diff --git a/.bashrc b/.bashrc deleted file mode 100644 index 5a3e294..0000000 --- a/.bashrc +++ /dev/null @@ -1,149 +0,0 @@ -# -# ~/.bashrc -# - -#Ibus settings if you need them -#type ibus-setup in terminal to change settings and start the daemon -#delete the hashtags of the next lines and restart -#export GTK_IM_MODULE=ibus -#export XMODIFIERS=@im=dbus -#export QT_IM_MODULE=ibus - -# If not running interactively, don't do anything -[[ $- != *i* ]] && return - -export HISTCONTROL=ignoreboth:erasedups - -PS1="\e[0m[\e[01;32m\u\e[0m@\e[1;36m\h \e[1;33m\W\e[0m]\e[1;31m λ \e[0m" - -if [ -d "$HOME/.bin" ] ; - then PATH="$HOME/.bin:$PATH" -fi - -if [ -d "$HOME/.local/bin" ] ; - then PATH="$HOME/.local/bin:$PATH" -fi - -#ignore upper and lowercase when TAB completion -bind "set completion-ignore-case on" - -#list -alias ls="ls --color=auto" -alias ll="ls -lah" -alias l.="ls -A | egrep '^\.'" - -## Colorize the grep command output for ease of use (good for log files)## -alias grep="grep --color=auto" -alias egrep="egrep --color=auto" -alias fgrep="fgrep --color=auto" - -#arcolinux logout unlock -alias rmlogoutlock="sudo rm /tmp/arcologout.lock" - -#free -alias free="free -mt" - -#use all cores -alias uac="sh ~/.bin/main/000*" - -#continue download -alias wget="wget -c" - -#userlist -alias userlist="cut -d: -f1 /etc/passwd" - -#merge new settings -alias merge="xrdb -merge ~/.Xresources" - -# Aliases for software managment -alias pacman="sudo pacman --color auto" -alias yays="yay --mflags --skipinteg" -alias update="pacman -Syyu --noconfirm" -alias yupdate="yay -Syyu --noconfirm" - -#ps -alias psa="ps auxf" -alias psgrep="ps aux | grep -v grep | grep -i -e VSZ -e" - -#grub update -alias update-grub="sudo grub-mkconfig -o /boot/grub/grub.cfg" - -#add new fonts -alias update-fc="sudo fc-cache -fv" - -#check vulnerabilities microcode -alias microcode="grep . /sys/devices/system/cpu/vulnerabilities/*" - -#get fastest mirrors in your neighborhood -alias mirror="sudo reflector -f 30 -l 30 --number 10 --verbose --save /etc/pacman.d/mirrorlist" -alias mirrord="sudo reflector --latest 50 --number 20 --sort delay --save /etc/pacman.d/mirrorlist" -alias mirrors="sudo reflector --latest 50 --number 20 --sort score --save /etc/pacman.d/mirrorlist" -alias mirrora="sudo reflector --latest 50 --number 20 --sort age --save /etc/pacman.d/mirrorlist" - -#shopt -shopt -s autocd # change to named directory -shopt -s cdspell # autocorrects cd misspellings -shopt -s cmdhist # save multi-line commands in history as single line -shopt -s dotglob -shopt -s histappend # do not overwrite history -shopt -s expand_aliases # expand aliases - -#Recent Installed Packages -alias rip="expac --timefmt='%Y-%m-%d %T' '%l\t%n %v' | sort | tail -200 | nl" -alias riplong="expac --timefmt='%Y-%m-%d %T' '%l\t%n %v' | sort | tail -3000 | nl" - -#iso and version used to install the distro I use (ArcoLinux) -alias iso="cat /etc/dev-rel | awk -F '=' '/ISO/ {print $2}'" - -#gpg -#verify signature for isos -alias gpg-check="gpg2 --keyserver-options auto-key-retrieve --verify" -#receive the key of a developer -alias gpg-retrieve="gpg2 --keyserver-options auto-key-retrieve --receive-keys" - -#maintenance -alias big="expac -H M '%m\t%n' | sort -h | nl" -alias downgrada="downgrade --ala-url 'https://bike.seedhost.eu/arcolinux/'" - -#systeminfo -alias probe="sudo -E hw-probe -all -upload" - -function bextract() { - if [ -f $1 ] ; then - case $1 in - *.tar.bz2) tar xjf $1 ;; - *.tar.gz) tar xzf $1 ;; - *.bz2) bunzip2 $1 ;; - *.rar) unrar x $1 ;; - *.gz) gunzip $1 ;; - *.tar) tar xf $1 ;; - *.tbz2) tar xjf $1 ;; - *.tgz) tar xzf $1 ;; - *.zip) unzip $1 ;; - *.Z) uncompress $1;; - *.7z) 7z x $1 ;; - *.deb) ar x $1 ;; - *.tar.xz) tar xf $1 ;; - *.tar.zst) unzstd $1 ;; - *) echo "I cannot decompress '$1'" ;; - esac - else echo "'$1' is not a valid file"; fi -} - -alias bextract=bextract - -#create a file called .bashrc-personal and put all your personal aliases -#in there. They will not be overwritten by skel. -[[ -f ~/.bashrc-personal ]] && . ~/.bashrc-personal - - - -# custom aliases -alias emacs="emacs --no-window-system" -alias rr="curl -s -L http://bit.ly/10hA8iC | bash" - -function weather() { curl "wttr.in/$1"; } -alias weather=weather - -pfetch - diff --git a/.config/i3/config-laptop b/.config/i3/config-laptop deleted file mode 100644 index 966e80e..0000000 --- a/.config/i3/config-laptop +++ /dev/null @@ -1,192 +0,0 @@ -# This file has been auto-generated by i3-config-wizard(1). -# It will not be overwritten, so edit it as you like. -# -# Should you change your keyboard layout some time, delete -# this file and re-run i3-config-wizard(1). -# - -# i3 config file (v4) -# -# Please see https://i3wm.org/docs/userguide.html for a complete reference! - -set $mod Mod4 -set $terminal kitty - -# Font for window titles. Will also be used by the bar unless a different font -# is used in the bar {} block below. -font pango:monospace 10 - -# This font is widely installed, provides lots of unicode glyphs, right-to-left -# text rendering and scalability on retina/hidpi displays (thanks to pango). -#font pango:DejaVu Sans Mono 8 - -# The combination of xss-lock, nm-applet and pactl is a popular choice, so -# they are included here as an example. Modify as you see fit. - -# xss-lock grabs a logind suspend inhibit lock and will use i3lock to lock the -# screen before suspend. Use loginctl lock-session to lock your screen. -exec --no-startup-id xss-lock --transfer-sleep-lock -- i3lock --nofork - -# NetworkManager is the most popular way to manage wireless networks on Linux, -# and nm-applet is a desktop environment-independent system tray GUI for it. -exec --no-startup-id nm-applet - -# Use pactl to adjust volume in PulseAudio. -set $refresh_i3status killall -SIGUSR1 i3status -bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +5% && $refresh_i3status -bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -5% && $refresh_i3status -bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle && $refresh_i3status -bindsym XF86AudioMicMute exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ toggle && $refresh_i3status - -# Use Mouse+$mod to drag floating windows to their wanted position -floating_modifier $mod - -# start a terminal -bindsym $mod+Return exec $terminal - -# kill focused window -bindsym $mod+Shift+q kill - -# start dmenu (a program launcher) -bindsym $mod+d exec --no-startup-id rofi -show run -bindsym $mod+Shift+d exec --no-startup-id rofi-theme-selector - -# change focus -bindsym $mod+j focus left -bindsym $mod+k focus down -bindsym $mod+l focus up -bindsym $mod+odiaeresis focus right - -# alternatively, you can use the cursor keys: -bindsym $mod+Left focus left -bindsym $mod+Down focus down -bindsym $mod+Up focus up -bindsym $mod+Right focus right - -# move focused window -bindsym $mod+Shift+j move left -bindsym $mod+Shift+k move down -bindsym $mod+Shift+l move up -bindsym $mod+Shift+odiaeresis move right - -# alternatively, you can use the cursor keys: -bindsym $mod+Shift+Left move left -bindsym $mod+Shift+Down move down -bindsym $mod+Shift+Up move up -bindsym $mod+Shift+Right move right - -# split in horizontal orientation -bindsym $mod+h split h - -# split in vertical orientation -bindsym $mod+v split v - -# enter fullscreen mode for the focused container -bindsym $mod+f fullscreen toggle - -# change container layout (stacked, tabbed, toggle split) -bindsym $mod+s layout stacking -bindsym $mod+w layout tabbed -bindsym $mod+e layout toggle split - -# toggle tiling / floating -bindsym $mod+Shift+space floating toggle - -# change focus between tiling / floating windows -bindsym $mod+space focus mode_toggle - -# focus the parent container -bindsym $mod+a focus parent - -# focus the child container -#bindsym $mod+d focus child - -# Define names for default workspaces for which we configure key bindings later on. -# We use variables to avoid repeating the names in multiple places. -set $ws1 "1" -set $ws2 "2" -set $ws3 "3" -set $ws4 "4" -set $ws5 "5" -set $ws6 "6" -set $ws7 "7" -set $ws8 "8" -set $ws9 "9" -set $ws10 "10" - -# switch to workspace -bindsym $mod+1 workspace number $ws1 -bindsym $mod+2 workspace number $ws2 -bindsym $mod+3 workspace number $ws3 -bindsym $mod+4 workspace number $ws4 -bindsym $mod+5 workspace number $ws5 -bindsym $mod+6 workspace number $ws6 -bindsym $mod+7 workspace number $ws7 -bindsym $mod+8 workspace number $ws8 -bindsym $mod+9 workspace number $ws9 -bindsym $mod+0 workspace number $ws10 - -# move focused container to workspace -bindsym $mod+Shift+1 move container to workspace number $ws1 -bindsym $mod+Shift+2 move container to workspace number $ws2 -bindsym $mod+Shift+3 move container to workspace number $ws3 -bindsym $mod+Shift+4 move container to workspace number $ws4 -bindsym $mod+Shift+5 move container to workspace number $ws5 -bindsym $mod+Shift+6 move container to workspace number $ws6 -bindsym $mod+Shift+7 move container to workspace number $ws7 -bindsym $mod+Shift+8 move container to workspace number $ws8 -bindsym $mod+Shift+9 move container to workspace number $ws9 -bindsym $mod+Shift+0 move container to workspace number $ws10 - -# reload the configuration file -bindsym $mod+Shift+c reload -# restart i3 inplace (preserves your layout/session, can be used to upgrade i3) -bindsym $mod+Shift+r restart -# exit i3 (logs you out of your X session) -bindsym $mod+Shift+e exec --no-startup-id i3 exit - -# resize window (you can also use the mouse for that) -mode "resize" { - # bindings for the arrow keys - bindsym Left resize shrink width 3 px or 3 ppt - bindsym Down resize grow height 3 px or 3 ppt - bindsym Up resize shrink height 3 px or 3 ppt - bindsym Right resize grow width 3 px or 3 ppt - - # back to normal: Enter or Escape or $mod+r - bindsym Return mode "default" - bindsym Escape mode "default" - bindsym $mod+r mode "default" -} - -bindsym $mod+r mode "resize" - -# Start i3bar to display a workspace bar (plus the system information i3status -# finds out, if available) -# bar { -# status_command i3status -# } - - - -# i3gaps -gaps outer 4 -gaps inner 8 -#for_window [class="^.*"] border pixel 3 - -# titlebar-border-color | titlebar-color | window-border-color | -# titlebar-text-color | border-indicator-color -client.focused #00ffa1 #00ffa1 #333333 #00ffa1 #00ffa1 - -# titlebar-border-color | window-border-color | titlebar-text-color -client.unfocused #555555 #555555 #ffffff - -# BINDSYMS -bindsym XF86MonBrightnessUp exec --no-startup-id light -A 5 -bindsym XF86MonBrightnessDown exec --no-startup-id light -U 5 - - -# STARTUPS -exec picom -exec polybar top -exec --no-startup-id nitrogen --restore diff --git a/.config/i3/config-pc b/.config/i3/config-pc deleted file mode 100644 index 70b75c1..0000000 --- a/.config/i3/config-pc +++ /dev/null @@ -1,188 +0,0 @@ -# This file has been auto-generated by i3-config-wizard(1). -# It will not be overwritten, so edit it as you like. -# -# Should you change your keyboard layout some time, delete -# this file and re-run i3-config-wizard(1). -# - -# i3 config file (v4) -# -# Please see https://i3wm.org/docs/userguide.html for a complete reference! - -set $mod Mod4 -set $terminal kitty - -# Font for window titles. Will also be used by the bar unless a different font -# is used in the bar {} block below. -font pango:monospace 10 - -# This font is widely installed, provides lots of unicode glyphs, right-to-left -# text rendering and scalability on retina/hidpi displays (thanks to pango). -#font pango:DejaVu Sans Mono 8 - -# The combination of xss-lock, nm-applet and pactl is a popular choice, so -# they are included here as an example. Modify as you see fit. - -# xss-lock grabs a logind suspend inhibit lock and will use i3lock to lock the -# screen before suspend. Use loginctl lock-session to lock your screen. -exec --no-startup-id xss-lock --transfer-sleep-lock -- i3lock --nofork - -# NetworkManager is the most popular way to manage wireless networks on Linux, -# and nm-applet is a desktop environment-independent system tray GUI for it. -exec --no-startup-id nm-applet - -# Use pactl to adjust volume in PulseAudio. -set $refresh_i3status killall -SIGUSR1 i3status -bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +5% && $refresh_i3status -bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -5% && $refresh_i3status -bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle && $refresh_i3status -bindsym XF86AudioMicMute exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ toggle && $refresh_i3status - -# Use Mouse+$mod to drag floating windows to their wanted position -floating_modifier $mod - -# start a terminal -bindsym $mod+Return exec $terminal - -# kill focused window -bindsym $mod+Shift+q kill - -# start dmenu (a program launcher) -bindsym $mod+d exec --no-startup-id rofi -show run -bindsym $mod+Shift+d exec --no-startup-id rofi-theme-selector - -# change focus -bindsym $mod+j focus left -bindsym $mod+k focus down -bindsym $mod+l focus up -bindsym $mod+odiaeresis focus right - -# alternatively, you can use the cursor keys: -bindsym $mod+Left focus left -bindsym $mod+Down focus down -bindsym $mod+Up focus up -bindsym $mod+Right focus right - -# move focused window -bindsym $mod+Shift+j move left -bindsym $mod+Shift+k move down -bindsym $mod+Shift+l move up -bindsym $mod+Shift+odiaeresis move right - -# alternatively, you can use the cursor keys: -bindsym $mod+Shift+Left move left -bindsym $mod+Shift+Down move down -bindsym $mod+Shift+Up move up -bindsym $mod+Shift+Right move right - -# split in horizontal orientation -bindsym $mod+h split h - -# split in vertical orientation -bindsym $mod+v split v - -# enter fullscreen mode for the focused container -bindsym $mod+f fullscreen toggle - -# change container layout (stacked, tabbed, toggle split) -bindsym $mod+s layout stacking -bindsym $mod+w layout tabbed -bindsym $mod+e layout toggle split - -# toggle tiling / floating -bindsym $mod+Shift+space floating toggle - -# change focus between tiling / floating windows -bindsym $mod+space focus mode_toggle - -# focus the parent container -bindsym $mod+a focus parent - -# focus the child container -#bindsym $mod+d focus child - -# Define names for default workspaces for which we configure key bindings later on. -# We use variables to avoid repeating the names in multiple places. -set $ws1 "1" -set $ws2 "2" -set $ws3 "3" -set $ws4 "4" -set $ws5 "5" -set $ws6 "6" -set $ws7 "7" -set $ws8 "8" -set $ws9 "9" -set $ws10 "10" - -# switch to workspace -bindsym $mod+1 workspace number $ws1 -bindsym $mod+2 workspace number $ws2 -bindsym $mod+3 workspace number $ws3 -bindsym $mod+4 workspace number $ws4 -bindsym $mod+5 workspace number $ws5 -bindsym $mod+6 workspace number $ws6 -bindsym $mod+7 workspace number $ws7 -bindsym $mod+8 workspace number $ws8 -bindsym $mod+9 workspace number $ws9 -bindsym $mod+0 workspace number $ws10 - -# move focused container to workspace -bindsym $mod+Shift+1 move container to workspace number $ws1 -bindsym $mod+Shift+2 move container to workspace number $ws2 -bindsym $mod+Shift+3 move container to workspace number $ws3 -bindsym $mod+Shift+4 move container to workspace number $ws4 -bindsym $mod+Shift+5 move container to workspace number $ws5 -bindsym $mod+Shift+6 move container to workspace number $ws6 -bindsym $mod+Shift+7 move container to workspace number $ws7 -bindsym $mod+Shift+8 move container to workspace number $ws8 -bindsym $mod+Shift+9 move container to workspace number $ws9 -bindsym $mod+Shift+0 move container to workspace number $ws10 - -# reload the configuration file -bindsym $mod+Shift+c reload -# restart i3 inplace (preserves your layout/session, can be used to upgrade i3) -bindsym $mod+Shift+r restart -# exit i3 (logs you out of your X session) -bindsym $mod+Shift+e exec --no-startup-id i3 exit - -# resize window (you can also use the mouse for that) -mode "resize" { - # bindings for the arrow keys - bindsym Left resize shrink width 3 px or 3 ppt - bindsym Down resize grow height 3 px or 3 ppt - bindsym Up resize shrink height 3 px or 3 ppt - bindsym Right resize grow width 3 px or 3 ppt - - # back to normal: Enter or Escape or $mod+r - bindsym Return mode "default" - bindsym Escape mode "default" - bindsym $mod+r mode "default" -} - -bindsym $mod+r mode "resize" - -# Start i3bar to display a workspace bar (plus the system information i3status -# finds out, if available) -# bar { -# status_command i3status -# } - - - -# i3gaps -gaps outer 4 -gaps inner 8 -#for_window [class="^.*"] border pixel 3 - -# titlebar-border-color | titlebar-color | window-border-color | -# titlebar-text-color | border-indicator-color -client.focused #00ffa1 #00ffa1 #333333 #00ffa1 #00ffa1 - -# titlebar-border-color | window-border-color | titlebar-text-color -client.unfocused #555555 #555555 #ffffff - -# STARTUPS -exec picom -exec polybar top-left -exec polybar top-right - diff --git a/.config/picom/picom.conf b/.config/picom/picom-laptop.conf similarity index 98% rename from .config/picom/picom.conf rename to .config/picom/picom-laptop.conf index 6fb3805..fe01303 100644 --- a/.config/picom/picom.conf +++ b/.config/picom/picom-laptop.conf @@ -2,4 +2,3 @@ active-opacity = 0.85; inactive-opacity = 0.70; - diff --git a/.config/picom/picom-pc.conf b/.config/picom/picom-pc.conf new file mode 100644 index 0000000..07c5c32 --- /dev/null +++ b/.config/picom/picom-pc.conf @@ -0,0 +1,5 @@ +# ~/.config/picom/picom.conf + +active-opacity = 1.0; +inactive-opacity = 0.9; + diff --git a/.config/polybar/config b/.config/polybar/config deleted file mode 100644 index 492bfdc..0000000 --- a/.config/polybar/config +++ /dev/null @@ -1,142 +0,0 @@ -[colors] -background = #222 -foreground = #eee -linecolor = #fba922 -bordercolor = #333 -accent = #e60053 - -[settings] -screenchange-reload = true - -[global/wm] -margin-top = 0 -margin-bottom = 0 - -[bar/top] -enable-ipc = true -monitor = eDP -width = 100% -height = 24 - -background = ${colors.background} -foreground = ${colors.foreground} - -line-color = ${colors.linecolor} -underline-size = 1 -overline-size = 2 - -border-bottom-size = 2 -border-bottom-color = ${colors.bordercolor} - -padding-left = 0 -padding-right = 2 -module-margin-left = 1 -module-margin-right = 2 - -font-0 = dina:pixelsize=9;1 -font-1 = siji:pixelsize=10;1 -font-2 = unifont:size=6;1 - -modules-left = i3 -modules-right = volume battery memory cpu date - -tray-position = right -tray-padding = 4 -tray-maxsize = 16 - -wm-restack = bspwm - -scroll-up = bspwm-deskprev -scroll-down = bspwm-desknext - -bspwm-focused-overline = ${colors.linecolor} -bspwm-focused-underline = #cc333333 - -[module/fs-root] -type = internal/fs -mount-0 = / -label-mounted = %{F#e60053}%percentage_used%%%{F-} used of %mountpoint% - -[module/i3] -type = internal/i3 -index-sort = true -pin-workspaces = true -wrapping-scroll = true - -format = <label-state> <label-mode> - -label-mode = %mode% -label-mode-padding = 2 -label-mode-background = ${colors.accent} - -label-focused = %index% -label-focused-foreground = #cccccc -label-focused-underline = #cccccc -label-focused-padding = 3 - -label-unfocused = %index% -label-unfocused-padding = 3 - -label-urgent = %index%! -label-urgent-background = #00ffa1 -label-urgent-padding = 3 - -label-visible = %index% -label-visible-padding = 3 - -[module/cpu] -type = internal/cpu -interval = 2 -label = %percentage%% -format-prefix = "CPU " -format-prefix-foreground = #666 - -[module/memory] -type = internal/memory -interval = 2 -label = %percentage_used%% -format-prefix = "RAM " -format-prefix-foreground = #666 - -[module/date] -type = internal/date -label = %{F#666}TIME%{F-} %time% - %date% -label-prefix = "TIME" -date = %d.%m.%Y -time = %H:%M -interval = 5 - -[module/volume] -type = internal/pulseaudio -speaker-mixer = Speaker -headphone-mixer = Headphone -headphone-id = 9 - -format-volume = <label-volume> -format-volume-prefix = "AUDIO " -format-volume-prefix-foreground = #666 -label-volume = %percentage%% -label-volume-foreground = ${root.foreground} - -format-muted-foreground = #777 -label-muted = AUDIO MUTED - -[module/battery] -type = internal/battery -full-at = 99 -time-format = %H:%M - -format-charging = <label-charging> -format-charging-prefix = "CHR " -format-charging-prefix-foreground = #666 -label-charging = %percentage%% - %time% - -format-discharging = <label-discharging> -format-discharging-prefix = "BAT " -format-discharging-prefix-foreground = #666 -label-discharging = %percentage%% - %time% - -format-full = <label-full> -format-full-prefix = "FLL " -format-full-prefix-foreground = #666 - diff --git a/.config/xmobar/xmobar-laptop.config b/.config/xmobar/xmobar-laptop.config new file mode 100644 index 0000000..2a68f85 --- /dev/null +++ b/.config/xmobar/xmobar-laptop.config @@ -0,0 +1,39 @@ +Config { font = "xft:monospace" + , additionalFonts = [] + , borderColor = "black" + , border = TopB + , bgColor = "#303030" + , fgColor = "grey" + , alpha = 255 + , position = Static { xpos = 0 , ypos = 0, width = 1920, height = 30 } + , textOffset = -1 + , iconOffset = -1 + , lowerOnStart = True + , pickBroadest = False + , persistent = False + , hideOnStart = False + , iconRoot = "." + , allDesktops = True + , overrideRedirect = True + , commands = [ + Run Cpu ["-L","3","-H","50", "--normal","green","--high","red"] 10 + , Run Memory ["-t","Mem: <usedratio>%"] 10 + , Run Swap [] 10 + , Run Com "uname" ["-s","-r"] "" 36000 + , Run Date "%H:%M - %d.%m.%Y" "date" 10 + , Run Wireless "wlp1s0" [ "-t", "<essid>" ] 10 + , Run Battery [ + "-t", "<acstatus>: <left>% <timeleft>", + "--", + --"-c", "charge_full", + "-O", "AC", + "-o", "Bat", + "-h", "green", + "-l", "red" + ] 10 + ] + , sepChar = "%" + , alignSep = "}{" + , template = " %cpu% | %memory% * %swap% }\ + \{ <fc=#ff55cc>%wlp1s0wi%</fc> | <fc=#9999ff>%battery%</fc> | <fc=#ffd700>%date%</fc> | <fc=#0fb471>%uname%</fc> " +} diff --git a/.config/xmobar/xmobar-pc.config b/.config/xmobar/xmobar-pc.config new file mode 100644 index 0000000..41075f4 --- /dev/null +++ b/.config/xmobar/xmobar-pc.config @@ -0,0 +1,28 @@ +Config { font = "xft:monospace" + , additionalFonts = [] + , borderColor = "black" + , border = TopB + , bgColor = "#303030" + , fgColor = "grey" + , alpha = 255 + , position = Static { xpos = 0 , ypos = 0, width = 2560, height = 30 } + , textOffset = -1 + , iconOffset = -1 + , lowerOnStart = True + , pickBroadest = False + , persistent = False + , hideOnStart = False + , iconRoot = "." + , allDesktops = True + , overrideRedirect = True + , commands = [ + Run Cpu ["-L","3","-H","50", "--normal","green","--high","red"] 10 + , Run Memory ["-t","Mem: <usedratio>%"] 10 + , Run Com "uname" ["-s","-r"] "" 36000 + , Run Date "%H:%M - %d.%m.%Y" "date" 10 + ] + , sepChar = "%" + , alignSep = "}{" + , template = " %cpu% | %memory%}\ + \{ <fc=#ffd700>%date%</fc> | <fc=#0fb471>%uname%</fc> " +} diff --git a/.emacs b/.emacs index 325ac27..ef3b810 100644 --- a/.emacs +++ b/.emacs @@ -6,40 +6,28 @@ (custom-set-variables - '(custom-safe-themes - '("d14f3df28603e9517eb8fb7518b662d653b25b26e83bd8e129acea042b774298" default)) - '(dashboard-banner-logo-title "Welcome to Emacs Dashboard") - '(dashboard-center-content t) - '(dashboard-footer-messages nil) - '(dashboard-items '((recents . 5) (bookmarks . 5) (registers . 5))) - '(dashboard-startup-banner "~/.emacs.d/title.txt") - '(global-display-line-numbers-mode t) - ;; tabstop stuff - '(indent-line-function 4) - '(tab-width 4) - '(c-basic-offset 4) - '(lisp-indent-offset 2) - '(sgml-basic-offset 4) - '(nxml-child-indent 4) - '(tab-stop-list (number-sequence 4 200 4)) - '(tab-width 4) - ;; other stuff - '(make-backup-files nil) - '(menu-bar-mode nil) - '(package-selected-packages - '(filetree auto-complete markdown-mode projectile dashboard pylint evil gruvbox-theme ##)) - '(scroll-bar-mode nil) - '(tool-bar-mode nil) - '(tooltip-mode nil)) + ;; custom-set-variables was added by Custom. + ;; If you edit it by hand, you could mess it up, so be careful. + ;; Your init file should contain only one such instance. + ;; If there is more than one, they won't work right. + '(global-display-line-numbers-mode t) + '(make-backup-files nil) + '(menu-bar-mode nil) + '(package-selected-packages + '(auto-complete format-all evil projectile doom-modeline dashboard atom-dark-theme)) + '(scroll-bar-mode nil) + '(tool-bar-mode nil) + '(tooltip-mode nil)) (custom-set-faces - ;; custom-set-faces was added by Custom. - ;; If you edit it by hand, you could mess it up, so be careful. - ;; Your init file should contain only one such instance. - ;; If there is more than one, they won't work right. - ) + ;; custom-set-faces was added by Custom. + ;; If you edit it by hand, you could mess it up, so be careful. + ;; Your init file should contain only one such instance. + ;; If there is more than one, they won't work right. + ) -;; auto complete default config +;; setup auto-complete +(require 'auto-complete) (ac-config-default) ;; enable evil mode @@ -47,13 +35,26 @@ (evil-mode 1) ;; load gruvbox theme -(load-theme 'gruvbox t) +(load-theme 'atom-dark t) ;; set font size (set-face-attribute 'default (selected-frame) :height 145) -;; start startup screen +;; highlight current line +(global-hl-line-mode +1) + +;; setup doom-modeline +(require 'doom-modeline) +(doom-modeline-mode 1) + +;; asdf +(require 'projectile) +(projectile-mode +1) + +;; setup dashboard (require 'dashboard) +(setq dashboard-startup-banner "~/.emacs.d/title.txt") +;;(setq dashboard-items '((recents . 5) (bookmarks . 5))) (dashboard-setup-startup-hook) ;; define custom commands diff --git a/.emacs.d/#recentf# b/.emacs.d/#recentf# new file mode 100644 index 0000000..f8ff341 --- /dev/null +++ b/.emacs.d/#recentf# @@ -0,0 +1,26 @@ +;;; Automatically generated by ‘recentf’ on Sat Jun 12 19:16:09 2021. + +(setq recentf-list + '( + "/home/llehn/.emacs.d/session.1080c407afbb4c7bf9162351796716501400000024240126" + "/home/llehn/.emacs" + "/home/llehn/.emacs.d/elpa/company-irony-20190124.2346/company-irony-autoloads.el" + "/home/llehn/.emacs.d/elpa/company-20210611.1224/company-autoloads.el" + "/home/llehn/.emacs.d/elpa/irony-20210321.1750/irony-autoloads.el" + "/home/llehn/.emacs.d/elpa/ac-clang-20180710.546/ac-clang-autoloads.el" + "/home/llehn/.emacs.d/elpa/pos-tip-20191227.1356/pos-tip-autoloads.el" + "/home/llehn/.emacs.d/elpa/yasnippet-20200604.246/yasnippet-autoloads.el" + "/home/llehn/.emacs.d/elpa/evil-20210527.2107/evil-autoloads.el" + "/home/llehn/.emacs.d/elpa/projectile-20210607.1513/projectile-autoloads.el" + "/home/llehn/.emacs.d/elpa/pkg-info-20150517.1143/pkg-info-autoloads.el" + "/home/llehn/.emacs.d/elpa/epl-20180205.2049/epl-autoloads.el" + "/home/llehn/Documents/GitHub/Plasmatum/src/lexerparser.cc" + "/home/llehn/.emacs.d/elpa/atom-dark-theme-20181022.1602/atom-dark-theme-autoloads.el" + )) + +(setq recentf-filter-changer-current 'nil) + + +;; Local Variables: +;; coding: utf-8-emacs +;; End: diff --git a/.emacs.d/ac-comphist.dat b/.emacs.d/ac-comphist.dat new file mode 100644 index 0000000..03b879a --- /dev/null +++ b/.emacs.d/ac-comphist.dat @@ -0,0 +1,22 @@ +((("projectile" . + [1 0 0 0 0 0 0 0 0 0]) + ("require" . + [2 0 0 0 0 0 1]) + ("company" . + [1 0 0 0 0 0 1]) + ("company-mode" . + [1 0 0 0 0 0 0 0 0 0 0 0]) + ("autoarg" . + [0 0 0 0 0 0 1]) + ("auto-complete-clang" . + [0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0]) + ("lambda" . + [1 0 0 0 0 0]) + ("setq" . + [1 0 0 0]) + ("ac-sources" . + [2 0 0 0 0 0 0 0 0 0]) + ("append" . + [1 0 0 0 0 0]) + ("ac-source-yasnippet" . + [0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0]))) diff --git a/.emacs.d/auto-save-list/.saves-81587-Pavilion~ b/.emacs.d/auto-save-list/.saves-81587-Pavilion~ new file mode 100644 index 0000000..7dbf87e --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-81587-Pavilion~ @@ -0,0 +1,8 @@ +/home/llehn/.emacs +/home/llehn/#.emacs# +/home/llehn/Documents/GitHub/Plasmatum/src/jit.h +/home/llehn/Documents/GitHub/Plasmatum/src/#jit.h# +/home/llehn/Documents/GitHub/Plasmatum/src/Documents/GitHub/Plasmatum/src/jit.h +/home/llehn/Documents/GitHub/Plasmatum/src/Documents/GitHub/Plasmatum/src/#jit.h# +/home/llehn/Documents/GitHub/Plasmatum/src/jit.cc +/home/llehn/Documents/GitHub/Plasmatum/src/#jit.cc# diff --git a/.emacs.d/auto-save-list/.saves-85665-Pavilion~ b/.emacs.d/auto-save-list/.saves-85665-Pavilion~ new file mode 100644 index 0000000..e69de29 diff --git a/.emacs.d/auto-save-list/.saves-98389-Pavilion~ b/.emacs.d/auto-save-list/.saves-98389-Pavilion~ new file mode 100644 index 0000000..fd61e84 --- /dev/null +++ b/.emacs.d/auto-save-list/.saves-98389-Pavilion~ @@ -0,0 +1,4 @@ +/home/llehn/.emacs +/home/llehn/#.emacs# +/home/llehn/.emacs.d/recentf +/home/llehn/.emacs.d/#recentf# diff --git a/.emacs.d/auto-save-list/.saves-98633-Pavilion~ b/.emacs.d/auto-save-list/.saves-98633-Pavilion~ new file mode 100644 index 0000000..e69de29 diff --git a/.emacs.d/elpa/all-the-icons-20210603.1604/all-the-icons-autoloads.el b/.emacs.d/elpa/all-the-icons-20210603.1604/all-the-icons-autoloads.el new file mode 100644 index 0000000..121bfa6 --- /dev/null +++ b/.emacs.d/elpa/all-the-icons-20210603.1604/all-the-icons-autoloads.el @@ -0,0 +1,75 @@ +;;; all-the-icons-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "all-the-icons" "all-the-icons.el" (0 0 0 0)) +;;; Generated autoloads from all-the-icons.el + +(autoload 'all-the-icons-icon-for-dir "all-the-icons" "\ +Get the formatted icon for DIR. +ARG-OVERRIDES should be a plist containining `:height', +`:v-adjust' or `:face' properties like in the normal icon +inserting functions. + +Note: You want chevron, please use `all-the-icons-icon-for-dir-with-chevron'. + +\(fn DIR &rest ARG-OVERRIDES)" nil nil) + +(autoload 'all-the-icons-icon-for-file "all-the-icons" "\ +Get the formatted icon for FILE. +ARG-OVERRIDES should be a plist containining `:height', +`:v-adjust' or `:face' properties like in the normal icon +inserting functions. + +\(fn FILE &rest ARG-OVERRIDES)" nil nil) + +(autoload 'all-the-icons-icon-for-mode "all-the-icons" "\ +Get the formatted icon for MODE. +ARG-OVERRIDES should be a plist containining `:height', +`:v-adjust' or `:face' properties like in the normal icon +inserting functions. + +\(fn MODE &rest ARG-OVERRIDES)" nil nil) + +(autoload 'all-the-icons-icon-for-url "all-the-icons" "\ +Get the formatted icon for URL. +If an icon for URL isn't found in `all-the-icons-url-alist', a globe is used. +ARG-OVERRIDES should be a plist containining `:height', +`:v-adjust' or `:face' properties like in the normal icon +inserting functions. + +\(fn URL &rest ARG-OVERRIDES)" nil nil) + +(autoload 'all-the-icons-install-fonts "all-the-icons" "\ +Helper function to download and install the latests fonts based on OS. +When PFX is non-nil, ignore the prompt and just install + +\(fn &optional PFX)" t nil) + +(autoload 'all-the-icons-insert "all-the-icons" "\ +Interactive icon insertion function. +When Prefix ARG is non-nil, insert the propertized icon. +When FAMILY is non-nil, limit the candidates to the icon set matching it. + +\(fn &optional ARG FAMILY)" t nil) + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "all-the-icons" '("all-the-icons-"))) + +;;;*** + +;;;### (autoloads nil nil ("all-the-icons-faces.el" "all-the-icons-pkg.el") +;;;;;; (0 0 0 0)) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; all-the-icons-autoloads.el ends here diff --git a/.emacs.d/elpa/all-the-icons-20210603.1604/all-the-icons-faces.el b/.emacs.d/elpa/all-the-icons-20210603.1604/all-the-icons-faces.el new file mode 100644 index 0000000..4408e97 --- /dev/null +++ b/.emacs.d/elpa/all-the-icons-20210603.1604/all-the-icons-faces.el @@ -0,0 +1,230 @@ +;;; all-the-icons-faces.el --- A module of faces for all-the-icons + +;; Copyright (C) 2016 Dominic Charlesworth <dgc336@gmail.com> + +;; Author: Dominic Charlesworth <dgc336@gmail.com> +;; Version: 1.0.0 +;; Package-Requires: ((emacs "24.3")) +;; URL: https://github.com/domtronn/all-the-icons.el +;; Keywords: convenient, lisp + +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License +;; as published by the Free Software Foundation; either version 3 +;; of the License, or (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: + +;; This file contains all of the faces used by the package for +;; colouring icons + +;;; Code: + +(defgroup all-the-icons-faces nil + "Manage how All The Icons icons are coloured and themed." + :prefix "all-the-icons-" + :group 'tools + :group 'all-the-icons) + + +;; red +(defface all-the-icons-red + '((((background dark)) :foreground "#AC4142") + (((background light)) :foreground "#AC4142")) + "Face for red icons" + :group 'all-the-icons-faces) +(defface all-the-icons-lred + '((((background dark)) :foreground "#EB595A") + (((background light)) :foreground "#EB595A")) + "Face for lred icons" + :group 'all-the-icons-faces) +(defface all-the-icons-dred + '((((background dark)) :foreground "#843031") + (((background light)) :foreground "#843031")) + "Face for dred icons" + :group 'all-the-icons-faces) +(defface all-the-icons-red-alt + '((((background dark)) :foreground "#ce5643") + (((background light)) :foreground "#843031")) + "Face for dred icons" + :group 'all-the-icons-faces) + +;; green +(defface all-the-icons-green + '((((background dark)) :foreground "#90A959") + (((background light)) :foreground "#90A959")) + "Face for green icons" + :group 'all-the-icons-faces) +(defface all-the-icons-lgreen + '((((background dark)) :foreground "#C6E87A") + (((background light)) :foreground "#3D6837")) + "Face for lgreen icons" + :group 'all-the-icons-faces) +(defface all-the-icons-dgreen + '((((background dark)) :foreground "#6D8143") + (((background light)) :foreground "#6D8143")) + "Face for dgreen icons" + :group 'all-the-icons-faces) + +;; yellow +(defface all-the-icons-yellow + '((((background dark)) :foreground "#FFD446") + (((background light)) :foreground "#FFCC0E")) + "Face for yellow icons" + :group 'all-the-icons-faces) +(defface all-the-icons-lyellow + '((((background dark)) :foreground "#FFC16D") + (((background light)) :foreground "#FF9300")) + "Face for lyellow icons" + :group 'all-the-icons-faces) +(defface all-the-icons-dyellow + '((((background dark)) :foreground "#B48D56") + (((background light)) :foreground "#B48D56")) + "Face for dyellow icons" + :group 'all-the-icons-faces) + +;; blue +(defface all-the-icons-blue + '((((background dark)) :foreground "#6A9FB5") + (((background light)) :foreground "#6A9FB5")) + "Face for blue icons" + :group 'all-the-icons-faces) +(defface all-the-icons-blue-alt + '((((background dark)) :foreground "#2188b6") + (((background light)) :foreground "#2188b6")) + "Face for blue icons" + :group 'all-the-icons-faces) +(defface all-the-icons-lblue + '((((background dark)) :foreground "#8FD7F4") + (((background light)) :foreground "#677174")) + "Face for lblue icons" + :group 'all-the-icons-faces) +(defface all-the-icons-dblue + '((((background dark)) :foreground "#446674") + (((background light)) :foreground "#446674")) + "Face for dblue icons" + :group 'all-the-icons-faces) + +;; maroon +(defface all-the-icons-maroon + '((((background dark)) :foreground "#8F5536") + (((background light)) :foreground "#8F5536")) + "Face for maroon icons" + :group 'all-the-icons-faces) +(defface all-the-icons-lmaroon + '((((background dark)) :foreground "#CE7A4E") + (((background light)) :foreground "#CE7A4E")) + "Face for lmaroon icons" + :group 'all-the-icons-faces) +(defface all-the-icons-dmaroon + '((((background dark)) :foreground "#72584B") + (((background light)) :foreground "#72584B")) + "Face for dmaroon icons" + :group 'all-the-icons-faces) + +;; purple +(defface all-the-icons-purple + '((((background dark)) :foreground "#AA759F") + (((background light)) :foreground "#68295B")) + "Face for purple icons" + :group 'all-the-icons-faces) +(defface all-the-icons-purple-alt + '((((background dark)) :foreground "#5D54E1") + (((background light)) :foreground "#5D54E1")) + "Face for purple icons" + :group 'all-the-icons-faces) +(defface all-the-icons-lpurple + '((((background dark)) :foreground "#E69DD6") + (((background light)) :foreground "#E69DD6")) + "Face for lpurple icons" + :group 'all-the-icons-faces) +(defface all-the-icons-dpurple + '((((background dark)) :foreground "#694863") + (((background light)) :foreground "#694863")) + "Face for dpurple icons" + :group 'all-the-icons-faces) + +;; orange +(defface all-the-icons-orange + '((((background dark)) :foreground "#D4843E") + (((background light)) :foreground "#D4843E")) + "Face for orange icons" + :group 'all-the-icons-faces) +(defface all-the-icons-lorange + '((((background dark)) :foreground "#FFA500") + (((background light)) :foreground "#FFA500")) + "Face for lorange icons" + :group 'all-the-icons-faces) +(defface all-the-icons-dorange + '((((background dark)) :foreground "#915B2D") + (((background light)) :foreground "#915B2D")) + "Face for dorange icons" + :group 'all-the-icons-faces) + +;; cyan +(defface all-the-icons-cyan + '((((background dark)) :foreground "#75B5AA") + (((background light)) :foreground "#75B5AA")) + "Face for cyan icons" + :group 'all-the-icons-faces) +(defface all-the-icons-cyan-alt + '((((background dark)) :foreground "#61dafb") + (((background light)) :foreground "#0595bd")) + "Face for cyan icons" + :group 'all-the-icons-faces) +(defface all-the-icons-lcyan + '((((background dark)) :foreground "#A5FDEC") + (((background light)) :foreground "#2C7D6E")) + "Face for lcyan icons" + :group 'all-the-icons-faces) +(defface all-the-icons-dcyan + '((((background dark)) :foreground "#48746D") + (((background light)) :foreground "#48746D")) + "Face for dcyan icons" + :group 'all-the-icons-faces) + +;; pink +(defface all-the-icons-pink + '((((background dark)) :foreground "#F2B4B8") + (((background light)) :foreground "#FC505B")) + "Face for pink icons" + :group 'all-the-icons-faces) +(defface all-the-icons-lpink + '((((background dark)) :foreground "#FFBDC1") + (((background light)) :foreground "#FF505B")) + "Face for lpink icons" + :group 'all-the-icons-faces) +(defface all-the-icons-dpink + '((((background dark)) :foreground "#B18286") + (((background light)) :foreground "#7E5D5F")) + "Face for dpink icons" + :group 'all-the-icons-faces) + +;; silver +(defface all-the-icons-silver + '((((background dark)) :foreground "#716E68") + (((background light)) :foreground "#716E68")) + "Face for silver icons" + :group 'all-the-icons-faces) +(defface all-the-icons-lsilver + '((((background dark)) :foreground "#B9B6AA") + (((background light)) :foreground "#7F7869")) + "Face for lsilver icons" + :group 'all-the-icons-faces) +(defface all-the-icons-dsilver + '((((background dark)) :foreground "#838484") + (((background light)) :foreground "#838484")) + "Face for dsilver icons" + :group 'all-the-icons-faces) + + +(provide 'all-the-icons-faces) +;;; all-the-icons-faces.el ends here diff --git a/.emacs.d/elpa/all-the-icons-20210603.1604/all-the-icons-faces.elc b/.emacs.d/elpa/all-the-icons-20210603.1604/all-the-icons-faces.elc new file mode 100644 index 0000000..26c672b Binary files /dev/null and b/.emacs.d/elpa/all-the-icons-20210603.1604/all-the-icons-faces.elc differ diff --git a/.emacs.d/elpa/all-the-icons-20210603.1604/all-the-icons-pkg.el b/.emacs.d/elpa/all-the-icons-20210603.1604/all-the-icons-pkg.el new file mode 100644 index 0000000..225df0f --- /dev/null +++ b/.emacs.d/elpa/all-the-icons-20210603.1604/all-the-icons-pkg.el @@ -0,0 +1,12 @@ +(define-package "all-the-icons" "20210603.1604" "A library for inserting Developer icons" + '((emacs "24.3")) + :commit "facbde4a7be292bf9490932cbe403b443273f45d" :authors + '(("Dominic Charlesworth" . "dgc336@gmail.com")) + :maintainer + '("Dominic Charlesworth" . "dgc336@gmail.com") + :keywords + '("convenient" "lisp") + :url "https://github.com/domtronn/all-the-icons.el") +;; Local Variables: +;; no-byte-compile: t +;; End: diff --git a/.emacs.d/elpa/all-the-icons-20210603.1604/all-the-icons.el b/.emacs.d/elpa/all-the-icons-20210603.1604/all-the-icons.el new file mode 100644 index 0000000..f38b3a4 --- /dev/null +++ b/.emacs.d/elpa/all-the-icons-20210603.1604/all-the-icons.el @@ -0,0 +1,1159 @@ +;;; all-the-icons.el --- A library for inserting Developer icons -*- lexical-binding: t; -*- + +;; Copyright (C) 2016 Dominic Charlesworth <dgc336@gmail.com> + +;; Author: Dominic Charlesworth <dgc336@gmail.com> +;; Version: 5.0.0 +;; Package-Requires: ((emacs "24.3")) +;; URL: https://github.com/domtronn/all-the-icons.el +;; Keywords: convenient, lisp + +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License +;; as published by the Free Software Foundation; either version 3 +;; of the License, or (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: + +;; This package is a utility for using and formatting various Icon +;; fonts within Emacs. Icon Fonts allow you to propertize and format +;; icons the same way you would normal text. This enables things such +;; as better scaling of and anti aliasing of the icons. + +;; This package was inspired by + +;; - `mode-icons' for Emacs, found at https://github.com/ryuslash/mode-icons +;; - `file-icons' for Atom, found at https://atom.io/packages/file-icons + +;; Currently, this package provides an interface to the following Icon Fonts + +;; - Atom File Icons, found at https://atom.io/packages/file-icons +;; - FontAwesome Icons, found at http://fontawesome.io/ +;; - GitHub Octicons, found at http://octicons.github.com +;; - Material Design Icons, found at http://google.github.io/material-design-icons/ +;; - Weather Icons, found at https://erikflowers.github.io/weather-icons/ +;; - AllTheIcons, a custom Icon Font maintained as part of this package + +;; Requests for new icons will be accepted and added to the AllTheIcons Icon Font + +;;; Usage: + +;; The simplest usage for this package is to use the following functions; + +;; `all-the-icons-icon-for-buffer' +;; `all-the-icons-icon-for-dir' +;; `all-the-icons-icon-for-file' +;; `all-the-icons-icon-for-mode' +;; `all-the-icons-icon-for-url' + +;; Which can be used to get a formatted icon for the current buffer, a +;; file name, a major mode, or an URL respectively. e.g. + +;; (insert (all-the-icons-icon-for-file "foo.js")) + +;; Inserts a JavaScript icon formatted like this + +;; #("some-icon" 0 1 (display (raise -0.24) +;; face (:family "dev-icons" :height 1.08 :foreground "#FFD446"))) + +;; You can also insert icons directly using the individual icon family +;; functions + +;; `all-the-icons-alltheicon' // Custom font with fewest icons +;; `all-the-icons-devicon' // Developer Icons +;; `all-the-icons-faicon' // Font Awesome Icons +;; `all-the-icons-fileicon' // File Icons from the Atom File Icons package +;; `all-the-icons-octicon' // GitHub Octicons +;; `all-the-icons-material' // Material Design Icons +;; `all-the-icons-wicon' // Weather Icons + +;; You can call these functions with the icon name you want to insert, e.g. + +;; (all-the-icons-octicon "file-binary") // GitHub Octicon for Binary File +;; (all-the-icons-faicon "cogs") // FontAwesome icon for cogs +;; (all-the-icons-wicon "tornado") // Weather Icon for tornado + +;; A list of all the icon names for the different font families can be +;; found in the data directory, or by inspecting the alist variables. +;; All the alist variables are prefixed with `all-the-icons-data/' + +;;; Code: +(require 'cl-lib) + +(require 'data-alltheicons "./data/data-alltheicons.el") +(require 'data-faicons "./data/data-faicons.el") +(require 'data-fileicons "./data/data-fileicons.el") +(require 'data-octicons "./data/data-octicons.el") +(require 'data-weathericons "./data/data-weathericons.el") +(require 'data-material "./data/data-material.el") + +(require 'all-the-icons-faces) + +(defvar web-mode-content-type) ;silence byte-compiler warning +;;; Custom Variables +(defgroup all-the-icons nil + "Manage how All The Icons formats icons." + :prefix "all-the-icons-" + :group 'appearance + :group 'convenience) + +(defcustom all-the-icons-color-icons t + "Whether or not to include a foreground colour when formatting the icon." + :group 'all-the-icons + :type 'boolean) + +(defcustom all-the-icons-scale-factor 1.2 + "The base Scale Factor for the `height' face property of an icon." + :group 'all-the-icons + :type 'number) + +(defcustom all-the-icons-default-adjust -0.2 + "The default adjustment to be made to the `raise' display property of an icon." + :group 'all-the-icons + :type 'number) + +(defvar all-the-icons-font-families '() "List of defined icon font families.") +(defvar all-the-icons-font-names '() "List of defined font file names this package was built with.") + +(defvar all-the-icons-extension-icon-alist + '( + ("fish" all-the-icons-alltheicon "terminal" :face all-the-icons-lpink) + ("zsh" all-the-icons-alltheicon "terminal" :face all-the-icons-lcyan) + ("sh" all-the-icons-alltheicon "terminal" :face all-the-icons-purple) + ;; Meta + ("tags" all-the-icons-octicon "tag" :height 1.0 :v-adjust 0.0 :face all-the-icons-blue) + ("log" all-the-icons-octicon "bug" :height 1.0 :v-adjust 0.0 :face all-the-icons-maroon) + ;; Config + ("node" all-the-icons-alltheicon "nodejs" :height 1.0 :face all-the-icons-green) + ("babelrc" all-the-icons-fileicon "babel" :face all-the-icons-yellow) + ("bashrc" all-the-icons-alltheicon "script" :height 0.9 :face all-the-icons-dpink) + ("bowerrc" all-the-icons-alltheicon "bower" :height 1.0 :v-adjust 0.0 :face all-the-icons-silver) + ("ini" all-the-icons-octicon "settings" :v-adjust 0.0 :face all-the-icons-yellow) + ("eslintignore" all-the-icons-fileicon "eslint" :height 0.9 :face all-the-icons-purple) + ("eslint" all-the-icons-fileicon "eslint" :height 0.9 :face all-the-icons-lpurple) + ("git" all-the-icons-alltheicon "git" :height 1.0 :face all-the-icons-lred) + ("mk" all-the-icons-fileicon "gnu" :face all-the-icons-dorange) + ("cmake" all-the-icons-fileicon "cmake" :face all-the-icons-red) + ("dockerignore" all-the-icons-fileicon "dockerfile" :height 1.2 :face all-the-icons-dblue) + ("xml" all-the-icons-faicon "file-code-o" :height 0.95 :face all-the-icons-lorange) + ("json" all-the-icons-octicon "settings" :v-adjust 0.0 :face all-the-icons-yellow) + ("cson" all-the-icons-octicon "settings" :v-adjust 0.0 :face all-the-icons-yellow) + ("yml" all-the-icons-octicon "settings" :v-adjust 0.0 :face all-the-icons-dyellow) + ("yaml" all-the-icons-octicon "settings" :v-adjust 0.0 :face all-the-icons-dyellow) + ;; ? + ("pkg" all-the-icons-octicon "package" :v-adjust 0.0 :face all-the-icons-dsilver) + ("rpm" all-the-icons-octicon "package" :v-adjust 0.0 :face all-the-icons-dsilver) + ("elc" all-the-icons-octicon "file-binary" :v-adjust 0.0 :face all-the-icons-dsilver) + ("gz" all-the-icons-octicon "file-binary" :v-adjust 0.0 :face all-the-icons-lmaroon) + ("zip" all-the-icons-octicon "file-zip" :v-adjust 0.0 :face all-the-icons-lmaroon) + ("7z" all-the-icons-octicon "file-zip" :v-adjust 0.0 :face all-the-icons-lmaroon) + ("dat" all-the-icons-faicon "bar-chart" :face all-the-icons-cyan :height 0.9) + ("dmg" all-the-icons-octicon "tools" :v-adjust 0.0 :face all-the-icons-lsilver) + ("dll" all-the-icons-faicon "cogs" :face all-the-icons-silver) + ("ds_store" all-the-icons-faicon "cogs" :face all-the-icons-silver) + ;; Source Codes + ("scpt" all-the-icons-fileicon "apple" :face all-the-icons-pink) + ("aup" all-the-icons-fileicon "audacity" :face all-the-icons-yellow) + ("elm" all-the-icons-fileicon "elm" :face all-the-icons-blue) + ("erl" all-the-icons-alltheicon "erlang" :face all-the-icons-red :v-adjust -0.1 :height 0.9) + ("hrl" all-the-icons-alltheicon "erlang" :face all-the-icons-dred :v-adjust -0.1 :height 0.9) + ("eex" all-the-icons-alltheicon "elixir" :face all-the-icons-lorange :v-adjust -0.1 :height 0.9) + ("leex" all-the-icons-alltheicon "elixir" :face all-the-icons-lorange :v-adjust -0.1 :height 0.9) + ("ex" all-the-icons-alltheicon "elixir" :face all-the-icons-lpurple :v-adjust -0.1 :height 0.9) + ("exs" all-the-icons-alltheicon "elixir" :face all-the-icons-lred :v-adjust -0.1 :height 0.9) + ("java" all-the-icons-alltheicon "java" :height 1.0 :face all-the-icons-purple) + ("go" all-the-icons-alltheicon "go" :height 1.0 :face all-the-icons-blue) + ("jl" all-the-icons-fileicon "julia" :face all-the-icons-purple :v-adjust 0.0) + ("matlab" all-the-icons-fileicon "matlab" :face all-the-icons-orange) + ("nix" all-the-icons-fileicon "nix" :face all-the-icons-blue) + ("pl" all-the-icons-alltheicon "perl" :face all-the-icons-lorange) + ("pm" all-the-icons-alltheicon "perl" :face all-the-icons-lorange) + ("pl6" all-the-icons-fileicon "perl6" :face all-the-icons-cyan) + ("pm6" all-the-icons-fileicon "perl6" :face all-the-icons-pink) + ("pod" all-the-icons-alltheicon "perldocs" :height 1.2 :face all-the-icons-lgreen) + ("php" all-the-icons-fileicon "php" :face all-the-icons-lsilver) + ("pony" all-the-icons-fileicon "pony" :face all-the-icons-maroon) + ("ps1" all-the-icons-fileicon "powershell" :face all-the-icons-blue) + ("pro" all-the-icons-alltheicon "prolog" :height 1.1 :face all-the-icons-lmaroon) + ("proog" all-the-icons-alltheicon "prolog" :height 1.1 :face all-the-icons-lmaroon) + ("py" all-the-icons-alltheicon "python" :height 1.0 :face all-the-icons-dblue) + ("ipynb" all-the-icons-fileicon "jupyter" :height 1.0 :face all-the-icons-dorange) + ("rkt" all-the-icons-fileicon "racket" :height 1.2 :face all-the-icons-red) + ("gem" all-the-icons-alltheicon "ruby-alt" :face all-the-icons-red) + ("rb" all-the-icons-octicon "ruby" :v-adjust 0.0 :face all-the-icons-lred) + ("rs" all-the-icons-alltheicon "rust" :height 1.2 :face all-the-icons-maroon) + ("rlib" all-the-icons-alltheicon "rust" :height 1.2 :face all-the-icons-dmaroon) + ("r" all-the-icons-fileicon "R" :face all-the-icons-lblue) + ("rd" all-the-icons-fileicon "R" :face all-the-icons-lblue) + ("rdx" all-the-icons-fileicon "R" :face all-the-icons-lblue) + ("rs" all-the-icons-fileicon "R" :face all-the-icons-lblue) + ("rsx" all-the-icons-fileicon "R" :face all-the-icons-lblue) + ;; There seems to be a a bug with this font icon which does not + ;; let you propertise it without it reverting to being a lower + ;; case phi + ("c" all-the-icons-alltheicon "c-line" :face all-the-icons-blue) + ("h" all-the-icons-alltheicon "c-line" :face all-the-icons-purple) + ("m" all-the-icons-fileicon "apple" :v-adjust 0.0 :height 1.0) + ("mm" all-the-icons-fileicon "apple" :v-adjust 0.0 :height 1.0) + ;; + ("cc" all-the-icons-alltheicon "cplusplus-line" :v-adjust -0.2 :face all-the-icons-blue) + ("cpp" all-the-icons-alltheicon "cplusplus-line" :v-adjust -0.2 :face all-the-icons-blue) + ("cxx" all-the-icons-alltheicon "cplusplus-line" :v-adjust -0.2 :face all-the-icons-blue) + ("hh" all-the-icons-alltheicon "cplusplus-line" :v-adjust -0.2 :face all-the-icons-purple) + ("hpp" all-the-icons-alltheicon "cplusplus-line" :v-adjust -0.2 :face all-the-icons-purple) + ("hxx" all-the-icons-alltheicon "cplusplus-line" :v-adjust -0.2 :face all-the-icons-purple) + ;; Lisps + ("cl" all-the-icons-fileicon "clisp" :face all-the-icons-lorange) + ("l" all-the-icons-fileicon "lisp" :face all-the-icons-orange) + ("lisp" all-the-icons-fileicon "lisp" :face all-the-icons-orange) + ("el" all-the-icons-fileicon "elisp" :height 1.0 :v-adjust -0.2 :face all-the-icons-purple) + ("clj" all-the-icons-alltheicon "clojure-line" :height 1.0 :face all-the-icons-blue :v-adjust 0.0) + ("cljc" all-the-icons-alltheicon "clojure-line" :height 1.0 :face all-the-icons-blue :v-adjust 0.0) + ("cljs" all-the-icons-fileicon "cljs" :height 1.0 :face all-the-icons-dblue :v-adjust 0.0) + ("coffee" all-the-icons-alltheicon "coffeescript" :height 1.0 :face all-the-icons-maroon) + ("iced" all-the-icons-alltheicon "coffeescript" :height 1.0 :face all-the-icons-lmaroon) + ("dart" all-the-icons-fileicon "dart" :height 1.0 :face all-the-icons-blue :v-adjust 0.0) + ;; Stylesheeting + ("css" all-the-icons-alltheicon "css3" :face all-the-icons-yellow) + ("scss" all-the-icons-alltheicon "sass" :face all-the-icons-pink) + ("sass" all-the-icons-alltheicon "sass" :face all-the-icons-dpink) + ("less" all-the-icons-alltheicon "less" :height 0.8 :face all-the-icons-dyellow) + ("postcss" all-the-icons-fileicon "postcss" :face all-the-icons-dred) + ("sss" all-the-icons-fileicon "postcss" :face all-the-icons-dred) + ("styl" all-the-icons-alltheicon "stylus" :face all-the-icons-lgreen) + ("csv" all-the-icons-octicon "graph" :v-adjust 0.0 :face all-the-icons-dblue) + ;; haskell + ("hs" all-the-icons-alltheicon "haskell" :height 1.0 :face all-the-icons-red) + ("chs" all-the-icons-alltheicon "haskell" :height 1.0 :face all-the-icons-red) + ("lhs" all-the-icons-alltheicon "haskell" :height 1.0 :face all-the-icons-red) + ("hsc" all-the-icons-alltheicon "haskell" :height 1.0 :face all-the-icons-red) + ;; Web modes + ("inky-haml" all-the-icons-fileicon "haml" :face all-the-icons-lyellow) + ("haml" all-the-icons-fileicon "haml" :face all-the-icons-lyellow) + ("htm" all-the-icons-alltheicon "html5" :face all-the-icons-orange) + ("html" all-the-icons-alltheicon "html5" :face all-the-icons-orange) + ("inky-er" all-the-icons-alltheicon "html5" :face all-the-icons-lred) + ("inky-erb" all-the-icons-alltheicon "html5" :face all-the-icons-lred) + ("erb" all-the-icons-alltheicon "html5" :face all-the-icons-lred) + ("hbs" all-the-icons-fileicon "moustache" :face all-the-icons-green) + ("inky-slim" all-the-icons-octicon "dashboard" :v-adjust 0.0 :face all-the-icons-yellow) + ("slim" all-the-icons-octicon "dashboard" :v-adjust 0.0 :face all-the-icons-yellow) + ("jade" all-the-icons-fileicon "jade" :face all-the-icons-red) + ("pug" all-the-icons-fileicon "pug-alt" :face all-the-icons-red) + ;; Javascript + ("d3js" all-the-icons-alltheicon "d3" :height 0.8 :face all-the-icons-lgreen) + ("re" all-the-icons-fileicon "reason" :height 1.0 :face all-the-icons-red-alt) + ("rei" all-the-icons-fileicon "reason" :height 1.0 :face all-the-icons-dred) + ("ml" all-the-icons-fileicon "ocaml" :height 1.0 :face all-the-icons-lpink) + ("mli" all-the-icons-fileicon "ocaml" :height 1.0 :face all-the-icons-dpink) + ("react" all-the-icons-alltheicon "react" :height 1.1 :face all-the-icons-lblue) + ("ts" all-the-icons-fileicon "typescript" :height 1.0 :v-adjust -0.1 :face all-the-icons-blue-alt) + ("js" all-the-icons-alltheicon "javascript" :height 1.0 :v-adjust 0.0 :face all-the-icons-yellow) + ("es" all-the-icons-alltheicon "javascript" :height 1.0 :v-adjust 0.0 :face all-the-icons-yellow) + ("jsx" all-the-icons-fileicon "jsx-2" :height 1.0 :v-adjust -0.1 :face all-the-icons-cyan-alt) + ("njs" all-the-icons-alltheicon "nodejs" :height 1.2 :face all-the-icons-lgreen) + ("vue" all-the-icons-fileicon "vue" :face all-the-icons-lgreen) + + ("sbt" all-the-icons-fileicon "sbt" :face all-the-icons-red) + ("scala" all-the-icons-alltheicon "scala" :face all-the-icons-red) + ("scm" all-the-icons-fileicon "scheme" :height 1.2 :face all-the-icons-red) + ("swift" all-the-icons-alltheicon "swift" :height 1.0 :v-adjust -0.1 :face all-the-icons-green) + + ("tcl" all-the-icons-fileicon "tcl" :height 1.0 :face all-the-icons-dred) + + ("tf" all-the-icons-fileicon "terraform" :height 1.0 :face all-the-icons-purple-alt) + ("tfvars" all-the-icons-fileicon "terraform" :height 1.0 :face all-the-icons-purple-alt) + ("tfstate" all-the-icons-fileicon "terraform" :height 1.0 :face all-the-icons-purple-alt) + + ("asm" all-the-icons-fileicon "assembly" :height 1.0 :face all-the-icons-blue) + ;; Verilog(-AMS) and SystemVerilog(-AMS) + ("v" all-the-icons-fileicon "verilog" :height 1.0 :v-adjust -0.2 :face all-the-icons-red) + ("vams" all-the-icons-fileicon "verilog" :height 1.0 :v-adjust -0.2 :face all-the-icons-red) + ("sv" all-the-icons-fileicon "verilog" :height 1.0 :v-adjust -0.2 :face all-the-icons-red) + ("sva" all-the-icons-fileicon "verilog" :height 1.0 :v-adjust -0.2 :face all-the-icons-red) + ("svh" all-the-icons-fileicon "verilog" :height 1.0 :v-adjust -0.2 :face all-the-icons-red) + ("svams" all-the-icons-fileicon "verilog" :height 1.0 :v-adjust -0.2 :face all-the-icons-red) + ;; VHDL(-AMS) + ("vhd" all-the-icons-fileicon "vhdl" :face all-the-icons-blue) + ("vhdl" all-the-icons-fileicon "vhdl" :face all-the-icons-blue) + ("vhms" all-the-icons-fileicon "vhdl" :face all-the-icons-blue) + ;; Cabal + ("cabal" all-the-icons-fileicon "cabal" :face all-the-icons-lblue) + ;; Kotlin + ("kt" all-the-icons-fileicon "kotlin" :face all-the-icons-orange) + ("kts" all-the-icons-fileicon "kotlin" :face all-the-icons-orange) + ;; Nimrod + ("nim" all-the-icons-fileicon "nimrod" :face all-the-icons-yellow) + ("nims" all-the-icons-fileicon "nimrod" :face all-the-icons-yellow) + ;; SQL + ("sql" all-the-icons-octicon "database" :face all-the-icons-silver) + ;; Styles + ("styles" all-the-icons-material "style" :face all-the-icons-red) + ;; Lua + ("lua" all-the-icons-fileicon "lua" :face all-the-icons-dblue) + ;; ASCII doc + ("adoc" all-the-icons-fileicon "asciidoc" :face all-the-icons-lblue) + ("asciidoc" all-the-icons-fileicon "asciidoc" :face all-the-icons-lblue) + ;; Puppet + ("pp" all-the-icons-fileicon "puppet" :face all-the-icons-yellow) + ;; Jinja + ("j2" all-the-icons-fileicon "jinja" :face all-the-icons-silver) + ("jinja2" all-the-icons-fileicon "jinja" :face all-the-icons-silver) + ;; Docker + ("dockerfile" all-the-icons-fileicon "dockerfile" :face all-the-icons-cyan) + ;; Vagrant + ("vagrantfile" all-the-icons-fileicon "vagrant" :face all-the-icons-blue) + ;; GLSL + ("glsl" all-the-icons-fileicon "vertex-shader" :face all-the-icons-blue) + ("vert" all-the-icons-fileicon "vertex-shader" :face all-the-icons-blue) + ("tesc" all-the-icons-fileicon "vertex-shader" :face all-the-icons-purple) + ("tese" all-the-icons-fileicon "vertex-shader" :face all-the-icons-dpurple) + ("geom" all-the-icons-fileicon "vertex-shader" :face all-the-icons-green) + ("frag" all-the-icons-fileicon "vertex-shader" :face all-the-icons-red) + ("comp" all-the-icons-fileicon "vertex-shader" :face all-the-icons-dblue) + ;; CUDA + ("cu" all-the-icons-fileicon "nvidia" :face all-the-icons-green) + ("cuh" all-the-icons-fileicon "nvidia" :face all-the-icons-green) + ;; C# + ("cs" all-the-icons-alltheicon "csharp-line" :face all-the-icons-dblue) + ("csx" all-the-icons-alltheicon "csharp-line" :face all-the-icons-dblue) + ;; F# + ("fs" all-the-icons-fileicon "fsharp" :face all-the-icons-blue-alt) + ("fsi" all-the-icons-fileicon "fsharp" :face all-the-icons-blue-alt) + ("fsx" all-the-icons-fileicon "fsharp" :face all-the-icons-blue-alt) + ("fsscript" all-the-icons-fileicon "fsharp" :face all-the-icons-blue-alt) + ;; zig + ("zig" all-the-icons-fileicon "zig" :face all-the-icons-orange) + ;; File Types + ("ico" all-the-icons-octicon "file-media" :v-adjust 0.0 :face all-the-icons-blue) + ("png" all-the-icons-octicon "file-media" :v-adjust 0.0 :face all-the-icons-orange) + ("gif" all-the-icons-octicon "file-media" :v-adjust 0.0 :face all-the-icons-green) + ("jpeg" all-the-icons-octicon "file-media" :v-adjust 0.0 :face all-the-icons-dblue) + ("jpg" all-the-icons-octicon "file-media" :v-adjust 0.0 :face all-the-icons-dblue) + ;; Audio + ("mp3" all-the-icons-faicon "volume-up" :face all-the-icons-dred) + ("wav" all-the-icons-faicon "volume-up" :face all-the-icons-dred) + ("m4a" all-the-icons-faicon "volume-up" :face all-the-icons-dred) + ("ogg" all-the-icons-faicon "volume-up" :face all-the-icons-dred) + ("flac" all-the-icons-faicon "volume-up" :face all-the-icons-dred) + ("opus" all-the-icons-faicon "volume-up" :face all-the-icons-dred) + ("au" all-the-icons-faicon "volume-up" :face all-the-icons-dred) + ("aif" all-the-icons-faicon "volume-up" :face all-the-icons-dred) + ("aifc" all-the-icons-faicon "volume-up" :face all-the-icons-dred) + ("aiff" all-the-icons-faicon "volume-up" :face all-the-icons-dred) + ("svg" all-the-icons-alltheicon "svg" :height 0.9 :face all-the-icons-lgreen) + ;; Video + ("mov" all-the-icons-faicon "film" :face all-the-icons-blue) + ("mp4" all-the-icons-faicon "film" :face all-the-icons-blue) + ("ogv" all-the-icons-faicon "film" :face all-the-icons-dblue) + ("mpg" all-the-icons-faicon "film" :face all-the-icons-blue) + ("mpeg" all-the-icons-faicon "film" :face all-the-icons-blue) + ("flv" all-the-icons-faicon "film" :face all-the-icons-blue) + ("ogv" all-the-icons-faicon "film" :face all-the-icons-dblue) + ("mkv" all-the-icons-faicon "film" :face all-the-icons-blue) + ("webm" all-the-icons-faicon "film" :face all-the-icons-blue) + ;; Fonts + ("ttf" all-the-icons-fileicon "font" :v-adjust 0.0 :face all-the-icons-dcyan) + ("woff" all-the-icons-fileicon "font" :v-adjust 0.0 :face all-the-icons-cyan) + ("woff2" all-the-icons-fileicon "font" :v-adjust 0.0 :face all-the-icons-cyan) + ;; Doc + ("pdf" all-the-icons-octicon "file-pdf" :v-adjust 0.0 :face all-the-icons-dred) + ("text" all-the-icons-octicon "file-text" :v-adjust 0.0 :face all-the-icons-cyan) + ("txt" all-the-icons-octicon "file-text" :v-adjust 0.0 :face all-the-icons-cyan) + ("doc" all-the-icons-fileicon "word" :face all-the-icons-blue) + ("docx" all-the-icons-fileicon "word" :face all-the-icons-blue) + ("docm" all-the-icons-fileicon "word" :face all-the-icons-blue) + ("texi" all-the-icons-fileicon "tex" :face all-the-icons-lred) + ("tex" all-the-icons-fileicon "tex" :face all-the-icons-lred) + ("md" all-the-icons-octicon "markdown" :v-adjust 0.0 :face all-the-icons-lblue) + ("bib" all-the-icons-fileicon "bib" :face all-the-icons-maroon) + ("org" all-the-icons-fileicon "org" :face all-the-icons-lgreen) + ("pps" all-the-icons-fileicon "powerpoint" :face all-the-icons-orange) + ("ppt" all-the-icons-fileicon "powerpoint" :face all-the-icons-orange) + ("pptsx" all-the-icons-fileicon "powerpoint" :face all-the-icons-orange) + ("ppttx" all-the-icons-fileicon "powerpoint" :face all-the-icons-orange) + ("knt" all-the-icons-fileicon "powerpoint" :face all-the-icons-cyan) + ("xlsx" all-the-icons-fileicon "excel" :face all-the-icons-dgreen) + ("xlsm" all-the-icons-fileicon "excel" :face all-the-icons-dgreen) + ("xlsb" all-the-icons-fileicon "excel" :face all-the-icons-dgreen) + ("xltx" all-the-icons-fileicon "excel" :face all-the-icons-dgreen) + ("xltm" all-the-icons-fileicon "excel" :face all-the-icons-dgreen) + ;; + ("key" all-the-icons-octicon "key" :v-adjust 0.0 :face all-the-icons-lblue) + ("pem" all-the-icons-octicon "key" :v-adjust 0.0 :face all-the-icons-orange) + ("p12" all-the-icons-octicon "key" :v-adjust 0.0 :face all-the-icons-dorange) + ("crt" all-the-icons-octicon "key" :v-adjust 0.0 :face all-the-icons-lblue) + ("pub" all-the-icons-octicon "key" :v-adjust 0.0 :face all-the-icons-blue) + ("gpg" all-the-icons-octicon "key" :v-adjust 0.0 :face all-the-icons-lblue) + ("cache" all-the-icons-octicon "database" :height 1.0 :v-adjust 0.0 :face all-the-icons-green))) + + +(define-obsolete-variable-alias 'all-the-icons-icon-alist + 'all-the-icons-regexp-icon-alist + "5.0.0" + "`all-the-icons-icon-alist' has been split to +`all-the-icons-extension-icon-alist' and `all-the-icons-regexp-icon-alist' +for performance sake.") + +(defvar all-the-icons-regexp-icon-alist + '( + ;; + ("^TAGS$" all-the-icons-octicon "tag" :height 1.0 :v-adjust 0.0 :face all-the-icons-blue) + ("^TODO$" all-the-icons-octicon "checklist" :v-adjust 0.0 :face all-the-icons-lyellow) + ("^LICENSE$" all-the-icons-octicon "book" :height 1.0 :v-adjust 0.0 :face all-the-icons-blue) + ("^readme" all-the-icons-octicon "book" :height 1.0 :v-adjust 0.0 :face all-the-icons-lcyan) + + ;; Config + ("^bower.json$" all-the-icons-alltheicon "bower" :height 1.0 :v-adjust 0.0 :face all-the-icons-lorange) + ("nginx" all-the-icons-fileicon "nginx" :height 0.9 :face all-the-icons-dgreen) + ("apache" all-the-icons-alltheicon "apache" :height 0.9 :face all-the-icons-dgreen) + ("^Makefile$" all-the-icons-fileicon "gnu" :face all-the-icons-dorange) + ("^CMakeLists.txt$" all-the-icons-fileicon "cmake" :face all-the-icons-red) + ("^CMakeCache.txt$" all-the-icons-fileicon "cmake" :face all-the-icons-blue) + + ("^\\.?Dockerfile" all-the-icons-fileicon "dockerfile" :face all-the-icons-blue) + ("^Brewfile$" all-the-icons-faicon "beer" :face all-the-icons-lsilver) + ("\\.npmignore$" all-the-icons-fileicon "npm" :face all-the-icons-dred) + ("^package.json$" all-the-icons-fileicon "npm" :face all-the-icons-red) + ("^package.lock.json$" all-the-icons-fileicon "npm" :face all-the-icons-dred) + ("^yarn\\.lock" all-the-icons-fileicon "yarn" :face all-the-icons-blue-alt) + + ;; ;; AWS + ("^stack.*.json$" all-the-icons-alltheicon "aws" :face all-the-icons-orange) + + + ("^serverless\\.yml$" all-the-icons-faicon "bolt" :v-adjust 0.0 :face all-the-icons-yellow) + + ;; lock files + ("~$" all-the-icons-octicon "lock" :v-adjust 0.0 :face all-the-icons-maroon) + + ;; Source Codes + ("^mix.lock$" all-the-icons-alltheicon "elixir" :face all-the-icons-lyellow :v-adjust -0.1 :height 0.9) + + ("^Gemfile\\(\\.lock\\)?$" all-the-icons-alltheicon "ruby-alt" :face all-the-icons-red) + ("_?test\\.rb$" all-the-icons-fileicon "test-ruby" :height 1.0 :v-adjust 0.0 :face all-the-icons-red) + ("_?test_helper\\.rb$" all-the-icons-fileicon "test-ruby" :height 1.0 :v-adjust 0.0 :face all-the-icons-dred) + ("_?spec\\.rb$" all-the-icons-fileicon "test-ruby" :height 1.0 :v-adjust 0.0 :face all-the-icons-red) + ("_?spec_helper\\.rb$" all-the-icons-fileicon "test-ruby" :height 1.0 :v-adjust 0.0 :face all-the-icons-dred) + + ("-?spec\\.ts$" all-the-icons-fileicon "test-typescript" :height 1.0 :v-adjust 0.0 :face all-the-icons-blue) + ("-?test\\.ts$" all-the-icons-fileicon "test-typescript" :height 1.0 :v-adjust 0.0 :face all-the-icons-blue) + ("-?spec\\.js$" all-the-icons-fileicon "test-js" :height 1.0 :v-adjust 0.0 :face all-the-icons-lpurple) + ("-?test\\.js$" all-the-icons-fileicon "test-js" :height 1.0 :v-adjust 0.0 :face all-the-icons-lpurple) + ("-?spec\\.jsx$" all-the-icons-fileicon "test-react" :height 1.0 :v-adjust 0.0 :face all-the-icons-blue-alt) + ("-?test\\.jsx$" all-the-icons-fileicon "test-react" :height 1.0 :v-adjust 0.0 :face all-the-icons-blue-alt) + + ;; Git + ("^MERGE_" all-the-icons-octicon "git-merge" :v-adjust 0.0 :face all-the-icons-red) + ("^COMMIT_EDITMSG" all-the-icons-octicon "git-commit" :v-adjust 0.0 :face all-the-icons-red) + + ;; Stylesheeting + ("stylelint" all-the-icons-fileicon "stylelint" :face all-the-icons-lyellow) + ;; JavaScript + ("^gulpfile" all-the-icons-alltheicon "gulp" :height 1.0 :face all-the-icons-lred) + ("^gruntfile" all-the-icons-alltheicon "grunt" :height 1.0 :v-adjust -0.1 :face all-the-icons-lyellow) + ("^webpack" all-the-icons-fileicon "webpack" :face all-the-icons-lblue) + + ("bookmark" all-the-icons-octicon "bookmark" :height 1.1 :v-adjust 0.0 :face all-the-icons-lpink) + + ("^\\*scratch\\*$" all-the-icons-faicon "sticky-note" :face all-the-icons-lyellow) + ("^\\*scratch.*" all-the-icons-faicon "sticky-note" :face all-the-icons-yellow) + ("^\\*new-tab\\*$" all-the-icons-material "star" :face all-the-icons-cyan) + + ("^\\." all-the-icons-octicon "gear" :v-adjust 0.0) + (".?" all-the-icons-faicon "file-o" :v-adjust 0.0 :face all-the-icons-dsilver))) + +(defvar all-the-icons-dir-icon-alist + '( + ("trash" all-the-icons-faicon "trash-o" :height 1.2 :v-adjust -0.1) + ("dropbox" all-the-icons-faicon "dropbox" :height 1.0 :v-adjust -0.1) + ("google[ _-]drive" all-the-icons-alltheicon "google-drive" :height 1.0 :v-adjust -0.1) + ("^atom$" all-the-icons-alltheicon "atom" :height 1.2 :v-adjust -0.1) + ("documents" all-the-icons-faicon "book" :height 1.0 :v-adjust -0.1) + ("download" all-the-icons-faicon "cloud-download" :height 0.9 :v-adjust -0.1) + ("desktop" all-the-icons-octicon "device-desktop" :height 1.0 :v-adjust -0.1) + ("pictures" all-the-icons-faicon "picture-o" :height 0.9 :v-adjust -0.2) + ("photos" all-the-icons-faicon "camera-retro" :height 1.0 :v-adjust -0.1) + ("music" all-the-icons-faicon "music" :height 1.0 :v-adjust -0.1) + ("movies" all-the-icons-faicon "film" :height 0.9 :v-adjust -0.1) + ("code" all-the-icons-octicon "code" :height 1.1 :v-adjust -0.1) + ("workspace" all-the-icons-octicon "code" :height 1.1 :v-adjust -0.1) + ("test" all-the-icons-fileicon "test-dir" :height 0.9) + ("\\.git" all-the-icons-alltheicon "git" :height 1.0) + (".?" all-the-icons-octicon "file-directory" :height 1.0 :v-adjust -0.1) + )) + +(defvar all-the-icons-weather-icon-alist + '( + ("tornado" all-the-icons-wicon "tornado") + ("hurricane" all-the-icons-wicon "hurricane") + ("thunderstorms" all-the-icons-wicon "thunderstorm") + ("sunny" all-the-icons-wicon "day-sunny") + ("rain.*snow" all-the-icons-wicon "rain-mix") + ("rain.*hail" all-the-icons-wicon "rain-mix") + ("sleet" all-the-icons-wicon "sleet") + ("hail" all-the-icons-wicon "hail") + ("drizzle" all-the-icons-wicon "sprinkle") + ("rain" all-the-icons-wicon "showers" :height 1.1 :v-adjust 0.0) + ("showers" all-the-icons-wicon "showers") + ("blowing.*snow" all-the-icons-wicon "snow-wind") + ("snow" all-the-icons-wicon "snow") + ("dust" all-the-icons-wicon "dust") + ("fog" all-the-icons-wicon "fog") + ("haze" all-the-icons-wicon "day-haze") + ("smoky" all-the-icons-wicon "smoke") + ("blustery" all-the-icons-wicon "cloudy-windy") + ("windy" all-the-icons-wicon "cloudy-gusts") + ("cold" all-the-icons-wicon "snowflake-cold") + ("partly.*cloudy.*night" all-the-icons-wicon "night-alt-partly-cloudy") + ("partly.*cloudy" all-the-icons-wicon "day-cloudy-high") + ("cloudy.*night" all-the-icons-wicon "night-alt-cloudy") + ("cxloudy.*day" all-the-icons-wicon "day-cloudy") + ("cloudy" all-the-icons-wicon "cloudy") + ("clear.*night" all-the-icons-wicon "night-clear") + ("fair.*night" all-the-icons-wicon "stars") + ("fair.*day" all-the-icons-wicon "horizon") + ("hot" all-the-icons-wicon "hot") + ("not.*available" all-the-icons-wicon "na") + )) + +(defvar all-the-icons-mode-icon-alist + '( + (emacs-lisp-mode all-the-icons-fileicon "elisp" :height 1.0 :v-adjust -0.1 :face all-the-icons-purple) + (circe-server-mode all-the-icons-faicon "commenting-o" :height 1.0 :v-adjust 0.0) + (circe-channel-mode all-the-icons-faicon "commenting-o" :height 1.0 :v-adjust 0.0) + (erc-mode all-the-icons-faicon "commenting-o" :height 1.0 :v-adjust 0.0) + (inferior-emacs-lisp-mode all-the-icons-fileicon "elisp" :height 1.0 :v-adjust -0.1 :face all-the-icons-lblue) + (dired-mode all-the-icons-octicon "file-directory" :v-adjust 0.0) + (lisp-interaction-mode all-the-icons-fileicon "lisp" :v-adjust -0.1 :face all-the-icons-orange) + (sly-mrepl-mode all-the-icons-fileicon "clisp" :v-adjust -0.1 :face all-the-icons-orange) + (slime-repl-mode all-the-icons-fileicon "clisp" :v-adjust -0.1 :face all-the-icons-orange) + (org-mode all-the-icons-fileicon "org" :v-adjust 0.0 :face all-the-icons-lgreen) + (typescript-mode all-the-icons-fileicon "typescript" :v-adjust -0.1 :face all-the-icons-blue-alt) + (js-mode all-the-icons-alltheicon "javascript" :v-adjust -0.1 :face all-the-icons-yellow) + (js-jsx-mode all-the-icons-alltheicon "javascript" :v-adjust -0.1 :face all-the-icons-yellow) + (js2-mode all-the-icons-alltheicon "javascript" :v-adjust -0.1 :face all-the-icons-yellow) + (js3-mode all-the-icons-alltheicon "javascript" :v-adjust -0.1 :face all-the-icons-yellow) + (rjsx-mode all-the-icons-fileicon "jsx-2" :v-adjust -0.1 :face all-the-icons-cyan-alt) + (term-mode all-the-icons-octicon "terminal" :v-adjust 0.2) + (vterm-mode all-the-icons-octicon "terminal" :v-adjust 0.2) + (eshell-mode all-the-icons-octicon "terminal" :v-adjust 0.0 :face all-the-icons-purple) + (magit-refs-mode all-the-icons-octicon "git-branch" :v-adjust 0.0 :face all-the-icons-red) + (magit-process-mode all-the-icons-octicon "mark-github" :v-adjust 0.0) + (magit-diff-mode all-the-icons-octicon "git-compare" :v-adjust 0.0 :face all-the-icons-lblue) + (ediff-mode all-the-icons-octicon "git-compare" :v-adjust 0.0 :Face all-the-icons-red) + (comint-mode all-the-icons-faicon "terminal" :v-adjust 0.0 :face all-the-icons-lblue) + (eww-mode all-the-icons-faicon "firefox" :v-adjust -0.1 :face all-the-icons-red) + (org-agenda-mode all-the-icons-octicon "checklist" :v-adjust 0.0 :face all-the-icons-lgreen) + (cfw:calendar-mode all-the-icons-octicon "calendar" :v-adjust 0.0) + (ibuffer-mode all-the-icons-faicon "files-o" :v-adjust 0.0 :face all-the-icons-dsilver) + (messages-buffer-mode all-the-icons-faicon "file-o" :v-adjust 0.0 :face all-the-icons-dsilver) + (help-mode all-the-icons-faicon "info" :v-adjust -0.1 :face all-the-icons-purple) + (benchmark-init/tree-mode all-the-icons-octicon "dashboard" :v-adjust 0.0) + (jenkins-mode all-the-icons-fileicon "jenkins" :face all-the-icons-blue) + (magit-popup-mode all-the-icons-alltheicon "git" :face all-the-icons-red) + (magit-status-mode all-the-icons-alltheicon "git" :face all-the-icons-lred) + (magit-log-mode all-the-icons-alltheicon "git" :face all-the-icons-green) + (mu4e-compose-mode all-the-icons-octicon "pencil" :v-adjust 0.0) + (mu4e-headers-mode all-the-icons-octicon "mail" :v-adjust 0.0) + (mu4e-main-mode all-the-icons-octicon "mail" :v-adjust 0.0) + (mu4e-view-mode all-the-icons-octicon "mail-read" :v-adjust 0.0) + (package-menu-mode all-the-icons-faicon "archive" :height 1.0 :v-adjust 0.0 :face all-the-icons-silver) + (paradox-menu-mode all-the-icons-faicon "archive" :height 1.0 :v-adjust 0.0 :face all-the-icons-silver) + (Custom-mode all-the-icons-octicon "settings" :v-adjust -0.1) + + ;; Special matcher for Web Mode based on the `web-mode-content-type' of the current buffer + (web-mode all-the-icons--web-mode-icon) + + (fundamental-mode all-the-icons-fileicon "elisp" :height 1.0 :v-adjust -0.1 :face all-the-icons-dsilver) + (special-mode all-the-icons-fileicon "elisp" :height 1.0 :v-adjust -0.1 :face all-the-icons-yellow) + (text-mode all-the-icons-octicon "file-text" :v-adjust 0.0 :face all-the-icons-cyan) + (enh-ruby-mode all-the-icons-alltheicon "ruby-alt" :face all-the-icons-lred) + (ruby-mode all-the-icons-alltheicon "ruby-alt" :face all-the-icons-lred) + (inf-ruby-mode all-the-icons-alltheicon "ruby-alt" :face all-the-icons-red) + (projectile-rails-compilation-mode all-the-icons-alltheicon "ruby-alt" :face all-the-icons-red) + (rspec-compilation-mode all-the-icons-alltheicon "ruby-alt" :face all-the-icons-red) + (rake-compilation-mode all-the-icons-alltheicon "ruby-alt" :face all-the-icons-red) + (sh-mode all-the-icons-alltheicon "terminal" :face all-the-icons-purple) + (shell-mode all-the-icons-alltheicon "terminal" :face all-the-icons-purple) + (fish-mode all-the-icons-alltheicon "terminal" :face all-the-icons-lpink) + (nginx-mode all-the-icons-fileicon "nginx" :height 0.9 :face all-the-icons-dgreen) + (apache-mode all-the-icons-alltheicon "apache" :height 0.9 :face all-the-icons-dgreen) + (makefile-mode all-the-icons-fileicon "gnu" :face all-the-icons-dorange) + (cmake-mode all-the-icons-fileicon "cmake" :face all-the-icons-red) + (dockerfile-mode all-the-icons-fileicon "dockerfile" :face all-the-icons-blue) + (docker-compose-mode all-the-icons-fileicon "dockerfile" :face all-the-icons-lblue) + (nxml-mode all-the-icons-faicon "file-code-o" :height 0.95 :face all-the-icons-lorange) + (json-mode all-the-icons-octicon "settings" :face all-the-icons-yellow) + (yaml-mode all-the-icons-octicon "settings" :v-adjust 0.0 :face all-the-icons-dyellow) + (elisp-byte-code-mode all-the-icons-octicon "file-binary" :v-adjust 0.0 :face all-the-icons-dsilver) + (archive-mode all-the-icons-octicon "file-zip" :v-adjust 0.0 :face all-the-icons-lmaroon) + (elm-mode all-the-icons-fileicon "elm" :face all-the-icons-blue) + (erlang-mode all-the-icons-alltheicon "erlang" :face all-the-icons-red :v-adjust -0.1 :height 0.9) + (elixir-mode all-the-icons-alltheicon "elixir" :face all-the-icons-lorange :v-adjust -0.1 :height 0.9) + (java-mode all-the-icons-alltheicon "java" :height 1.0 :face all-the-icons-purple) + (go-mode all-the-icons-fileicon "go" :height 1.0 :face all-the-icons-blue) + (matlab-mode all-the-icons-fileicon "matlab" :face all-the-icons-orange) + (perl-mode all-the-icons-alltheicon "perl" :face all-the-icons-lorange) + (cperl-mode all-the-icons-alltheicon "perl" :face all-the-icons-lorange) + (php-mode all-the-icons-fileicon "php" :face all-the-icons-lsilver) + (prolog-mode all-the-icons-alltheicon "prolog" :height 1.1 :face all-the-icons-lmaroon) + (python-mode all-the-icons-alltheicon "python" :height 1.0 :face all-the-icons-dblue) + (inferior-python-mode all-the-icons-alltheicon "python" :height 1.0 :face all-the-icons-dblue) + (racket-mode all-the-icons-fileicon "racket" :height 1.2 :face all-the-icons-red) + (rust-mode all-the-icons-alltheicon "rust" :height 1.2 :face all-the-icons-maroon) + (scala-mode all-the-icons-alltheicon "scala" :face all-the-icons-red) + (scheme-mode all-the-icons-fileicon "scheme" :height 1.2 :face all-the-icons-red) + (swift-mode all-the-icons-alltheicon "swift" :height 1.0 :v-adjust -0.1 :face all-the-icons-green) + (c-mode all-the-icons-alltheicon "c-line" :face all-the-icons-blue) + (c++-mode all-the-icons-alltheicon "cplusplus-line" :v-adjust -0.2 :face all-the-icons-blue) + (csharp-mode all-the-icons-alltheicon "csharp-line" :face all-the-icons-dblue) + (clojure-mode all-the-icons-alltheicon "clojure" :height 1.0 :face all-the-icons-blue) + (cider-repl-mode all-the-icons-alltheicon "clojure" :height 1.0 :face all-the-icons-green) + (clojurescript-mode all-the-icons-fileicon "cljs" :height 1.0 :face all-the-icons-dblue) + (coffee-mode all-the-icons-alltheicon "coffeescript" :height 1.0 :face all-the-icons-maroon) + (lisp-mode all-the-icons-fileicon "lisp" :face all-the-icons-orange) + (css-mode all-the-icons-alltheicon "css3" :face all-the-icons-yellow) + (scss-mode all-the-icons-alltheicon "sass" :face all-the-icons-pink) + (sass-mode all-the-icons-alltheicon "sass" :face all-the-icons-dpink) + (less-css-mode all-the-icons-alltheicon "less" :height 0.8 :face all-the-icons-dyellow) + (stylus-mode all-the-icons-alltheicon "stylus" :face all-the-icons-lgreen) + (csv-mode all-the-icons-octicon "graph" :v-adjust 0.0 :face all-the-icons-dblue) + (haskell-mode all-the-icons-alltheicon "haskell" :height 1.0 :face all-the-icons-red) + (haskell-c2hs-mode all-the-icons-alltheicon "haskell" :height 1.0 :face all-the-icons-red) + (literate-haskell-mode all-the-icons-alltheicon "haskell" :height 1.0 :face all-the-icons-red) + (haml-mode all-the-icons-fileicon "haml" :face all-the-icons-lyellow) + (html-mode all-the-icons-alltheicon "html5" :face all-the-icons-orange) + (rhtml-mode all-the-icons-alltheicon "html5" :face all-the-icons-lred) + (mustache-mode all-the-icons-fileicon "moustache" :face all-the-icons-green) + (slim-mode all-the-icons-octicon "dashboard" :v-adjust 0.0 :face all-the-icons-yellow) + (jade-mode all-the-icons-fileicon "jade" :face all-the-icons-red) + (pug-mode all-the-icons-fileicon "pug" :face all-the-icons-red) + (react-mode all-the-icons-alltheicon "react" :height 1.1 :face all-the-icons-lblue) + (image-mode all-the-icons-octicon "file-media" :v-adjust 0.0 :face all-the-icons-blue) + (texinfo-mode all-the-icons-fileicon "tex" :face all-the-icons-lred) + (markdown-mode all-the-icons-octicon "markdown" :v-adjust 0.0 :face all-the-icons-lblue) + (bibtex-mode all-the-icons-fileicon "bib" :face all-the-icons-maroon) + (org-mode all-the-icons-fileicon "org" :face all-the-icons-lgreen) + (compilation-mode all-the-icons-faicon "cogs" :v-adjust 0.0 :height 1.0) + (objc-mode all-the-icons-faicon "apple" :v-adjust 0.0 :height 1.0) + (tuareg-mode all-the-icons-fileicon "ocaml" :v-adjust 0.0 :height 1.0) + (purescript-mode all-the-icons-fileicon "purescript" :v-adjust 0.0 :height 1.0) + (verilog-mode all-the-icons-fileicon "verilog" :height 1.0 :v-adjust -0.2 :face all-the-icons-red) + (vhdl-mode all-the-icons-fileicon "vhdl" :face all-the-icons-blue) + (haskell-cabal-mode all-the-icons-fileicon "cabal" :face all-the-icons-lblue) + (kotlin-mode all-the-icons-fileicon "kotlin" :face all-the-icons-orange) + (nim-mode all-the-icons-fileicon "nimrod" :face all-the-icons-yellow) + (sql-mode all-the-icons-octicon "database" :face all-the-icons-silver) + (lua-mode all-the-icons-fileicon "lua" :face all-the-icons-dblue) + (adoc-mode all-the-icons-fileicon "asciidoc" :face all-the-icons-lblue) + (puppet-mode all-the-icons-fileicon "puppet" :face all-the-icons-yellow) + (jinja2-mode all-the-icons-fileicon "jinja" :face all-the-icons-silver) + (powershell-mode all-the-icons-fileicon "powershell" :face all-the-icons-blue) + (tex-mode all-the-icons-fileicon "tex" :face all-the-icons-lred) + (latex-mode all-the-icons-fileicon "tex" :face all-the-icons-lred) + (dart-mode all-the-icons-fileicon "dart" :height 1.0 :face all-the-icons-blue) + (fsharp-mode all-the-icons-fileicon "fsharp" :height 1.0 :face all-the-icons-blue) + (asm-mode all-the-icons-fileicon "assembly" :height 1.0 :face all-the-icons-blue) + (nasm-mode all-the-icons-fileicon "assembly" :height 1.0 :face all-the-icons-blue) + (tcl-mode all-the-icons-fileicon "tcl" :height 1.0 :face all-the-icons-dred) + (cuda-mode all-the-icons-fileicon "nvidia" :face all-the-icons-green) + (glsl-mode all-the-icons-fileicon "vertex-shader" :face all-the-icons-green) + (zig-mode all-the-icons-fileicon "zig" :face all-the-icons-orange))) + +(defvar all-the-icons-url-alist + '( + ;; Social media and communities + ("^\\(https?://\\)?\\(www\\.\\)?del\\.icio\\.us" all-the-icons-faicon "delicious") + ("^\\(https?://\\)?\\(www\\.\\)?behance\\.net" all-the-icons-faicon "behance") + ("^\\(https?://\\)?\\(www\\.\\)?dribbble\\.com" all-the-icons-faicon "dribbble") + ("^\\(https?://\\)?\\(www\\.\\)?facebook\\.com" all-the-icons-faicon "facebook-official") + ("^\\(https?://\\)?\\(www\\.\\)?glide\\.me" all-the-icons-faicon "glide-g") + ("^\\(https?://\\)?\\(www\\.\\)?plus\\.google\\.com" all-the-icons-faicon "google-plus") + ("linkedin\\.com" all-the-icons-faicon "linkedin") + ("^\\(https?://\\)?\\(www\\.\\)?ok\\.ru" all-the-icons-faicon "odnoklassniki") + ("^\\(https?://\\)?\\(www\\.\\)?reddit\\.com" all-the-icons-faicon "reddit-alien") + ("^\\(https?://\\)?\\(www\\.\\)?slack\\.com" all-the-icons-faicon "slack") + ("^\\(https?://\\)?\\(www\\.\\)?snapchat\\.com" all-the-icons-faicon "snapchat-ghost") + ("^\\(https?://\\)?\\(www\\.\\)?weibo\\.com" all-the-icons-faicon "weibo") + ("^\\(https?://\\)?\\(www\\.\\)?twitter\\.com" all-the-icons-faicon "twitter") + ;; Blogging + ("joomla\\.org" all-the-icons-faicon "joomla") + ("^\\(https?://\\)?\\(www\\.\\)?medium\\.com" all-the-icons-faicon "medium") + ("tumblr\\.com" all-the-icons-faicon "tumblr") + ("^wordpress\\.com" all-the-icons-faicon "wordpress") + ;; Programming + ("^\\(https?://\\)?\\(www\\.\\)?bitbucket\\.org" all-the-icons-faicon "bitbucket") + ("^\\(https?://\\)?\\(www\\.\\)?codepen\\.io" all-the-icons-faicon "codepen") + ("^\\(https?://\\)?\\(www\\.\\)?codiepie\\.com" all-the-icons-faicon "codiepie") + ("^\\(https?://\\)?\\(www\\.\\)?gist\\.github\\.com" all-the-icons-octicon "gist") + ("^\\(https?://\\)?\\(www\\.\\)?github\\.com" all-the-icons-octicon "mark-github") + ("^\\(https?://\\)?\\(www\\.\\)?gitlab\\.com" all-the-icons-faicon "gitlab") + ("^\\(https?://\\)?\\(www\\.\\)?news\\.ycombinator\\.com" all-the-icons-faicon "hacker-news") + ("^\\(https?://\\)?\\(www\\.\\)?jsfiddle\\.net" all-the-icons-faicon "jsfiddle") + ("^\\(https?://\\)?\\(www\\.\\)?maxcdn\\.com" all-the-icons-faicon "maxcdn") + ("^\\(https?://\\)?\\(www\\.\\)?stackoverflow\\.com" all-the-icons-faicon "stack-overflow") + ;; Video + ("^\\(https?://\\)?\\(www\\.\\)?twitch\\.tv" all-the-icons-faicon "twitch") + ("^\\(https?://\\)?\\(www\\.\\)?vimeo\\.com" all-the-icons-faicon "vimeo") + ("^\\(https?://\\)?\\(www\\.\\)?youtube\\.com" all-the-icons-faicon "youtube") + ("^\\(https?://\\)?\\(www\\.\\)?youtu\\.be" all-the-icons-faicon "youtube") + ("^\\(https?://\\)?\\(www\\.\\)?vine\\.co" all-the-icons-faicon "vine") + ;; Sound + ("^\\(https?://\\)?\\(www\\.\\)?last\\.fm" all-the-icons-faicon "lastfm") + ("^\\(https?://\\)?\\(www\\.\\)?mixcloud\\.com" all-the-icons-faicon "mixcloud") + ("^\\(https?://\\)?\\(www\\.\\)?soundcloud\\.com" all-the-icons-faicon "soundcloud") + ("spotify\\.com" all-the-icons-faicon "spotify") + ;; Shopping + ("^\\(https?://\\)?\\(www\\.\\)?amazon\\." all-the-icons-faicon "amazon") + ("^\\(https?://\\)?\\(www\\.\\)?opencart\\.com" all-the-icons-faicon "opencart") + ("^\\(https?://\\)?\\(www\\.\\)?paypal\\.com" all-the-icons-faicon "paypal") + ("^\\(https?://\\)?\\(www\\.\\)?shirtsinbulk\\.com" all-the-icons-faicon "shitsinbulk") + ;; Images + ("^\\(https?://\\)?\\(www\\.\\)?500px\\.com" all-the-icons-faicon "500px") + ("^\\(https?://\\)?\\(www\\.\\)?deviantart\\.com" all-the-icons-faicon "deviantart") + ("^\\(https?://\\)?\\(www\\.\\)?flickr\\.com" all-the-icons-faicon "flickr") + ("^\\(https?://\\)?\\(www\\.\\)?instagram\\.com" all-the-icons-faicon "instagram") + ("^\\(https?://\\)?\\(www\\.\\)?pinterest\\." all-the-icons-faicon "pinterest") + ;; Information and books + ("^\\(https?://\\)?\\(www\\.\\)?digg\\.com" all-the-icons-faicon "digg") + ("^\\(https?://\\)?\\(www\\.\\)?foursquare\\.com" all-the-icons-faicon "foursquare") + ("^\\(https?://\\)?\\(www\\.\\)?getpocket\\.com" all-the-icons-faicon "get-pocket") + ("^\\(https?://\\)?\\(www\\.\\)?scribd\\.com" all-the-icons-faicon "scribd") + ("^\\(https?://\\)?\\(www\\.\\)?slideshare\\.net" all-the-icons-faicon "slideshare") + ("stackexchange\\.com" all-the-icons-faicon "stack-exchange") + ("^\\(https?://\\)?\\(www\\.\\)?stumbleupon\\.com" all-the-icons-faicon "stumbleupon") + ("^\\(https?://\\)?\\(www\\.\\)?tripadvisor\\." all-the-icons-faicon "tripadvisor") + ("^\\(https?://\\)?\\(www\\.\\)?yelp\\." all-the-icons-faicon "yelp") + + ("wikipedia\\.org" all-the-icons-faicon "wikipedia-w") + ;; Various companies and tools + ("^\\(https?://\\)?\\(www\\.\\)?angel\\.co" all-the-icons-faicon "angellist") + ("^\\(https?://\\)?\\(www\\.\\)?apple\\.com" all-the-icons-faicon "apple") + ("^\\(https?://\\)?\\(www\\.\\)?buysellads\\.com" all-the-icons-faicon "buysellads") + ("^\\(https?://\\)?\\(www\\.\\)?connectdevelop\\.com" all-the-icons-faicon "connectdevelop") + ("^\\(https?://\\)?\\(www\\.\\)?dashcube\\.com" all-the-icons-faicon "dashcube") + ("^\\(https?://\\)?\\(www\\.\\)?dropbox\\.com" all-the-icons-faicon "dropbox") + ("^\\(https?://\\)?\\(www\\.\\)?enviragallery\\.com" all-the-icons-faicon "envira") + ("^\\(https?://\\)?\\(www\\.\\)?fortawesome\\.com" all-the-icons-faicon "fort-awesome") + ("^\\(https?://\\)?\\(www\\.\\)?forumbee\\.com" all-the-icons-faicon "forumbee") + ("^\\(https?://\\)?\\(www\\.\\)?gratipay\\.com" all-the-icons-faicon "gratipay") + ("^\\(https?://\\)?\\(www\\.\\)?modx\\.com" all-the-icons-faicon "modx") + ("^\\(https?://\\)?\\(www\\.\\)?pagelines\\.com" all-the-icons-faicon "pagelines") + ("^\\(https?://\\)?\\(www\\.\\)?producthunt\\.com" all-the-icons-faicon "product-hunt") + ("sellsy\\.com" all-the-icons-faicon "sellsy") + ("^\\(https?://\\)?\\(www\\.\\)?simplybuilt\\.com" all-the-icons-faicon "simplybuilt") + ("^\\(https?://\\)?\\(www\\.\\)?skyatlas\\.com" all-the-icons-faicon "skyatlas") + ("^\\(https?://\\)?\\(www\\.\\)?skype\\.com" all-the-icons-faicon "skype") + ("steampowered\\.com" all-the-icons-faicon "steam") + ("^\\(https?://\\)?\\(www\\.\\)?themeisle\\.com" all-the-icons-faicon "themeisle") + ("^\\(https?://\\)?\\(www\\.\\)?trello\\.com" all-the-icons-faicon "trello") + ("^\\(https?://\\)?\\(www\\.\\)?whatsapp\\.com" all-the-icons-faicon "whatsapp") + ("^\\(https?://\\)?\\(www\\.\\)?ycombinator\\.com" all-the-icons-faicon "y-combinator") + ("yahoo\\.com" all-the-icons-faicon "yahoo") + ("^\\(https?://\\)?\\(www\\.\\)?yoast\\.com" all-the-icons-faicon "yoast") + ;; Catch all + ("android" all-the-icons-faicon "android") + ("creativecommons" all-the-icons-faicon "creative-commons") + ("forums?" all-the-icons-octicon "comment-discussion") + ("\\.pdf$" all-the-icons-octicon "file-pdf" :v-adjust 0.0 :face all-the-icons-dred) + ("google" all-the-icons-faicon "google") + ("\\.rss" all-the-icons-faicon "rss") + )) + +;; ==================== +;; Functions Start +;; ==================== + +(defun all-the-icons-auto-mode-match? (&optional file) + "Whether or not FILE's `major-mode' match against its `auto-mode-alist'." + (let* ((file (or file (buffer-file-name) (buffer-name))) + (auto-mode (all-the-icons-match-to-alist file auto-mode-alist))) + (eq major-mode auto-mode))) + +(defun all-the-icons-match-to-alist (file alist) + "Match FILE against an entry in ALIST using `string-match'." + (cdr (cl-find-if (lambda (it) (string-match (car it) file)) alist))) + +(defun all-the-icons-dir-is-submodule (dir) + "Checker whether or not DIR is a git submodule." + (let* ((gitmodule-dir (locate-dominating-file dir ".gitmodules")) + (modules-file (expand-file-name (format "%s.gitmodules" gitmodule-dir))) + (module-search (format "submodule \".*?%s\"" (file-name-base dir)))) + + (when (and gitmodule-dir (file-exists-p (format "%s/.git" dir))) + (with-temp-buffer + (insert-file-contents modules-file) + (search-forward-regexp module-search (point-max) t))))) + +;; Icon functions +(defun all-the-icons-icon-for-dir-with-chevron (dir &optional chevron padding) + "Format an icon for DIR with CHEVRON similar to tree based directories. + +If PADDING is provided, it will prepend and separate the chevron +and directory with PADDING. + +Produces different symbols by inspecting DIR to distinguish +symlinks and git repositories which do not depend on the +directory contents" + (let ((icon (all-the-icons-icon-for-dir dir)) + (chevron (if chevron (all-the-icons-octicon (format "chevron-%s" chevron) :height 0.8 :v-adjust -0.1) "")) + (padding (or padding "\t"))) + (format "%s%s%s%s%s" padding chevron padding icon padding))) + +(defun all-the-icons-icon-for-buffer () + "Get the formatted icon for the current buffer. + +This function prioritises the use of the buffers file extension to +discern the icon when its `major-mode' matches its auto mode, +otherwise it will use the buffers `major-mode' to decide its +icon." + (all-the-icons--icon-info-for-buffer)) + +(defun all-the-icons-icon-family-for-buffer () + "Get the icon font family for the current buffer." + (all-the-icons--icon-info-for-buffer "family")) + +(defun all-the-icons--web-mode-icon (&rest arg-overrides) "Get icon for a `web-mode' buffer with ARG-OVERRIDES." (all-the-icons--web-mode nil arg-overrides)) +(defun all-the-icons--web-mode-icon-family () "Get icon family for a `web-mode' buffer." (all-the-icons--web-mode t)) +(defun all-the-icons--web-mode (&optional family arg-overrides) + "Return icon or FAMILY for `web-mode' based on `web-mode-content-type'. +Providing ARG-OVERRIDES will modify the creation of the icon." + (let ((non-nil-args (cl-reduce (lambda (acc it) (if it (append acc (list it)) acc)) arg-overrides :initial-value '()))) + (cond + ((equal web-mode-content-type "jsx") + (if family (all-the-icons-fileicon-family) (apply 'all-the-icons-fileicon (append '("jsx-2") non-nil-args)))) + ((equal web-mode-content-type "javascript") + (if family (all-the-icons-alltheicon-family) (apply 'all-the-icons-alltheicon (append '("javascript") non-nil-args)))) + ((equal web-mode-content-type "json") + (if family (all-the-icons-alltheicon-family) (apply 'all-the-icons-alltheicon (append '("less") non-nil-args)))) + ((equal web-mode-content-type "xml") + (if family (all-the-icons-faicon-family) (apply 'all-the-icons-faicon (append '("file-code-o") non-nil-args)))) + ((equal web-mode-content-type "css") + (if family (all-the-icons-alltheicon-family) (apply 'all-the-icons-alltheicon (append '("css3") non-nil-args)))) + (t + (if family (all-the-icons-alltheicon-family) (apply 'all-the-icons-alltheicon (append '("html5") non-nil-args))))))) + +;; Icon Functions + +;;;###autoload +(defun all-the-icons-icon-for-dir (dir &rest arg-overrides) + "Get the formatted icon for DIR. +ARG-OVERRIDES should be a plist containining `:height', +`:v-adjust' or `:face' properties like in the normal icon +inserting functions. + +Note: You want chevron, please use `all-the-icons-icon-for-dir-with-chevron'." + (let* ((dirname (file-name-base (directory-file-name dir))) + (path (expand-file-name dir)) + (icon (all-the-icons-match-to-alist dirname all-the-icons-dir-icon-alist)) + (args (cdr icon))) + (when arg-overrides (setq args (append `(,(car args)) arg-overrides (cdr args)))) + (cond + ((file-symlink-p path) + (apply #'all-the-icons-octicon "file-symlink-directory" (cdr args))) + ((all-the-icons-dir-is-submodule path) + (apply #'all-the-icons-octicon "file-submodule" (cdr args))) + ((file-exists-p (format "%s/.git" path)) + (apply #'all-the-icons-octicon "repo" (cdr args))) + (t (apply (car icon) args))))) + +;;;###autoload +(defun all-the-icons-icon-for-file (file &rest arg-overrides) + "Get the formatted icon for FILE. +ARG-OVERRIDES should be a plist containining `:height', +`:v-adjust' or `:face' properties like in the normal icon +inserting functions." + (let* ((ext (file-name-extension file)) + (icon (or (and ext + (cdr (assoc (downcase ext) + all-the-icons-extension-icon-alist))) + (all-the-icons-match-to-alist file all-the-icons-regexp-icon-alist))) + (args (cdr icon))) + (when arg-overrides (setq args (append `(,(car args)) arg-overrides (cdr args)))) + (apply (car icon) args))) + +;;;###autoload +(defun all-the-icons-icon-for-mode (mode &rest arg-overrides) + "Get the formatted icon for MODE. +ARG-OVERRIDES should be a plist containining `:height', +`:v-adjust' or `:face' properties like in the normal icon +inserting functions." + (let* ((icon (cdr (or (assoc mode all-the-icons-mode-icon-alist) + (assoc (get mode 'derived-mode-parent) all-the-icons-mode-icon-alist)))) + (args (cdr icon))) + (when arg-overrides (setq args (append `(,(car args)) arg-overrides (cdr args)))) + (if icon (apply (car icon) args) mode))) + +;;;###autoload +(defun all-the-icons-icon-for-url (url &rest arg-overrides) + "Get the formatted icon for URL. +If an icon for URL isn't found in `all-the-icons-url-alist', a globe is used. +ARG-OVERRIDES should be a plist containining `:height', +`:v-adjust' or `:face' properties like in the normal icon +inserting functions." + (let* ((icon (all-the-icons-match-to-alist url all-the-icons-url-alist)) + (args (cdr icon))) + (unless icon + (setq icon '(all-the-icons-faicon "globe")) + (setq args (cdr icon))) + (when arg-overrides (setq args (append `(,(car args)) arg-overrides (cdr args)))) + (apply (car icon) args))) + +(defcustom all-the-icons--cache-limit 2048 + "Maximum cache size for functions cached by `all-the-icons-cache'." + :type 'integer) + +(defun all-the-icons-cache (func) + "Set a cache for FUNC. Does not work on interactive functions." + (unless (get func 'all-the-icons--cached) + (let ((cache (make-hash-table :test #'equal + :size all-the-icons--cache-limit)) + (orig-fn (symbol-function func))) + (fset func + (lambda (&rest args) + (or (gethash args cache) + (progn + (when (> (hash-table-count cache) + all-the-icons--cache-limit) + (clrhash cache)) + (puthash args (apply orig-fn args) cache))))))) + + (put func 'all-the-icons--cached t)) + +(all-the-icons-cache #'all-the-icons-icon-for-dir) +(all-the-icons-cache #'all-the-icons-icon-for-file) +(all-the-icons-cache #'all-the-icons-icon-for-mode) +(all-the-icons-cache #'all-the-icons-icon-for-url) + +;; Family Face Functions +(defun all-the-icons-icon-family-for-file (file) + "Get the icons font family for FILE." + (let ((icon (all-the-icons-match-to-alist file all-the-icons-regexp-icon-alist))) + (funcall (intern (format "%s-family" (car icon)))))) + +(defun all-the-icons-icon-family-for-mode (mode) + "Get the icons font family for MODE." + (let ((icon (cdr (assoc mode all-the-icons-mode-icon-alist)))) + (if icon (funcall (intern (format "%s-family" (car icon)))) nil))) + +(defun all-the-icons-icon-family (icon) + "Get a propertized ICON family programmatically." + (plist-get (get-text-property 0 'face icon) :family)) + +(all-the-icons-cache #'all-the-icons-icon-family-for-file) +(all-the-icons-cache #'all-the-icons-icon-family-for-mode) +(all-the-icons-cache #'all-the-icons-icon-family) + +(defun all-the-icons--icon-info-for-buffer (&optional f) + "Get icon info for the current buffer. + +When F is provided, the info function is calculated with the format +`all-the-icons-icon-%s-for-file' or `all-the-icons-icon-%s-for-mode'." + (let* ((base-f (concat "all-the-icons-icon" (when f (format "-%s" f)))) + (file-f (intern (concat base-f "-for-file"))) + (mode-f (intern (concat base-f "-for-mode")))) + (if (and (buffer-file-name) + (all-the-icons-auto-mode-match?)) + (funcall file-f (file-name-nondirectory (buffer-file-name))) + (funcall mode-f major-mode)))) + +;; Weather icons +(defun all-the-icons-icon-for-weather (weather) + "Get an icon for a WEATHER status." + (let ((icon (all-the-icons-match-to-alist weather all-the-icons-weather-icon-alist))) + (if icon (apply (car icon) (cdr icon)) weather))) + +;; Definitions + +(eval-and-compile + (defun all-the-icons--function-name (name) + "Get the symbol for an icon function name for icon set NAME." + (intern (concat "all-the-icons-" (downcase (symbol-name name))))) + + (defun all-the-icons--family-name (name) + "Get the symbol for an icon family function for icon set NAME." + (intern (concat "all-the-icons-" (downcase (symbol-name name)) "-family"))) + + (defun all-the-icons--data-name (name) + "Get the symbol for an icon family function for icon set NAME." + (intern (concat "all-the-icons-" (downcase (symbol-name name)) "-data"))) + + (defun all-the-icons--insert-function-name (name) + "Get the symbol for an icon insert function for icon set NAME." + (intern (concat "all-the-icons-insert-" (downcase (symbol-name name))))) + + (defun all-the-icons--family-scale-factor (family) + (intern (concat "all-the-icons-" (symbol-name family) "-scale-factor"))) + + (defun all-the-icons--family-adjust (family) + (intern (concat "all-the-icons-default-" (symbol-name family) "-adjust")))) + +;; Icon insertion functions + +(defun all-the-icons--read-candidates () + "Helper to build a list of candidates for all families." + (cl-reduce 'append (mapcar (lambda (it) (all-the-icons--read-candidates-for-family it t)) all-the-icons-font-families))) + +(defun all-the-icons--read-candidates-for-family (family &optional show-family) + "Helper to build read candidates for FAMILY. +If SHOW-FAMILY is non-nil, displays the icons family in the candidate string." + (let ((data (funcall (all-the-icons--data-name family))) + (icon-f (all-the-icons--function-name family))) + (mapcar + (lambda (it) + (let* ((icon-name (car it)) + (icon-name-head (substring icon-name 0 1)) + (icon-name-tail (substring icon-name 1)) + + (icon-display (propertize icon-name-head 'display (format "%s\t%s" (funcall icon-f icon-name) icon-name-head))) + (icon-family (if show-family (format "\t[%s]" family) "")) + + (candidate-name (format "%s%s%s" icon-display icon-name-tail icon-family)) + (candidate-icon (funcall (all-the-icons--function-name family) icon-name))) + + (cons candidate-name candidate-icon))) + data))) + +;;;###autoload +(defun all-the-icons-install-fonts (&optional pfx) + "Helper function to download and install the latests fonts based on OS. +When PFX is non-nil, ignore the prompt and just install" + (interactive "P") + (when (or pfx (yes-or-no-p "This will download and install fonts, are you sure you want to do this?")) + (let* ((url-format "https://raw.githubusercontent.com/domtronn/all-the-icons.el/master/fonts/%s") + (font-dest (cond + ;; Default Linux install directories + ((member system-type '(gnu gnu/linux gnu/kfreebsd)) + (concat (or (getenv "XDG_DATA_HOME") + (concat (getenv "HOME") "/.local/share")) + "/fonts/")) + ;; Default MacOS install directory + ((eq system-type 'darwin) + (concat (getenv "HOME") "/Library/Fonts/")))) + (known-dest? (stringp font-dest)) + (font-dest (or font-dest (read-directory-name "Font installation directory: " "~/")))) + + (unless (file-directory-p font-dest) (mkdir font-dest t)) + + (mapc (lambda (font) + (url-copy-file (format url-format font) (expand-file-name font font-dest) t)) + all-the-icons-font-names) + (when known-dest? + (message "Fonts downloaded, updating font cache... <fc-cache -f -v> ") + (shell-command-to-string (format "fc-cache -f -v"))) + (message "%s Successfully %s `all-the-icons' fonts to `%s'!" + (all-the-icons-wicon "stars" :v-adjust 0.0) + (if known-dest? "installed" "downloaded") + font-dest)))) + +;;;###autoload +(defun all-the-icons-insert (&optional arg family) + "Interactive icon insertion function. +When Prefix ARG is non-nil, insert the propertized icon. +When FAMILY is non-nil, limit the candidates to the icon set matching it." + (interactive "P") + (let* ((standard-output (current-buffer)) + (candidates (if family + (all-the-icons--read-candidates-for-family family) + (all-the-icons--read-candidates))) + (prompt (if family + (format "%s Icon: " (funcall (all-the-icons--family-name family))) + "Icon : ")) + + (selection (completing-read prompt candidates nil t)) + (result (cdr (assoc selection candidates)))) + + (if arg (prin1 result) (insert result)))) + +;; Debug Helpers + +(defun all-the-icons-insert-icons-for (family &optional height duration) + "Insert all of the available icons associated with FAMILY. +If a HEIGHT is provided it will render the icons at this height. +This is useful both to see the icons more clearly and to test +different height rendering. If DURATION is provided, it will +pause for DURATION seconds between printing each character." + (let* ((data-f (all-the-icons--data-name family)) + (insert-f (all-the-icons--function-name family)) + + (height (or height 2.0)) + (data (funcall data-f))) + (mapc + (lambda (it) + (insert (format "%s - %s\n" (funcall insert-f (car it) :height height) (car it))) + (when duration (sit-for duration 0))) + data))) + +(defmacro all-the-icons-define-icon (name alist family &optional font-name) + "Macro to generate functions for inserting icons for icon set NAME. + +NAME defines is the name of the iconset and will produce a +function of the for `all-the-icons-NAME'. + +ALIST is the alist containing maps between icon names and the +UniCode for the character. All of these can be found in the data +directory of this package. + +FAMILY is the font family to use for the icons. +FONT-NAME is the name of the .ttf file providing the font, defaults to FAMILY." + `(progn + (add-to-list 'all-the-icons-font-families (quote ,name)) + (add-to-list 'all-the-icons-font-names (quote ,(downcase (format "%s.ttf" (or font-name family))))) + (defcustom ,(all-the-icons--family-scale-factor name) 1.0 + ,(format "The additional `height' face property Scale Factor for %s icons." + (symbol-name name)) + :group 'all-the-icons + :type 'number) + (defcustom ,(all-the-icons--family-adjust name) 0.0 + ,(format "The additional `raise' display property adjustment for %s icons." + (symbol-name name)) + :group 'all-the-icons + :type 'number) + (defun ,(all-the-icons--family-name name) () ,family) + (defun ,(all-the-icons--data-name name) () ,alist) + (defun ,(all-the-icons--function-name name) (icon-name &rest args) + (let ((icon (cdr (assoc icon-name ,alist))) + (other-face (when all-the-icons-color-icons (plist-get args :face))) + (height (* all-the-icons-scale-factor + ,(all-the-icons--family-scale-factor name) + (or (plist-get args :height) 1.0))) + (v-adjust (* all-the-icons-scale-factor ,(all-the-icons--family-scale-factor name) + (+ (or (plist-get args :v-adjust) all-the-icons-default-adjust) + ,(all-the-icons--family-adjust name)))) + (family ,family)) + (unless icon + (error (format "Unable to find icon with name `%s' in icon set `%s'" icon-name (quote ,name)))) + (let ((face (if other-face + `(:family ,family :height ,height :inherit ,other-face) + `(:family ,family :height ,height)))) + (propertize icon + 'face face ;so that this works without `font-lock-mode' enabled + 'font-lock-face face ;so that `font-lock-mode' leaves this alone + 'display `(raise ,v-adjust) + 'rear-nonsticky t)))) + (defun ,(all-the-icons--insert-function-name name) (&optional arg) + ,(format "Insert a %s icon at point." family) + (interactive "P") + (all-the-icons-insert arg (quote ,name))))) + +(define-obsolete-function-alias 'define-icon 'all-the-icons-define-icon "4.0.0") + +(all-the-icons-define-icon alltheicon all-the-icons-data/alltheicons-alist "all-the-icons") +(all-the-icons-define-icon fileicon all-the-icons-data/file-icon-alist "file-icons") +(all-the-icons-define-icon faicon all-the-icons-data/fa-icon-alist "FontAwesome") +(all-the-icons-define-icon octicon all-the-icons-data/octicons-alist "github-octicons" "octicons") +(all-the-icons-define-icon wicon all-the-icons-data/weather-icons-alist "Weather Icons" "weathericons") +(all-the-icons-define-icon material all-the-icons-data/material-icons-alist "Material Icons" "material-design-icons") + +(provide 'all-the-icons) + +;;; all-the-icons.el ends here diff --git a/.emacs.d/elpa/all-the-icons-20210603.1604/all-the-icons.elc b/.emacs.d/elpa/all-the-icons-20210603.1604/all-the-icons.elc new file mode 100644 index 0000000..ef38d88 Binary files /dev/null and b/.emacs.d/elpa/all-the-icons-20210603.1604/all-the-icons.elc differ diff --git a/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-alltheicons.el b/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-alltheicons.el new file mode 100644 index 0000000..3322500 --- /dev/null +++ b/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-alltheicons.el @@ -0,0 +1,70 @@ +(defvar all-the-icons-data/alltheicons-alist + '( + + ( "apache" . "\xe909" ) + ( "atom" . "\xe917" ) + ( "aws" . "\xe90c" ) + ( "bower" . "\xe918" ) + ( "c" . "\xe915" ) + ( "c-line" . "\xe90f" ) + ( "clojure" . "\xe919" ) + ( "clojure-line" . "\xe91a" ) + ( "coffeescript" . "\xe914" ) + ( "cplusplus" . "\xe913" ) + ( "cplusplus-line" . "\xe910" ) + ( "csharp" . "\xe911" ) + ( "csharp-line" . "\xe912" ) + ( "css3" . "\xe91b" ) + ( "css3-alt" . "\xe91c" ) + ( "d3" . "\xe90e" ) + ( "dlang" . "\xe935" ) + ( "elixir" . "\xe936" ) + ( "erlang" . "\xe934" ) + ( "git" . "\xe907" ) + ( "go" . "\xe91d" ) + ( "google-drive" . "\xe91e" ) + ( "grunt" . "\xe90d" ) + ( "grunt-line" . "\xe91f" ) + ( "gulp" . "\xe920" ) + ( "haskell" . "\xe921" ) + ( "html5" . "\xe932" ) + ( "jasmine" . "\xe904" ) + ( "java" . "\xe922" ) + ( "javascript" . "\xe906" ) + ( "javascript-badge" . "\xe923" ) + ( "javascript-shield" . "\xe924" ) + ( "less" . "\xe90b" ) + ( "nginx" . "\xe933" ) + ( "nodejs" . "\xe925" ) + ( "perl" . "\xe905" ) + ( "perldocs" . "\xe926" ) + ( "postgresql" . "\xe938" ) + ( "prolog" . "\xe927" ) + ( "python" . "\xe928" ) + ( "react" . "\xe929" ) + ( "ruby" . "\xe92a" ) + ( "ruby-alt" . "\xe92b" ) + ( "rust" . "\xe92c" ) + ( "sass" . "\xe92d" ) + ( "scala" . "\xe908" ) + ( "script" . "\xe90a" ) + ( "spring" . "\xe937" ) + ( "stylus" . "\xe92e" ) + ( "svg" . "\xe903" ) + ( "swift" . "\xe92f" ) + ( "terminal" . "\xe930" ) + ( "terminal-alt" . "\xe931" ) + ( "battery-charging" . "\xe939" ) + + ( "arrow-left" . "\xe93a" ) + ( "arrow-right" . "\xe93b" ) + ( "cup-left" . "\xe93c" ) + ( "cup-right" . "\xe93d" ) + ( "slant-left" . "\xe93e" ) + ( "slant-right" . "\xe93f" ) + ( "wave-left" . "\xe940" ) + ( "wave-right" . "\xe941" ) + + )) + +(provide 'data-alltheicons) diff --git a/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-alltheicons.elc b/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-alltheicons.elc new file mode 100644 index 0000000..76b2125 Binary files /dev/null and b/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-alltheicons.elc differ diff --git a/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-faicons.el b/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-faicons.el new file mode 100644 index 0000000..6ab0480 --- /dev/null +++ b/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-faicons.el @@ -0,0 +1,641 @@ +(defvar all-the-icons-data/fa-icon-alist + '( + + ("500px" . "\xf26e") + ("adjust" . "\xf042") + ("adn" . "\xf170") + ("align-center" . "\xf037") + ("align-justify" . "\xf039") + ("align-left" . "\xf036") + ("align-right" . "\xf038") + ("amazon" . "\xf270") + ("ambulance" . "\xf0f9") + ("american-sign-language-interpreting" . "\xf2a3") + ("anchor" . "\xf13d") + ("android" . "\xf17b") + ("angellist" . "\xf209") + ("angle-double-down" . "\xf103") + ("angle-double-left" . "\xf100") + ("angle-double-right" . "\xf101") + ("angle-double-up" . "\xf102") + ("angle-down" . "\xf107") + ("angle-left" . "\xf104") + ("angle-right" . "\xf105") + ("angle-up" . "\xf106") + ("apple" . "\xf179") + ("archive" . "\xf187") + ("area-chart" . "\xf1fe") + ("arrow-circle-down" . "\xf0ab") + ("arrow-circle-left" . "\xf0a8") + ("arrow-circle-o-down" . "\xf01a") + ("arrow-circle-o-left" . "\xf190") + ("arrow-circle-o-right" . "\xf18e") + ("arrow-circle-o-up" . "\xf01b") + ("arrow-circle-right" . "\xf0a9") + ("arrow-circle-up" . "\xf0aa") + ("arrow-down" . "\xf063") + ("arrow-left" . "\xf060") + ("arrow-right" . "\xf061") + ("arrow-up" . "\xf062") + ("arrows" . "\xf047") + ("arrows-alt" . "\xf0b2") + ("arrows-h" . "\xf07e") + ("arrows-v" . "\xf07d") + ("assistive-listening-systems" . "\xf2a2") + ("asterisk" . "\xf069") + ("at" . "\xf1fa") + ("audio-description" . "\xf29e") + ("backward" . "\xf04a") + ("balance-scale" . "\xf24e") + ("ban" . "\xf05e") + ("bar-chart" . "\xf080") + ("barcode" . "\xf02a") + ("bars" . "\xf0c9") + ("battery-empty" . "\xf244") + ("battery-full" . "\xf240") + ("battery-half" . "\xf242") + ("battery-quarter" . "\xf243") + ("battery-three-quarters" . "\xf241") + ("bed" . "\xf236") + ("beer" . "\xf0fc") + ("behance" . "\xf1b4") + ("behance-square" . "\xf1b5") + ("bell" . "\xf0f3") + ("bell-o" . "\xf0a2") + ("bell-slash" . "\xf1f6") + ("bell-slash-o" . "\xf1f7") + ("bicycle" . "\xf206") + ("binoculars" . "\xf1e5") + ("birthday-cake" . "\xf1fd") + ("bitbucket" . "\xf171") + ("bitbucket-square" . "\xf172") + ("black-tie" . "\xf27e") + ("blind" . "\xf29d") + ("bluetooth" . "\xf293") + ("bluetooth-b" . "\xf294") + ("bold" . "\xf032") + ("bolt" . "\xf0e7") + ("bomb" . "\xf1e2") + ("book" . "\xf02d") + ("bookmark" . "\xf02e") + ("bookmark-o" . "\xf097") + ("braille" . "\xf2a1") + ("briefcase" . "\xf0b1") + ("btc" . "\xf15a") + ("bug" . "\xf188") + ("building" . "\xf1ad") + ("building-o" . "\xf0f7") + ("bullhorn" . "\xf0a1") + ("bullseye" . "\xf140") + ("bus" . "\xf207") + ("buysellads" . "\xf20d") + ("calculator" . "\xf1ec") + ("calendar" . "\xf073") + ("calendar-check-o" . "\xf274") + ("calendar-minus-o" . "\xf272") + ("calendar-o" . "\xf133") + ("calendar-plus-o" . "\xf271") + ("calendar-times-o" . "\xf273") + ("camera" . "\xf030") + ("camera-retro" . "\xf083") + ("car" . "\xf1b9") + ("caret-down" . "\xf0d7") + ("caret-left" . "\xf0d9") + ("caret-right" . "\xf0da") + ("caret-square-o-down" . "\xf150") + ("caret-square-o-left" . "\xf191") + ("caret-square-o-right" . "\xf152") + ("caret-square-o-up" . "\xf151") + ("caret-up" . "\xf0d8") + ("cart-arrow-down" . "\xf218") + ("cart-plus" . "\xf217") + ("cc" . "\xf20a") + ("cc-amex" . "\xf1f3") + ("cc-diners-club" . "\xf24c") + ("cc-discover" . "\xf1f2") + ("cc-jcb" . "\xf24b") + ("cc-mastercard" . "\xf1f1") + ("cc-paypal" . "\xf1f4") + ("cc-stripe" . "\xf1f5") + ("cc-visa" . "\xf1f0") + ("certificate" . "\xf0a3") + ("chain-broken" . "\xf127") + ("check" . "\xf00c") + ("check-circle" . "\xf058") + ("check-circle-o" . "\xf05d") + ("check-square" . "\xf14a") + ("check-square-o" . "\xf046") + ("chevron-circle-down" . "\xf13a") + ("chevron-circle-left" . "\xf137") + ("chevron-circle-right" . "\xf138") + ("chevron-circle-up" . "\xf139") + ("chevron-down" . "\xf078") + ("chevron-left" . "\xf053") + ("chevron-right" . "\xf054") + ("chevron-up" . "\xf077") + ("child" . "\xf1ae") + ("chrome" . "\xf268") + ("circle" . "\xf111") + ("circle-o" . "\xf10c") + ("circle-o-notch" . "\xf1ce") + ("circle-thin" . "\xf1db") + ("clipboard" . "\xf0ea") + ("clock-o" . "\xf017") + ("clone" . "\xf24d") + ("cloud" . "\xf0c2") + ("cloud-download" . "\xf0ed") + ("cloud-upload" . "\xf0ee") + ("code" . "\xf121") + ("code-fork" . "\xf126") + ("codepen" . "\xf1cb") + ("codiepie" . "\xf284") + ("coffee" . "\xf0f4") + ("cog" . "\xf013") + ("cogs" . "\xf085") + ("columns" . "\xf0db") + ("comment" . "\xf075") + ("comment-o" . "\xf0e5") + ("commenting" . "\xf27a") + ("commenting-o" . "\xf27b") + ("comments" . "\xf086") + ("comments-o" . "\xf0e6") + ("compass" . "\xf14e") + ("compress" . "\xf066") + ("connectdevelop" . "\xf20e") + ("contao" . "\xf26d") + ("copyright" . "\xf1f9") + ("creative-commons" . "\xf25e") + ("credit-card" . "\xf09d") + ("credit-card-alt" . "\xf283") + ("crop" . "\xf125") + ("crosshairs" . "\xf05b") + ("css3" . "\xf13c") + ("cube" . "\xf1b2") + ("cubes" . "\xf1b3") + ("cutlery" . "\xf0f5") + ("dashcube" . "\xf210") + ("database" . "\xf1c0") + ("deaf" . "\xf2a4") + ("delicious" . "\xf1a5") + ("desktop" . "\xf108") + ("deviantart" . "\xf1bd") + ("diamond" . "\xf219") + ("digg" . "\xf1a6") + ("dot-circle-o" . "\xf192") + ("download" . "\xf019") + ("dribbble" . "\xf17d") + ("dropbox" . "\xf16b") + ("drupal" . "\xf1a9") + ("edge" . "\xf282") + ("eject" . "\xf052") + ("ellipsis-h" . "\xf141") + ("ellipsis-v" . "\xf142") + ("empire" . "\xf1d1") + ("envelope" . "\xf0e0") + ("envelope-o" . "\xf003") + ("envelope-square" . "\xf199") + ("envira" . "\xf299") + ("eraser" . "\xf12d") + ("eur" . "\xf153") + ("exchange" . "\xf0ec") + ("exclamation" . "\xf12a") + ("exclamation-circle" . "\xf06a") + ("exclamation-triangle" . "\xf071") + ("expand" . "\xf065") + ("expeditedssl" . "\xf23e") + ("external-link" . "\xf08e") + ("external-link-square" . "\xf14c") + ("eye" . "\xf06e") + ("eye-slash" . "\xf070") + ("eyedropper" . "\xf1fb") + ("facebook" . "\xf09a") + ("facebook-official" . "\xf230") + ("facebook-square" . "\xf082") + ("fast-backward" . "\xf049") + ("fast-forward" . "\xf050") + ("fax" . "\xf1ac") + ("female" . "\xf182") + ("fighter-jet" . "\xf0fb") + ("file" . "\xf15b") + ("file-archive-o" . "\xf1c6") + ("file-audio-o" . "\xf1c7") + ("file-code-o" . "\xf1c9") + ("file-excel-o" . "\xf1c3") + ("file-image-o" . "\xf1c5") + ("file-o" . "\xf016") + ("file-pdf-o" . "\xf1c1") + ("file-powerpoint-o" . "\xf1c4") + ("file-text" . "\xf15c") + ("file-text-o" . "\xf0f6") + ("file-video-o" . "\xf1c8") + ("file-word-o" . "\xf1c2") + ("files-o" . "\xf0c5") + ("film" . "\xf008") + ("filter" . "\xf0b0") + ("fire" . "\xf06d") + ("fire-extinguisher" . "\xf134") + ("firefox" . "\xf269") + ("first-order" . "\xf2b0") + ("flag" . "\xf024") + ("flag-checkered" . "\xf11e") + ("flag-o" . "\xf11d") + ("flask" . "\xf0c3") + ("flickr" . "\xf16e") + ("floppy-o" . "\xf0c7") + ("folder" . "\xf07b") + ("folder-o" . "\xf114") + ("folder-open" . "\xf07c") + ("folder-open-o" . "\xf115") + ("font" . "\xf031") + ("font-awesome" . "\xf2b4") + ("fonticons" . "\xf280") + ("fort-awesome" . "\xf286") + ("forumbee" . "\xf211") + ("forward" . "\xf04e") + ("foursquare" . "\xf180") + ("frown-o" . "\xf119") + ("futbol-o" . "\xf1e3") + ("gamepad" . "\xf11b") + ("gavel" . "\xf0e3") + ("gbp" . "\xf154") + ("genderless" . "\xf22d") + ("get-pocket" . "\xf265") + ("gg" . "\xf260") + ("gg-circle" . "\xf261") + ("gift" . "\xf06b") + ("git" . "\xf1d3") + ("git-square" . "\xf1d2") + ("github" . "\xf09b") + ("github-alt" . "\xf113") + ("github-square" . "\xf092") + ("gitlab" . "\xf296") + ("glass" . "\xf000") + ("glide" . "\xf2a5") + ("glide-g" . "\xf2a6") + ("globe" . "\xf0ac") + ("google" . "\xf1a0") + ("google-plus" . "\xf0d5") + ("google-plus-official" . "\xf2b3") + ("google-plus-square" . "\xf0d4") + ("google-wallet" . "\xf1ee") + ("graduation-cap" . "\xf19d") + ("gratipay" . "\xf184") + ("h-square" . "\xf0fd") + ("hacker-news" . "\xf1d4") + ("hand-lizard-o" . "\xf258") + ("hand-o-down" . "\xf0a7") + ("hand-o-left" . "\xf0a5") + ("hand-o-right" . "\xf0a4") + ("hand-o-up" . "\xf0a6") + ("hand-paper-o" . "\xf256") + ("hand-peace-o" . "\xf25b") + ("hand-pointer-o" . "\xf25a") + ("hand-rock-o" . "\xf255") + ("hand-scissors-o" . "\xf257") + ("hand-spock-o" . "\xf259") + ("hashtag" . "\xf292") + ("hdd-o" . "\xf0a0") + ("header" . "\xf1dc") + ("headphones" . "\xf025") + ("heart" . "\xf004") + ("heart-o" . "\xf08a") + ("heartbeat" . "\xf21e") + ("history" . "\xf1da") + ("home" . "\xf015") + ("hospital-o" . "\xf0f8") + ("hourglass" . "\xf254") + ("hourglass-end" . "\xf253") + ("hourglass-half" . "\xf252") + ("hourglass-o" . "\xf250") + ("hourglass-start" . "\xf251") + ("houzz" . "\xf27c") + ("html5" . "\xf13b") + ("i-cursor" . "\xf246") + ("ils" . "\xf20b") + ("inbox" . "\xf01c") + ("indent" . "\xf03c") + ("industry" . "\xf275") + ("info" . "\xf129") + ("info-circle" . "\xf05a") + ("inr" . "\xf156") + ("instagram" . "\xf16d") + ("internet-explorer" . "\xf26b") + ("ioxhost" . "\xf208") + ("italic" . "\xf033") + ("joomla" . "\xf1aa") + ("jpy" . "\xf157") + ("jsfiddle" . "\xf1cc") + ("key" . "\xf084") + ("keyboard-o" . "\xf11c") + ("krw" . "\xf159") + ("language" . "\xf1ab") + ("laptop" . "\xf109") + ("lastfm" . "\xf202") + ("lastfm-square" . "\xf203") + ("leaf" . "\xf06c") + ("leanpub" . "\xf212") + ("lemon-o" . "\xf094") + ("level-down" . "\xf149") + ("level-up" . "\xf148") + ("life-ring" . "\xf1cd") + ("lightbulb-o" . "\xf0eb") + ("line-chart" . "\xf201") + ("link" . "\xf0c1") + ("linkedin" . "\xf0e1") + ("linkedin-square" . "\xf08c") + ("linux" . "\xf17c") + ("list" . "\xf03a") + ("list-alt" . "\xf022") + ("list-ol" . "\xf0cb") + ("list-ul" . "\xf0ca") + ("location-arrow" . "\xf124") + ("lock" . "\xf023") + ("long-arrow-down" . "\xf175") + ("long-arrow-left" . "\xf177") + ("long-arrow-right" . "\xf178") + ("long-arrow-up" . "\xf176") + ("low-vision" . "\xf2a8") + ("magic" . "\xf0d0") + ("magnet" . "\xf076") + ("male" . "\xf183") + ("map" . "\xf279") + ("map-marker" . "\xf041") + ("map-o" . "\xf278") + ("map-pin" . "\xf276") + ("map-signs" . "\xf277") + ("mars" . "\xf222") + ("mars-double" . "\xf227") + ("mars-stroke" . "\xf229") + ("mars-stroke-h" . "\xf22b") + ("mars-stroke-v" . "\xf22a") + ("maxcdn" . "\xf136") + ("meanpath" . "\xf20c") + ("medium" . "\xf23a") + ("medkit" . "\xf0fa") + ("meh-o" . "\xf11a") + ("mercury" . "\xf223") + ("microphone" . "\xf130") + ("microphone-slash" . "\xf131") + ("minus" . "\xf068") + ("minus-circle" . "\xf056") + ("minus-square" . "\xf146") + ("minus-square-o" . "\xf147") + ("mixcloud" . "\xf289") + ("mobile" . "\xf10b") + ("modx" . "\xf285") + ("money" . "\xf0d6") + ("moon-o" . "\xf186") + ("motorcycle" . "\xf21c") + ("mouse-pointer" . "\xf245") + ("music" . "\xf001") + ("neuter" . "\xf22c") + ("newspaper-o" . "\xf1ea") + ("object-group" . "\xf247") + ("object-ungroup" . "\xf248") + ("odnoklassniki" . "\xf263") + ("odnoklassniki-square" . "\xf264") + ("opencart" . "\xf23d") + ("openid" . "\xf19b") + ("opera" . "\xf26a") + ("optin-monster" . "\xf23c") + ("outdent" . "\xf03b") + ("pagelines" . "\xf18c") + ("paint-brush" . "\xf1fc") + ("paper-plane" . "\xf1d8") + ("paper-plane-o" . "\xf1d9") + ("paperclip" . "\xf0c6") + ("paragraph" . "\xf1dd") + ("pause" . "\xf04c") + ("pause-circle" . "\xf28b") + ("pause-circle-o" . "\xf28c") + ("paw" . "\xf1b0") + ("paypal" . "\xf1ed") + ("pencil" . "\xf040") + ("pencil-square" . "\xf14b") + ("pencil-square-o" . "\xf044") + ("percent" . "\xf295") + ("phone" . "\xf095") + ("phone-square" . "\xf098") + ("picture-o" . "\xf03e") + ("pie-chart" . "\xf200") + ("pied-piper" . "\xf2ae") + ("pied-piper-alt" . "\xf1a8") + ("pied-piper-pp" . "\xf1a7") + ("pinterest" . "\xf0d2") + ("pinterest-p" . "\xf231") + ("pinterest-square" . "\xf0d3") + ("plane" . "\xf072") + ("play" . "\xf04b") + ("play-circle" . "\xf144") + ("play-circle-o" . "\xf01d") + ("plug" . "\xf1e6") + ("plus" . "\xf067") + ("plus-circle" . "\xf055") + ("plus-square" . "\xf0fe") + ("plus-square-o" . "\xf196") + ("power-off" . "\xf011") + ("print" . "\xf02f") + ("product-hunt" . "\xf288") + ("puzzle-piece" . "\xf12e") + ("qq" . "\xf1d6") + ("qrcode" . "\xf029") + ("question" . "\xf128") + ("question-circle" . "\xf059") + ("question-circle-o" . "\xf29c") + ("quote-left" . "\xf10d") + ("quote-right" . "\xf10e") + ("random" . "\xf074") + ("rebel" . "\xf1d0") + ("recycle" . "\xf1b8") + ("reddit" . "\xf1a1") + ("reddit-alien" . "\xf281") + ("reddit-square" . "\xf1a2") + ("refresh" . "\xf021") + ("registered" . "\xf25d") + ("renren" . "\xf18b") + ("repeat" . "\xf01e") + ("reply" . "\xf112") + ("reply-all" . "\xf122") + ("retweet" . "\xf079") + ("road" . "\xf018") + ("rocket" . "\xf135") + ("rss" . "\xf09e") + ("rss-square" . "\xf143") + ("rub" . "\xf158") + ("safari" . "\xf267") + ("scissors" . "\xf0c4") + ("scribd" . "\xf28a") + ("search" . "\xf002") + ("search-minus" . "\xf010") + ("search-plus" . "\xf00e") + ("sellsy" . "\xf213") + ("server" . "\xf233") + ("share" . "\xf064") + ("share-alt" . "\xf1e0") + ("share-alt-square" . "\xf1e1") + ("share-square" . "\xf14d") + ("share-square-o" . "\xf045") + ("shield" . "\xf132") + ("ship" . "\xf21a") + ("shirtsinbulk" . "\xf214") + ("shopping-bag" . "\xf290") + ("shopping-basket" . "\xf291") + ("shopping-cart" . "\xf07a") + ("sign-in" . "\xf090") + ("sign-language" . "\xf2a7") + ("sign-out" . "\xf08b") + ("signal" . "\xf012") + ("simplybuilt" . "\xf215") + ("sitemap" . "\xf0e8") + ("skyatlas" . "\xf216") + ("skype" . "\xf17e") + ("slack" . "\xf198") + ("sliders" . "\xf1de") + ("slideshare" . "\xf1e7") + ("smile-o" . "\xf118") + ("snapchat" . "\xf2ab") + ("snapchat-ghost" . "\xf2ac") + ("snapchat-square" . "\xf2ad") + ("sort" . "\xf0dc") + ("sort-alpha-asc" . "\xf15d") + ("sort-alpha-desc" . "\xf15e") + ("sort-amount-asc" . "\xf160") + ("sort-amount-desc" . "\xf161") + ("sort-asc" . "\xf0de") + ("sort-desc" . "\xf0dd") + ("sort-numeric-asc" . "\xf162") + ("sort-numeric-desc" . "\xf163") + ("soundcloud" . "\xf1be") + ("space-shuttle" . "\xf197") + ("spinner" . "\xf110") + ("spoon" . "\xf1b1") + ("spotify" . "\xf1bc") + ("square" . "\xf0c8") + ("square-o" . "\xf096") + ("stack-exchange" . "\xf18d") + ("stack-overflow" . "\xf16c") + ("star" . "\xf005") + ("star-half" . "\xf089") + ("star-half-o" . "\xf123") + ("star-o" . "\xf006") + ("steam" . "\xf1b6") + ("steam-square" . "\xf1b7") + ("step-backward" . "\xf048") + ("step-forward" . "\xf051") + ("stethoscope" . "\xf0f1") + ("sticky-note" . "\xf249") + ("sticky-note-o" . "\xf24a") + ("stop" . "\xf04d") + ("stop-circle" . "\xf28d") + ("stop-circle-o" . "\xf28e") + ("street-view" . "\xf21d") + ("strikethrough" . "\xf0cc") + ("stumbleupon" . "\xf1a4") + ("stumbleupon-circle" . "\xf1a3") + ("subscript" . "\xf12c") + ("subway" . "\xf239") + ("suitcase" . "\xf0f2") + ("sun-o" . "\xf185") + ("superscript" . "\xf12b") + ("table" . "\xf0ce") + ("tablet" . "\xf10a") + ("tachometer" . "\xf0e4") + ("tag" . "\xf02b") + ("tags" . "\xf02c") + ("tasks" . "\xf0ae") + ("taxi" . "\xf1ba") + ("television" . "\xf26c") + ("tencent-weibo" . "\xf1d5") + ("terminal" . "\xf120") + ("text-height" . "\xf034") + ("text-width" . "\xf035") + ("th" . "\xf00a") + ("th-large" . "\xf009") + ("th-list" . "\xf00b") + ("themeisle" . "\xf2b2") + ("thumb-tack" . "\xf08d") + ("thumbs-down" . "\xf165") + ("thumbs-o-down" . "\xf088") + ("thumbs-o-up" . "\xf087") + ("thumbs-up" . "\xf164") + ("ticket" . "\xf145") + ("times" . "\xf00d") + ("times-circle" . "\xf057") + ("times-circle-o" . "\xf05c") + ("tint" . "\xf043") + ("toggle-off" . "\xf204") + ("toggle-on" . "\xf205") + ("trademark" . "\xf25c") + ("train" . "\xf238") + ("transgender" . "\xf224") + ("transgender-alt" . "\xf225") + ("trash" . "\xf1f8") + ("trash-o" . "\xf014") + ("tree" . "\xf1bb") + ("trello" . "\xf181") + ("tripadvisor" . "\xf262") + ("trophy" . "\xf091") + ("truck" . "\xf0d1") + ("try" . "\xf195") + ("tty" . "\xf1e4") + ("tumblr" . "\xf173") + ("tumblr-square" . "\xf174") + ("twitch" . "\xf1e8") + ("twitter" . "\xf099") + ("twitter-square" . "\xf081") + ("umbrella" . "\xf0e9") + ("underline" . "\xf0cd") + ("undo" . "\xf0e2") + ("universal-access" . "\xf29a") + ("university" . "\xf19c") + ("unlock" . "\xf09c") + ("unlock-alt" . "\xf13e") + ("upload" . "\xf093") + ("usb" . "\xf287") + ("usd" . "\xf155") + ("user" . "\xf007") + ("user-md" . "\xf0f0") + ("user-plus" . "\xf234") + ("user-secret" . "\xf21b") + ("user-times" . "\xf235") + ("users" . "\xf0c0") + ("venus" . "\xf221") + ("venus-double" . "\xf226") + ("venus-mars" . "\xf228") + ("viacoin" . "\xf237") + ("viadeo" . "\xf2a9") + ("viadeo-square" . "\xf2aa") + ("video-camera" . "\xf03d") + ("vimeo" . "\xf27d") + ("vimeo-square" . "\xf194") + ("vine" . "\xf1ca") + ("vk" . "\xf189") + ("volume-control-phone" . "\xf2a0") + ("volume-down" . "\xf027") + ("volume-off" . "\xf026") + ("volume-up" . "\xf028") + ("weibo" . "\xf18a") + ("weixin" . "\xf1d7") + ("whatsapp" . "\xf232") + ("wheelchair" . "\xf193") + ("wheelchair-alt" . "\xf29b") + ("wifi" . "\xf1eb") + ("wikipedia-w" . "\xf266") + ("windows" . "\xf17a") + ("wordpress" . "\xf19a") + ("wpbeginner" . "\xf297") + ("wpforms" . "\xf298") + ("wrench" . "\xf0ad") + ("xing" . "\xf168") + ("xing-square" . "\xf169") + ("y-combinator" . "\xf23b") + ("yahoo" . "\xf19e") + ("yelp" . "\xf1e9") + ("yoast" . "\xf2b1") + ("youtube" . "\xf167") + ("youtube-play" . "\xf16a") + ("youtube-square" . "\xf166") + + )) + +(provide 'data-faicons) diff --git a/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-faicons.elc b/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-faicons.elc new file mode 100644 index 0000000..3d0970d Binary files /dev/null and b/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-faicons.elc differ diff --git a/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-fileicons.el b/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-fileicons.el new file mode 100644 index 0000000..9baf46b --- /dev/null +++ b/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-fileicons.el @@ -0,0 +1,491 @@ +(defvar all-the-icons-data/file-icon-alist + '( + + ( "1c" . "\xa5ea" ) + ( "1c-alt" . "\xea28" ) + ( "MJML" . "\xea6f" ) + ( "R" . "\xe905" ) + ( "abap" . "\xe92b" ) + ( "abif" . "\xea4e" ) + ( "access" . "\xe9ea" ) + ( "actionscript" . "\xe92e" ) + ( "ada" . "\xe90b" ) + ( "ae" . "\xe9f3" ) + ( "ai" . "\xe6b4" ) + ( "akka" . "\xea0e" ) + ( "alex" . "\x29cb" ) + ( "alloy" . "\xe935" ) + ( "alpine-linux" . "\xe9ff" ) + ( "ampl" . "\xe94e" ) + ( "amx" . "\xe99b" ) + ( "angelscript" . "\xea5b" ) + ( "ansible" . "\x24b6" ) + ( "ansible-alt" . "\x61" ) + ( "ant" . "\xe93e" ) + ( "antlr" . "\xe92c" ) + ( "antwar" . "\x2591" ) + ( "api-blueprint" . "\xe92d" ) + ( "apl" . "\x234b" ) + ( "apl-old" . "\xe909" ) + ( "apple" . "\xe925" ) + ( "appveyor" . "\xe923" ) + ( "arc" . "\xe92f" ) + ( "arch-linux" . "\x41" ) + ( "arduino" . "\xe930" ) + ( "arttext" . "\x24d0" ) + ( "asciidoc" . "\xe918" ) + ( "assembly" . "\xEB4F" ) + ( "ats" . "\xe934" ) + ( "audacity" . "\xe9f9" ) + ( "augeas" . "\xe931" ) + ( "aurelia" . "\xea48" ) + ( "auto-hotkey" . "\xe932" ) + ( "autoit" . "\xe933" ) + ( "babel" . "\xe91f" ) + ( "bazel" . "\xea5a" ) + ( "bem" . "\xea59" ) + ( "bib" . "\xe601" ) + ( "bintray" . "\xea6e" ) + ( "bithound" . "\xea2a" ) + ( "blender" . "\xe9fa" ) + ( "bluespec" . "\xe93c" ) + ( "boo" . "\xe939" ) + ( "brain" . "\xe93a" ) + ( "brakeman" . "\xe9d6" ) + ( "bro" . "\xe93b" ) + ( "broccoli" . "\xe922" ) + ( "brotli" . "\xea6c" ) + ( "browserslist" . "\xea80" ) + ( "brunch" . "\xea47" ) + ( "buck" . "\xea46" ) + ( "build-boot" . "\xf103" ) + ( "bundler" . "\xea45" ) + ( "byond" . "\xe962" ) + ( "cabal" . "\xe9c2" ) + ( "caddy" . "\xea58" ) + ( "cake" . "\xe9e3" ) + ( "cakefile" . "\xe924" ) + ( "cakephp" . "\xea43" ) + ( "cakephp-old" . "\xe9d3" ) + ( "cc" . "\xe9d5" ) + ( "ceylon" . "\xe94f" ) + ( "chai" . "\x63" ) + ( "chapel" . "\xe950" ) + ( "chartjs" . "\xea0b" ) + ( "chef" . "\xea42" ) + ( "chuck" . "\xe943" ) + ( "circle-ci" . "\xea12" ) + ( "cirru" . "\xe951" ) + ( "ckeditor" . "\xea0c" ) + ( "clarion" . "\xe952" ) + ( "clean" . "\xe95b" ) + ( "click" . "\xe95c" ) + ( "clips" . "\xe940" ) + ( "clj" . "\xf105" ) + ( "cljs" . "\xf104" ) + ( "closure-template" . "\xea82" ) + ( "cmake" . "\xe93f" ) + ( "cobol" . "\xea44" ) + ( "codecov" . "\x2602" ) + ( "codekit" . "\xea41" ) + ( "codemirror" . "\xea0d" ) + ( "codeship" . "\xea6a" ) + ( "cold-fusion" . "\xe929" ) + ( "clisp" . "\xe972" ) + ( "composer" . "\xe683" ) + ( "config" . "\xf07c" ) + ( "coq" . "\xe95f" ) + ( "cordova" . "\xea11" ) + ( "cp" . "\xe942" ) + ( "cpan" . "\xea87" ) + ( "creole" . "\xe95e" ) + ( "crystal" . "\xe902" ) + ( "cs-script" . "\xe9e2" ) + ( "csound" . "\xe9f0" ) + ( "cucumber" . "\xf02b" ) + ( "cython" . "\xe963" ) + ( "d3" . "\xea10" ) + ( "darcs" . "\xe964" ) + ( "dart" . "\xe698" ) + ( "dashboard" . "\xf07d" ) + ( "dbase" . "\xe9f1" ) + ( "default" . "\x1f5cc" ) + ( "delphi" . "\xea40" ) + ( "devicetree" . "\xea57" ) + ( "diff" . "\xe960" ) + ( "dockerfile" . "\xf106" ) + ( "doclets" . "\xea3f" ) + ( "doge" . "\xe946" ) + ( "dom" . "\xea71" ) + ( "donejs" . "\x1f3c1" ) + ( "doxygen" . "\xe928" ) + ( "dragula" . "\x1f44c" ) + ( "drone" . "\xea3d" ) + ( "dyalog" . "\xe90c" ) + ( "dylib" . "\xea15" ) + ( "e" . "\x45" ) + ( "eagle" . "\xe965" ) + ( "easybuild" . "\xea85" ) + ( "ec" . "\xe9c9" ) + ( "ecere" . "\xe966" ) + ( "edge" . "\xea78" ) + ( "editorconfig" . "\xea1b" ) + ( "eiffel" . "\xe967" ) + ( "ejs" . "\xea4b" ) + ( "electron" . "\xea27" ) + ( "elm" . "\xf102" ) + ( "emacs" . "\xe926" ) + ( "elisp" . "\xe926" ) + ( "ember" . "\xe61b" ) + ( "emberscript" . "\xe968" ) + ( "eq" . "\xea0a" ) + ( "esdoc" . "\xea5c" ) + ( "eslint" . "\xea0f" ) + ( "eslint-old" . "\xe90e" ) + ( "excel" . "\xe9ee" ) + ( "fabfile" . "\xe94b" ) + ( "factor" . "\xe96a" ) + ( "fancy" . "\xe96b" ) + ( "fantom" . "\xe96f" ) + ( "fbx" . "\xe9fc" ) + ( "ffmpeg" . "\xea22" ) + ( "finder" . "\xe9e9" ) + ( "firebase" . "\xea7f" ) + ( "flow" . "\xe921" ) + ( "flux" . "\xe969" ) + ( "font" . "\xe90f" ) + ( "fontforge" . "\xfb00" ) + ( "fortran" . "\xe90a" ) + ( "franca" . "\xea56" ) + ( "freemarker" . "\xe970" ) + ( "frege" . "\xe96e" ) + ( "fsharp" . "\xe6a7" ) + ( "fuel-ux" . "\xea09" ) + ( "gams" . "\xe973" ) + ( "gap" . "\xe971" ) + ( "gdb" . "\xea08" ) + ( "genshi" . "\xe976" ) + ( "gentoo" . "\xe96d" ) + ( "gf" . "\xe978" ) + ( "gitlab" . "\xea3c" ) + ( "glade" . "\xe938" ) + ( "glyphs" . "\x47" ) + ( "gn" . "\xea25" ) + ( "gnu" . "\xe679" ) + ( "go" . "\xeaae" ) + ( "godot" . "\xe974" ) + ( "golo" . "\xe979" ) + ( "gosu" . "\xe97a" ) + ( "gradle" . "\xe903" ) + ( "graphql" . "\xe97c" ) + ( "graphviz" . "\xe97d" ) + ( "groovy" . "\xe904" ) + ( "grunt" . "\xe611" ) + ( "gulp" . "\xe610" ) + ( "hack" . "\xe9ce" ) + ( "haml" . "\xf15b" ) + ( "harbour" . "\xe97b" ) + ( "hashicorp" . "\xe97e" ) + ( "haxe" . "\xe907" ) + ( "haxedevelop" . "\xea3b" ) + ( "hg" . "\x263f" ) + ( "hoplon" . "\xea4d" ) + ( "hy" . "\xe97f" ) + ( "icu" . "\xea23" ) + ( "id" . "\xe9f4" ) + ( "idl" . "\xe947" ) + ( "idris" . "\xe983" ) + ( "igorpro" . "\xe980" ) + ( "image" . "\xf012" ) + ( "inform7" . "\xe984" ) + ( "inno" . "\xe985" ) + ( "io" . "\xe981" ) + ( "ioke" . "\xe982" ) + ( "ionic-project" . "\xf14b" ) + ( "isabelle" . "\xe945" ) + ( "j" . "\xe937" ) + ( "jade" . "\xe90d" ) + ( "jake" . "\xe948" ) + ( "jasmine" . "\xea3a" ) + ( "jenkins" . "\xe667" ) + ( "jest" . "\xea39" ) + ( "jinja" . "\xe944" ) + ( "jison" . "\xea55" ) + ( "jolie" . "\xea75" ) + ( "jsonld" . "\xe958" ) + ( "jsx" . "\xf100" ) + ( "jsx-2" . "\xf101" ) + ( "jsx2-alt" . "\xe9e6" ) + ( "julia" . "\x26ec" ) + ( "junos" . "\xea81" ) + ( "jupyter" . "\xe987" ) + ( "karma" . "\xe9cd" ) + ( "keynote" . "\xe9e5" ) + ( "khronos" . "\xe9f8" ) + ( "kicad" . "\xea4c" ) + ( "kitchenci" . "\xea38" ) + ( "kivy" . "\xe901" ) + ( "knockout" . "\x4b" ) + ( "kotlin" . "\xe989" ) + ( "krl" . "\xe988" ) + ( "labview" . "\xe98a" ) + ( "lasso" . "\xe98c" ) + ( "leaflet" . "\xea07" ) + ( "lean" . "\x4c" ) + ( "lerna" . "\xea37" ) + ( "lfe" . "\xe94c" ) + ( "libuv" . "\xea21" ) + ( "lightwave" . "\xe9fb" ) + ( "lime" . "\xea36" ) + ( "lisp" . "\xe908" ) + ( "livescript" . "\xe914" ) + ( "llvm" . "\xe91d" ) + ( "logtalk" . "\xe98d" ) + ( "lookml" . "\xe98e" ) + ( "lsl" . "\xe98b" ) + ( "lua" . "\xe91b" ) + ( "mako" . "\xe98f" ) + ( "man-page" . "\xe936" ) + ( "mapbox" . "\xe941" ) + ( "markdownlint" . "\xf0c9" ) + ( "marko" . "\xe920" ) + ( "mathematica" . "\xe990" ) + ( "mathjax" . "\xea06" ) + ( "matlab" . "\xe991" ) + ( "max" . "\xe993" ) + ( "maxscript" . "\xe900" ) + ( "maya" . "\xe9f6" ) + ( "mediawiki" . "\xe954" ) + ( "mercury" . "\xe994" ) + ( "meson" . "\xea54" ) + ( "metal" . "\x4d" ) + ( "meteor" . "\xe6a5" ) + ( "microsoft-infopath" . "\xea35" ) + ( "minecraft" . "\xe9dc" ) + ( "minizinc" . "\xea53" ) + ( "mirah" . "\xe995" ) + ( "miranda" . "\xea52" ) + ( "mocha" . "\x26fe" ) + ( "modula-2" . "\xe996" ) + ( "moment" . "\x1f558" ) + ( "moment-tz" . "\x1f30d" ) + ( "monkey" . "\xe997" ) + ( "moustache" . "\xe60f" ) + ( "mruby" . "\xea18" ) + ( "mupad" . "\xe9ca" ) + ( "nano" . "\xea76" ) + ( "nanoc" . "\xea51" ) + ( "nant" . "\xe9e1" ) + ( "nasm" . "\xea72" ) + ( "neko" . "\xea05" ) + ( "netlogo" . "\xe99c" ) + ( "new-relic" . "\xe9d7" ) + ( "nginx" . "\xf146b" ) + ( "nib" . "\x2712" ) + ( "nimrod" . "\xe998" ) + ( "nit" . "\xe999" ) + ( "nix" . "\xe99a" ) + ( "nmap" . "\xe94d" ) + ( "nodemon" . "\xea26" ) + ( "normalize" . "\xea04" ) + ( "npm" . "\xe91c" ) + ( "npm-old" . "\xf17b" ) + ( "nsis" . "\xea1e" ) + ( "nsis-old" . "\xe992" ) + ( "nuclide" . "\xea34" ) + ( "nuget" . "\xe9d9" ) + ( "numpy" . "\xe99d" ) + ( "nunjucks" . "\xe953" ) + ( "nvidia" . "\xe95d" ) + ( "nxc" . "\xea6b" ) + ( "obj" . "\xe9e8" ) + ( "objective-j" . "\xe99e" ) + ( "ocaml" . "\xe91a" ) + ( "octave" . "\xea33" ) + ( "onenote" . "\xe9eb" ) + ( "ooc" . "\xe9cb" ) + ( "opa" . "\x2601" ) + ( "opencl" . "\xe99f" ) + ( "opengl" . "\xea7a" ) + ( "openoffice" . "\xe9e4" ) + ( "openscad" . "\xe911" ) + ( "org" . "\xe917" ) + ( "owl" . "\xe957" ) + ( "ox" . "\xe9a1" ) + ( "oxygene" . "\xe9bf" ) + ( "oz" . "\xe9be" ) + ( "p4" . "\xea50" ) + ( "pan" . "\xe9bd" ) + ( "papyrus" . "\xe9bc" ) + ( "parrot" . "\xe9bb" ) + ( "pascal" . "\xe92a" ) + ( "patch" . "\xe961" ) + ( "pawn" . "\x265f" ) + ( "pb" . "\xea14" ) + ( "pegjs" . "\xea74" ) + ( "perl6" . "\xe96c" ) + ( "phalcon" . "\xe94a" ) + ( "phoenix" . "\xea5f" ) + ( "php" . "\xf147" ) + ( "phpunit" . "\xea32" ) + ( "pickle" . "\xe9c4" ) + ( "pike" . "\xe9b9" ) + ( "platformio" . "\xea2c" ) + ( "pm2" . "\x2630" ) + ( "pod" . "\xea84" ) + ( "pogo" . "\xe9b8" ) + ( "pointwise" . "\xe977" ) + ( "polymer" . "\xea2b" ) + ( "pony" . "\xe9b7" ) + ( "postcss" . "\xe910" ) + ( "postscript" . "\xe955" ) + ( "povray" . "\x50" ) + ( "powerpoint" . "\xe9ec" ) + ( "powershell" . "\xe9da" ) + ( "precision" . "\x2295" ) + ( "premiere" . "\xe9f5" ) + ( "processing" . "\xe9a0" ) + ( "progress" . "\xe9c0" ) + ( "propeller" . "\xe9b5" ) + ( "proselint" . "\xea6d" ) + ( "protractor" . "\xe9de" ) + ( "ps" . "\xe6b8" ) + ( "pug" . "\xea13" ) + ( "pug-alt" . "\xe9d0" ) + ( "puppet" . "\xf0c3" ) + ( "purebasic" . "\x1b5" ) + ( "purescript" . "\xe9b2" ) + ( "racket" . "\xe9b1" ) + ( "raml" . "\xe913" ) + ( "rascal" . "\xea24" ) + ( "rdoc" . "\xe9b0" ) + ( "realbasic" . "\xe9af" ) + ( "reason" . "\xea1d" ) + ( "rebol" . "\xe9ae" ) + ( "red" . "\xe9ad" ) + ( "redux" . "\xea30" ) + ( "regex" . "\x2a" ) + ( "rexx" . "\xea16" ) + ( "rhino" . "\xea4a" ) + ( "ring" . "\x1f48d" ) + ( "riot" . "\xe919" ) + ( "robot" . "\xe9ac" ) + ( "rollup" . "\xea20" ) + ( "rollup-old" . "\xe9fd" ) + ( "rot" . "\x1f764" ) + ( "rspec" . "\xea31" ) + ( "rst" . "\xe9cc" ) + ( "sage" . "\xe9ab" ) + ( "saltstack" . "\xe915" ) + ( "sas" . "\xe95a" ) + ( "sbt" . "\xe9d2" ) + ( "sc" . "\xe9a2" ) + ( "scheme" . "\x3bb" ) + ( "scilab" . "\xe9a9" ) + ( "scrutinizer" . "\xe9d4" ) + ( "self" . "\xe9a8" ) + ( "sequelize" . "\xea2f" ) + ( "sf" . "\xe9db" ) + ( "shen" . "\xe9a7" ) + ( "shipit" . "\x26f5" ) + ( "shippable" . "\xea2d" ) + ( "shopify" . "\xe9cf" ) + ( "shuriken" . "\x272b" ) + ( "silverstripe" . "\xe800" ) + ( "sinatra" . "\xea03" ) + ( "sketch" . "\xe927" ) + ( "sketchup-layout" . "\xea7c" ) + ( "sketchup-make" . "\xea7e" ) + ( "sketchup-stylebuilder" . "\xea7d" ) + ( "slash" . "\xe9a6" ) + ( "snyk" . "\xea1c" ) + ( "solidity" . "\xea86" ) + ( "sparql" . "\xe959" ) + ( "spray" . "\xea02" ) + ( "sqf" . "\xe9a5" ) + ( "sqlite" . "\xe9dd" ) + ( "squarespace" . "\xea5e" ) + ( "stan" . "\xe9a4" ) + ( "stata" . "\xe9a3" ) + ( "storyist" . "\xe9ef" ) + ( "strings" . "\xe9e0" ) + ( "stylelint" . "\xe93d" ) + ( "stylus" . "\x73" ) + ( "stylus-full" . "\xe9f7" ) + ( "stylus-orb" . "\x53" ) + ( "sublime" . "\xe986" ) + ( "sv" . "\xe9c3" ) + ( "svn" . "\xea17" ) + ( "swagger" . "\xea29" ) + ( "tag" . "\xf015" ) + ( "tcl" . "\xe956" ) + ( "telegram" . "\x2708" ) + ( "terminal" . "\xf0c8" ) + ( "tern" . "\x1f54a" ) + ( "terraform" . "\xe916" ) + ( "test-coffeescript" . "\xea62" ) + ( "test-dir" . "\xea60" ) + ( "test-generic" . "\xea63" ) + ( "test-js" . "\xea64" ) + ( "test-perl" . "\xea65" ) + ( "test-python" . "\xea66" ) + ( "test-react" . "\xea67" ) + ( "test-ruby" . "\xea68" ) + ( "test-typescript" . "\xea69" ) + ( "tex" . "\xe600" ) + ( "textile" . "\x74" ) + ( "textmate" . "\x2122" ) + ( "thor" . "\xe9d8" ) + ( "tinymce" . "\xea01" ) + ( "tsx" . "\xe9d1" ) + ( "tsx-alt" . "\xe9e7" ) + ( "tt" . "\x54" ) + ( "turing" . "\xe9b6" ) + ( "twig" . "\x2e19" ) + ( "twine" . "\xea5d" ) + ( "txl" . "\xe9c1" ) + ( "typedoc" . "\xe9fe" ) + ( "typescript" . "\xe912" ) + ( "typescript-alt" . "\x2a6" ) + ( "typings" . "\xe9df" ) + ( "uno" . "\xe9b3" ) + ( "unreal" . "\x75" ) + ( "urweb" . "\xe9ba" ) + ( "v8" . "\xea1f" ) + ( "vagrant" . "\x56" ) + ( "vcl" . "\xe9b4" ) + ( "verilog" . "\xe949" ) + ( "vertex-shader" . "\xea79" ) + ( "vhdl" . "\xe9aa" ) + ( "video" . "\xf057" ) + ( "virtualbox" . "\xea3e" ) + ( "virtualbox-alt" . "\xea2e" ) + ( "visio" . "\xea83" ) + ( "vmware" . "\xea49" ) + ( "vue" . "\xe906" ) + ( "wasm" . "\xea70" ) + ( "watchman" . "\xea4f" ) + ( "webgl" . "\xea7b" ) + ( "webpack" . "\xea61" ) + ( "webpack-old" . "\xe91e" ) + ( "wercker" . "\xea19" ) + ( "word" . "\xe9ed" ) + ( "x10" . "\x2169" ) + ( "xamarin" . "\xea77" ) + ( "xmos" . "\x58" ) + ( "xpages" . "\xe9c5" ) + ( "xtend" . "\xe9c6" ) + ( "yarn" . "\xea1a" ) + ( "yasm" . "\xea73" ) + ( "yin-yang" . "\x262f" ) + ( "yoyo" . "\xe975" ) + ( "yui" . "\xea00" ) + ( "zbrush" . "\xe9f2" ) + ( "zephir" . "\xe9c7" ) + ("zig" . "\x7A") + ( "zimpl" . "\xe9c8" ) + + ) + ) + +(provide 'data-fileicons) diff --git a/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-fileicons.elc b/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-fileicons.elc new file mode 100644 index 0000000..ca6f103 Binary files /dev/null and b/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-fileicons.elc differ diff --git a/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-material.el b/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-material.el new file mode 100644 index 0000000..bafcfe7 --- /dev/null +++ b/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-material.el @@ -0,0 +1,935 @@ +(defvar all-the-icons-data/material-icons-alist + '(("3d_rotation" . "\xe84d") + ("ac_unit" . "\xeb3b") + ("access_alarm" . "\xe190") + ("access_alarms" . "\xe191") + ("access_time" . "\xe192") + ("accessibility" . "\xe84e") + ("accessible" . "\xe914") + ("account_balance" . "\xe84f") + ("account_balance_wallet" . "\xe850") + ("account_box" . "\xe851") + ("account_circle" . "\xe853") + ("adb" . "\xe60e") + ("add" . "\xe145") + ("add_a_photo" . "\xe439") + ("add_alarm" . "\xe193") + ("add_alert" . "\xe003") + ("add_box" . "\xe146") + ("add_circle" . "\xe147") + ("add_circle_outline" . "\xe148") + ("add_location" . "\xe567") + ("add_shopping_cart" . "\xe854") + ("add_to_photos" . "\xe39d") + ("add_to_queue" . "\xe05c") + ("adjust" . "\xe39e") + ("airline_seat_flat" . "\xe630") + ("airline_seat_flat_angled" . "\xe631") + ("airline_seat_individual_suite" . "\xe632") + ("airline_seat_legroom_extra" . "\xe633") + ("airline_seat_legroom_normal" . "\xe634") + ("airline_seat_legroom_reduced" . "\xe635") + ("airline_seat_recline_extra" . "\xe636") + ("airline_seat_recline_normal" . "\xe637") + ("airplanemode_active" . "\xe195") + ("airplanemode_inactive" . "\xe194") + ("airplay" . "\xe055") + ("airport_shuttle" . "\xeb3c") + ("alarm" . "\xe855") + ("alarm_add" . "\xe856") + ("alarm_off" . "\xe857") + ("alarm_on" . "\xe858") + ("album" . "\xe019") + ("all_inclusive" . "\xeb3d") + ("all_out" . "\xe90b") + ("android" . "\xe859") + ("announcement" . "\xe85a") + ("apps" . "\xe5c3") + ("archive" . "\xe149") + ("arrow_back" . "\xe5c4") + ("arrow_downward" . "\xe5db") + ("arrow_drop_down" . "\xe5c5") + ("arrow_drop_down_circle" . "\xe5c6") + ("arrow_drop_up" . "\xe5c7") + ("arrow_forward" . "\xe5c8") + ("arrow_upward" . "\xe5d8") + ("art_track" . "\xe060") + ("aspect_ratio" . "\xe85b") + ("assessment" . "\xe85c") + ("assignment" . "\xe85d") + ("assignment_ind" . "\xe85e") + ("assignment_late" . "\xe85f") + ("assignment_return" . "\xe860") + ("assignment_returned" . "\xe861") + ("assignment_turned_in" . "\xe862") + ("assistant" . "\xe39f") + ("assistant_photo" . "\xe3a0") + ("attach_file" . "\xe226") + ("attach_money" . "\xe227") + ("attachment" . "\xe2bc") + ("audiotrack" . "\xe3a1") + ("autorenew" . "\xe863") + ("av_timer" . "\xe01b") + ("backspace" . "\xe14a") + ("backup" . "\xe864") + ("battery_alert" . "\xe19c") + ("battery_charging_full" . "\xe1a3") + ("battery_full" . "\xe1a4") + ("battery_std" . "\xe1a5") + ("battery_unknown" . "\xe1a6") + ("beach_access" . "\xeb3e") + ("beenhere" . "\xe52d") + ("block" . "\xe14b") + ("bluetooth" . "\xe1a7") + ("bluetooth_audio" . "\xe60f") + ("bluetooth_connected" . "\xe1a8") + ("bluetooth_disabled" . "\xe1a9") + ("bluetooth_searching" . "\xe1aa") + ("blur_circular" . "\xe3a2") + ("blur_linear" . "\xe3a3") + ("blur_off" . "\xe3a4") + ("blur_on" . "\xe3a5") + ("book" . "\xe865") + ("bookmark" . "\xe866") + ("bookmark_border" . "\xe867") + ("border_all" . "\xe228") + ("border_bottom" . "\xe229") + ("border_clear" . "\xe22a") + ("border_color" . "\xe22b") + ("border_horizontal" . "\xe22c") + ("border_inner" . "\xe22d") + ("border_left" . "\xe22e") + ("border_outer" . "\xe22f") + ("border_right" . "\xe230") + ("border_style" . "\xe231") + ("border_top" . "\xe232") + ("border_vertical" . "\xe233") + ("branding_watermark" . "\xe06b") + ("brightness_1" . "\xe3a6") + ("brightness_2" . "\xe3a7") + ("brightness_3" . "\xe3a8") + ("brightness_4" . "\xe3a9") + ("brightness_5" . "\xe3aa") + ("brightness_6" . "\xe3ab") + ("brightness_7" . "\xe3ac") + ("brightness_auto" . "\xe1ab") + ("brightness_high" . "\xe1ac") + ("brightness_low" . "\xe1ad") + ("brightness_medium" . "\xe1ae") + ("broken_image" . "\xe3ad") + ("brush" . "\xe3ae") + ("bubble_chart" . "\xe6dd") + ("bug_report" . "\xe868") + ("build" . "\xe869") + ("burst_mode" . "\xe43c") + ("business" . "\xe0af") + ("business_center" . "\xeb3f") + ("cached" . "\xe86a") + ("cake" . "\xe7e9") + ("call" . "\xe0b0") + ("call_end" . "\xe0b1") + ("call_made" . "\xe0b2") + ("call_merge" . "\xe0b3") + ("call_missed" . "\xe0b4") + ("call_missed_outgoing" . "\xe0e4") + ("call_received" . "\xe0b5") + ("call_split" . "\xe0b6") + ("call_to_action" . "\xe06c") + ("camera" . "\xe3af") + ("camera_alt" . "\xe3b0") + ("camera_enhance" . "\xe8fc") + ("camera_front" . "\xe3b1") + ("camera_rear" . "\xe3b2") + ("camera_roll" . "\xe3b3") + ("cancel" . "\xe5c9") + ("card_giftcard" . "\xe8f6") + ("card_membership" . "\xe8f7") + ("card_travel" . "\xe8f8") + ("casino" . "\xeb40") + ("cast" . "\xe307") + ("cast_connected" . "\xe308") + ("center_focus_strong" . "\xe3b4") + ("center_focus_weak" . "\xe3b5") + ("change_history" . "\xe86b") + ("chat" . "\xe0b7") + ("chat_bubble" . "\xe0ca") + ("chat_bubble_outline" . "\xe0cb") + ("check" . "\xe5ca") + ("check_box" . "\xe834") + ("check_box_outline_blank" . "\xe835") + ("check_circle" . "\xe86c") + ("chevron_left" . "\xe5cb") + ("chevron_right" . "\xe5cc") + ("child_care" . "\xeb41") + ("child_friendly" . "\xeb42") + ("chrome_reader_mode" . "\xe86d") + ("class" . "\xe86e") + ("clear" . "\xe14c") + ("clear_all" . "\xe0b8") + ("close" . "\xe5cd") + ("closed_caption" . "\xe01c") + ("cloud" . "\xe2bd") + ("cloud_circle" . "\xe2be") + ("cloud_done" . "\xe2bf") + ("cloud_download" . "\xe2c0") + ("cloud_off" . "\xe2c1") + ("cloud_queue" . "\xe2c2") + ("cloud_upload" . "\xe2c3") + ("code" . "\xe86f") + ("collections" . "\xe3b6") + ("collections_bookmark" . "\xe431") + ("color_lens" . "\xe3b7") + ("colorize" . "\xe3b8") + ("comment" . "\xe0b9") + ("compare" . "\xe3b9") + ("compare_arrows" . "\xe915") + ("computer" . "\xe30a") + ("confirmation_number" . "\xe638") + ("contact_mail" . "\xe0d0") + ("contact_phone" . "\xe0cf") + ("contacts" . "\xe0ba") + ("content_copy" . "\xe14d") + ("content_cut" . "\xe14e") + ("content_paste" . "\xe14f") + ("control_point" . "\xe3ba") + ("control_point_duplicate" . "\xe3bb") + ("copyright" . "\xe90c") + ("create" . "\xe150") + ("create_new_folder" . "\xe2cc") + ("credit_card" . "\xe870") + ("crop" . "\xe3be") + ("crop_16_9" . "\xe3bc") + ("crop_3_2" . "\xe3bd") + ("crop_5_4" . "\xe3bf") + ("crop_7_5" . "\xe3c0") + ("crop_din" . "\xe3c1") + ("crop_free" . "\xe3c2") + ("crop_landscape" . "\xe3c3") + ("crop_original" . "\xe3c4") + ("crop_portrait" . "\xe3c5") + ("crop_rotate" . "\xe437") + ("crop_square" . "\xe3c6") + ("dashboard" . "\xe871") + ("data_usage" . "\xe1af") + ("date_range" . "\xe916") + ("dehaze" . "\xe3c7") + ("delete" . "\xe872") + ("delete_forever" . "\xe92b") + ("delete_sweep" . "\xe16c") + ("description" . "\xe873") + ("desktop_mac" . "\xe30b") + ("desktop_windows" . "\xe30c") + ("details" . "\xe3c8") + ("developer_board" . "\xe30d") + ("developer_mode" . "\xe1b0") + ("device_hub" . "\xe335") + ("devices" . "\xe1b1") + ("devices_other" . "\xe337") + ("dialer_sip" . "\xe0bb") + ("dialpad" . "\xe0bc") + ("directions" . "\xe52e") + ("directions_bike" . "\xe52f") + ("directions_boat" . "\xe532") + ("directions_bus" . "\xe530") + ("directions_car" . "\xe531") + ("directions_railway" . "\xe534") + ("directions_run" . "\xe566") + ("directions_subway" . "\xe533") + ("directions_transit" . "\xe535") + ("directions_walk" . "\xe536") + ("disc_full" . "\xe610") + ("dns" . "\xe875") + ("do_not_disturb" . "\xe612") + ("do_not_disturb_alt" . "\xe611") + ("do_not_disturb_off" . "\xe643") + ("do_not_disturb_on" . "\xe644") + ("dock" . "\xe30e") + ("domain" . "\xe7ee") + ("done" . "\xe876") + ("done_all" . "\xe877") + ("donut_large" . "\xe917") + ("donut_small" . "\xe918") + ("drafts" . "\xe151") + ("drag_handle" . "\xe25d") + ("drive_eta" . "\xe613") + ("dvr" . "\xe1b2") + ("edit" . "\xe3c9") + ("edit_location" . "\xe568") + ("eject" . "\xe8fb") + ("email" . "\xe0be") + ("enhanced_encryption" . "\xe63f") + ("equalizer" . "\xe01d") + ("error" . "\xe000") + ("error_outline" . "\xe001") + ("euro_symbol" . "\xe926") + ("ev_station" . "\xe56d") + ("event" . "\xe878") + ("event_available" . "\xe614") + ("event_busy" . "\xe615") + ("event_note" . "\xe616") + ("event_seat" . "\xe903") + ("exit_to_app" . "\xe879") + ("expand_less" . "\xe5ce") + ("expand_more" . "\xe5cf") + ("explicit" . "\xe01e") + ("explore" . "\xe87a") + ("exposure" . "\xe3ca") + ("exposure_neg_1" . "\xe3cb") + ("exposure_neg_2" . "\xe3cc") + ("exposure_plus_1" . "\xe3cd") + ("exposure_plus_2" . "\xe3ce") + ("exposure_zero" . "\xe3cf") + ("extension" . "\xe87b") + ("face" . "\xe87c") + ("fast_forward" . "\xe01f") + ("fast_rewind" . "\xe020") + ("favorite" . "\xe87d") + ("favorite_border" . "\xe87e") + ("featured_play_list" . "\xe06d") + ("featured_video" . "\xe06e") + ("feedback" . "\xe87f") + ("fiber_dvr" . "\xe05d") + ("fiber_manual_record" . "\xe061") + ("fiber_new" . "\xe05e") + ("fiber_pin" . "\xe06a") + ("fiber_smart_record" . "\xe062") + ("file_download" . "\xe2c4") + ("file_upload" . "\xe2c6") + ("filter" . "\xe3d3") + ("filter_1" . "\xe3d0") + ("filter_2" . "\xe3d1") + ("filter_3" . "\xe3d2") + ("filter_4" . "\xe3d4") + ("filter_5" . "\xe3d5") + ("filter_6" . "\xe3d6") + ("filter_7" . "\xe3d7") + ("filter_8" . "\xe3d8") + ("filter_9" . "\xe3d9") + ("filter_9_plus" . "\xe3da") + ("filter_b_and_w" . "\xe3db") + ("filter_center_focus" . "\xe3dc") + ("filter_drama" . "\xe3dd") + ("filter_frames" . "\xe3de") + ("filter_hdr" . "\xe3df") + ("filter_list" . "\xe152") + ("filter_none" . "\xe3e0") + ("filter_tilt_shift" . "\xe3e2") + ("filter_vintage" . "\xe3e3") + ("find_in_page" . "\xe880") + ("find_replace" . "\xe881") + ("fingerprint" . "\xe90d") + ("first_page" . "\xe5dc") + ("fitness_center" . "\xeb43") + ("flag" . "\xe153") + ("flare" . "\xe3e4") + ("flash_auto" . "\xe3e5") + ("flash_off" . "\xe3e6") + ("flash_on" . "\xe3e7") + ("flight" . "\xe539") + ("flight_land" . "\xe904") + ("flight_takeoff" . "\xe905") + ("flip" . "\xe3e8") + ("flip_to_back" . "\xe882") + ("flip_to_front" . "\xe883") + ("folder" . "\xe2c7") + ("folder_open" . "\xe2c8") + ("folder_shared" . "\xe2c9") + ("folder_special" . "\xe617") + ("font_download" . "\xe167") + ("format_align_center" . "\xe234") + ("format_align_justify" . "\xe235") + ("format_align_left" . "\xe236") + ("format_align_right" . "\xe237") + ("format_bold" . "\xe238") + ("format_clear" . "\xe239") + ("format_color_fill" . "\xe23a") + ("format_color_reset" . "\xe23b") + ("format_color_text" . "\xe23c") + ("format_indent_decrease" . "\xe23d") + ("format_indent_increase" . "\xe23e") + ("format_italic" . "\xe23f") + ("format_line_spacing" . "\xe240") + ("format_list_bulleted" . "\xe241") + ("format_list_numbered" . "\xe242") + ("format_paint" . "\xe243") + ("format_quote" . "\xe244") + ("format_shapes" . "\xe25e") + ("format_size" . "\xe245") + ("format_strikethrough" . "\xe246") + ("format_textdirection_l_to_r" . "\xe247") + ("format_textdirection_r_to_l" . "\xe248") + ("format_underlined" . "\xe249") + ("forum" . "\xe0bf") + ("forward" . "\xe154") + ("forward_10" . "\xe056") + ("forward_30" . "\xe057") + ("forward_5" . "\xe058") + ("free_breakfast" . "\xeb44") + ("fullscreen" . "\xe5d0") + ("fullscreen_exit" . "\xe5d1") + ("functions" . "\xe24a") + ("g_translate" . "\xe927") + ("gamepad" . "\xe30f") + ("games" . "\xe021") + ("gavel" . "\xe90e") + ("gesture" . "\xe155") + ("get_app" . "\xe884") + ("gif" . "\xe908") + ("golf_course" . "\xeb45") + ("gps_fixed" . "\xe1b3") + ("gps_not_fixed" . "\xe1b4") + ("gps_off" . "\xe1b5") + ("grade" . "\xe885") + ("gradient" . "\xe3e9") + ("grain" . "\xe3ea") + ("graphic_eq" . "\xe1b8") + ("grid_off" . "\xe3eb") + ("grid_on" . "\xe3ec") + ("group" . "\xe7ef") + ("group_add" . "\xe7f0") + ("group_work" . "\xe886") + ("hd" . "\xe052") + ("hdr_off" . "\xe3ed") + ("hdr_on" . "\xe3ee") + ("hdr_strong" . "\xe3f1") + ("hdr_weak" . "\xe3f2") + ("headset" . "\xe310") + ("headset_mic" . "\xe311") + ("healing" . "\xe3f3") + ("hearing" . "\xe023") + ("help" . "\xe887") + ("help_outline" . "\xe8fd") + ("high_quality" . "\xe024") + ("highlight" . "\xe25f") + ("highlight_off" . "\xe888") + ("history" . "\xe889") + ("home" . "\xe88a") + ("hot_tub" . "\xeb46") + ("hotel" . "\xe53a") + ("hourglass_empty" . "\xe88b") + ("hourglass_full" . "\xe88c") + ("http" . "\xe902") + ("https" . "\xe88d") + ("image" . "\xe3f4") + ("image_aspect_ratio" . "\xe3f5") + ("import_contacts" . "\xe0e0") + ("import_export" . "\xe0c3") + ("important_devices" . "\xe912") + ("inbox" . "\xe156") + ("indeterminate_check_box" . "\xe909") + ("info" . "\xe88e") + ("info_outline" . "\xe88f") + ("input" . "\xe890") + ("insert_chart" . "\xe24b") + ("insert_comment" . "\xe24c") + ("insert_drive_file" . "\xe24d") + ("insert_emoticon" . "\xe24e") + ("insert_invitation" . "\xe24f") + ("insert_link" . "\xe250") + ("insert_photo" . "\xe251") + ("invert_colors" . "\xe891") + ("invert_colors_off" . "\xe0c4") + ("iso" . "\xe3f6") + ("keyboard" . "\xe312") + ("keyboard_arrow_down" . "\xe313") + ("keyboard_arrow_left" . "\xe314") + ("keyboard_arrow_right" . "\xe315") + ("keyboard_arrow_up" . "\xe316") + ("keyboard_backspace" . "\xe317") + ("keyboard_capslock" . "\xe318") + ("keyboard_hide" . "\xe31a") + ("keyboard_return" . "\xe31b") + ("keyboard_tab" . "\xe31c") + ("keyboard_voice" . "\xe31d") + ("kitchen" . "\xeb47") + ("label" . "\xe892") + ("label_outline" . "\xe893") + ("landscape" . "\xe3f7") + ("language" . "\xe894") + ("laptop" . "\xe31e") + ("laptop_chromebook" . "\xe31f") + ("laptop_mac" . "\xe320") + ("laptop_windows" . "\xe321") + ("last_page" . "\xe5dd") + ("launch" . "\xe895") + ("layers" . "\xe53b") + ("layers_clear" . "\xe53c") + ("leak_add" . "\xe3f8") + ("leak_remove" . "\xe3f9") + ("lens" . "\xe3fa") + ("library_add" . "\xe02e") + ("library_books" . "\xe02f") + ("library_music" . "\xe030") + ("lightbulb_outline" . "\xe90f") + ("line_style" . "\xe919") + ("line_weight" . "\xe91a") + ("linear_scale" . "\xe260") + ("link" . "\xe157") + ("linked_camera" . "\xe438") + ("list" . "\xe896") + ("live_help" . "\xe0c6") + ("live_tv" . "\xe639") + ("local_activity" . "\xe53f") + ("local_airport" . "\xe53d") + ("local_atm" . "\xe53e") + ("local_bar" . "\xe540") + ("local_cafe" . "\xe541") + ("local_car_wash" . "\xe542") + ("local_convenience_store" . "\xe543") + ("local_dining" . "\xe556") + ("local_drink" . "\xe544") + ("local_florist" . "\xe545") + ("local_gas_station" . "\xe546") + ("local_grocery_store" . "\xe547") + ("local_hospital" . "\xe548") + ("local_hotel" . "\xe549") + ("local_laundry_service" . "\xe54a") + ("local_library" . "\xe54b") + ("local_mall" . "\xe54c") + ("local_movies" . "\xe54d") + ("local_offer" . "\xe54e") + ("local_parking" . "\xe54f") + ("local_pharmacy" . "\xe550") + ("local_phone" . "\xe551") + ("local_pizza" . "\xe552") + ("local_play" . "\xe553") + ("local_post_office" . "\xe554") + ("local_printshop" . "\xe555") + ("local_see" . "\xe557") + ("local_shipping" . "\xe558") + ("local_taxi" . "\xe559") + ("location_city" . "\xe7f1") + ("location_disabled" . "\xe1b6") + ("location_off" . "\xe0c7") + ("location_on" . "\xe0c8") + ("location_searching" . "\xe1b7") + ("lock" . "\xe897") + ("lock_open" . "\xe898") + ("lock_outline" . "\xe899") + ("looks" . "\xe3fc") + ("looks_3" . "\xe3fb") + ("looks_4" . "\xe3fd") + ("looks_5" . "\xe3fe") + ("looks_6" . "\xe3ff") + ("looks_one" . "\xe400") + ("looks_two" . "\xe401") + ("loop" . "\xe028") + ("loupe" . "\xe402") + ("low_priority" . "\xe16d") + ("loyalty" . "\xe89a") + ("mail" . "\xe158") + ("mail_outline" . "\xe0e1") + ("map" . "\xe55b") + ("markunread" . "\xe159") + ("markunread_mailbox" . "\xe89b") + ("memory" . "\xe322") + ("menu" . "\xe5d2") + ("merge_type" . "\xe252") + ("message" . "\xe0c9") + ("mic" . "\xe029") + ("mic_none" . "\xe02a") + ("mic_off" . "\xe02b") + ("mms" . "\xe618") + ("mode_comment" . "\xe253") + ("mode_edit" . "\xe254") + ("monetization_on" . "\xe263") + ("money_off" . "\xe25c") + ("monochrome_photos" . "\xe403") + ("mood" . "\xe7f2") + ("mood_bad" . "\xe7f3") + ("more" . "\xe619") + ("more_horiz" . "\xe5d3") + ("more_vert" . "\xe5d4") + ("motorcycle" . "\xe91b") + ("mouse" . "\xe323") + ("move_to_inbox" . "\xe168") + ("movie" . "\xe02c") + ("movie_creation" . "\xe404") + ("movie_filter" . "\xe43a") + ("multiline_chart" . "\xe6df") + ("music_note" . "\xe405") + ("music_video" . "\xe063") + ("my_location" . "\xe55c") + ("nature" . "\xe406") + ("nature_people" . "\xe407") + ("navigate_before" . "\xe408") + ("navigate_next" . "\xe409") + ("navigation" . "\xe55d") + ("near_me" . "\xe569") + ("network_cell" . "\xe1b9") + ("network_check" . "\xe640") + ("network_locked" . "\xe61a") + ("network_wifi" . "\xe1ba") + ("new_releases" . "\xe031") + ("next_week" . "\xe16a") + ("nfc" . "\xe1bb") + ("no_encryption" . "\xe641") + ("no_sim" . "\xe0cc") + ("not_interested" . "\xe033") + ("note" . "\xe06f") + ("note_add" . "\xe89c") + ("notifications" . "\xe7f4") + ("notifications_active" . "\xe7f7") + ("notifications_none" . "\xe7f5") + ("notifications_off" . "\xe7f6") + ("notifications_paused" . "\xe7f8") + ("offline_pin" . "\xe90a") + ("ondemand_video" . "\xe63a") + ("opacity" . "\xe91c") + ("open_in_browser" . "\xe89d") + ("open_in_new" . "\xe89e") + ("open_with" . "\xe89f") + ("pages" . "\xe7f9") + ("pageview" . "\xe8a0") + ("palette" . "\xe40a") + ("pan_tool" . "\xe925") + ("panorama" . "\xe40b") + ("panorama_fish_eye" . "\xe40c") + ("panorama_horizontal" . "\xe40d") + ("panorama_vertical" . "\xe40e") + ("panorama_wide_angle" . "\xe40f") + ("party_mode" . "\xe7fa") + ("pause" . "\xe034") + ("pause_circle_filled" . "\xe035") + ("pause_circle_outline" . "\xe036") + ("payment" . "\xe8a1") + ("people" . "\xe7fb") + ("people_outline" . "\xe7fc") + ("perm_camera_mic" . "\xe8a2") + ("perm_contact_calendar" . "\xe8a3") + ("perm_data_setting" . "\xe8a4") + ("perm_device_information" . "\xe8a5") + ("perm_identity" . "\xe8a6") + ("perm_media" . "\xe8a7") + ("perm_phone_msg" . "\xe8a8") + ("perm_scan_wifi" . "\xe8a9") + ("person" . "\xe7fd") + ("person_add" . "\xe7fe") + ("person_outline" . "\xe7ff") + ("person_pin" . "\xe55a") + ("person_pin_circle" . "\xe56a") + ("personal_video" . "\xe63b") + ("pets" . "\xe91d") + ("phone" . "\xe0cd") + ("phone_android" . "\xe324") + ("phone_bluetooth_speaker" . "\xe61b") + ("phone_forwarded" . "\xe61c") + ("phone_in_talk" . "\xe61d") + ("phone_iphone" . "\xe325") + ("phone_locked" . "\xe61e") + ("phone_missed" . "\xe61f") + ("phone_paused" . "\xe620") + ("phonelink" . "\xe326") + ("phonelink_erase" . "\xe0db") + ("phonelink_lock" . "\xe0dc") + ("phonelink_off" . "\xe327") + ("phonelink_ring" . "\xe0dd") + ("phonelink_setup" . "\xe0de") + ("photo" . "\xe410") + ("photo_album" . "\xe411") + ("photo_camera" . "\xe412") + ("photo_filter" . "\xe43b") + ("photo_library" . "\xe413") + ("photo_size_select_actual" . "\xe432") + ("photo_size_select_large" . "\xe433") + ("photo_size_select_small" . "\xe434") + ("picture_as_pdf" . "\xe415") + ("picture_in_picture" . "\xe8aa") + ("picture_in_picture_alt" . "\xe911") + ("pie_chart" . "\xe6c4") + ("pie_chart_outlined" . "\xe6c5") + ("pin_drop" . "\xe55e") + ("place" . "\xe55f") + ("play_arrow" . "\xe037") + ("play_circle_filled" . "\xe038") + ("play_circle_outline" . "\xe039") + ("play_for_work" . "\xe906") + ("playlist_add" . "\xe03b") + ("playlist_add_check" . "\xe065") + ("playlist_play" . "\xe05f") + ("plus_one" . "\xe800") + ("poll" . "\xe801") + ("polymer" . "\xe8ab") + ("pool" . "\xeb48") + ("portable_wifi_off" . "\xe0ce") + ("portrait" . "\xe416") + ("power" . "\xe63c") + ("power_input" . "\xe336") + ("power_settings_new" . "\xe8ac") + ("pregnant_woman" . "\xe91e") + ("present_to_all" . "\xe0df") + ("print" . "\xe8ad") + ("priority_high" . "\xe645") + ("public" . "\xe80b") + ("publish" . "\xe255") + ("query_builder" . "\xe8ae") + ("question_answer" . "\xe8af") + ("queue" . "\xe03c") + ("queue_music" . "\xe03d") + ("queue_play_next" . "\xe066") + ("radio" . "\xe03e") + ("radio_button_checked" . "\xe837") + ("radio_button_unchecked" . "\xe836") + ("rate_review" . "\xe560") + ("receipt" . "\xe8b0") + ("recent_actors" . "\xe03f") + ("record_voice_over" . "\xe91f") + ("redeem" . "\xe8b1") + ("redo" . "\xe15a") + ("refresh" . "\xe5d5") + ("remove" . "\xe15b") + ("remove_circle" . "\xe15c") + ("remove_circle_outline" . "\xe15d") + ("remove_from_queue" . "\xe067") + ("remove_red_eye" . "\xe417") + ("remove_shopping_cart" . "\xe928") + ("reorder" . "\xe8fe") + ("repeat" . "\xe040") + ("repeat_one" . "\xe041") + ("replay" . "\xe042") + ("replay_10" . "\xe059") + ("replay_30" . "\xe05a") + ("replay_5" . "\xe05b") + ("reply" . "\xe15e") + ("reply_all" . "\xe15f") + ("report" . "\xe160") + ("report_problem" . "\xe8b2") + ("restaurant" . "\xe56c") + ("restaurant_menu" . "\xe561") + ("restore" . "\xe8b3") + ("restore_page" . "\xe929") + ("ring_volume" . "\xe0d1") + ("room" . "\xe8b4") + ("room_service" . "\xeb49") + ("rotate_90_degrees_ccw" . "\xe418") + ("rotate_left" . "\xe419") + ("rotate_right" . "\xe41a") + ("rounded_corner" . "\xe920") + ("router" . "\xe328") + ("rowing" . "\xe921") + ("rss_feed" . "\xe0e5") + ("rv_hookup" . "\xe642") + ("satellite" . "\xe562") + ("save" . "\xe161") + ("scanner" . "\xe329") + ("schedule" . "\xe8b5") + ("school" . "\xe80c") + ("screen_lock_landscape" . "\xe1be") + ("screen_lock_portrait" . "\xe1bf") + ("screen_lock_rotation" . "\xe1c0") + ("screen_rotation" . "\xe1c1") + ("screen_share" . "\xe0e2") + ("sd_card" . "\xe623") + ("sd_storage" . "\xe1c2") + ("search" . "\xe8b6") + ("security" . "\xe32a") + ("select_all" . "\xe162") + ("send" . "\xe163") + ("sentiment_dissatisfied" . "\xe811") + ("sentiment_neutral" . "\xe812") + ("sentiment_satisfied" . "\xe813") + ("sentiment_very_dissatisfied" . "\xe814") + ("sentiment_very_satisfied" . "\xe815") + ("settings" . "\xe8b8") + ("settings_applications" . "\xe8b9") + ("settings_backup_restore" . "\xe8ba") + ("settings_bluetooth" . "\xe8bb") + ("settings_brightness" . "\xe8bd") + ("settings_cell" . "\xe8bc") + ("settings_ethernet" . "\xe8be") + ("settings_input_antenna" . "\xe8bf") + ("settings_input_component" . "\xe8c0") + ("settings_input_composite" . "\xe8c1") + ("settings_input_hdmi" . "\xe8c2") + ("settings_input_svideo" . "\xe8c3") + ("settings_overscan" . "\xe8c4") + ("settings_phone" . "\xe8c5") + ("settings_power" . "\xe8c6") + ("settings_remote" . "\xe8c7") + ("settings_system_daydream" . "\xe1c3") + ("settings_voice" . "\xe8c8") + ("share" . "\xe80d") + ("shop" . "\xe8c9") + ("shop_two" . "\xe8ca") + ("shopping_basket" . "\xe8cb") + ("shopping_cart" . "\xe8cc") + ("short_text" . "\xe261") + ("show_chart" . "\xe6e1") + ("shuffle" . "\xe043") + ("signal_cellular_4_bar" . "\xe1c8") + ("signal_cellular_connected_no_internet_4_bar" . "\xe1cd") + ("signal_cellular_no_sim" . "\xe1ce") + ("signal_cellular_null" . "\xe1cf") + ("signal_cellular_off" . "\xe1d0") + ("signal_wifi_4_bar" . "\xe1d8") + ("signal_wifi_4_bar_lock" . "\xe1d9") + ("signal_wifi_off" . "\xe1da") + ("sim_card" . "\xe32b") + ("sim_card_alert" . "\xe624") + ("skip_next" . "\xe044") + ("skip_previous" . "\xe045") + ("slideshow" . "\xe41b") + ("slow_motion_video" . "\xe068") + ("smartphone" . "\xe32c") + ("smoke_free" . "\xeb4a") + ("smoking_rooms" . "\xeb4b") + ("sms" . "\xe625") + ("sms_failed" . "\xe626") + ("snooze" . "\xe046") + ("sort" . "\xe164") + ("sort_by_alpha" . "\xe053") + ("spa" . "\xeb4c") + ("space_bar" . "\xe256") + ("speaker" . "\xe32d") + ("speaker_group" . "\xe32e") + ("speaker_notes" . "\xe8cd") + ("speaker_notes_off" . "\xe92a") + ("speaker_phone" . "\xe0d2") + ("spellcheck" . "\xe8ce") + ("star" . "\xe838") + ("star_border" . "\xe83a") + ("star_half" . "\xe839") + ("stars" . "\xe8d0") + ("stay_current_landscape" . "\xe0d3") + ("stay_current_portrait" . "\xe0d4") + ("stay_primary_landscape" . "\xe0d5") + ("stay_primary_portrait" . "\xe0d6") + ("stop" . "\xe047") + ("stop_screen_share" . "\xe0e3") + ("storage" . "\xe1db") + ("store" . "\xe8d1") + ("store_mall_directory" . "\xe563") + ("straighten" . "\xe41c") + ("streetview" . "\xe56e") + ("strikethrough_s" . "\xe257") + ("style" . "\xe41d") + ("subdirectory_arrow_left" . "\xe5d9") + ("subdirectory_arrow_right" . "\xe5da") + ("subject" . "\xe8d2") + ("subscriptions" . "\xe064") + ("subtitles" . "\xe048") + ("subway" . "\xe56f") + ("supervisor_account" . "\xe8d3") + ("surround_sound" . "\xe049") + ("swap_calls" . "\xe0d7") + ("swap_horiz" . "\xe8d4") + ("swap_vert" . "\xe8d5") + ("swap_vertical_circle" . "\xe8d6") + ("switch_camera" . "\xe41e") + ("switch_video" . "\xe41f") + ("sync" . "\xe627") + ("sync_disabled" . "\xe628") + ("sync_problem" . "\xe629") + ("system_update" . "\xe62a") + ("system_update_alt" . "\xe8d7") + ("tab" . "\xe8d8") + ("tab_unselected" . "\xe8d9") + ("tablet" . "\xe32f") + ("tablet_android" . "\xe330") + ("tablet_mac" . "\xe331") + ("tag_faces" . "\xe420") + ("tap_and_play" . "\xe62b") + ("terrain" . "\xe564") + ("text_fields" . "\xe262") + ("text_format" . "\xe165") + ("textsms" . "\xe0d8") + ("texture" . "\xe421") + ("theaters" . "\xe8da") + ("thumb_down" . "\xe8db") + ("thumb_up" . "\xe8dc") + ("thumbs_up_down" . "\xe8dd") + ("time_to_leave" . "\xe62c") + ("timelapse" . "\xe422") + ("timeline" . "\xe922") + ("timer" . "\xe425") + ("timer_10" . "\xe423") + ("timer_3" . "\xe424") + ("timer_off" . "\xe426") + ("title" . "\xe264") + ("toc" . "\xe8de") + ("today" . "\xe8df") + ("toll" . "\xe8e0") + ("tonality" . "\xe427") + ("touch_app" . "\xe913") + ("toys" . "\xe332") + ("track_changes" . "\xe8e1") + ("traffic" . "\xe565") + ("train" . "\xe570") + ("tram" . "\xe571") + ("transfer_within_a_station" . "\xe572") + ("transform" . "\xe428") + ("translate" . "\xe8e2") + ("trending_down" . "\xe8e3") + ("trending_flat" . "\xe8e4") + ("trending_up" . "\xe8e5") + ("tune" . "\xe429") + ("turned_in" . "\xe8e6") + ("turned_in_not" . "\xe8e7") + ("tv" . "\xe333") + ("unarchive" . "\xe169") + ("undo" . "\xe166") + ("unfold_less" . "\xe5d6") + ("unfold_more" . "\xe5d7") + ("update" . "\xe923") + ("usb" . "\xe1e0") + ("verified_user" . "\xe8e8") + ("vertical_align_bottom" . "\xe258") + ("vertical_align_center" . "\xe259") + ("vertical_align_top" . "\xe25a") + ("vibration" . "\xe62d") + ("video_call" . "\xe070") + ("video_label" . "\xe071") + ("video_library" . "\xe04a") + ("videocam" . "\xe04b") + ("videocam_off" . "\xe04c") + ("videogame_asset" . "\xe338") + ("view_agenda" . "\xe8e9") + ("view_array" . "\xe8ea") + ("view_carousel" . "\xe8eb") + ("view_column" . "\xe8ec") + ("view_comfy" . "\xe42a") + ("view_compact" . "\xe42b") + ("view_day" . "\xe8ed") + ("view_headline" . "\xe8ee") + ("view_list" . "\xe8ef") + ("view_module" . "\xe8f0") + ("view_quilt" . "\xe8f1") + ("view_stream" . "\xe8f2") + ("view_week" . "\xe8f3") + ("vignette" . "\xe435") + ("visibility" . "\xe8f4") + ("visibility_off" . "\xe8f5") + ("voice_chat" . "\xe62e") + ("voicemail" . "\xe0d9") + ("volume_down" . "\xe04d") + ("volume_mute" . "\xe04e") + ("volume_off" . "\xe04f") + ("volume_up" . "\xe050") + ("vpn_key" . "\xe0da") + ("vpn_lock" . "\xe62f") + ("wallpaper" . "\xe1bc") + ("warning" . "\xe002") + ("watch" . "\xe334") + ("watch_later" . "\xe924") + ("wb_auto" . "\xe42c") + ("wb_cloudy" . "\xe42d") + ("wb_incandescent" . "\xe42e") + ("wb_iridescent" . "\xe436") + ("wb_sunny" . "\xe430") + ("wc" . "\xe63d") + ("web" . "\xe051") + ("web_asset" . "\xe069") + ("weekend" . "\xe16b") + ("whatshot" . "\xe80e") + ("widgets" . "\xe1bd") + ("wifi" . "\xe63e") + ("wifi_lock" . "\xe1e1") + ("wifi_tethering" . "\xe1e2") + ("work" . "\xe8f9") + ("wrap_text" . "\xe25b") + ("youtube_searched_for" . "\xe8fa") + ("zoom_in" . "\xe8ff") + ("zoom_out" . "\xe900") + ("zoom_out_map" . "\xe56b"))) + + (provide 'data-material) diff --git a/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-material.elc b/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-material.elc new file mode 100644 index 0000000..96cb645 Binary files /dev/null and b/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-material.elc differ diff --git a/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-octicons.el b/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-octicons.el new file mode 100644 index 0000000..432251e --- /dev/null +++ b/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-octicons.el @@ -0,0 +1,165 @@ +(defvar all-the-icons-data/octicons-alist + '( + + ("alert" . "\xf02d") + ("arrow-down" . "\xf03f") + ("arrow-left" . "\xf040") + ("arrow-right" . "\xf03e") + ("arrow-small-down" . "\xf0a0") + ("arrow-small-left" . "\xf0a1") + ("arrow-small-right" . "\xf071") + ("arrow-small-up" . "\xf09f") + ("arrow-up" . "\xf03d") + ("book" . "\xf007") + ("bookmark" . "\xf07b") + ("briefcase" . "\xf0d3") + ("broadcast" . "\xf048") + ("browser" . "\xf0c5") + ("bug" . "\xf091") + ("calendar" . "\xf068") + ("check" . "\xf03a") + ("checklist" . "\xf076") + ("chevron-down" . "\xf0a3") + ("chevron-left" . "\xf0a4") + ("chevron-right" . "\xf078") + ("chevron-up" . "\xf0a2") + ("circle-slash" . "\xf084") + ("circuit-board" . "\xf0d6") + ("clippy" . "\xf035") + ("clock" . "\xf046") + ("cloud-download" . "\xf00b") + ("cloud-upload" . "\xf00c") + ("code" . "\xf05f") + ("comment" . "\xf02b") + ("comment-discussion" . "\xf04f") + ("credit-card" . "\xf045") + ("dash" . "\xf0ca") + ("dashboard" . "\xf07d") + ("database" . "\xf096") + ("device-camera" . "\xf056") + ("device-camera-video" . "\xf057") + ("device-desktop" . "\xf27c") + ("device-mobile" . "\xf038") + ("diff" . "\xf04d") + ("diff-added" . "\xf06b") + ("diff-ignored" . "\xf099") + ("diff-modified" . "\xf06d") + ("diff-removed" . "\xf06c") + ("diff-renamed" . "\xf06e") + ("ellipsis" . "\xf09a") + ("eye" . "\xf04e") + ("file-binary" . "\xf094") + ("file-code" . "\xf010") + ("file-directory" . "\xf016") + ("file-media" . "\xf012") + ("file-pdf" . "\xf014") + ("file-submodule" . "\xf017") + ("file-symlink-directory" . "\xf0b1") + ("file-symlink-file" . "\xf0b0") + ("file-text" . "\xf011") + ("file-zip" . "\xf013") + ("flame" . "\xf0d2") + ("fold" . "\xf0cc") + ("gear" . "\xf02f") + ("gift" . "\xf042") + ("gist" . "\xf00e") + ("gist-secret" . "\xf08c") + ("git-branch" . "\xf020") + ("git-commit" . "\xf01f") + ("git-compare" . "\xf0ac") + ("git-merge" . "\xf023") + ("git-pull-request" . "\xf009") + ("globe" . "\xf0b6") + ("graph" . "\xf043") + ("beaker" . "\xf0dd") + ("heart" . "\x2665") + ("history" . "\xf07e") + ("home" . "\xf08d") + ("horizontal-rule" . "\xf070") + ("hourglass" . "\xf09e") + ("hubot" . "\xf09d") + ("inbox" . "\xf0cf") + ("info" . "\xf059") + ("issue-closed" . "\xf028") + ("issue-opened" . "\xf026") + ("issue-reopened" . "\xf027") + ("jersey" . "\xf019") + ("key" . "\xf049") + ("keyboard" . "\xf00d") + ("law" . "\xf0d8") + ("light-bulb" . "\xf000") + ("link" . "\xf05c") + ("link-external" . "\xf07f") + ("list-ordered" . "\xf062") + ("list-unordered" . "\xf061") + ("location" . "\xf060") + ("lock" . "\xf06a") + ("logo-github" . "\xf092") + ("mail" . "\xf03b") + ("mail-read" . "\xf03c") + ("mail-reply" . "\xf051") + ("mark-github" . "\xf00a") + ("markdown" . "\xf0c9") + ("megaphone" . "\xf077") + ("mention" . "\xf0be") + ("milestone" . "\xf075") + ("mirror" . "\xf024") + ("mortar-board" . "\xf0d7") + ("mute" . "\xf080") + ("no-newline" . "\xf09c") + ("octoface" . "\xf008") + ("organization" . "\xf037") + ("package" . "\xf0c4") + ("paintcan" . "\xf0d1") + ("pencil" . "\xf058") + ("person" . "\xf018") + ("pin" . "\xf041") + ("plug" . "\xf0d4") + ("plus" . "\xf05d") + ("primitive-dot" . "\xf052") + ("primitive-square" . "\xf053") + ("pulse" . "\xf085") + ("puzzle" . "\xf0c0") + ("question" . "\xf02c") + ("quote" . "\xf063") + ("radio-tower" . "\xf030") + ("repo" . "\xf001") + ("repo-clone" . "\xf04c") + ("repo-force-push" . "\xf04a") + ("repo-forked" . "\xf002") + ("repo-pull" . "\xf006") + ("repo-push" . "\xf005") + ("rocket" . "\xf033") + ("rss" . "\xf034") + ("ruby" . "\xf047") + ("search" . "\xf02e") + ("server" . "\xf097") + ("settings" . "\xf07c") + ("sign-in" . "\xf036") + ("sign-out" . "\xf032") + ("squirrel" . "\xf0b2") + ("star" . "\xf02a") + ("steps" . "\xf0c7") + ("stop" . "\xf08f") + ("sync" . "\xf087") + ("tag" . "\xf015") + ("telescope" . "\xf088") + ("terminal" . "\xf0c8") + ("three-bars" . "\xf05e") + ("thumbsdown" . "\xf0db") + ("thumbsup" . "\xf0da") + ("tools" . "\xf031") + ("trashcan" . "\xf0d0") + ("triangle-down" . "\xf05b") + ("triangle-left" . "\xf044") + ("triangle-right" . "\xf05a") + ("triangle-up" . "\xf0aa") + ("unfold" . "\xf039") + ("unmute" . "\xf0ba") + ("versions" . "\xf064") + ("x" . "\xf081") + ("zap" . "\x26A1") + + )) + +(provide 'data-octicons) diff --git a/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-octicons.elc b/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-octicons.elc new file mode 100644 index 0000000..3b3968b Binary files /dev/null and b/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-octicons.elc differ diff --git a/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-weathericons.el b/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-weathericons.el new file mode 100644 index 0000000..676581c --- /dev/null +++ b/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-weathericons.el @@ -0,0 +1,594 @@ +(defvar all-the-icons-data/weather-icons-alist + '( + + ("alien" . "\xf075") + ("barometer" . "\xf079") + ("celsius" . "\xf03c") + ("cloud" . "\xf041") + ("cloud-down" . "\xf03d") + ("cloud-refresh" . "\xf03e") + ("cloud-up" . "\xf040") + ("cloudy" . "\xf013") + ("cloudy-gusts" . "\xf011") + ("cloudy-windy" . "\xf012") + ("day-cloudy" . "\xf002") + ("day-cloudy-gusts" . "\xf000") + ("day-cloudy-high" . "\xf07d") + ("day-cloudy-windy" . "\xf001") + ("day-fog" . "\xf003") + ("day-hail" . "\xf004") + ("day-haze" . "\xf0b6") + ("day-light-wind" . "\xf0c4") + ("day-lightning" . "\xf005") + ("day-rain" . "\xf008") + ("day-rain-mix" . "\xf006") + ("day-rain-wind" . "\xf007") + ("day-showers" . "\xf009") + ("day-sleet" . "\xf0b2") + ("day-sleet-storm" . "\xf068") + ("day-snow" . "\xf00a") + ("day-snow-thunderstorm" . "\xf06b") + ("day-snow-wind" . "\xf065") + ("day-sprinkle" . "\xf00b") + ("day-storm-showers" . "\xf00e") + ("day-sunny" . "\xf00d") + ("day-sunny-overcast" . "\xf00c") + ("day-thunderstorm" . "\xf010") + ("day-windy" . "\xf085") + ("degrees" . "\xf042") + ("direction-down" . "\xf044") + ("direction-down-left" . "\xf043") + ("direction-down-right" . "\xf088") + ("direction-left" . "\xf048") + ("direction-right" . "\xf04d") + ("direction-up" . "\xf058") + ("direction-up-left" . "\xf087") + ("direction-up-right" . "\xf057") + ("dust" . "\xf063") + ("earthquake" . "\xf0c6") + ("fahrenheit" . "\xf045") + ("fire" . "\xf0c7") + ("flood" . "\xf07c") + ("fog" . "\xf014") + ("forecast-io-clear-day" . "\xf00d") + ("forecast-io-clear-night" . "\xf02e") + ("forecast-io-cloudy" . "\xf013") + ("forecast-io-fog" . "\xf014") + ("forecast-io-hail" . "\xf015") + ("forecast-io-partly-cloudy-day" . "\xf002") + ("forecast-io-partly-cloudy-night" . "\xf031") + ("forecast-io-rain" . "\xf019") + ("forecast-io-sleet" . "\xf0b5") + ("forecast-io-snow" . "\xf01b") + ("forecast-io-thunderstorm" . "\xf01e") + ("forecast-io-tornado" . "\xf056") + ("forecast-io-wind" . "\xf050") + ("gale-warning" . "\xf0cd") + ("hail" . "\xf015") + ("horizon" . "\xf047") + ("horizon-alt" . "\xf046") + ("hot" . "\xf072") + ("humidity" . "\xf07a") + ("hurricane" . "\xf073") + ("hurricane-warning" . "\xf0cf") + ("lightning" . "\xf016") + ("lunar-eclipse" . "\xf070") + ("meteor" . "\xf071") + ("moon-0" . "\xf095") + ("moon-1" . "\xf096") + ("moon-10" . "\xf09f") + ("moon-11" . "\xf0a0") + ("moon-12" . "\xf0a1") + ("moon-13" . "\xf0a2") + ("moon-14" . "\xf0a3") + ("moon-15" . "\xf0a4") + ("moon-16" . "\xf0a5") + ("moon-17" . "\xf0a6") + ("moon-18" . "\xf0a7") + ("moon-19" . "\xf0a8") + ("moon-2" . "\xf097") + ("moon-20" . "\xf0a9") + ("moon-21" . "\xf0aa") + ("moon-22" . "\xf0ab") + ("moon-23" . "\xf0ac") + ("moon-24" . "\xf0ad") + ("moon-25" . "\xf0ae") + ("moon-26" . "\xf0af") + ("moon-27" . "\xf0b0") + ("moon-3" . "\xf098") + ("moon-4" . "\xf099") + ("moon-5" . "\xf09a") + ("moon-6" . "\xf09b") + ("moon-7" . "\xf09c") + ("moon-8" . "\xf09d") + ("moon-9" . "\xf09e") + ("moon-alt-first-quarter" . "\xf0d6") + ("moon-alt-full" . "\xf0dd") + ("moon-alt-new" . "\xf0eb") + ("moon-alt-third-quarter" . "\xf0e4") + ("moon-alt-waning-crescent-1" . "\xf0e5") + ("moon-alt-waning-crescent-2" . "\xf0e6") + ("moon-alt-waning-crescent-3" . "\xf0e7") + ("moon-alt-waning-crescent-4" . "\xf0e8") + ("moon-alt-waning-crescent-5" . "\xf0e9") + ("moon-alt-waning-crescent-6" . "\xf0ea") + ("moon-alt-waning-gibbous-1" . "\xf0de") + ("moon-alt-waning-gibbous-2" . "\xf0df") + ("moon-alt-waning-gibbous-3" . "\xf0e0") + ("moon-alt-waning-gibbous-4" . "\xf0e1") + ("moon-alt-waning-gibbous-5" . "\xf0e2") + ("moon-alt-waning-gibbous-6" . "\xf0e3") + ("moon-alt-waxing-crescent-1" . "\xf0d0") + ("moon-alt-waxing-crescent-2" . "\xf0d1") + ("moon-alt-waxing-crescent-3" . "\xf0d2") + ("moon-alt-waxing-crescent-4" . "\xf0d3") + ("moon-alt-waxing-crescent-5" . "\xf0d4") + ("moon-alt-waxing-crescent-6" . "\xf0d5") + ("moon-alt-waxing-gibbous-1" . "\xf0d7") + ("moon-alt-waxing-gibbous-2" . "\xf0d8") + ("moon-alt-waxing-gibbous-3" . "\xf0d9") + ("moon-alt-waxing-gibbous-4" . "\xf0da") + ("moon-alt-waxing-gibbous-5" . "\xf0db") + ("moon-alt-waxing-gibbous-6" . "\xf0dc") + ("moon-first-quarter" . "\xf09c") + ("moon-full" . "\xf0a3") + ("moon-new" . "\xf095") + ("moon-third-quarter" . "\xf0aa") + ("moon-waning-crescent-1" . "\xf0ab") + ("moon-waning-crescent-2" . "\xf0ac") + ("moon-waning-crescent-3" . "\xf0ad") + ("moon-waning-crescent-4" . "\xf0ae") + ("moon-waning-crescent-5" . "\xf0af") + ("moon-waning-crescent-6" . "\xf0b0") + ("moon-waning-gibbous-1" . "\xf0a4") + ("moon-waning-gibbous-2" . "\xf0a5") + ("moon-waning-gibbous-3" . "\xf0a6") + ("moon-waning-gibbous-4" . "\xf0a7") + ("moon-waning-gibbous-5" . "\xf0a8") + ("moon-waning-gibbous-6" . "\xf0a9") + ("moon-waxing-crescent-1" . "\xf096") + ("moon-waxing-crescent-2" . "\xf097") + ("moon-waxing-crescent-3" . "\xf098") + ("moon-waxing-crescent-4" . "\xf099") + ("moon-waxing-crescent-5" . "\xf09a") + ("moon-waxing-crescent-6" . "\xf09b") + ("moon-waxing-gibbous-1" . "\xf09d") + ("moon-waxing-gibbous-2" . "\xf09e") + ("moon-waxing-gibbous-3" . "\xf09f") + ("moon-waxing-gibbous-4" . "\xf0a0") + ("moon-waxing-gibbous-5" . "\xf0a1") + ("moon-waxing-gibbous-6" . "\xf0a2") + ("moonrise" . "\xf0c9") + ("moonset" . "\xf0ca") + ("na" . "\xf07b") + ("night-alt-cloudy" . "\xf086") + ("night-alt-cloudy-gusts" . "\xf022") + ("night-alt-cloudy-high" . "\xf07e") + ("night-alt-cloudy-windy" . "\xf023") + ("night-alt-hail" . "\xf024") + ("night-alt-lightning" . "\xf025") + ("night-alt-partly-cloudy" . "\xf081") + ("night-alt-rain" . "\xf028") + ("night-alt-rain-mix" . "\xf026") + ("night-alt-rain-wind" . "\xf027") + ("night-alt-showers" . "\xf029") + ("night-alt-sleet" . "\xf0b4") + ("night-alt-sleet-storm" . "\xf06a") + ("night-alt-snow" . "\xf02a") + ("night-alt-snow-thunderstorm" . "\xf06d") + ("night-alt-snow-wind" . "\xf067") + ("night-alt-sprinkle" . "\xf02b") + ("night-alt-storm-showers" . "\xf02c") + ("night-alt-thunderstorm" . "\xf02d") + ("night-clear" . "\xf02e") + ("night-cloudy" . "\xf031") + ("night-cloudy-gusts" . "\xf02f") + ("night-cloudy-high" . "\xf080") + ("night-cloudy-windy" . "\xf030") + ("night-fog" . "\xf04a") + ("night-hail" . "\xf032") + ("night-lightning" . "\xf033") + ("night-partly-cloudy" . "\xf083") + ("night-rain" . "\xf036") + ("night-rain-mix" . "\xf034") + ("night-rain-wind" . "\xf035") + ("night-showers" . "\xf037") + ("night-sleet" . "\xf0b3") + ("night-sleet-storm" . "\xf069") + ("night-snow" . "\xf038") + ("night-snow-thunderstorm" . "\xf06c") + ("night-snow-wind" . "\xf066") + ("night-sprinkle" . "\xf039") + ("night-storm-showers" . "\xf03a") + ("night-thunderstorm" . "\xf03b") + ("owm-200" . "\xf01e") + ("owm-201" . "\xf01e") + ("owm-202" . "\xf01e") + ("owm-210" . "\xf016") + ("owm-211" . "\xf016") + ("owm-212" . "\xf016") + ("owm-221" . "\xf016") + ("owm-230" . "\xf01e") + ("owm-231" . "\xf01e") + ("owm-232" . "\xf01e") + ("owm-300" . "\xf01c") + ("owm-301" . "\xf01c") + ("owm-302" . "\xf019") + ("owm-310" . "\xf017") + ("owm-311" . "\xf019") + ("owm-312" . "\xf019") + ("owm-313" . "\xf01a") + ("owm-314" . "\xf019") + ("owm-321" . "\xf01c") + ("owm-500" . "\xf01c") + ("owm-501" . "\xf019") + ("owm-502" . "\xf019") + ("owm-503" . "\xf019") + ("owm-504" . "\xf019") + ("owm-511" . "\xf017") + ("owm-520" . "\xf01a") + ("owm-521" . "\xf01a") + ("owm-522" . "\xf01a") + ("owm-531" . "\xf01d") + ("owm-600" . "\xf01b") + ("owm-601" . "\xf01b") + ("owm-602" . "\xf0b5") + ("owm-611" . "\xf017") + ("owm-612" . "\xf017") + ("owm-615" . "\xf017") + ("owm-616" . "\xf017") + ("owm-620" . "\xf017") + ("owm-621" . "\xf01b") + ("owm-622" . "\xf01b") + ("owm-701" . "\xf01a") + ("owm-711" . "\xf062") + ("owm-721" . "\xf0b6") + ("owm-731" . "\xf063") + ("owm-741" . "\xf014") + ("owm-761" . "\xf063") + ("owm-762" . "\xf063") + ("owm-771" . "\xf011") + ("owm-781" . "\xf056") + ("owm-800" . "\xf00d") + ("owm-801" . "\xf011") + ("owm-802" . "\xf011") + ("owm-803" . "\xf012") + ("owm-804" . "\xf013") + ("owm-900" . "\xf056") + ("owm-901" . "\xf01d") + ("owm-902" . "\xf073") + ("owm-903" . "\xf076") + ("owm-904" . "\xf072") + ("owm-905" . "\xf021") + ("owm-906" . "\xf015") + ("owm-957" . "\xf050") + ("owm-day-200" . "\xf010") + ("owm-day-201" . "\xf010") + ("owm-day-202" . "\xf010") + ("owm-day-210" . "\xf005") + ("owm-day-211" . "\xf005") + ("owm-day-212" . "\xf005") + ("owm-day-221" . "\xf005") + ("owm-day-230" . "\xf010") + ("owm-day-231" . "\xf010") + ("owm-day-232" . "\xf010") + ("owm-day-300" . "\xf00b") + ("owm-day-301" . "\xf00b") + ("owm-day-302" . "\xf008") + ("owm-day-310" . "\xf008") + ("owm-day-311" . "\xf008") + ("owm-day-312" . "\xf008") + ("owm-day-313" . "\xf008") + ("owm-day-314" . "\xf008") + ("owm-day-321" . "\xf00b") + ("owm-day-500" . "\xf00b") + ("owm-day-501" . "\xf008") + ("owm-day-502" . "\xf008") + ("owm-day-503" . "\xf008") + ("owm-day-504" . "\xf008") + ("owm-day-511" . "\xf006") + ("owm-day-520" . "\xf009") + ("owm-day-521" . "\xf009") + ("owm-day-522" . "\xf009") + ("owm-day-531" . "\xf00e") + ("owm-day-600" . "\xf00a") + ("owm-day-601" . "\xf0b2") + ("owm-day-602" . "\xf00a") + ("owm-day-611" . "\xf006") + ("owm-day-612" . "\xf006") + ("owm-day-615" . "\xf006") + ("owm-day-616" . "\xf006") + ("owm-day-620" . "\xf006") + ("owm-day-621" . "\xf00a") + ("owm-day-622" . "\xf00a") + ("owm-day-701" . "\xf009") + ("owm-day-711" . "\xf062") + ("owm-day-721" . "\xf0b6") + ("owm-day-731" . "\xf063") + ("owm-day-741" . "\xf003") + ("owm-day-761" . "\xf063") + ("owm-day-762" . "\xf063") + ("owm-day-781" . "\xf056") + ("owm-day-800" . "\xf00d") + ("owm-day-801" . "\xf000") + ("owm-day-802" . "\xf000") + ("owm-day-803" . "\xf000") + ("owm-day-804" . "\xf00c") + ("owm-day-900" . "\xf056") + ("owm-day-902" . "\xf073") + ("owm-day-903" . "\xf076") + ("owm-day-904" . "\xf072") + ("owm-day-906" . "\xf004") + ("owm-day-957" . "\xf050") + ("owm-night-200" . "\xf02d") + ("owm-night-201" . "\xf02d") + ("owm-night-202" . "\xf02d") + ("owm-night-210" . "\xf025") + ("owm-night-211" . "\xf025") + ("owm-night-212" . "\xf025") + ("owm-night-221" . "\xf025") + ("owm-night-230" . "\xf02d") + ("owm-night-231" . "\xf02d") + ("owm-night-232" . "\xf02d") + ("owm-night-300" . "\xf02b") + ("owm-night-301" . "\xf02b") + ("owm-night-302" . "\xf028") + ("owm-night-310" . "\xf028") + ("owm-night-311" . "\xf028") + ("owm-night-312" . "\xf028") + ("owm-night-313" . "\xf028") + ("owm-night-314" . "\xf028") + ("owm-night-321" . "\xf02b") + ("owm-night-500" . "\xf02b") + ("owm-night-501" . "\xf028") + ("owm-night-502" . "\xf028") + ("owm-night-503" . "\xf028") + ("owm-night-504" . "\xf028") + ("owm-night-511" . "\xf026") + ("owm-night-520" . "\xf029") + ("owm-night-521" . "\xf029") + ("owm-night-522" . "\xf029") + ("owm-night-531" . "\xf02c") + ("owm-night-600" . "\xf02a") + ("owm-night-601" . "\xf0b4") + ("owm-night-602" . "\xf02a") + ("owm-night-611" . "\xf026") + ("owm-night-612" . "\xf026") + ("owm-night-615" . "\xf026") + ("owm-night-616" . "\xf026") + ("owm-night-620" . "\xf026") + ("owm-night-621" . "\xf02a") + ("owm-night-622" . "\xf02a") + ("owm-night-701" . "\xf029") + ("owm-night-711" . "\xf062") + ("owm-night-721" . "\xf0b6") + ("owm-night-731" . "\xf063") + ("owm-night-741" . "\xf04a") + ("owm-night-761" . "\xf063") + ("owm-night-762" . "\xf063") + ("owm-night-781" . "\xf056") + ("owm-night-800" . "\xf02e") + ("owm-night-801" . "\xf022") + ("owm-night-802" . "\xf022") + ("owm-night-803" . "\xf022") + ("owm-night-804" . "\xf086") + ("owm-night-900" . "\xf056") + ("owm-night-902" . "\xf073") + ("owm-night-903" . "\xf076") + ("owm-night-904" . "\xf072") + ("owm-night-906" . "\xf024") + ("owm-night-957" . "\xf050") + ("rain" . "\xf019") + ("rain-mix" . "\xf017") + ("rain-wind" . "\xf018") + ("raindrop" . "\xf078") + ("raindrops" . "\xf04e") + ("refresh" . "\xf04c") + ("refresh-alt" . "\xf04b") + ("sandstorm" . "\xf082") + ("showers" . "\xf01a") + ("sleet" . "\xf0b5") + ("small-craft-advisory" . "\xf0cc") + ("smog" . "\xf074") + ("smoke" . "\xf062") + ("snow" . "\xf01b") + ("snow" . "\xf01b") + ("snow-wind" . "\xf064") + ("snowflake-cold" . "\xf076") + ("solar-eclipse" . "\xf06e") + ("sprinkle" . "\xf01c") + ("stars" . "\xf077") + ("storm-showers" . "\xf01d") + ("storm-showers" . "\xf01d") + ("storm-warning" . "\xf0ce") + ("strong-wind" . "\xf050") + ("sunrise" . "\xf051") + ("sunset" . "\xf052") + ("thermometer" . "\xf055") + ("thermometer-exterior" . "\xf053") + ("thermometer-internal" . "\xf054") + ("thunderstorm" . "\xf01e") + ("thunderstorm" . "\xf01e") + ("time-1" . "\xf08a") + ("time-10" . "\xf093") + ("time-11" . "\xf094") + ("time-12" . "\xf089") + ("time-2" . "\xf08b") + ("time-3" . "\xf08c") + ("time-4" . "\xf08d") + ("time-5" . "\xf08e") + ("time-6" . "\xf08f") + ("time-7" . "\xf090") + ("time-8" . "\xf091") + ("time-9" . "\xf092") + ("tornado" . "\xf056") + ("train" . "\xf0cb") + ("tsunami" . "\xf0c5") + ("umbrella" . "\xf084") + ("volcano" . "\xf0c8") + ("wind-beaufort-0" . "\xf0b7") + ("wind-beaufort-1" . "\xf0b8") + ("wind-beaufort-10" . "\xf0c1") + ("wind-beaufort-11" . "\xf0c2") + ("wind-beaufort-12" . "\xf0c3") + ("wind-beaufort-2" . "\xf0b9") + ("wind-beaufort-3" . "\xf0ba") + ("wind-beaufort-4" . "\xf0bb") + ("wind-beaufort-5" . "\xf0bc") + ("wind-beaufort-6" . "\xf0bd") + ("wind-beaufort-7" . "\xf0be") + ("wind-beaufort-8" . "\xf0bf") + ("wind-beaufort-9" . "\xf0c0") + ("wind-direction" . "\xf0b1") + ("windy" . "\xf021") + ("wmo4680-00" . "\xf055") + ("wmo4680-01" . "\xf013") + ("wmo4680-02" . "\xf055") + ("wmo4680-03" . "\xf013") + ("wmo4680-04" . "\xf014") + ("wmo4680-05" . "\xf014") + ("wmo4680-10" . "\xf014") + ("wmo4680-11" . "\xf014") + ("wmo4680-12" . "\xf016") + ("wmo4680-18" . "\xf050") + ("wmo4680-20" . "\xf014") + ("wmo4680-21" . "\xf017") + ("wmo4680-22" . "\xf017") + ("wmo4680-23" . "\xf019") + ("wmo4680-24" . "\xf01b") + ("wmo4680-25" . "\xf015") + ("wmo4680-26" . "\xf01e") + ("wmo4680-27" . "\xf063") + ("wmo4680-28" . "\xf063") + ("wmo4680-29" . "\xf063") + ("wmo4680-30" . "\xf014") + ("wmo4680-31" . "\xf014") + ("wmo4680-32" . "\xf014") + ("wmo4680-33" . "\xf014") + ("wmo4680-34" . "\xf014") + ("wmo4680-35" . "\xf014") + ("wmo4680-40" . "\xf017") + ("wmo4680-41" . "\xf01c") + ("wmo4680-42" . "\xf019") + ("wmo4680-43" . "\xf01c") + ("wmo4680-44" . "\xf019") + ("wmo4680-45" . "\xf015") + ("wmo4680-46" . "\xf015") + ("wmo4680-47" . "\xf01b") + ("wmo4680-48" . "\xf01b") + ("wmo4680-50" . "\xf01c") + ("wmo4680-51" . "\xf01c") + ("wmo4680-52" . "\xf019") + ("wmo4680-53" . "\xf019") + ("wmo4680-54" . "\xf076") + ("wmo4680-55" . "\xf076") + ("wmo4680-56" . "\xf076") + ("wmo4680-57" . "\xf01c") + ("wmo4680-58" . "\xf019") + ("wmo4680-60" . "\xf01c") + ("wmo4680-61" . "\xf01c") + ("wmo4680-62" . "\xf019") + ("wmo4680-63" . "\xf019") + ("wmo4680-64" . "\xf015") + ("wmo4680-65" . "\xf015") + ("wmo4680-66" . "\xf015") + ("wmo4680-67" . "\xf017") + ("wmo4680-68" . "\xf017") + ("wmo4680-70" . "\xf01b") + ("wmo4680-71" . "\xf01b") + ("wmo4680-72" . "\xf01b") + ("wmo4680-73" . "\xf01b") + ("wmo4680-74" . "\xf076") + ("wmo4680-75" . "\xf076") + ("wmo4680-76" . "\xf076") + ("wmo4680-77" . "\xf01b") + ("wmo4680-78" . "\xf076") + ("wmo4680-80" . "\xf019") + ("wmo4680-81" . "\xf01c") + ("wmo4680-82" . "\xf019") + ("wmo4680-83" . "\xf019") + ("wmo4680-84" . "\xf01d") + ("wmo4680-85" . "\xf017") + ("wmo4680-86" . "\xf017") + ("wmo4680-87" . "\xf017") + ("wmo4680-89" . "\xf015") + ("wmo4680-90" . "\xf016") + ("wmo4680-91" . "\xf01d") + ("wmo4680-92" . "\xf01e") + ("wmo4680-93" . "\xf01e") + ("wmo4680-94" . "\xf016") + ("wmo4680-95" . "\xf01e") + ("wmo4680-96" . "\xf01e") + ("wmo4680-99" . "\xf056") + ("wu-chanceflurries" . "\xf064") + ("wu-chancerain" . "\xf019") + ("wu-chancesleat" . "\xf0b5") + ("wu-chancesnow" . "\xf01b") + ("wu-chancetstorms" . "\xf01e") + ("wu-clear" . "\xf00d") + ("wu-cloudy" . "\xf002") + ("wu-flurries" . "\xf064") + ("wu-hazy" . "\xf0b6") + ("wu-mostlycloudy" . "\xf002") + ("wu-mostlysunny" . "\xf00d") + ("wu-partlycloudy" . "\xf002") + ("wu-partlysunny" . "\xf00d") + ("wu-rain" . "\xf01a") + ("wu-sleat" . "\xf0b5") + ("wu-snow" . "\xf01b") + ("wu-sunny" . "\xf00d") + ("wu-tstorms" . "\xf01e") + ("wu-unknown" . "\xf00d") + ("yahoo-0" . "\xf056") + ("yahoo-1" . "\xf00e") + ("yahoo-10" . "\xf015") + ("yahoo-11" . "\xf01a") + ("yahoo-12" . "\xf01a") + ("yahoo-13" . "\xf01b") + ("yahoo-14" . "\xf00a") + ("yahoo-15" . "\xf064") + ("yahoo-16" . "\xf01b") + ("yahoo-17" . "\xf015") + ("yahoo-18" . "\xf017") + ("yahoo-19" . "\xf063") + ("yahoo-2" . "\xf073") + ("yahoo-20" . "\xf014") + ("yahoo-21" . "\xf021") + ("yahoo-22" . "\xf062") + ("yahoo-23" . "\xf050") + ("yahoo-24" . "\xf050") + ("yahoo-25" . "\xf076") + ("yahoo-26" . "\xf013") + ("yahoo-27" . "\xf031") + ("yahoo-28" . "\xf002") + ("yahoo-29" . "\xf031") + ("yahoo-3" . "\xf01e") + ("yahoo-30" . "\xf002") + ("yahoo-31" . "\xf02e") + ("yahoo-32" . "\xf00d") + ("yahoo-3200" . "\xf077") + ("yahoo-33" . "\xf083") + ("yahoo-34" . "\xf00c") + ("yahoo-35" . "\xf017") + ("yahoo-36" . "\xf072") + ("yahoo-37" . "\xf00e") + ("yahoo-38" . "\xf00e") + ("yahoo-39" . "\xf00e") + ("yahoo-4" . "\xf01e") + ("yahoo-40" . "\xf01a") + ("yahoo-41" . "\xf064") + ("yahoo-42" . "\xf01b") + ("yahoo-43" . "\xf064") + ("yahoo-44" . "\xf00c") + ("yahoo-45" . "\xf00e") + ("yahoo-46" . "\xf01b") + ("yahoo-47" . "\xf00e") + ("yahoo-5" . "\xf017") + ("yahoo-6" . "\xf017") + ("yahoo-7" . "\xf017") + ("yahoo-8" . "\xf015") + ("yahoo-9" . "\xf01a") + + )) + +(provide 'data-weathericons) diff --git a/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-weathericons.elc b/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-weathericons.elc new file mode 100644 index 0000000..0e10e04 Binary files /dev/null and b/.emacs.d/elpa/all-the-icons-20210603.1604/data/data-weathericons.elc differ diff --git a/.emacs.d/elpa/archives/gnu/archive-contents b/.emacs.d/elpa/archives/gnu/archive-contents new file mode 100644 index 0000000..6bb5a18 --- /dev/null +++ b/.emacs.d/elpa/archives/gnu/archive-contents @@ -0,0 +1,2813 @@ +(1 + (ace-window . + [(0 10 0) + ((avy + (0 5 0))) + "Quickly switch windows." tar + ((:url . "https://github.com/abo-abo/ace-window") + (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") + (:authors + ("Oleh Krehel" . "ohwoeowho@gmail.com")) + (:keywords "window" "location"))]) + (ack . + [(1 10) + nil "interface to ack-like tools" tar + ((:url . "https://github.com/leoliu/ack-el") + (:maintainer "João Távora" . "joaotavora@gmail.com") + (:authors + ("Leo Liu" . "sdl.web@gmail.com")) + (:keywords "tools" "processes" "convenience"))]) + (ada-mode . + [(7 1 4) + ((uniquify-files + (1 0 1)) + (wisi + (3 1 2)) + (emacs + (25 0))) + "major-mode for editing Ada sources" tar + ((:url . "http://www.nongnu.org/ada-mode/") + (:maintainer "Stephen Leake" . "stephen_leake@stephe-leake.org") + (:authors + ("Stephen Leake" . "stephen_leake@stephe-leake.org")) + (:keywords "languages" "ada"))]) + (ada-ref-man . + [(2020 1) + nil "Ada Reference Manual 2012" tar + ((:url . "http://stephe-leake.org/ada/arm.html") + (:maintainer "Stephen Leake" . "stephen_leake@member.fsf.org") + (:authors + ("Stephen Leake" . "stephen_leake@member.fsf.org")) + (:keywords "languages" "ada"))]) + (adaptive-wrap . + [(0 8) + nil "Smart line-wrapping with wrap-prefix" tar + ((:maintainer "Stephen Berman" . "stephen.berman@gmx.net") + (:authors + ("Stephen Berman" . "stephen.berman@gmx.net") + ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:url . "https://elpa.gnu.org/packages/adaptive-wrap.html"))]) + (adjust-parens . + [(3 1) + nil "Indent and dedent Lisp code, automatically adjust close parens" tar + ((:maintainer "Barry O'Reilly" . "gundaetiapo@gmail.com") + (:authors + ("Barry O'Reilly" . "gundaetiapo@gmail.com")) + (:url . "http://elpa.gnu.org/packages/adjust-parens.html"))]) + (advice-patch . + [(0 1) + ((emacs + (24 4))) + "Use patches to advise the inside of functions" single + ((:url . "http://elpa.gnu.org/packages/advice-patch.html") + (:authors + ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) + (aggressive-completion . + [(1 6) + ((emacs + (27 1))) + "Automatic minibuffer completion" tar + ((:maintainer "Tassilo Horn" . "tsdh@gnu.org") + (:authors + ("Tassilo Horn" . "tsdh@gnu.org")) + (:keywords "minibuffer" "completion") + (:url . "https://elpa.gnu.org/packages/aggressive-completion.html"))]) + (aggressive-indent . + [(1 8 3) + ((emacs + (24 1)) + (cl-lib + (0 5))) + "Minor mode to aggressively keep your code always indented" single + ((:keywords "indent" "lisp" "maint" "tools") + (:authors + ("Artur Malabarba" . "emacs@endlessparentheses.com")) + (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") + (:url . "https://github.com/Malabarba/aggressive-indent-mode"))]) + (ahungry-theme . + [(1 10 0) + ((emacs + (24))) + "Ahungry color theme for Emacs. Make sure to (load-theme 'ahungry)." tar + ((:url . "https://github.com/ahungry/color-theme-ahungry") + (:maintainer "Matthew Carter" . "m@ahungry.com") + (:authors + ("Matthew Carter" . "m@ahungry.com")) + (:keywords "ahungry" "palette" "color" "theme" "emacs" "color-theme" "deftheme"))]) + (all . + [(1 0) + nil "Edit all lines matching a given regexp" single + ((:url . "http://elpa.gnu.org/packages/all.html") + (:keywords "matching") + (:authors + ("Per Abrahamsen" . "per.abrahamsen@gmail.com")) + (:maintainer "Per Abrahamsen" . "per.abrahamsen@gmail.com"))]) + (ampc . + [(0 2) + nil "Asynchronous Music Player Controller" single + ((:url . "http://elpa.gnu.org/packages/ampc.html") + (:keywords "ampc" "mpc" "mpd") + (:authors + ("Christopher Schmidt" . "christopher@ch.ristopher.com")) + (:maintainer nil . "emacs-devel@gnu.org"))]) + (arbitools . + [(0 977) + ((cl-lib + (0 5))) + "Package for chess tournaments administration" single + ((:url . "http://elpa.gnu.org/packages/arbitools.html") + (:authors + ("David Gonzalez Gandara" . "dggandara@member.fsf.org")) + (:maintainer "David Gonzalez Gandara" . "dggandara@member.fsf.org"))]) + (ascii-art-to-unicode . + [(1 13) + nil "a small artist adjunct" single + ((:keywords "ascii" "unicode" "box-drawing") + (:authors + ("Thien-Thi Nguyen" . "ttn@gnu.org")) + (:maintainer "Thien-Thi Nguyen" . "ttn@gnu.org") + (:url . "http://www.gnuvola.org/software/aa2u/"))]) + (async . + [(1 9 5) + ((emacs + (24 3))) + "Asynchronous processing in Emacs" tar + ((:url . "https://github.com/jwiegley/emacs-async") + (:maintainer "John Wiegley" . "jwiegley@gmail.com") + (:authors + ("John Wiegley" . "jwiegley@gmail.com")) + (:keywords "async"))]) + (auctex . + [(13 0 12) + ((emacs + (24 3))) + "Integrated environment for *TeX*" tar + ((:url . "https://www.gnu.org/software/auctex/") + (:maintainer nil . "auctex-devel@gnu.org") + (:keywords "tex" "latex" "texinfo" "context" "doctex" "preview-latex"))]) + (aumix-mode . + [(7) + nil "run the aumix program in a buffer" single + ((:keywords "multimedia" "mixer" "aumix") + (:authors + ("Kevin Ryde" . "user42_kevin@yahoo.com.au")) + (:maintainer "Kevin Ryde" . "user42_kevin@yahoo.com.au") + (:url . "http://user42.tuxfamily.org/aumix-mode/index.html"))]) + (auto-correct . + [(1 1 4) + nil "Remembers and automatically fixes past corrections" single + ((:url . "http://elpa.gnu.org/packages/auto-correct.html") + (:keywords "editing") + (:authors + ("Ian Dunn" . "dunni@gnu.org")) + (:maintainer "Ian Dunn" . "dunni@gnu.org"))]) + (auto-overlays . + [(0 10 10) + ((cl-lib + (0 5))) + "Automatic regexp-delimited overlays" tar + ((:url . "http://www.dr-qubit.org/tags/computing-code-emacs.html") + (:maintainer "Toby Cubitt" . "toby-predictive@dr-qubit.org") + (:authors + ("Toby Cubitt" . "toby-predictive@dr-qubit.org")) + (:keywords "extensions"))]) + (avy . + [(0 5 0) + ((emacs + (24 1)) + (cl-lib + (0 5))) + "Jump to arbitrary positions in visible text and select text quickly." tar + ((:url . "https://github.com/abo-abo/avy") + (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") + (:authors + ("Oleh Krehel" . "ohwoeowho@gmail.com")) + (:keywords "point" "location"))]) + (bbdb . + [(3 2) + ((emacs + (24)) + (cl-lib + (0 5))) + "core of BBDB" tar + ((:maintainer "Roland Winkler" . "winkler@gnu.org") + (:url . "http://elpa.gnu.org/packages/bbdb.html"))]) + (beacon . + [(1 3 3) + ((seq + (2 14))) + "Highlight the cursor whenever the window scrolls" single + ((:keywords "convenience") + (:authors + ("Artur Malabarba" . "emacs@endlessparentheses.com")) + (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") + (:url . "https://github.com/Malabarba/beacon"))]) + (bluetooth . + [(0 2) + ((emacs + (25 1)) + (dash + (2 12 0))) + "A Major mode for Bluetooth devices" single + ((:keywords "hardware") + (:authors + ("Raffael Stocker" . "r.stocker@mnet-mail.de") + ("Etienne Prud’homme" . "e.e.f.prudhomme@gmail.com")) + (:maintainer "Raffael Stocker" . "r.stocker@mnet-mail.de") + (:url . "https://gitlab.com/rstocker/emacs-bluetooth"))]) + (bnf-mode . + [(0 4 5) + ((cl-lib + (0 5)) + (emacs + (24 3))) + "Major mode for editing BNF grammars." tar + ((:url . "https://github.com/sergeyklay/bnf-mode") + (:maintainer "Serghei Iakovlev" . "egrep@protonmail.ch") + (:authors + ("Serghei Iakovlev" . "egrep@protonmail.ch")) + (:keywords "languages"))]) + (brief . + [(5 87) + nil "Brief Editor Emulator (Brief Mode)" tar + ((:maintainer "Luke Lee" . "luke.yx.lee@gmail.com") + (:authors + ("Luke Lee" . "luke.yx.lee@gmail.com")) + (:keywords "brief" "emulations" "crisp") + (:url . "http://elpa.gnu.org/packages/brief.html"))]) + (buffer-expose . + [(0 4 3) + ((emacs + (25)) + (cl-lib + (0 5))) + "Visual buffer switching using a window grid" single + ((:keywords "convenience") + (:authors + ("Clemens Radermacher" . "clemera@posteo.net")) + (:maintainer "Clemens Radermacher" . "clemera@posteo.net") + (:url . "https://github.com/clemera/buffer-expose"))]) + (bug-hunter . + [(1 3 1) + ((seq + (1 3)) + (cl-lib + (0 5))) + "Hunt down errors by bisecting elisp files" tar + ((:url . "https://github.com/Malabarba/elisp-bug-hunter") + (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") + (:authors + ("Artur Malabarba" . "emacs@endlessparentheses.com")) + (:keywords "lisp"))]) + (caps-lock . + [(1 0) + nil "Caps-lock as a minor mode" single + ((:url . "http://elpa.gnu.org/packages/caps-lock.html") + (:authors + ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) + (captain . + [(1 0 3) + nil "CAPiTalization is Automatic IN emacs" single + ((:url . "http://elpa.gnu.org/packages/captain.html") + (:keywords "editing") + (:authors + ("Ian Dunn" . "dunni@gnu.org")) + (:maintainer "Ian Dunn" . "dunni@gnu.org"))]) + (chess . + [(2 0 5) + ((cl-lib + (0 5))) + "Play chess in GNU Emacs" tar + ((:maintainer "Mario Lang" . "mlang@delysid.org") + (:authors + ("John Wiegley" . "johnw@gnu.org")) + (:keywords "games") + (:url . "http://elpa.gnu.org/packages/chess.html"))]) + (cl-generic . + [(0 3) + nil "Forward cl-generic compatibility for Emacs<25" single + ((:url . "http://elpa.gnu.org/packages/cl-generic.html") + (:authors + ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) + (cl-lib . + [(0 7) + nil "Forward cl-lib compatibility library for Emacs<24.3" tar + ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") + (:authors + ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:url . "https://elpa.gnu.org/packages/cl-lib.html"))]) + (cl-print . + [(1 0) + ((emacs + (25))) + "CL-style generic printing" single + ((:url . "http://elpa.gnu.org/packages/cl-print.html") + (:authors + ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) + (clipboard-collector . + [(0 3) + ((emacs + (25))) + "Collect clipboard entries according to regex rules" tar + ((:url . "https://github.com/clemera/clipboard-collector") + (:maintainer "Clemens Radermacher" . "clemera@posteo.net") + (:authors + ("Clemens Radermacher" . "clemera@posteo.net")) + (:keywords "convenience"))]) + (cobol-mode . + [(1 0 0) + ((cl-lib + (0 5))) + "Mode for editing COBOL code" single + ((:url . "http://elpa.gnu.org/packages/cobol-mode.html") + (:keywords "languages") + (:authors + ("Edward Hart" . "edward.dan.hart@gmail.com")) + (:maintainer "Edward Hart" . "edward.dan.hart@gmail.com"))]) + (coffee-mode . + [(0 4 1 1) + nil "Major mode for CoffeeScript files" single + ((:keywords "coffeescript" "major" "mode") + (:authors + ("Chris Wanstrath" . "chris@ozmm.org")) + (:maintainer "Chris Wanstrath" . "chris@ozmm.org") + (:url . "http://github.com/defunkt/coffee-mode"))]) + (compact-docstrings . + [(0 2) + nil "Shrink blank lines in docstrings and doc comments" single + ((:keywords "convenience" "faces" "lisp" "maint" "c") + (:authors + ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) + (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com") + (:url . "https://github.com/cpitclaudel/compact-docstrings"))]) + (company . + [(0 9 13) + ((emacs + (24 3))) + "Modular text completion framework" tar + ((:url . "http://company-mode.github.io/") + (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru") + (:authors + ("Nikolaj Schumacher")) + (:keywords "abbrev" "convenience" "matching"))]) + (company-ebdb . + [(1 1) + ((company + (0 9 4)) + (ebdb + (0 2))) + "company-mode completion backend for EBDB in message-mode" single + ((:url . "http://elpa.gnu.org/packages/company-ebdb.html") + (:authors + ("Jan Tatarik" . "jan.tatarik@gmail.com")) + (:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net"))]) + (company-math . + [(1 4) + ((company + (0 8 0)) + (math-symbol-lists + (1 3))) + "Completion backends for unicode math symbols and latex tags" tar + ((:url . "https://github.com/vspinu/company-math") + (:maintainer "Vitalie Spinu" . "spinuvit@gmail.com") + (:authors + ("Vitalie Spinu" . "spinuvit@gmail.com")) + (:keywords "unicode" "symbols" "completion"))]) + (company-statistics . + [(0 2 3) + ((emacs + (24 3)) + (company + (0 8 5))) + "Sort candidates using completion history" tar + ((:url . "https://github.com/company-mode/company-statistics") + (:maintainer "Ingo Lohmar" . "i.lohmar@gmail.com") + (:authors + ("Ingo Lohmar" . "i.lohmar@gmail.com")) + (:keywords "abbrev" "convenience" "matching"))]) + (consult . + [(0 8) + ((emacs + (26 1))) + "Consulting completing-read" tar + ((:url . "https://github.com/minad/consult") + (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") + (:authors + ("Daniel Mendler and Consult contributors")))]) + (context-coloring . + [(8 1 0) + ((emacs + (24 3))) + "Highlight by scope" tar + ((:url . "https://github.com/jacksonrayhamilton/context-coloring") + (:maintainer "Jackson Ray Hamilton" . "jackson@jacksonrayhamilton.com") + (:authors + ("Jackson Ray Hamilton" . "jackson@jacksonrayhamilton.com")) + (:keywords "convenience" "faces" "tools"))]) + (corfu . + [(0 8) + ((emacs + (27 1))) + "Completion Overlay Region FUnction" tar + ((:url . "https://github.com/minad/corfu") + (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") + (:authors + ("Daniel Mendler" . "mail@daniel-mendler.de")))]) + (counsel . + [(0 13 4) + ((emacs + (24 5)) + (ivy + (0 13 4)) + (swiper + (0 13 4))) + "Various completion functions using Ivy" tar + ((:url . "https://github.com/abo-abo/swiper") + (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") + (:authors + ("Oleh Krehel" . "ohwoeowho@gmail.com")) + (:keywords "convenience" "matching" "tools"))]) + (cpio-mode . + [(0 17) + ((emacs + (24 5))) + "Handle cpio archives in the style of dired." tar + ((:maintainer "Douglas Lewan" . "d.lewan2000@gmail.com") + (:authors + ("Douglas Lewan" . "d.lewan2000@gmail.com")) + (:keywords "files") + (:url . "http://elpa.gnu.org/packages/cpio-mode.html"))]) + (crisp . + [(1 3 6) + nil "CRiSP/Brief Emacs emulator" single + ((:url . "http://elpa.gnu.org/packages/crisp.html") + (:keywords "emulations" "brief" "crisp") + (:authors + ("Gary D. Foster" . "Gary.Foster@Corp.Sun.COM")) + (:maintainer "Luke Lee" . "luke.yx.lee@gmail.com"))]) + (csv-mode . + [(1 15) + ((emacs + (24 1)) + (cl-lib + (0 5))) + "Major mode for editing comma/char separated values" tar + ((:maintainer nil . "emacs-devel@gnu.org") + (:authors + ("\"Francis J. Wright\"" . "F.J.Wright@qmul.ac.uk")) + (:keywords "convenience") + (:url . "https://elpa.gnu.org/packages/csv-mode.html"))]) + (cycle-quotes . + [(0 1) + nil "Cycle between quote styles" tar + ((:maintainer "Simen Heggestøyl" . "simenheg@gmail.com") + (:authors + ("Simen Heggestøyl" . "simenheg@gmail.com")) + (:keywords "convenience") + (:url . "http://elpa.gnu.org/packages/cycle-quotes.html"))]) + (darkroom . + [(0 3) + ((cl-lib + (0 5))) + "Remove visual distractions and focus on writing" single + ((:url . "http://elpa.gnu.org/packages/darkroom.html") + (:keywords "convenience" "emulations") + (:authors + ("João Távora" . "joaotavora@gmail.com")) + (:maintainer "João Távora" . "joaotavora@gmail.com"))]) + (dash . + [(2 18 1) + ((emacs + (24))) + "A modern list library for Emacs" tar + ((:url . "https://github.com/magnars/dash.el") + (:maintainer "Magnar Sveen" . "magnars@gmail.com") + (:authors + ("Magnar Sveen" . "magnars@gmail.com")) + (:keywords "extensions" "lisp"))]) + (dbus-codegen . + [(0 1) + ((cl-lib + (0 5))) + "Lisp code generation for D-Bus." single + ((:url . "http://elpa.gnu.org/packages/dbus-codegen.html") + (:keywords "comm" "dbus" "convenience") + (:authors + ("Daiki Ueno" . "ueno@gnu.org")) + (:maintainer nil . "emacs-devel@gnu.org"))]) + (debbugs . + [(0 28) + ((emacs + (25 1)) + (soap-client + (3 1 5))) + "SOAP library to access debbugs servers" tar + ((:maintainer "Michael Albinus" . "michael.albinus@gmx.de") + (:authors + ("Michael Albinus" . "michael.albinus@gmx.de")) + (:keywords "comm" "hypermedia") + (:url . "https://elpa.gnu.org/packages/debbugs.html"))]) + (delight . + [(1 7) + ((cl-lib + (0 5)) + (nadvice + (0 3))) + "A dimmer switch for your lighter text" single + ((:keywords "convenience") + (:authors + ("Phil Sainty" . "psainty@orcon.net.nz")) + (:maintainer "Phil Sainty" . "psainty@orcon.net.nz") + (:url . "https://savannah.nongnu.org/projects/delight"))]) + (devdocs . + [(0 1) + ((emacs + (27 1))) + "Emacs viewer for DevDocs" tar + ((:url . "https://github.com/astoff/devdocs") + (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com") + (:authors + ("Augusto Stoffel" . "arstoffel@gmail.com")) + (:keywords "help"))]) + (dict-tree . + [(0 16) + ((trie + (0 3)) + (tNFA + (0 1 1)) + (heap + (0 3))) + "Dictionary data structure" tar + ((:url . "http://www.dr-qubit.org/emacs.php") + (:maintainer "Toby Cubitt" . "toby-predictive@dr-qubit.org") + (:authors + ("Toby Cubitt" . "toby-predictive@dr-qubit.org")) + (:keywords "extensions" "matching" "data structures trie" "tree" "dictionary" "completion" "regexp"))]) + (diff-hl . + [(1 8 8) + ((cl-lib + (0 2)) + (emacs + (24 3))) + "Highlight uncommitted changes using VC" tar + ((:url . "https://github.com/dgutov/diff-hl") + (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru") + (:authors + ("Dmitry Gutov" . "dgutov@yandex.ru")) + (:keywords "vc" "diff"))]) + (diffview . + [(1 0) + nil "View diffs in side-by-side format" single + ((:keywords "convenience" "diff") + (:authors + ("Mitchel Humpherys" . "mitch.special@gmail.com")) + (:maintainer "Mitchel Humpherys" . "mitch.special@gmail.com") + (:url . "https://github.com/mgalgs/diffview-mode"))]) + (dired-du . + [(0 5 2) + ((emacs + (24 4)) + (cl-lib + (0 5))) + "Dired with recursive directory sizes" tar + ((:maintainer "Tino Calancha" . "tino.calancha@gmail.com") + (:authors + ("Tino Calancha" . "tino.calancha@gmail.com")) + (:keywords "files" "unix" "convenience") + (:url . "http://elpa.gnu.org/packages/dired-du.html"))]) + (dired-git-info . + [(0 3 1) + ((emacs + (25))) + "Show git info in dired" single + ((:keywords "dired" "files") + (:authors + ("Clemens Radermacher" . "clemera@posteo.net")) + (:maintainer "Clemens Radermacher" . "clemera@posteo.net") + (:url . "https://github.com/clemera/dired-git-info"))]) + (disk-usage . + [(1 3 3) + ((emacs + (26 1))) + "Sort and browse disk usage listings" single + ((:keywords "files" "convenience" "tools") + (:authors + ("Pierre Neidhardt" . "mail@ambrevar.xyz")) + (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") + (:url . "https://gitlab.com/Ambrevar/emacs-disk-usage"))]) + (dismal . + [(1 5 2) + ((cl-lib + (0)) + (emacs + (24 3))) + "Dis Mode Ain't Lotus: Spreadsheet program Emacs" tar + ((:maintainer "UnMaintainer" . "emacs-devel@gnu.org") + (:authors + (nil . "David Fox, fox@cs.nyu.edu") + (nil . "Frank E. Ritter, ritter@cs.cmu.edu")) + (:url . "https://elpa.gnu.org/packages/dismal.html"))]) + (djvu . + [(1 1 1) + nil "Edit and view Djvu files via djvused" single + ((:url . "http://elpa.gnu.org/packages/djvu.html") + (:keywords "files" "wp") + (:authors + ("Roland Winkler" . "winkler@gnu.org")) + (:maintainer "Roland Winkler" . "winkler@gnu.org"))]) + (docbook . + [(0 1) + nil "Info-like viewer for DocBook" single + ((:url . "http://elpa.gnu.org/packages/docbook.html") + (:keywords "docs" "help") + (:authors + ("Chong Yidong" . "cyd@gnu.org")) + (:maintainer "Chong Yidong" . "cyd@gnu.org"))]) + (dts-mode . + [(0 1 1) + nil "Major mode for Device Tree source files" tar + ((:maintainer "Ben Gamari" . "ben@smart-cactus.org") + (:authors + ("Ben Gamari" . "ben@smart-cactus.org")) + (:keywords "languages") + (:url . "https://elpa.gnu.org/packages/dts-mode.html"))]) + (easy-kill . + [(0 9 4) + ((emacs + (24)) + (cl-lib + (0 5))) + "kill & mark things easily" tar + ((:url . "https://github.com/leoliu/easy-kill") + (:maintainer "Leo Liu" . "sdl.web@gmail.com") + (:authors + ("Leo Liu" . "sdl.web@gmail.com")) + (:keywords "killing" "convenience"))]) + (ebdb . + [(0 6 23) + ((emacs + (25 1)) + (cl-lib + (0 5)) + (seq + (2 15))) + "Contact management package" tar + ((:url . "https://github.com/girzel/ebdb") + (:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net") + (:authors + ("Eric Abrahamsen" . "eric@ericabrahamsen.net")) + (:keywords "convenience" "mail"))]) + (ebdb-gnorb . + [(1 0 2) + ((gnorb + (1 1 0)) + (ebdb + (0 2))) + "Utilities for connecting EBDB to Gnorb" single + ((:url . "http://elpa.gnu.org/packages/ebdb-gnorb.html") + (:authors + ("Eric Abrahamsen" . "eric@ericabrahamsen.net")) + (:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net"))]) + (ebdb-i18n-chn . + [(1 3 2) + ((pyim + (1 6 0)) + (ebdb + (0 6 17))) + "China-specific internationalization support for EBDB" tar + ((:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net") + (:authors + ("Eric Abrahamsen" . "eric@ericabrahamsen.net")) + (:url . "https://elpa.gnu.org/packages/ebdb-i18n-chn.html"))]) + (ediprolog . + [(2 1) + nil "Emacs Does Interactive Prolog" single + ((:keywords "languages" "processes") + (:authors + ("Markus Triska" . "triska@metalevel.at")) + (:maintainer "Markus Triska" . "triska@metalevel.at") + (:url . "https://www.metalevel.at/ediprolog/"))]) + (eev . + [(20210608) + ((emacs + (24 4))) + "Support for e-scripts (eepitch blocks, elisp hyperlinks, etc)" tar + ((:url . "http://angg.twu.net/#eev") + (:maintainer "Eduardo Ochs" . "eduardoochs@gmail.com") + (:authors + ("Eduardo Ochs" . "eduardoochs@gmail.com")) + (:keywords "lisp" "e-scripts"))]) + (eglot . + [(1 7) + ((emacs + (26 1)) + (jsonrpc + (1 0 14)) + (flymake + (1 0 9)) + (project + (0 3 0)) + (xref + (1 0 1)) + (eldoc + (1 11 0))) + "Client for Language Server Protocol (LSP) servers" tar + ((:url . "https://github.com/joaotavora/eglot") + (:maintainer "João Távora" . "joaotavora@gmail.com") + (:authors + ("João Távora" . "joaotavora@gmail.com")) + (:keywords "convenience" "languages"))]) + (el-search . + [(1 12 6 1) + ((emacs + (25)) + (stream + (2 2 4)) + (cl-print + (1 0))) + "Expression based interactive search for Emacs Lisp" tar + ((:maintainer "Michael Heerdegen" . "michael_heerdegen@web.de") + (:authors + ("Michael Heerdegen" . "michael_heerdegen@web.de")) + (:keywords "lisp") + (:url . "http://elpa.gnu.org/packages/el-search.html"))]) + (eldoc . + [(1 11 0) + ((emacs + (26 3))) + "Show function arglist or variable docstring in echo area" single + ((:url . "http://elpa.gnu.org/packages/eldoc.html") + (:keywords "extensions") + (:authors + ("Noah Friedman" . "friedman@splode.com")) + (:maintainer "Noah Friedman" . "friedman@splode.com"))]) + (eldoc-eval . + [(0 1) + nil "Enable eldoc support when minibuffer is in use." single + ((:url . "http://elpa.gnu.org/packages/eldoc-eval.html") + (:authors + ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) + (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com"))]) + (electric-spacing . + [(5 0) + nil "Insert operators with surrounding spaces smartly" single + ((:url . "http://elpa.gnu.org/packages/electric-spacing.html") + (:authors + ("William Xu" . "william.xwl@gmail.com")) + (:maintainer "William Xu" . "william.xwl@gmail.com"))]) + (elisp-benchmarks . + [(1 12) + nil "elisp benchmarks collection" tar + ((:maintainer "Andrea Corallo" . "akrl@sdf.org") + (:authors + ("Andrea Corallo" . "akrl@sdf.org")) + (:keywords "languages" "lisp") + (:url . "https://elpa.gnu.org/packages/elisp-benchmarks.html"))]) + (emms . + [(7 3) + ((cl-lib + (0 5)) + (nadvice + (0 3)) + (seq + (0))) + "The Emacs Multimedia System" tar + ((:url . "https://www.gnu.org/software/emms/") + (:maintainer "Yoni Rabkin" . "yrk@gnu.org") + (:authors + ("Jorgen Schäfer" . "forcer@forcix.cx")) + (:keywords "emms" "mp3" "ogg" "flac" "music" "mpeg" "video" "multimedia"))]) + (enwc . + [(2 0) + ((emacs + (25 1))) + "The Emacs Network Client" tar + ((:url . "https://savannah.nongnu.org/p/enwc") + (:maintainer "Ian Dunn" . "dunni@gnu.org") + (:authors + ("Ian Dunn" . "dunni@gnu.org")) + (:keywords "external" "network" "wicd" "manager" "nm"))]) + (epoch-view . + [(0 0 1) + nil "Minor mode to visualize epoch timestamps" single + ((:url . "http://elpa.gnu.org/packages/epoch-view.html") + (:keywords "data" "timestamp" "epoch" "unix") + (:authors + ("Ted Zlatanov" . "tzz@lifelogs.com")) + (:maintainer "Ted Zlatanov" . "tzz@lifelogs.com"))]) + (ergoemacs-mode . + [(5 16 10 12) + ((emacs + (24 1)) + (undo-tree + (0 6 5)) + (cl-lib + (0 5))) + "Emacs mode based on common modern interface and ergonomics." tar + ((:url . "https://github.com/ergoemacs/ergoemacs-mode") + (:maintainer "Matthew L. Fidler" . "matthew.fidler@gmail.com") + (:authors + ("Xah Lee" . "xah@xahlee.org") + ("David Capello" . "davidcapello@gmail.com") + ("Matthew L. Fidler" . "matthew.fidler@gmail.com")) + (:keywords "convenience"))]) + (excorporate . + [(1 0 0) + ((emacs + (24 1)) + (cl-lib + (0 6 1)) + (fsm + (0 2 1)) + (soap-client + (3 2 0)) + (url-http-ntlm + (2 0 4)) + (nadvice + (0 3))) + "Exchange Web Services (EWS) integration" tar + ((:url . "https://www.fitzsim.org/blog/") + (:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org") + (:authors + ("Thomas Fitzsimmons" . "fitzsim@fitzsim.org")) + (:keywords "calendar"))]) + (expand-region . + [(0 11 0) + nil "Increase selected region by semantic units." tar + ((:url . "https://github.com/magnars/expand-region.el") + (:maintainer "Magnar Sveen" . "magnars@gmail.com") + (:authors + ("Magnar Sveen" . "magnars@gmail.com")) + (:keywords "marking" "region"))]) + (exwm . + [(0 24) + ((xelb + (0 18))) + "Emacs X Window Manager" tar + ((:url . "https://github.com/ch11ng/exwm") + (:maintainer "Chris Feng" . "chris.w.feng@gmail.com") + (:authors + ("Chris Feng" . "chris.w.feng@gmail.com")) + (:keywords "unix"))]) + (f90-interface-browser . + [(1 1) + nil "Parse and browse f90 interfaces" single + ((:authors + ("Lawrence Mitchell" . "wence@gmx.li")) + (:maintainer "Lawrence Mitchell" . "wence@gmx.li") + (:url . "http://github.com/wence-/f90-iface/"))]) + (filladapt . + [(2 12 2) + ((emacs + (24 4))) + "Adaptive fill" single + ((:url . "http://elpa.gnu.org/packages/filladapt.html") + (:authors + ("Kyle E. Jones" . "kyle_jones@wonderworks.com")) + (:maintainer nil . "emacs-devel@gnu.org"))]) + (flylisp . + [(0 2) + ((emacs + (24 1)) + (cl-lib + (0 4))) + "Color unbalanced parentheses and parentheses inconsistent with indentation" single + ((:url . "http://elpa.gnu.org/packages/flylisp.html") + (:authors + ("Barry O'Reilly" . "gundaetiapo@gmail.com")) + (:maintainer "Barry O'Reilly" . "gundaetiapo@gmail.com"))]) + (flymake . + [(1 1 1) + ((emacs + (26 1)) + (eldoc + (1 1 0))) + "A universal on-the-fly syntax checker" tar + ((:maintainer "João Távora" . "joaotavora@gmail.com") + (:authors + ("Pavel Kobyakov" . "pk_at_work@yahoo.com")) + (:keywords "c" "languages" "tools") + (:url . "https://elpa.gnu.org/packages/flymake.html"))]) + (frame-tabs . + [(1 1) + nil "show buffer tabs in side window" single + ((:url . "http://elpa.gnu.org/packages/frame-tabs.html") + (:keywords "frames" "tabs") + (:authors + ("Martin Rudalics" . "rudalics@gmx.at")) + (:maintainer "Martin Rudalics" . "rudalics@gmx.at"))]) + (frog-menu . + [(0 2 11) + ((emacs + (26)) + (avy + (0 4)) + (posframe + (0 4))) + "Quickly pick items from ad hoc menus" single + ((:keywords "convenience") + (:authors + ("Clemens Radermacher" . "clemera@posteo.net")) + (:maintainer "Clemens Radermacher" . "clemera@posteo.net") + (:url . "https://github.com/clemera/frog-menu"))]) + (fsm . + [(0 2 1) + ((emacs + (24 1)) + (cl-lib + (0 5))) + "state machine library" single + ((:url . "http://elpa.gnu.org/packages/fsm.html") + (:keywords "extensions") + (:authors + ("Magnus Henoch" . "magnus.henoch@gmail.com")) + (:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org"))]) + (gcmh . + [(0 2 1) + ((emacs + (24))) + "the Garbage Collector Magic Hack" single + ((:keywords "internal") + (:authors + ("Andrea Corallo" . "akrl@sdf.org")) + (:maintainer nil . "akrl@sdf.org") + (:url . "https://gitlab.com/koral/gcmh"))]) + (ggtags . + [(0 9 0) + ((emacs + (25))) + "emacs frontend to GNU Global source code tagging system" tar + ((:url . "https://github.com/leoliu/ggtags") + (:maintainer "Leo Liu" . "sdl.web@gmail.com") + (:authors + ("Leo Liu" . "sdl.web@gmail.com")) + (:keywords "tools" "convenience"))]) + (gited . + [(0 6 0) + ((emacs + (24 4)) + (cl-lib + (0 5))) + "Operate on Git branches like dired" tar + ((:maintainer "Tino Calancha" . "tino.calancha@gmail.com") + (:authors + ("Tino Calancha" . "tino.calancha@gmail.com")) + (:keywords "git" "vc" "convenience") + (:url . "http://elpa.gnu.org/packages/gited.html"))]) + (gle-mode . + [(1 1) + ((cl-lib + (0 5))) + "Major mode to edit Graphics Layout Engine files" single + ((:url . "http://elpa.gnu.org/packages/gle-mode.html") + (:authors + ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) + (gnome-c-style . + [(0 1) + nil "minor mode for editing GNOME-style C source code" tar + ((:maintainer "Daiki Ueno" . "ueno@gnu.org") + (:authors + ("Daiki Ueno" . "ueno@gnu.org")) + (:keywords "gnome" "c" "coding style") + (:url . "http://elpa.gnu.org/packages/gnome-c-style.html"))]) + (gnorb . + [(1 6 9) + ((cl-lib + (0 5))) + "Glue code between Gnus, Org, and BBDB" tar + ((:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net") + (:authors + ("Eric Abrahamsen" . "eric@ericabrahamsen.net")) + (:keywords "mail" "org" "gnus" "bbdb" "todo" "task") + (:url . "http://elpa.gnu.org/packages/gnorb.html"))]) + (gnu-elpa . + [(1 1) + nil "Advertize GNU ELPA packages" tar + ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") + (:authors + ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:url . "http://elpa.gnu.org/packages/gnu-elpa.html"))]) + (gnu-elpa-keyring-update . + [(2019 3) + nil "Update Emacs's GPG keyring for GNU ELPA" tar + ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") + (:authors + ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:keywords "maint" "tools") + (:url . "http://elpa.gnu.org/packages/gnu-elpa-keyring-update.html"))]) + (gnugo . + [(3 1 1) + ((ascii-art-to-unicode + (1 5)) + (xpm + (1 0 1)) + (cl-lib + (0 5))) + "play GNU Go in a buffer" tar + ((:url . "http://www.gnuvola.org/software/gnugo/") + (:maintainer "Thien-Thi Nguyen" . "ttn@gnu.org") + (:authors + ("Thien-Thi Nguyen" . "ttn@gnu.org")) + (:keywords "games" "processes"))]) + (gnus-mock . + [(0 5) + nil "Mock Gnus installation for testing" tar + ((:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net") + (:authors + ("Eric Abrahamsen" . "eric@ericabrahamsen.net")) + (:url . "https://elpa.gnu.org/packages/gnus-mock.html"))]) + (gpastel . + [(0 5 0) + ((emacs + (25 1))) + "Integrates GPaste with the kill-ring" single + ((:keywords "tools") + (:authors + ("Damien Cassou" . "damien@cassou.me")) + (:maintainer "Damien Cassou" . "damien@cassou.me") + (:url . "https://gitlab.petton.fr/DamienCassou/desktop-environment"))]) + (greader . + [(0 1) + ((emacs + (25))) + "gnamù reader, a reader with espeak tts" tar + ((:maintainer "Michelangelo Rodriguez" . "michelangelo.rodriguez@gmail.com") + (:authors + ("Michelangelo Rodriguez" . "michelangelo.rodriguez@gmail.com")) + (:keywords "tools" "accessibility") + (:url . "http://elpa.gnu.org/packages/greader.html"))]) + (greenbar . + [(1 1) + nil "Mark comint output with \"greenbar\" background" single + ((:url . "http://elpa.gnu.org/packages/greenbar.html") + (:keywords "faces" "terminals") + (:authors + ("Michael R. Mauger" . "michael@mauger.com")) + (:maintainer "Michael R. Mauger" . "michael@mauger.com"))]) + (guess-language . + [(0 0 1) + ((cl-lib + (0 5)) + (emacs + (24)) + (nadvice + (0 1))) + "Robust automatic language detection" single + ((:authors + ("Titus von der Malsburg" . "malsburg@posteo.de")) + (:maintainer "Titus von der Malsburg" . "malsburg@posteo.de") + (:url . "https://github.com/tmalsburg/guess-language.el"))]) + (heap . + [(0 5) + nil "Heap (a.k.a. priority queue) data structure" single + ((:keywords "extensions" "data structures" "heap" "priority queue") + (:authors + ("Toby Cubitt" . "toby-predictive@dr-qubit.org")) + (:maintainer "Toby Cubitt" . "toby-predictive@dr-qubit.org") + (:url . "http://www.dr-qubit.org/emacs.php"))]) + (hiddenquote . + [(1 1) + ((emacs + (25 1))) + "Major mode for doing hidden quote puzzles" tar + ((:url . "http://mauroaranda.com/puzzles/hidden-quote-puzzle/") + (:maintainer "Mauro Aranda" . "maurooaranda@gmail.com") + (:authors + ("Mauro Aranda" . "maurooaranda@gmail.com")) + (:keywords "games"))]) + (highlight-escape-sequences . + [(0 4) + nil "Highlight escape sequences" single + ((:keywords "convenience") + (:authors + ("Dmitry Gutov" . "dgutov@yandex.ru") + ("Pavel Matcula" . "dev.plvlml@gmail.com")) + (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru") + (:url . "https://github.com/dgutov/highlight-escape-sequences"))]) + (hook-helpers . + [(1 1 1) + ((emacs + (25 1))) + "Anonymous, modifiable hook functions" tar + ((:url . "https://savannah.nongnu.org/projects/hook-helpers-el/") + (:maintainer "Ian Dunn" . "dunni@gnu.org") + (:authors + ("Ian Dunn" . "dunni@gnu.org")) + (:keywords "development" "hooks"))]) + (html5-schema . + [(0 1) + nil "Add HTML5 schemas for use by nXML" tar + ((:url . "https://github.com/validator/validator") + (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") + (:authors + ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:keywords "html" "xml"))]) + (hydra . + [(0 14 0) + ((cl-lib + (0 5))) + "Make bindings that stick around." tar + ((:url . "https://github.com/abo-abo/hydra") + (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") + (:authors + ("Oleh Krehel" . "ohwoeowho@gmail.com")) + (:keywords "bindings"))]) + (hyperbole . + [(7 1 3) + ((emacs + (27 1))) + "GNU Hyperbole: The Everyday Hypertextual Information Manager" tar + ((:url . "http://www.gnu.org/software/hyperbole") + (:maintainer "Bob Weiner <rsw@gnu.org>, Mats Lidell" . "matsl@gnu.org") + (:authors + ("Bob Weiner")) + (:keywords "comm" "convenience" "files" "frames" "hypermedia" "languages" "mail" "matching" "mouse" "multimedia" "outlines" "tools" "wp"))]) + (ioccur . + [(2 4) + ((emacs + (24)) + (cl-lib + (0 5))) + "Incremental occur" single + ((:authors + ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) + (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") + (:url . "https://github.com/thierryvolpiatto/ioccur"))]) + (isearch-mb . + [(0 3) + ((emacs + (27 1))) + "Control isearch from the minibuffer" tar + ((:url . "https://github.com/astoff/isearch-mb") + (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com") + (:authors + ("Augusto Stoffel" . "arstoffel@gmail.com")) + (:keywords "matching"))]) + (iterators . + [(0 1 1) + ((emacs + (25))) + "Functions for working with iterators" single + ((:url . "http://elpa.gnu.org/packages/iterators.html") + (:keywords "extensions" "elisp") + (:authors + ("Michael Heerdegen" . "michael_heerdegen@web.de")) + (:maintainer "Michael Heerdegen" . "michael_heerdegen@web.de"))]) + (ivy . + [(0 13 4) + ((emacs + (24 5))) + "Incremental Vertical completYon" tar + ((:url . "https://github.com/abo-abo/swiper") + (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") + (:authors + ("Oleh Krehel" . "ohwoeowho@gmail.com")) + (:keywords "matching"))]) + (ivy-avy . + [(0 13 4) + ((emacs + (24 5)) + (ivy + (0 13 4)) + (avy + (0 5 0))) + "Avy integration for Ivy" tar + ((:url . "https://github.com/abo-abo/swiper") + (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") + (:authors + ("Oleh Krehel" . "ohwoeowho@gmail.com")) + (:keywords "convenience"))]) + (ivy-explorer . + [(0 3 2) + ((emacs + (25)) + (ivy + (0 10 0))) + "Dynamic file browsing grid using ivy" single + ((:keywords "convenience" "files" "matching") + (:authors + ("Clemens Radermacher" . "clemera@posteo.net")) + (:maintainer "Clemens Radermacher" . "clemera@posteo.net") + (:url . "https://github.com/clemera/ivy-explorer"))]) + (ivy-hydra . + [(0 13 5) + ((emacs + (24 5)) + (ivy + (0 13 4)) + (hydra + (0 14 0))) + "Additional key bindings for Ivy" tar + ((:url . "https://github.com/abo-abo/swiper") + (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") + (:authors + ("Oleh Krehel" . "ohwoeowho@gmail.com")) + (:keywords "convenience"))]) + (ivy-posframe . + [(0 6 1) + ((emacs + (26 0)) + (posframe + (1 0 0)) + (ivy + (0 13 0))) + "Using posframe to show Ivy" tar + ((:url . "https://github.com/tumashu/ivy-posframe") + (:maintainer "Feng Shu" . "tumashu@163.com") + (:authors + ("Feng Shu" . "tumashu@163.com") + ("Naoya Yamashita" . "conao3@gmail.com")) + (:keywords "abbrev" "convenience" "matching" "ivy"))]) + (javaimp . + [(0 7 1) + nil "Add and reorder Java import statements in Maven/Gradle projects" tar + ((:maintainer "Filipp Gunbin" . "fgunbin@fastmail.fm") + (:authors + ("Filipp Gunbin" . "fgunbin@fastmail.fm")) + (:keywords "java" "maven" "gradle" "programming") + (:url . "http://elpa.gnu.org/packages/javaimp.html"))]) + (jgraph-mode . + [(1 1) + ((cl-lib + (0 5))) + "Major mode for Jgraph files" single + ((:url . "http://elpa.gnu.org/packages/jgraph-mode.html") + (:keywords "tex" "wp") + (:authors + ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) + (js2-mode . + [(20201220) + ((emacs + (24 1)) + (cl-lib + (0 5))) + "Improved JavaScript editing mode" tar + ((:url . "https://github.com/mooz/js2-mode/") + (:maintainer "Steve Yegge" . "steve.yegge@gmail.com") + (:authors + ("Steve Yegge" . "steve.yegge@gmail.com") + ("mooz" . "stillpedant@gmail.com") + ("Dmitry Gutov" . "dgutov@yandex.ru")) + (:keywords "languages" "javascript"))]) + (json-mode . + [(0 2) + ((emacs + (25 1))) + "Major mode for editing JSON files" single + ((:url . "http://elpa.gnu.org/packages/json-mode.html") + (:keywords "data") + (:authors + ("Simen Heggestøyl" . "simenheg@gmail.com")) + (:maintainer "Simen Heggestøyl" . "simenheg@gmail.com"))]) + (jsonrpc . + [(1 0 14) + ((emacs + (25 2))) + "JSON-RPC library" single + ((:url . "http://elpa.gnu.org/packages/jsonrpc.html") + (:keywords "processes" "languages" "extensions") + (:authors + ("João Távora" . "joaotavora@gmail.com")) + (:maintainer "João Távora" . "joaotavora@gmail.com"))]) + (jumpc . + [(3 0) + nil "jump to previous insertion points" single + ((:url . "http://elpa.gnu.org/packages/jumpc.html") + (:authors + ("Ivan Kanis" . "ivan@kanis.fr")) + (:maintainer "Ivan Kanis" . "ivan@kanis.fr"))]) + (kiwix . + [(1 0 3) + ((emacs + (24 4)) + (request + (0 3 0))) + "Searching offline Wikipedia through Kiwix." tar + ((:url . "https://github.com/stardiviner/kiwix.el") + (:maintainer "stardiviner" . "numbchild@gmail.com") + (:authors + ("stardiviner" . "numbchild@gmail.com")) + (:keywords "kiwix" "wikipedia"))]) + (kmb . + [(0 1) + ((emacs + (24 1))) + "Kill buffers matching a regexp w/o confirmation" single + ((:url . "http://elpa.gnu.org/packages/kmb.html") + (:keywords "lisp" "convenience") + (:authors + ("Tino Calancha" . "tino.calancha@gmail.com")) + (:maintainer "Tino Calancha" . "tino.calancha@gmail.com"))]) + (landmark . + [(1 0) + nil "Neural-network robot that learns landmarks" single + ((:url . "http://elpa.gnu.org/packages/landmark.html") + (:keywords "games" "neural network" "adaptive search" "chemotaxis") + (:authors + ("Terrence Brannon" . "metaperl@gmail.com")) + (:maintainer nil . "emacs-devel@gnu.org"))]) + (leaf . + [(4 4 8) + ((emacs + (24 1))) + "Simplify your init.el configuration, extended use-package" tar + ((:url . "https://github.com/conao3/leaf.el") + (:maintainer "Naoya Yamashita" . "conao3@gmail.com") + (:authors + ("Naoya Yamashita" . "conao3@gmail.com")) + (:keywords "lisp" "settings"))]) + (let-alist . + [(1 0 6) + ((emacs + (24 1))) + "Easily let-bind values of an assoc-list by their names" single + ((:url . "http://elpa.gnu.org/packages/let-alist.html") + (:keywords "extensions" "lisp") + (:authors + ("Artur Malabarba" . "emacs@endlessparentheses.com")) + (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com"))]) + (lex . + [(1 1) + nil "Lexical analyser construction" tar + ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") + (:authors + ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:url . "http://elpa.gnu.org/packages/lex.html"))]) + (lmc . + [(1 4) + ((emacs + (24)) + (cl-lib + (0 5))) + "Little Man Computer in Elisp" single + ((:url . "http://elpa.gnu.org/packages/lmc.html") + (:authors + ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) + (load-dir . + [(0 0 5) + ((cl-lib + (0 5))) + "Load all Emacs Lisp files in a given directory" single + ((:url . "http://elpa.gnu.org/packages/load-dir.html") + (:keywords "lisp" "files" "convenience") + (:maintainer "Teodor Zlatanov" . "tzz@lifelogs.com"))]) + (load-relative . + [(1 3 1) + nil "Relative file load (within a multi-file Emacs package)" single + ((:keywords "internal") + (:authors + ("Rocky Bernstein" . "rocky@gnu.org")) + (:maintainer "Rocky Bernstein" . "rocky@gnu.org") + (:url . "http://github.com/rocky/emacs-load-relative"))]) + (loc-changes . + [(1 2) + nil "keep track of positions even after buffer changes" single + ((:authors + ("Rocky Bernstein" . "rocky@gnu.org")) + (:maintainer "Rocky Bernstein" . "rocky@gnu.org") + (:url . "http://github.com/rocky/emacs-loc-changes"))]) + (loccur . + [(1 2 4) + ((emacs + (24 3))) + "Perform an occur-like folding in current buffer" single + ((:keywords "matching") + (:authors + ("Alexey Veretennikov" . "alexey.veretennikov@gmail.com")) + (:maintainer "Alexey Veretennikov" . "alexey.veretennikov@gmail.com") + (:url . "https://github.com/fourier/loccur"))]) + (map . + [(3 0) + ((emacs + (26))) + "Map manipulation functions" tar + ((:maintainer nil . "emacs-devel@gnu.org") + (:authors + ("Nicolas Petton" . "nicolas@petton.fr")) + (:keywords "extensions" "lisp") + (:url . "https://elpa.gnu.org/packages/map.html"))]) + (marginalia . + [(0 6) + ((emacs + (26 1))) + "Enrich existing commands with completion annotations" tar + ((:url . "https://github.com/minad/marginalia") + (:maintainer "Omar Antolín Camarena <omar@matem.unam.mx>, Daniel Mendler" . "mail@daniel-mendler.de") + (:authors + ("Omar Antolín Camarena <omar@matem.unam.mx>, Daniel Mendler" . "mail@daniel-mendler.de")))]) + (markchars . + [(0 2 2) + nil "Mark chars fitting certain characteristics" single + ((:url . "http://elpa.gnu.org/packages/markchars.html") + (:authors + ("Lennart Borgman" . "lennart.borgman@gmail.com")) + (:maintainer "Lennart Borgman" . "lennart.borgman@gmail.com"))]) + (math-symbol-lists . + [(1 2 1) + nil "Lists of Unicode math symbols and latex commands" single + ((:keywords "unicode" "symbols" "mathematics") + (:authors + ("Vitalie Spinu" . "spinuvit@gmail.com")) + (:maintainer "Vitalie Spinu" . "spinuvit@gmail.com") + (:url . "https://github.com/vspinu/math-symbol-lists"))]) + (memory-usage . + [(0 2) + nil "Analyze the memory usage of Emacs in various ways" single + ((:url . "http://elpa.gnu.org/packages/memory-usage.html") + (:keywords "maint") + (:authors + ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) + (metar . + [(0 3) + ((cl-lib + (0 5))) + "Retrieve and decode METAR weather information" single + ((:url . "http://elpa.gnu.org/packages/metar.html") + (:keywords "comm") + (:authors + ("Mario Lang" . "mlang@delysid.org")) + (:maintainer "Mario Lang" . "mlang@delysid.org"))]) + (midi-kbd . + [(0 2) + ((emacs + (25))) + "Create keyboard events from Midi input" single + ((:url . "http://elpa.gnu.org/packages/midi-kbd.html") + (:keywords "convenience" "hardware" "multimedia") + (:authors + ("David Kastrup" . "dak@gnu.org")) + (:maintainer "David Kastrup" . "dak@gnu.org"))]) + (mines . + [(1 6) + ((emacs + (24 4)) + (cl-lib + (0 5))) + "Minesweeper game" tar + ((:url . "https://github.com/calancha/Minesweeper") + (:maintainer "Tino Calancha" . "tino.calancha@gmail.com") + (:authors + ("Tino Calancha" . "tino.calancha@gmail.com")) + (:keywords "games"))]) + (minibuffer-line . + [(0 1) + nil "Display status info in the minibuffer window" single + ((:url . "http://elpa.gnu.org/packages/minibuffer-line.html") + (:authors + ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) + (minimap . + [(1 4) + nil "Sidebar showing a \"mini-map\" of a buffer" single + ((:url . "http://elpa.gnu.org/packages/minimap.html") + (:authors + ("David Engster" . "deng@randomsample.de")) + (:maintainer "David Engster" . "deng@randomsample.de"))]) + (mmm-mode . + [(0 5 8) + ((cl-lib + (0 2))) + "Allow Multiple Major Modes in a buffer" tar + ((:url . "https://github.com/purcell/mmm-mode") + (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru") + (:authors + ("Michael Abraham Shulman" . "viritrilbia@gmail.com")) + (:keywords "convenience" "faces" "languages" "tools"))]) + (modus-operandi-theme . + [(0 13 2) + ((emacs + (26 1)) + (modus-themes + (1 2 4))) + "Accessible light theme (WCAG AAA) [DEPRECATED]" tar + ((:url . "https://gitlab.com/protesilaos/modus-themes") + (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") + (:authors + ("Protesilaos Stavrou" . "info@protesilaos.com")) + (:keywords "faces" "theme" "accessibility"))]) + (modus-themes . + [(1 4 0) + ((emacs + (26 1))) + "Highly accessible themes (WCAG AAA)" tar + ((:url . "https://gitlab.com/protesilaos/modus-themes") + (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") + (:authors + ("Protesilaos Stavrou" . "info@protesilaos.com")) + (:keywords "faces" "theme" "accessibility"))]) + (modus-vivendi-theme . + [(0 13 2) + ((emacs + (26 1)) + (modus-themes + (1 2 4))) + "Accessible dark theme (WCAG AAA) [DEPRECATED]" tar + ((:url . "https://gitlab.com/protesilaos/modus-themes") + (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") + (:authors + ("Protesilaos Stavrou" . "info@protesilaos.com")) + (:keywords "faces" "theme" "accessibility"))]) + (multishell . + [(1 1 9) + ((cl-lib + (0 5))) + "Easily use multiple shell buffers, local and remote" tar + ((:url . "https://github.com/kenmanheimer/EmacsMultishell") + (:maintainer "Ken Manheimer" . "ken.manheimer@gmail.com") + (:authors + ("Ken Manheimer" . "ken.manheimer@gmail.com")) + (:keywords "processes"))]) + (muse . + [(3 20 2) + nil "Authoring and publishing tool for Emacs" tar + ((:url . "http://mwolson.org/projects/EmacsMuse.html") + (:maintainer "Michael Olson" . "mwolson@gnu.org") + (:authors + ("John Wiegley" . "johnw@gnu.org")) + (:keywords "hypermedia"))]) + (myers . + [(0 1) + ((emacs + (25))) + "Random-access singly-linked lists" single + ((:url . "http://elpa.gnu.org/packages/myers.html") + (:keywords "list" "containers") + (:authors + ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) + (nadvice . + [(0 3) + nil "Forward compatibility for Emacs-24.4's nadvice" single + ((:url . "http://elpa.gnu.org/packages/nadvice.html") + (:authors + ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) + (nameless . + [(1 0 2) + ((emacs + (24 4))) + "Hide package namespace in your emacs-lisp code" single + ((:keywords "convenience" "lisp") + (:authors + ("Artur Malabarba" . "emacs@endlessparentheses.com")) + (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") + (:url . "https://github.com/Malabarba/nameless"))]) + (names . + [(20151201 0) + ((emacs + (24 1)) + (cl-lib + (0 5)) + (nadvice + (0 3))) + "Namespaces for emacs-lisp. Avoid name clobbering without hiding symbols." tar + ((:url . "https://github.com/Malabarba/names") + (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") + (:authors + ("Artur Malabarba" . "emacs@endlessparentheses.com")) + (:keywords "extensions" "lisp"))]) + (nhexl-mode . + [(1 5) + ((emacs + (24 4)) + (cl-lib + (0 5))) + "Minor mode to edit files via hex-dump format" single + ((:url . "http://elpa.gnu.org/packages/nhexl-mode.html") + (:keywords "data") + (:authors + ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) + (nlinum . + [(1 9) + nil "Show line numbers in the margin" single + ((:url . "http://elpa.gnu.org/packages/nlinum.html") + (:keywords "convenience") + (:authors + ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) + (notes-mode . + [(1 30) + nil "Indexing system for on-line note-taking" tar + ((:maintainer nil . "<johnh@isi.edu>.") + (:authors + (nil . "<johnh@isi.edu>.")) + (:url . "http://elpa.gnu.org/packages/notes-mode.html"))]) + (ntlm . + [(2 1 0) + nil "NTLM (NT LanManager) authentication support" single + ((:url . "http://elpa.gnu.org/packages/ntlm.html") + (:keywords "ntlm" "sasl" "comm") + (:authors + ("Taro Kawagishi" . "tarok@transpulse.org")) + (:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org"))]) + (num3-mode . + [(1 3) + nil "highlight groups of digits in long numbers" single + ((:url . "http://elpa.gnu.org/packages/num3-mode.html") + (:keywords "faces" "minor-mode") + (:authors + ("Felix Lee <felix8a@gmail.com>, Michal Nazarewicz" . "mina86@mina86.com")) + (:maintainer "Michal Nazarewicz" . "mina86@mina86.com"))]) + (oauth2 . + [(0 16) + ((cl-lib + (0 5)) + (nadvice + (0 3))) + "OAuth 2.0 Authorization Protocol" tar + ((:maintainer "Julien Danjou" . "julien@danjou.info") + (:authors + ("Julien Danjou" . "julien@danjou.info")) + (:keywords "comm") + (:url . "https://elpa.gnu.org/packages/oauth2.html"))]) + (ob-haxe . + [(1 0) + nil "org-babel functions for haxe evaluation" tar + ((:url . "https://orgmode.org") + (:maintainer "Ian Martins" . "ianxm@jhu.edu") + (:authors + ("Ian Martins" . "ianxm@jhu.edu")) + (:keywords "literate programming" "reproducible research"))]) + (objed . + [(0 8 3) + ((emacs + (25)) + (cl-lib + (0 5))) + "Navigate and edit text objects." tar + ((:url . "https://github.com/clemera/objed") + (:maintainer "Clemens Radermacher" . "clemera@posteo.net") + (:authors + ("Clemens Radermacher" . "clemera@posteo.net")) + (:keywords "convenience"))]) + (omn-mode . + [(1 2) + nil "Support for OWL Manchester Notation" single + ((:url . "http://elpa.gnu.org/packages/omn-mode.html") + (:authors + ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) + (:maintainer "Phillip Lord" . "phillip.lord@newcastle.ac.uk"))]) + (on-screen . + [(1 3 3) + ((cl-lib + (0))) + "guide your eyes while scrolling" single + ((:keywords "convenience") + (:authors + ("Michael Heerdegen" . "michael_heerdegen@web.de")) + (:maintainer "Michael Heerdegen" . "michael_heerdegen@web.de") + (:url . "https://github.com/michael-heerdegen/on-screen.el"))]) + (org . + [(9 4 6) + ((emacs + (24 3))) + "Outline-based notes management and organizer" tar + ((:url . "https://orgmode.org") + (:maintainer "Bastien Guerry" . "bzg@gnu.org") + (:authors + ("Carsten Dominik" . "carsten.dominik@gmail.com")) + (:keywords "outlines" "hypermedia" "calendar" "wp"))]) + (org-edna . + [(1 1 2) + ((emacs + (25 1)) + (seq + (2 19)) + (org + (9 0 5))) + "Extensible Dependencies 'N' Actions" tar + ((:url . "https://savannah.nongnu.org/projects/org-edna-el/") + (:maintainer "Ian Dunn" . "dunni@gnu.org") + (:authors + ("Ian Dunn" . "dunni@gnu.org")) + (:keywords "convenience" "text" "org"))]) + (org-translate . + [(0 1 3) + ((emacs + (25 1)) + (org + (9 1))) + "Org-based translation environment" single + ((:url . "http://elpa.gnu.org/packages/org-translate.html") + (:authors + ("Eric Abrahamsen" . "eric@ericabrahamsen.net")) + (:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net"))]) + (orgalist . + [(1 13) + ((emacs + (24 4))) + "Manage Org-like lists in non-Org buffers" single + ((:url . "http://elpa.gnu.org/packages/orgalist.html") + (:keywords "convenience") + (:authors + ("Nicolas Goaziou" . "mail@nicolasgoaziou.fr")) + (:maintainer "Nicolas Goaziou" . "mail@nicolasgoaziou.fr"))]) + (osc . + [(0 4) + nil "Open Sound Control protocol library" tar + ((:maintainer "Mario Lang" . "mlang@blind.guru") + (:authors + ("Mario Lang" . "mlang@blind.guru")) + (:keywords "comm" "processes" "multimedia") + (:url . "https://elpa.gnu.org/packages/osc.html"))]) + (other-frame-window . + [(1 0 6) + ((emacs + (24 4))) + "Minor mode to enable global prefix keys for other frame/window buffer placement" single + ((:url . "http://elpa.gnu.org/packages/other-frame-window.html") + (:keywords "frame" "window") + (:authors + ("Stephen Leake" . "stephen_leake@member.fsf.org")) + (:maintainer "Stephen Leake" . "stephen_leake@member.fsf.org"))]) + (pabbrev . + [(4 2 1) + nil "Predictive abbreviation expansion" single + ((:url . "http://elpa.gnu.org/packages/pabbrev.html") + (:authors + ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) + (:maintainer "Phillip Lord" . "phillip.lord@newcastle.ac.uk"))]) + (paced . + [(1 1 3) + ((emacs + (25 1)) + (async + (1 9 1))) + "Predictive Abbreviation Completion and Expansion using Dictionaries" tar + ((:url . "https://savannah.nongnu.org/projects/paced-el/") + (:maintainer "Ian Dunn" . "dunni@gnu.org") + (:authors + ("Ian Dunn" . "dunni@gnu.org")) + (:keywords "convenience" "completion"))]) + (parsec . + [(0 1 3) + ((emacs + (24)) + (cl-lib + (0 5))) + "Parser combinator library" tar + ((:url . "https://github.com/cute-jumper/parsec.el") + (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") + (:authors + ("Junpeng Qiu" . "qjpchmail@gmail.com")) + (:keywords "extensions"))]) + (path-iterator . + [(1 0) + ((emacs + (25 0))) + "An iterator for traversing a directory path." tar + ((:maintainer "Stephen Leake" . "stephen_leake@stephe-leake.org") + (:authors + ("Stephen Leake" . "stephen_leake@stephe-leake.org")) + (:url . "http://elpa.gnu.org/packages/path-iterator.html"))]) + (peg . + [(1 0) + ((emacs + (25))) + "Parsing Expression Grammars in Emacs Lisp" tar + ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca") + (:authors + ("Helmut Eller" . "eller.helmut@gmail.com")) + (:url . "http://elpa.gnu.org/packages/peg.html"))]) + (persist . + [(0 4) + nil "Persist Variables between Emacs Sessions" tar + ((:maintainer "Phillip Lord" . "phillip.lord@russet.org.uk") + (:authors + ("Phillip Lord" . "phillip.lord@russet.org.uk")) + (:url . "http://elpa.gnu.org/packages/persist.html"))]) + (phps-mode . + [(0 4 3) + ((emacs + (26))) + "Major mode for PHP with Semantic integration" tar + ((:url . "https://github.com/cjohansson/emacs-phps-mode") + (:maintainer "Christian Johansson" . "christian@cvj.se") + (:authors + ("Christian Johansson" . "christian@cvj.se")) + (:keywords "tools" "convenience"))]) + (pinentry . + [(0 1) + nil "GnuPG Pinentry server implementation" single + ((:url . "http://elpa.gnu.org/packages/pinentry.html") + (:keywords "gnupg") + (:authors + ("Daiki Ueno" . "ueno@gnu.org")) + (:maintainer "Daiki Ueno" . "ueno@gnu.org"))]) + (poker . + [(0 2) + nil "Texas hold 'em poker" single + ((:url . "http://elpa.gnu.org/packages/poker.html") + (:keywords "games") + (:authors + ("Mario Lang" . "mlang@delysid.org")) + (:maintainer "Mario Lang" . "mlang@delysid.org"))]) + (posframe . + [(1 0 3) + ((emacs + (26))) + "Pop a posframe (just a frame) at point" tar + ((:url . "https://github.com/tumashu/posframe") + (:maintainer "Feng Shu" . "tumashu@163.com") + (:authors + ("Feng Shu" . "tumashu@163.com")) + (:keywords "convenience" "tooltip"))]) + (project . + [(0 6 0) + ((emacs + (26 1)) + (xref + (1 0 2))) + "Operations on the current project" tar + ((:url . "https://elpa.gnu.org/packages/project.html"))]) + (psgml . + [(1 3 4) + nil "SGML-editing mode with parsing support" tar + ((:maintainer "Lennart Staflin" . "lstaflin@gmail.com") + (:authors + ("Lennart Staflin" . "lenst@lysator.liu.se") + ("James Clark" . "jjc@clark.com")) + (:keywords "languages") + (:url . "http://elpa.gnu.org/packages/psgml.html"))]) + (pspp-mode . + [(1 1) + nil "Major mode for editing PSPP files" single + ((:url . "http://elpa.gnu.org/packages/pspp-mode.html") + (:keywords "pspp" "major-mode") + (:authors + ("Scott Andrew Borton" . "scott@pp.htv.fi")) + (:maintainer "John Darrington" . "john@darrington.wattle.id.au"))]) + (pyim . + [(3 8 1) + ((emacs + (24 4)) + (async + (1 6)) + (xr + (1 13))) + "A Chinese input method support quanpin, shuangpin, wubi and cangjie." tar + ((:url . "https://github.com/tumashu/pyim") + (:maintainer "Feng Shu" . "tumashu@163.com") + (:authors + ("Ye Wenbin" . "wenbinye@163.com") + ("Feng Shu" . "tumashu@163.com")) + (:keywords "convenience" "chinese" "pinyin" "input-method"))]) + (pyim-basedict . + [(0 5 0) + nil "The default pinyin dict of pyim" tar + ((:url . "https://github.com/tumashu/pyim-basedict") + (:maintainer "Feng Shu" . "tumashu@163.com") + (:authors + ("Feng Shu" . "tumashu@163.com")) + (:keywords "convenience" "chinese" "pinyin" "input-method" "complete"))]) + (python . + [(0 27 1) + ((emacs + (24 2)) + (cl-lib + (1 0))) + "Python's flying circus support for Emacs" single + ((:keywords "languages") + (:authors + ("Fabián E. Gallina" . "fgallina@gnu.org")) + (:maintainer nil . "emacs-devel@gnu.org") + (:url . "https://github.com/fgallina/python.el"))]) + (quarter-plane . + [(0 1) + nil "Minor mode for quarter-plane style editing" single + ((:url . "http://elpa.gnu.org/packages/quarter-plane.html") + (:keywords "convenience" "wp") + (:authors + ("Peter J. Weisberg" . "pj@irregularexpressions.net")) + (:maintainer "Peter J. Weisberg" . "pj@irregularexpressions.net"))]) + (queue . + [(0 2) + nil "Queue data structure" single + ((:keywords "extensions" "data structures" "queue") + (:authors + ("Inge Wallin" . "inge@lysator.liu.se") + ("Toby Cubitt" . "toby-predictive@dr-qubit.org")) + (:maintainer "Toby Cubitt" . "toby-predictive@dr-qubit.org") + (:url . "http://www.dr-qubit.org/emacs.php"))]) + (rainbow-mode . + [(1 0 5) + nil "Colorize color names in buffers" single + ((:url . "http://elpa.gnu.org/packages/rainbow-mode.html") + (:keywords "faces") + (:authors + ("Julien Danjou" . "julien@danjou.info")) + (:maintainer "Julien Danjou" . "julien@danjou.info"))]) + (rbit . + [(0 1) + nil "Red-black persistent interval trees" single + ((:url . "http://elpa.gnu.org/packages/rbit.html") + (:keywords "data structures" "binary tree" "intervals") + (:authors + ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) + (rcirc-color . + [(0 4 2) + ((emacs + (24 4))) + "color nicks" tar + ((:maintainer "Alex Schroeder" . "alex@gnu.org") + (:authors + ("Alex Schroeder" . "alex@gnu.org")) + (:keywords "comm") + (:url . "https://elpa.gnu.org/packages/rcirc-color.html"))]) + (rcirc-menu . + [(1 1) + nil "A menu of all your rcirc connections" single + ((:url . "http://elpa.gnu.org/packages/rcirc-menu.html") + (:keywords "comm") + (:authors + ("Alex Schroeder" . "alex@gnu.org")) + (:maintainer "Alex Schroeder" . "alex@gnu.org"))]) + (realgud . + [(1 5 1) + ((load-relative + (1 3 1)) + (loc-changes + (1 2)) + (test-simple + (1 3 0)) + (emacs + (25))) + "A modular front-end for interacting with external debuggers" tar + ((:url . "http://github.com/realgud/realgud/") + (:maintainer "Rocky Bernstein" . "rocky@gnu.org") + (:authors + ("Rocky Bernstein" . "rocky@gnu.org")) + (:keywords "debugger" "gdb" "python" "perl" "go" "bash" "zsh" "bashdb" "zshdb" "remake" "trepan" "perldb" "pdb"))]) + (realgud-ipdb . + [(1 0 0) + ((realgud + (1 5 0)) + (load-relative + (1 3 1)) + (emacs + (25))) + "Realgud front-end to ipdb" tar + ((:url . "http://github.com/rocky/realgud-ipdb") + (:maintainer "Rocky Bernstein" . "rocky@gnu.org") + (:authors + ("Rocky Bernstein" . "rocky@gnu.org")))]) + (realgud-jdb . + [(1 0 0) + ((realgud + (1 4 5)) + (load-relative + (1 2)) + (cl-lib + (0 5)) + (emacs + (25))) + "Realgud front-end to Java's jdb debugger\"" tar + ((:url . "http://github.com/realgud/realgud-jdb") + (:maintainer "Rocky Bernstein" . "rocky@gnu.org") + (:authors + ("Rocky Bernstein" . "rocky@gnu.org")))]) + (realgud-lldb . + [(1 0 2) + ((load-relative + (1 3 1)) + (realgud + (1 5 0)) + (emacs + (25))) + "Realgud front-end to lldb" tar + ((:url . "http://github.com/realgud/realgud-lldb") + (:maintainer "Rocky Bernstein" . "rocky@gnu.org") + (:authors + ("Rocky Bernstein" . "rocky@gnu.org")))]) + (realgud-node-debug . + [(1 0 0) + ((realgud + (1 4 5)) + (load-relative + (1 2)) + (cl-lib + (0 5)) + (emacs + (25))) + "Realgud front-end to older \"node debug\"" tar + ((:url . "http://github.com/realgud/realgud-node-debug") + (:maintainer "Rocky Bernstein" . "rocky@gnu.org") + (:authors + ("Rocky Bernstein" . "rocky@gnu.org")))]) + (realgud-node-inspect . + [(1 0 0) + ((realgud + (1 4 5)) + (load-relative + (1 2)) + (cl-lib + (0 5)) + (emacs + (24))) + "Realgud front-end to newer \"node inspect\"" tar + ((:url . "http://github.com/realgud/realgud-node-inspect") + (:maintainer "Rocky Bernstein" . "rocky@gnu.org") + (:authors + ("Rocky Bernstein" . "rocky@gnu.org")))]) + (realgud-trepan-ni . + [(1 0 1) + ((load-relative + (1 2)) + (realgud + (1 5 0)) + (cl-lib + (0 5)) + (emacs + (25))) + "Realgud front-end to trepan-ni" tar + ((:url . "http://github.com/realgud/realgud-trepan-ni") + (:maintainer "Rocky Bernstein" . "rocky@gnu.org") + (:authors + ("Rocky Bernstein" . "rocky@gnu.org")))]) + (rec-mode . + [(1 8 1) + ((emacs + (25))) + "Major mode for viewing/editing rec files" tar + ((:url . "https://www.gnu.org/software/recutils/") + (:maintainer "Antoine Kalmbach" . "ane@iki.fi") + (:authors + ("Jose E. Marchesi" . "jemarch@gnu.org")))]) + (register-list . + [(0 1) + nil "Interactively list/edit registers" single + ((:url . "http://elpa.gnu.org/packages/register-list.html") + (:keywords "register") + (:authors + ("Bastien Guerry" . "bzg@gnu.org")) + (:maintainer "Bastien Guerry" . "bzg@gnu.org"))]) + (relint . + [(1 19) + ((xr + (1 20)) + (emacs + (26 1))) + "Elisp regexp mistake finder" tar + ((:url . "https://github.com/mattiase/relint") + (:maintainer "Mattias Engdegård" . "mattiase@acm.org") + (:authors + ("Mattias Engdegård" . "mattiase@acm.org")) + (:keywords "lisp" "regexps"))]) + (repology . + [(1 1 0) + ((emacs + (26 1))) + "Repology API access via Elisp" tar + ((:maintainer "Nicolas Goaziou" . "mail@nicolasgoaziou.fr") + (:authors + ("Nicolas Goaziou" . "mail@nicolasgoaziou.fr")) + (:keywords "web") + (:url . "https://elpa.gnu.org/packages/repology.html"))]) + (rich-minority . + [(1 0 3) + ((cl-lib + (0 5))) + "Clean-up and Beautify the list of minor-modes." tar + ((:url . "https://github.com/Malabarba/rich-minority") + (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") + (:authors + ("Artur Malabarba" . "emacs@endlessparentheses.com")) + (:keywords "mode-line" "faces"))]) + (rnc-mode . + [(0 2) + nil "Emacs mode to edit Relax-NG Compact files" single + ((:url . "http://elpa.gnu.org/packages/rnc-mode.html") + (:keywords "xml" "relaxng") + (:authors + ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) + (rt-liberation . + [(2 3) + nil "Emacs interface to RT" tar + ((:url . "http://www.nongnu.org/rtliber/") + (:maintainer "Yoni Rabkin" . "yrk@gnu.org") + (:authors + ("Yoni Rabkin" . "yrk@gnu.org")) + (:keywords "rt" "tickets"))]) + (rudel . + [(0 3 2) + ((emacs + (24)) + (cl-lib + (0 5)) + (cl-generic + (0 3)) + (cl-print + (1 0))) + "A collaborative editing framework for Emacs" tar + ((:url . "http://rudel.sourceforge.net/") + (:maintainer "Jan Moringen" . "scymtym@users.sourceforge.net") + (:authors + ("Jan Moringen" . "scymtym@users.sourceforge.net")) + (:keywords "rudel" "collaboration"))]) + (scanner . + [(0 2) + ((emacs + (25 1)) + (dash + (2 12 0))) + "Scan documents and images" tar + ((:url . "https://gitlab.com/rstocker/scanner.git") + (:maintainer "Raffael Stocker" . "r.stocker@mnet-mail.de") + (:authors + ("Raffael Stocker" . "r.stocker@mnet-mail.de")) + (:keywords "hardware" "multimedia"))]) + (scroll-restore . + [(1 0) + nil "restore original position after scrolling" single + ((:url . "http://elpa.gnu.org/packages/scroll-restore.html") + (:keywords "scrolling") + (:authors + ("Martin Rudalics" . "rudalics@gmx.at")) + (:maintainer "Martin Rudalics" . "rudalics@gmx.at"))]) + (sed-mode . + [(1 0) + nil "Major mode to edit sed scripts" single + ((:url . "http://elpa.gnu.org/packages/sed-mode.html") + (:authors + ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) + (seq . + [(2 22) + nil "Sequence manipulation functions" tar + ((:maintainer nil . "emacs-devel@gnu.org") + (:authors + ("Nicolas Petton" . "nicolas@petton.fr")) + (:keywords "sequences") + (:url . "http://elpa.gnu.org/packages/seq.html"))]) + (setup . + [(0 2 0) + ((emacs + (26 1))) + "Helpful Configuration Macro" tar + ((:url . "https://git.sr.ht/~zge/setup") + (:maintainer "Philip K." . "philipk@posteo.net") + (:authors + ("Philip K." . "philipk@posteo.net")) + (:keywords "lisp" "local"))]) + (shelisp . + [(0 9 1) + nil "execute elisp in shell" single + ((:url . "http://elpa.gnu.org/packages/shelisp.html") + (:keywords "terminals" "lisp" "processes") + (:authors + ("Michael R. Mauger" . "michael@mauger.com")) + (:maintainer "Michael R. Mauger" . "michael@mauger.com"))]) + (shell-command+ . + [(2 2 0) + ((emacs + (24 1))) + "An extended shell-command" tar + ((:url . "https://git.sr.ht/~zge/bang") + (:maintainer "Philip K." . "philipk@posteo.net") + (:authors + ("Philip K." . "philipk@posteo.net")) + (:keywords "unix" "processes" "convenience"))]) + (shen-mode . + [(0 1) + nil "A major mode for editing shen source code" tar + ((:maintainer "Eric Schulte" . "schulte.eric@gmail.com") + (:authors + ("Eric Schulte" . "schulte.eric@gmail.com")) + (:keywords "languages" "shen") + (:url . "http://elpa.gnu.org/packages/shen-mode.html"))]) + (sisu-mode . + [(7 1 8) + nil "Major mode for SiSU markup text" single + ((:keywords "text" "syntax" "processes" "tools") + (:authors + ("Ralph Amissah & Ambrose Kofi Laing")) + (:maintainer "Ralph Amissah" . "ralph.amissah@gmail.com") + (:url . "http://www.sisudoc.org/"))]) + (slime-volleyball . + [(1 1 7) + ((cl-lib + (0 5))) + "An SVG Slime Volleyball Game" tar + ((:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org") + (:authors + ("Thomas Fitzsimmons" . "fitzsim@fitzsim.org")) + (:keywords "games") + (:url . "http://elpa.gnu.org/packages/slime-volleyball.html"))]) + (sm-c-mode . + [(1 1) + nil "C major mode based on SMIE" single + ((:url . "http://elpa.gnu.org/packages/sm-c-mode.html") + (:authors + ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) + (smalltalk-mode . + [(4 0) + nil "Major mode for the GNU Smalltalk programming language" tar + ((:maintainer "Derek Zhou" . "derek@3qin.us") + (:authors + ("Steve Byrne")) + (:url . "https://elpa.gnu.org/packages/smalltalk-mode.html"))]) + (smart-yank . + [(0 1 1) + ((emacs + (24))) + "A different approach of yank pointer handling" single + ((:url . "http://elpa.gnu.org/packages/smart-yank.html") + (:keywords "convenience") + (:authors + ("Michael Heerdegen" . "michael_heerdegen@web.de")) + (:maintainer "Michael Heerdegen" . "michael_heerdegen@web.de"))]) + (sml-mode . + [(6 10) + ((emacs + (24 3)) + (cl-lib + (0 5))) + "Major mode for editing (Standard) ML" single + ((:url . "http://elpa.gnu.org/packages/sml-mode.html") + (:keywords "sml") + (:authors + ("Lars Bo Nielsen") + (" Olin Shivers") + (" Fritz Knabe (?)") + (" Steven Gilmore (?)") + (" Matthew Morley" . "mjm@scs.leeds.ac.uk") + (" Matthias Blume" . "blume@cs.princeton.edu") + (" (Stefan Monnier)" . "monnier@iro.umontreal.ca")) + (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) + (so-long . + [(1 0) + ((emacs + (24 4))) + "Say farewell to performance problems with minified code." single + ((:keywords "convenience") + (:authors + ("Phil Sainty" . "psainty@orcon.net.nz")) + (:maintainer "Phil Sainty" . "psainty@orcon.net.nz") + (:url . "https://savannah.nongnu.org/projects/so-long"))]) + (soap-client . + [(3 2 0) + ((cl-lib + (0 6 1))) + "Access SOAP web services" tar + ((:url . "https://github.com/alex-hhh/emacs-soap-client") + (:maintainer "Alexandru Harsanyi" . "AlexHarsanyi@gmail.com") + (:authors + ("Alexandru Harsanyi" . "AlexHarsanyi@gmail.com")) + (:keywords "soap" "web-services" "comm" "hypermedia"))]) + (sokoban . + [(1 4 8) + ((emacs + (23 1)) + (cl-lib + (0 5))) + "Implementation of Sokoban for Emacs." tar + ((:maintainer "Dieter Deyke" . "dieter.deyke@gmail.com") + (:authors + ("Glynn Clements" . "glynn.clements@xemacs.org")) + (:keywords "games") + (:url . "http://elpa.gnu.org/packages/sokoban.html"))]) + (sotlisp . + [(1 6 2) + ((emacs + (24 1))) + "Write lisp at the speed of thought." single + ((:keywords "convenience" "lisp") + (:authors + ("Artur Malabarba" . "emacs@endlessparentheses.com")) + (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") + (:url . "https://github.com/Malabarba/speed-of-thought-lisp"))]) + (spinner . + [(1 7 3) + nil "Add spinners and progress-bars to the mode-line for ongoing operations" single + ((:keywords "processes" "mode-line") + (:authors + ("Artur Malabarba" . "emacs@endlessparentheses.com")) + (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") + (:url . "https://github.com/Malabarba/spinner.el"))]) + (sql-beeline . + [(0 1) + nil "Beeline support for sql.el" single + ((:url . "http://elpa.gnu.org/packages/sql-beeline.html") + (:keywords "sql" "hive" "beeline" "hiveserver2") + (:authors + ("Filipp Gunbin" . "fgunbin@fastmail.fm")) + (:maintainer "Filipp Gunbin" . "fgunbin@fastmail.fm"))]) + (sql-indent . + [(1 5) + ((cl-lib + (0 5))) + "Support for indenting code in SQL files." tar + ((:url . "https://github.com/alex-hhh/emacs-sql-indent") + (:maintainer "Alex Harsanyi" . "AlexHarsanyi@gmail.com") + (:authors + ("Alex Harsanyi" . "AlexHarsanyi@gmail.com")) + (:keywords "languages" "sql"))]) + (ssh-deploy . + [(3 1 12) + ((emacs + (25))) + "Deployment via Tramp, global or per directory." tar + ((:url . "https://github.com/cjohansson/emacs-ssh-deploy") + (:maintainer "Christian Johansson" . "christian@cvj.se") + (:authors + ("Christian Johansson" . "christian@cvj.se")) + (:keywords "tools" "convenience"))]) + (stream . + [(2 2 5) + ((emacs + (25))) + "Implementation of streams" tar + ((:maintainer nil . "nicolas@petton.fr") + (:authors + ("Nicolas Petton" . "nicolas@petton.fr")) + (:keywords "stream" "laziness" "sequences") + (:url . "http://elpa.gnu.org/packages/stream.html"))]) + (svg . + [(1 1) + ((emacs + (25))) + "SVG image creation functions" single + ((:url . "http://elpa.gnu.org/packages/svg.html") + (:keywords "image") + (:authors + ("Lars Magne Ingebrigtsen" . "larsi@gnus.org") + ("Felix E. Klee" . "felix.klee@inka.de")) + (:maintainer "Lars Magne Ingebrigtsen" . "larsi@gnus.org"))]) + (svg-clock . + [(1 2) + ((svg + (1 0)) + (emacs + (27 0))) + "Analog clock using Scalable Vector Graphics" single + ((:url . "http://elpa.gnu.org/packages/svg-clock.html") + (:keywords "demo" "svg" "clock") + (:authors + ("Ulf Jasper" . "ulf.jasper@web.de")) + (:maintainer "Ulf Jasper" . "ulf.jasper@web.de"))]) + (swiper . + [(0 13 4) + ((emacs + (24 5)) + (ivy + (0 13 4))) + "Isearch with an overview. Oh, man!" tar + ((:url . "https://github.com/abo-abo/swiper") + (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") + (:authors + ("Oleh Krehel" . "ohwoeowho@gmail.com")) + (:keywords "matching"))]) + (system-packages . + [(1 0 11) + ((emacs + (24 3))) + "functions to manage system packages" tar + ((:url . "https://gitlab.com/jabranham/system-packages") + (:maintainer "J. Alexander Branham" . "alex.branham@gmail.com") + (:authors + ("J. Alexander Branham" . "alex.branham@gmail.com")))]) + (tNFA . + [(0 1 1) + ((queue + (0 1))) + "Tagged non-deterministic finite-state automata" single + ((:keywords "extensions" "matching" "data structures tnfa" "nfa" "dfa" "finite state automata" "automata" "regexp") + (:authors + ("Toby Cubitt" . "toby-predictive@dr-qubit.org")) + (:maintainer "Toby Cubitt" . "toby-predictive@dr-qubit.org") + (:url . "http://www.dr-qubit.org/emacs.php"))]) + (temp-buffer-browse . + [(1 5) + ((emacs + (24))) + "temp buffer browse mode" single + ((:url . "http://elpa.gnu.org/packages/temp-buffer-browse.html") + (:keywords "convenience") + (:authors + ("Leo Liu" . "sdl.web@gmail.com")) + (:maintainer "Leo Liu" . "sdl.web@gmail.com"))]) + (test-simple . + [(1 3 0) + ((cl-lib + (0))) + "Simple Unit Test Framework for Emacs Lisp" single + ((:keywords "unit-test") + (:authors + ("Rocky Bernstein" . "rocky@gnu.org")) + (:maintainer "Rocky Bernstein" . "rocky@gnu.org") + (:url . "http://github.com/rocky/emacs-test-simple"))]) + (timerfunctions . + [(1 4 2) + ((cl-lib + (0 5)) + (emacs + (24))) + "Enhanced versions of some timer.el functions" single + ((:url . "http://elpa.gnu.org/packages/timerfunctions.html") + (:authors + ("Dave Goel" . "deego3@gmail.com")) + (:maintainer "Dave Goel" . "deego3@gmail.com"))]) + (tiny . + [(0 2 1) + nil "Quickly generate linear ranges in Emacs" tar + ((:url . "https://github.com/abo-abo/tiny") + (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") + (:authors + ("Oleh Krehel" . "ohwoeowho@gmail.com")) + (:keywords "convenience"))]) + (tramp . + [(2 5 0 5) + ((emacs + (25 1))) + "Transparent Remote Access, Multiple Protocol" tar + ((:url . "https://www.gnu.org/software/tramp/") + (:maintainer "Michael Albinus" . "michael.albinus@gmx.de") + (:authors + ("Kai Großjohann" . "kai.grossjohann@gmx.net")) + (:keywords "comm" "processes"))]) + (tramp-theme . + [(0 2) + ((emacs + (24 1))) + "Custom theme for remote buffers" single + ((:url . "http://elpa.gnu.org/packages/tramp-theme.html") + (:keywords "convenience" "faces") + (:authors + ("Michael Albinus" . "michael.albinus@gmx.de")) + (:maintainer "Michael Albinus" . "michael.albinus@gmx.de"))]) + (transcribe . + [(1 5 2) + nil "Package for audio transcriptions" single + ((:url . "http://elpa.gnu.org/packages/transcribe.html") + (:authors + ("David Gonzalez Gandara" . "dggandara@member.fsf.org")) + (:maintainer "David Gonzalez Gandara" . "dggandara@member.fsf.org"))]) + (transient . + [(0 3 4) + ((emacs + (25 1))) + "Transient commands" tar + ((:url . "https://github.com/magit/transient") + (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") + (:authors + ("Jonas Bernoulli" . "jonas@bernoul.li")) + (:keywords "bindings"))]) + (trie . + [(0 5) + ((tNFA + (0 1 1)) + (heap + (0 3))) + "Trie data structure" tar + ((:url . "http://www.dr-qubit.org/emacs.php") + (:maintainer "Toby Cubitt" . "toby-predictive@dr-qubit.org") + (:authors + ("Toby Cubitt" . "toby-predictive@dr-qubit.org")) + (:keywords "extensions" "matching" "data structures trie" "ternary search tree" "tree" "completion" "regexp"))]) + (undo-tree . + [(0 7 5) + nil "Treat undo history as a tree" single + ((:keywords "convenience" "files" "undo" "redo" "history" "tree") + (:authors + ("Toby Cubitt" . "toby-undo-tree@dr-qubit.org")) + (:maintainer "Toby Cubitt" . "toby-undo-tree@dr-qubit.org") + (:url . "http://www.dr-qubit.org/emacs.php"))]) + (uni-confusables . + [(0 2) + nil "Unicode confusables table" tar + ((:maintainer "Teodor Zlatanov" . "tzz@lifelogs.com") + (:url . "http://elpa.gnu.org/packages/uni-confusables.html"))]) + (uniquify-files . + [(1 0 3) + ((emacs + (25 0))) + "Completion style for files, minimizing directories" tar + ((:maintainer "Stephen Leake" . "stephen_leake@stephe-leake.org") + (:authors + ("Stephen Leake" . "stephen_leake@stephe-leake.org")) + (:keywords "completion" "table" "uniquify") + (:url . "http://elpa.gnu.org/packages/uniquify-files.html"))]) + (url-http-ntlm . + [(2 0 4) + ((cl-lib + (0 5)) + (ntlm + (2 1 0))) + "NTLM authentication for the url library" single + ((:keywords "comm" "data" "processes" "hypermedia") + (:authors + ("Tom Schutzer-Weissmann" . "tom.weissmann@gmail.com")) + (:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org") + (:url . "https://code.google.com/p/url-http-ntlm/"))]) + (validate . + [(1 0 4) + ((emacs + (24 1)) + (cl-lib + (0 5)) + (seq + (2 16))) + "Schema validation for Emacs-lisp" single + ((:url . "http://elpa.gnu.org/packages/validate.html") + (:keywords "lisp") + (:authors + ("Artur Malabarba" . "emacs@endlessparentheses.com")) + (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com"))]) + (valign . + [(3 1 1) + ((emacs + (26 0))) + "Visually align tables" tar + ((:url . "https://github.com/casouri/valign") + (:maintainer "Yuan Fu" . "casouri@gmail.com") + (:authors + ("Yuan Fu" . "casouri@gmail.com")) + (:keywords "convenience" "text" "table"))]) + (vc-hgcmd . + [(1 14) + ((emacs + (25 1))) + "VC mercurial backend that uses hg command server" tar + ((:url . "https://github.com/muffinmad/emacs-vc-hgcmd") + (:maintainer "Andrii Kolomoiets" . "andreyk.mad@gmail.com") + (:authors + ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) + (:keywords "vc"))]) + (vcard . + [(0 2 1) + ((emacs + (27 1))) + "Package for handling vCard files" tar + ((:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net") + (:authors + ("Eric Abrahamsen" . "eric@ericabrahamsen.net")) + (:url . "https://elpa.gnu.org/packages/vcard.html"))]) + (vcl-mode . + [(1 1) + nil "Major mode for Varnish Configuration Language" single + ((:url . "http://elpa.gnu.org/packages/vcl-mode.html") + (:keywords "varnish" "vcl") + (:authors + ("Sergey Poznyakoff" . "gray@gnu.org.ua")) + (:maintainer "Sergey Poznyakoff" . "gray@gnu.org.ua"))]) + (vdiff . + [(0 2 4) + ((emacs + (24 4)) + (hydra + (0 13 0))) + "A diff tool similar to vimdiff" tar + ((:url . "https://github.com/justbur/emacs-vdiff") + (:maintainer "Justin Burkett" . "justin@burkett.cc") + (:authors + ("Justin Burkett" . "justin@burkett.cc")) + (:keywords "diff"))]) + (verilog-mode . + [(2021 4 12 188864585) + nil "major mode for editing verilog source in Emacs" tar + ((:url . "https://www.veripool.org") + (:maintainer "Michael McNamara" . "mac@verilog.com") + (:authors + ("Michael McNamara" . "mac@verilog.com") + ("Wilson Snyder" . "wsnyder@wsnyder.org")) + (:keywords "languages"))]) + (vertico . + [(0 11) + ((emacs + (27 1))) + "VERTical Interactive COmpletion" tar + ((:url . "https://github.com/minad/vertico") + (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") + (:authors + ("Daniel Mendler" . "mail@daniel-mendler.de")))]) + (vigenere . + [(1 0) + ((emacs + (25 1))) + "Run a vigenere cipher on a block of text ;" single + ((:keywords "data" "vigenere" "cipher") + (:authors + ("Ian Dunn" . "dunni@gnu.org")) + (:maintainer "Ian Dunn" . "dunni@gnu.org") + (:url . "https://elpa.gnu.org/packages/vigenere.html"))]) + (visual-filename-abbrev . + [(1 1) + ((emacs + (26 1))) + "Visually abbreviate filenames" tar + ((:maintainer "Tassilo Horn" . "tsdh@gnu.org") + (:authors + ("Tassilo Horn" . "tsdh@gnu.org")) + (:keywords "tools") + (:url . "https://elpa.gnu.org/packages/visual-filename-abbrev.html"))]) + (visual-fill . + [(0 1) + nil "Auto-refill paragraphs without modifying the buffer" single + ((:url . "http://elpa.gnu.org/packages/visual-fill.html") + (:authors + ("Stefan Monnier" . "monnier@iro.umontreal.ca")) + (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca"))]) + (vlf . + [(1 7 2) + nil "View Large Files" tar + ((:url . "https://github.com/m00natic/vlfi") + (:maintainer "Andrey Kotlarski" . "m00naticus@gmail.com") + (:keywords "large files" "utilities"))]) + (wcheck-mode . + [(2020 10 4) + nil "General interface for text checkers" single + ((:keywords "text" "spell" "check" "languages" "ispell") + (:authors + ("Teemu Likonen" . "tlikonen@iki.fi")) + (:maintainer "Teemu Likonen" . "tlikonen@iki.fi") + (:url . "https://github.com/tlikonen/wcheck-mode"))]) + (wconf . + [(0 2 1) + ((emacs + (24 4))) + "Minimal window layout manager" single + ((:keywords "windows" "frames" "layout") + (:authors + ("Ingo Lohmar" . "i.lohmar@gmail.com")) + (:maintainer "Ingo Lohmar" . "i.lohmar@gmail.com") + (:url . "https://github.com/ilohmar/wconf"))]) + (web-server . + [(0 1 2) + ((emacs + (24 3))) + "Emacs Web Server" tar + ((:url . "https://github.com/eschulte/emacs-web-server") + (:maintainer "Eric Schulte" . "schulte.eric@gmail.com") + (:authors + ("Eric Schulte" . "schulte.eric@gmail.com")) + (:keywords "http" "server" "network"))]) + (webfeeder . + [(1 1 2) + ((emacs + (25 1))) + "Build RSS and Atom webfeeds from HTML files" tar + ((:url . "https://gitlab.com/Ambrevar/emacs-webfeeder") + (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") + (:authors + ("Pierre Neidhardt" . "mail@ambrevar.xyz")) + (:keywords "news" "hypermedia" "blog" "feed" "rss" "atom"))]) + (websocket . + [(1 13 1) + ((cl-lib + (0 5))) + "Emacs WebSocket client and server" tar + ((:url . "https://github.com/ahyatt/emacs-websocket") + (:maintainer "Andrew Hyatt" . "ahyatt@gmail.com") + (:authors + ("Andrew Hyatt" . "ahyatt@gmail.com")) + (:keywords "communication" "websocket" "server"))]) + (which-key . + [(3 5 1) + ((emacs + (24 4))) + "Display available keybindings in popup" tar + ((:url . "https://github.com/justbur/emacs-which-key") + (:maintainer "Justin Burkett" . "justin@burkett.cc") + (:authors + ("Justin Burkett" . "justin@burkett.cc")))]) + (windower . + [(0 0 1) + ((emacs + (25))) + "Helper functions for window manipulation." single + ((:keywords "convenience" "tools") + (:authors + ("Pierre Neidhardt" . "mail@ambrevar.xyz")) + (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") + (:url . "https://gitlab.com/ambrevar/windower"))]) + (windresize . + [(0 1) + nil "Resize windows interactively" single + ((:url . "http://elpa.gnu.org/packages/windresize.html") + (:keywords "window") + (:authors + ("Bastien" . "bzg@gnu.org")) + (:maintainer "Bastien" . "bzg@gnu.org"))]) + (wisi . + [(3 1 3) + ((emacs + (25 0)) + (seq + (2 20))) + "Utilities for implementing an indentation/navigation engine using a generalized LALR parser" tar + ((:url . "http://stephe-leake.org/ada/wisitoken.html") + (:maintainer "Stephen Leake" . "stephen_leake@stephe-leake.org") + (:authors + ("Stephen Leake" . "stephen_leake@stephe-leake.org")) + (:keywords "parser" "indentation" "navigation"))]) + (wisitoken-grammar-mode . + [(1 2 0) + ((wisi + (3 1 1)) + (emacs + (25 0)) + (mmm-mode + (0 5 7))) + "Major mode for editing WisiToken grammar files" tar + ((:url . "http://www.nongnu.org/ada-mode/") + (:maintainer "Stephen Leake" . "stephen_leake@stephe-leake.org") + (:authors + ("Stephen Leake" . "stephen_leake@stephe-leake.org")) + (:keywords "languages"))]) + (wpuzzle . + [(1 1) + nil "find as many word in a given time" single + ((:url . "http://elpa.gnu.org/packages/wpuzzle.html") + (:authors + ("Ivan Kanis" . "ivan@kanis.fr")) + (:maintainer "Ivan Kanis" . "ivan@kanis.fr"))]) + (xclip . + [(1 10) + nil "Copy&paste GUI clipboard from text terminal" single + ((:url . "http://elpa.gnu.org/packages/xclip.html") + (:keywords "convenience" "tools") + (:authors + ("Leo Liu" . "sdl.web@gmail.com")) + (:maintainer "Leo Liu" . "sdl.web@gmail.com"))]) + (xelb . + [(0 18) + ((emacs + (24 4)) + (cl-generic + (0 2))) + "X protocol Emacs Lisp Binding" tar + ((:url . "https://github.com/ch11ng/xelb") + (:maintainer "Chris Feng" . "chris.w.feng@gmail.com") + (:authors + ("Chris Feng" . "chris.w.feng@gmail.com")) + (:keywords "unix"))]) + (xpm . + [(1 0 4) + nil "edit XPM images" tar + ((:url . "http://www.gnuvola.org/software/xpm/") + (:maintainer "Thien-Thi Nguyen" . "ttn@gnu.org") + (:authors + ("Thien-Thi Nguyen" . "ttn@gnu.org")) + (:keywords "multimedia" "xpm"))]) + (xr . + [(1 21) + ((emacs + (26 1))) + "Convert string regexp to rx notation" tar + ((:url . "https://github.com/mattiase/xr") + (:maintainer "Mattias Engdegård" . "mattiase@acm.org") + (:authors + ("Mattias Engdegård" . "mattiase@acm.org")) + (:keywords "lisp" "regexps"))]) + (xref . + [(1 1 0) + ((emacs + (26 1))) + "Cross-referencing commands" tar + ((:url . "https://elpa.gnu.org/packages/xref.html"))]) + (yasnippet . + [(0 14 0) + ((cl-lib + (0 5))) + "Yet another snippet extension for Emacs" tar + ((:url . "http://github.com/joaotavora/yasnippet") + (:maintainer "Noam Postavsky" . "npostavs@gmail.com") + (:keywords "convenience" "emulation"))]) + (yasnippet-classic-snippets . + [(1 0 2) + ((yasnippet + (0 9 1))) + "\"Classic\" yasnippet snippets" tar + ((:maintainer "Noam Postavsky" . "npostavs@gmail.com") + (:keywords "snippets") + (:url . "http://elpa.gnu.org/packages/yasnippet-classic-snippets.html"))]) + (zones . + [(2019 7 13) + nil "Zones of text - like multiple regions" single + ((:keywords "narrow" "restriction" "widen" "region" "zone") + (:authors + ("Drew Adams")) + (:maintainer "Drew Adams" . "drew.adams@oracle.com") + (:url . "https://elpa.gnu.org/packages/zones.html"))]) + (ztree . + [(1 0 6) + ((cl-lib + (0))) + "Text mode directory tree" tar + ((:url . "https://github.com/fourier/ztree") + (:maintainer "Alexey Veretennikov" . "alexey.veretennikov@gmail.com") + (:authors + ("Alexey Veretennikov" . "alexey.veretennikov@gmail.com")) + (:keywords "files" "tools"))])) diff --git a/.emacs.d/elpa/archives/gnu/archive-contents.signed b/.emacs.d/elpa/archives/gnu/archive-contents.signed new file mode 100644 index 0000000..84c0564 --- /dev/null +++ b/.emacs.d/elpa/archives/gnu/archive-contents.signed @@ -0,0 +1 @@ +Good signature from 066DAFCB81E42C40 GNU ELPA Signing Agent (2019) <elpasign@elpa.gnu.org> (trust undefined) created at 2021-06-12T11:05:02+0200 using RSA \ No newline at end of file diff --git a/.emacs.d/elpa/archives/melpa/archive-contents b/.emacs.d/elpa/archives/melpa/archive-contents new file mode 100644 index 0000000..f624a19 --- /dev/null +++ b/.emacs.d/elpa/archives/melpa/archive-contents @@ -0,0 +1,4960 @@ +(1 + (0blayout . [(20190703 527) nil "Layout grouping with ease" single ((:commit . "fd9a8f353dbd45b4628b5f84b8d8c2525ebf571d") (:authors ("Elis \"etu\" Axelsson")) (:maintainer "Elis \"etu\" Axelsson") (:keywords "convenience" "window-management") (:url . "https://github.com/etu/0blayout"))]) + (0x0 . [(20210512 1001) ((emacs (24 1))) "Upload to 0x0.st" single ((:commit . "655846fd3ce772950d30167b4b9be6ce64502ae7") (:authors ("Philip K." . "philipk@posteo.net")) (:maintainer "Philip K." . "philipk@posteo.net") (:keywords "comm") (:url . "https://git.sr.ht/~zge/nullpointer-emacs"))]) + (0xc . [(20201025 2105) ((emacs (24 4)) (s (1 11 0))) "Base conversion made easy" tar ((:commit . "eec4fb10b9288c0852f751cfb05d638664fa2411") (:authors ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainer "Adam Niederer" . "adam.niederer@gmail.com") (:keywords "base" "conversion") (:url . "http://github.com/AdamNiederer/0xc"))]) + (2048-game . [(20200417 259) nil "play 2048 in Emacs" single ((:commit . "aad4a590ea91f9a3256233b9b345e9159c6993f2") (:authors ("Zachary Kanfer" . "zkanfer@gmail.com")) (:maintainer "Zachary Kanfer" . "zkanfer@gmail.com") (:url . "https://hg.sr.ht/~zck/game-2048"))]) + (2bit . [(20200926 1418) ((emacs (24 3))) "Library for reading data from 2bit files" single ((:commit . "69b4ec1d6d2ad95c9e59dacb43224abbec7a8989") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "files" "data") (:url . "https://github.com/davep/2bit.el"))]) + (4clojure . [(20210102 459) ((request (0 2 0))) "Open and evaluate 4clojure.com questions." single ((:commit . "6f494d3905284ccdd57aae3d8ac16fc7ab431596") (:authors ("Joshua Hoff")) (:maintainer "Sasha Kovar" . "sasha-git@arcocene.org") (:keywords "languages" "data") (:url . "https://github.com/abend/4clojure.el"))]) + (@ . [(20181225 1438) ((emacs (24 3))) "multiple-inheritance prototype-based objects DSL" tar ((:commit . "0a6189f8be42dbbc5d9358cbd447d471236135a2") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/at-el"))]) + (a . [(20201203 1927) ((emacs (25))) "Associative data structure functions" single ((:commit . "3d341eb7813ee02b00ab28e11c915295bfd4b5a7") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net") (:keywords "lisp") (:url . "https://github.com/plexus/a.el"))]) + (aa-edit-mode . [(20170119 320) ((emacs (24 3)) (navi2ch (2 0 0))) "Major mode for editing AA(S_JIS Art) and .mlt file" single ((:commit . "1dd801225b7ad3c23ad09698f5e77f0df7012a65") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "wp" "text" "shiftjis" "mlt" "yaruo"))]) + (aas . [(20210605 1143) ((emacs (26 3))) "Snippet expansions mid-typing" single ((:commit . "118ed7fc948b6d91eea727df35a1639521bf5fdb") (:authors ("Yoav Marco" . "yoavm448@gmail.com")) (:maintainer "Yoav Marco" . "yoavm448@gmail.com") (:keywords "abbrev" "tools") (:url . "https://github.com/ymarco/auto-activating-snippets"))]) + (abc-mode . [(20210508 1552) nil "Major mode for editing abc music files" single ((:commit . "80fa954787b57d14e21e19bd65e52abab1686f4a") (:authors ("Matthew K. Junker" . "junker@alum.mit.edu")) (:maintainer "Matthew K. Junker" . "junker@alum.mit.edu") (:keywords "local" "docs"))]) + (abgaben . [(20171119 646) ((pdf-tools (0 80)) (f (0 19 0)) (s (1 11 0))) "review and correct assignments received by mail" single ((:commit . "20d14830f07d66e2a04bcad1498a4a6fbf4b4451") (:authors ("Arne Köhn" . "arne@chark.eu")) (:maintainer "Arne Köhn" . "arne@chark.eu") (:keywords "mail" "outlines" "convenience") (:url . "http://arne.chark.eu/"))]) + (abl-mode . [(20210122 1508) nil "Python TDD minor mode" single ((:commit . "fdd83e732b2c870f4ddc0f62b5b261e03bfb212a") (:authors ("Ulas Tuerkmen <ulas.tuerkmen at gmail dot com>")) (:maintainer "Ulas Tuerkmen <ulas.tuerkmen at gmail dot com>") (:url . "http://github.com/afroisalreadyinu/abl-mode"))]) + (abridge-diff . [(20210519 322) ((emacs (26 1))) "Abridge long line-based diff hunks, including in magit" single ((:commit . "fb1fe91ab8ec75dcd52130c38f13759f19d20fe9") (:authors ("J.D. Smith <jdtsmith AT gmail>")) (:maintainer "J.D. Smith <jdtsmith AT gmail>") (:keywords "magit" "diffs" "tools") (:url . "https://github.com/jdtsmith/abridge-diff"))]) + (abs-mode . [(20210411 1013) ((emacs (25 3)) (erlang (0)) (maude-mode (0)) (flymake (0 3))) "Major mode for the modeling language Abs" single ((:commit . "3b332ec1e941874f220897e5c0e0a6df762ca28d") (:authors ("Rudi Schlatte" . "rudi@constantly.at")) (:maintainer "Rudi Schlatte" . "rudi@constantly.at") (:keywords "languages") (:url . "https://github.com/abstools/abs-mode"))]) + (abyss-theme . [(20170808 1345) ((emacs (24))) "A dark theme with contrasting colours." single ((:commit . "18791c6e8d9cc2b4815c9f08627a2e94fc0eeb14") (:authors ("Matt Russell" . "matt@mgrbyte.co.uk")) (:maintainer "Matt Russell" . "matt@mgrbyte.co.uk") (:keywords "theme" "dark" "contrasting colours") (:url . "https://github.com/mgrbyte/emacs-abyss-theme"))]) + (ac-alchemist . [(20150908 656) ((auto-complete (1 5 0)) (alchemist (1 5 0)) (cl-lib (0 5))) "auto-complete source for alchemist" single ((:commit . "b1891c3d41aed83f61d78a609ea97be5cc2758d9") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-ac-alchemist"))]) + (ac-c-headers . [(20200816 1007) ((auto-complete (1 3 1))) "auto-complete source for C headers" single ((:commit . "67e1e86a48c9bed57bc7ce5ce2553ad203f5752e") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://zk-phi.gitub.io/"))]) + (ac-capf . [(20151101 217) ((auto-complete (1 4)) (cl-lib (0 5))) "auto-complete source with completion-at-point" single ((:commit . "17571dba0a8f98111f2ab758e9bea285b263781b") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-ac-capf"))]) + (ac-cider . [(20161006 719) ((cider (0 8 0)) (auto-complete (1 4)) (cl-lib (0 3))) "Clojure auto-complete sources using CIDER" single ((:commit . "fa13e067dd9c8c76151c7d140a2803da1d109b84") (:authors ("Alex Yakushev" . "alex@bytopia.org") ("Steve Purcell" . "steve@sanityinc.com") ("Sam Aaron" . "samaaron@gmail.com")) (:maintainer "Alex Yakushev" . "alex@bytopia.org") (:keywords "languages" "clojure" "nrepl" "cider" "compliment") (:url . "https://github.com/clojure-emacs/ac-cider"))]) + (ac-clang . [(20180710 546) ((emacs (24)) (cl-lib (0 5)) (auto-complete (1 4 0)) (pos-tip (0 4 6)) (yasnippet (0 8 0))) "Auto Completion source by libclang for GNU Emacs" tar ((:commit . "3294b968eb1a8317049190940193f9da47c085ef") (:authors ("yaruopooner [https://github.com/yaruopooner]")) (:maintainer "yaruopooner [https://github.com/yaruopooner]") (:keywords "completion" "convenience" "intellisense") (:url . "https://github.com/yaruopooner/ac-clang"))]) + (ac-dcd . [(20210428 1556) ((auto-complete (1 3 1)) (flycheck-dmd-dub (0 7))) "Auto Completion source for dcd for GNU Emacs" single ((:commit . "56d9817159acdebdbb3d5499c7e9379d29af0cd4") (:authors (nil . "<atila.neves@gmail.com>")) (:maintainer nil . "<atila.neves@gmail.com>") (:keywords "languages") (:url . "http://github.com/atilaneves/ac-dcd"))]) + (ac-emacs-eclim . [(20180911 1121) ((eclim (0 3)) (auto-complete (1 5))) "auto-complete source for eclim" single ((:commit . "222ddd48fcf0ee01592dec77c58e0cf3f2ea1100"))]) + (ac-emmet . [(20131015 1558) ((emmet-mode (1 0 2)) (auto-complete (1 4))) "auto-complete sources for emmet-mode's snippets" single ((:commit . "88f24876ee3b759978d4614a758280b5d512d543") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com") (:keywords "completion" "convenience" "emmet") (:url . "https://github.com/yasuyk/ac-emmet"))]) + (ac-emoji . [(20150823 711) ((auto-complete (1 5 0)) (cl-lib (0 5))) "auto-complete source of Emoji" tar ((:commit . "40a639764eb654f1b4bb705c817b66032a26ff2b") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-ac-emoji"))]) + (ac-etags . [(20161001 1507) ((auto-complete (1 4))) "etags/ctags completion source for auto-complete" single ((:commit . "7983e631c226fe0fa53af3b2d56bf4eca3d785ce") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-ac-etags"))]) + (ac-geiser . [(20200318 824) ((geiser (0 5)) (auto-complete (1 4))) "Auto-complete backend for geiser" tar ((:commit . "93818c936ee7e2f1ba1b315578bde363a7d43d05"))]) + (ac-haskell-process . [(20150423 1402) ((auto-complete (1 4)) (haskell-mode (13))) "Haskell auto-complete source which uses the current haskell process" single ((:commit . "0362d4323511107ec70e7165cb612f3ab01b712f") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "languages"))]) + (ac-helm . [(20160319 233) ((helm (1 6 3)) (auto-complete (1 4 0)) (popup (0 5 0)) (cl-lib (0 5))) "Helm interface for auto-complete" single ((:commit . "baf2b1e04bcffa835084389c0fab415f26efbf32") (:authors ("rubikitch" . "rubikitch@ruby-lang.org") ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com") (:keywords "completion" "convenience" "helm"))]) + (ac-html . [(20151005 731) ((auto-complete (1 4)) (s (1 9)) (f (0 17)) (dash (2 10))) "auto complete source for html tags and attributes" tar ((:commit . "668154cba123c321d1b07c2dc8b26d14092253b8") (:authors ("Zhang Kai Yu" . "yeannylam@gmail.com")) (:maintainer "Zhang Kai Yu" . "yeannylam@gmail.com") (:keywords "html" "auto-complete" "slim" "haml" "jade") (:url . "https://github.com/cheunghy/ac-html"))]) + (ac-html-angular . [(20151225 719) ((web-completion-data (0 1))) "auto complete angular15 data for `ac-html' and `company-web'" tar ((:commit . "6bafe09afe03112ca4183d58461c1a6f6c2b3c67") (:authors ("Olexandr Sydorchuk" . "olexandr.syd@gmail.com")) (:maintainer "Olexandr Sydorchuk" . "olexandr.syd@gmail.com") (:keywords "html" "auto-complete" "angular") (:url . "https://github.com/osv/ac-html-bootstrap"))]) + (ac-html-bootstrap . [(20160302 1701) ((web-completion-data (0 1))) "auto complete bootstrap3/fontawesome classes for `ac-html' and `company-web'" tar ((:commit . "481e6e441cd566554ce71cd8cb28c9e7ebb1c24b") (:authors ("Olexandr Sydorchuk" . "olexandr.syd@gmail.com")) (:maintainer "Olexandr Sydorchuk" . "olexandr.syd@gmail.com") (:keywords "html" "auto-complete" "bootstrap" "cssx") (:url . "https://github.com/osv/ac-html-bootstrap"))]) + (ac-html-csswatcher . [(20151208 2113) ((web-completion-data (0 1))) "css/less class/id completion with `ac-html' or `company-web'" single ((:commit . "b0f3e7e1a3fe49e88b6eb6432377232fc715f221") (:authors ("Olexandr Sydorchuck " . "olexandr.syd@gmail.com")) (:maintainer "Olexandr Sydorchuck " . "olexandr.syd@gmail.com") (:keywords "html" "css" "less" "auto-complete") (:url . "https://github.com/osv/ac-html-csswatcher"))]) + (ac-inf-ruby . [(20131115 1150) ((inf-ruby (2 3 2)) (auto-complete (1 4))) "Enable auto-complete in inf-ruby sessions" single ((:commit . "ee53fc9c61950da9a96df3ff5ef186f9a9faf151") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "languages" "tools"))]) + (ac-ispell . [(20151101 226) ((auto-complete (1 4)) (cl-lib (0 5))) "ispell completion source for auto-complete" single ((:commit . "22bace7387e9012002a6a444922f75f9913077b0") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-ac-ispell"))]) + (ac-js2 . [(20190101 933) ((js2-mode (20090723)) (skewer-mode (1 4))) "Auto-complete source for Js2-mode, with navigation" tar ((:commit . "2b56d09a16c1a0ce514cc1b85d64cb1be4502723") (:authors ("Scott Barnett" . "scott.n.barnett@gmail.com")) (:maintainer "Scott Barnett" . "scott.n.barnett@gmail.com") (:url . "https://github.com/ScottyB/ac-js2"))]) + (ac-math . [(20141116 2127) ((auto-complete (1 4)) (math-symbol-lists (1 0))) "Auto-complete sources for input of mathematical symbols and latex tags" single ((:commit . "c012a8f620a48cb18db7d78995035d65eae28f11") (:authors ("Vitalie Spinu")) (:maintainer "Vitalie Spinu") (:keywords "latex" "auto-complete" "unicode" "symbols") (:url . "https://github.com/vitoshka/ac-math"))]) + (ac-mozc . [(20150227 1619) ((cl-lib (0 5)) (auto-complete (1 4)) (mozc (0))) "auto-complete sources for Japanese input using Mozc" single ((:commit . "4c6c8be4701010d9362184437c0f783e0335c631") (:authors ("igjit" . "igjit1@gmail.com")) (:maintainer "igjit" . "igjit1@gmail.com") (:url . "https://github.com/igjit/ac-mozc"))]) + (ac-octave . [(20180406 334) ((auto-complete (1 4 0))) "An auto-complete source for Octave" single ((:commit . "fe0f931f2024f43de3c4fff4b1ace672413adeae") (:authors ("coldnew" . "coldnew.tw@gmail.com")) (:maintainer "coldnew" . "coldnew.tw@gmail.com") (:keywords "octave" "auto-complete" "completion") (:url . "https://github.com/coldnew/ac-octave"))]) + (ac-php . [(20200916 751) ((ac-php-core (2 0)) (auto-complete (1 4 0)) (yasnippet (0 8 0))) "Auto Completion source for PHP." single ((:commit . "9770c95bf2df93d9cb0f200723b03b3d9a480640") (:authors ("jim" . "xcwenn@qq.com")) (:maintainer "jim") (:keywords "completion" "convenience" "intellisense") (:url . "https://github.com/xcwen/ac-php"))]) + (ac-php-core . [(20210218 559) ((dash (1)) (php-mode (1)) (s (1)) (f (0 17 0)) (popup (0 5 0)) (xcscope (1 0))) "The core library of the ac-php." tar ((:commit . "9770c95bf2df93d9cb0f200723b03b3d9a480640") (:authors ("jim" . "xcwenn@qq.com") ("Serghei Iakovlev" . "sadhooklay@gmail.com")) (:maintainer "jim") (:keywords "completion" "convenience" "intellisense") (:url . "https://github.com/xcwen/ac-php"))]) + (ac-racer . [(20170114 809) ((emacs (24 3)) (auto-complete (1 5 0)) (racer (0 0 2))) "auto-complete source of racer" single ((:commit . "4408c2d652dec0432e20c05e001db8222d778c6b") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-ac-racer"))]) + (ac-rtags . [(20191222 920) ((auto-complete (1 4 0)) (rtags (2 10))) "auto-complete back-end for RTags" single ((:commit . "63f18acb21e664fd92fbc19465f0b5df085b5e93") (:authors ("Jan Erik Hanssen" . "jhanssen@gmail.com") ("Anders Bakken" . "agbakken@gmail.com")) (:maintainer "Jan Erik Hanssen" . "jhanssen@gmail.com") (:url . "https://github.com/Andersbakken/rtags"))]) + (ac-skk . [(20141230 119) ((auto-complete (1 3 1)) (ddskk (16 0 50)) (tinysegmenter (0)) (cl-lib (0 5))) "auto-complete-mode source for DDSKK a.k.a Japanese input method" single ((:commit . "d25a265930430d080329789fb253d786c01dfa24") (:authors ("lugecy <https://twitter.com/lugecy>")) (:maintainer "myuhe") (:keywords "convenience" "auto-complete") (:url . "https://github.com/myuhe/ac-skk.el"))]) + (ac-slime . [(20171027 2100) ((auto-complete (1 4)) (slime (2 9)) (cl-lib (0 5))) "An auto-complete source using slime completions" single ((:commit . "6c80cb602ddad46486288f94ad7546396c6e4b1a") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/ac-slime"))]) + (ac-sly . [(20170728 1027) ((sly (1 0 0 -3)) (auto-complete (1 4)) (cl-lib (0 5))) "An auto-complete source using sly completions" single ((:commit . "bf69c687c4ecf1994349d20c182e9b567399912e") (:authors ("Damian T. Dobroczy\\'nski" . "qoocku@gmail.com")) (:maintainer "Damian T. Dobroczy\\'nski" . "qoocku@gmail.com") (:url . "https://github.com/qoocku/ac-sly"))]) + (academic-phrases . [(20180723 1021) ((dash (2 12 0)) (s (1 12 0)) (ht (2 0)) (emacs (24))) "Bypass that mental block when writing your papers." single ((:commit . "25d9cf67feac6359cb213f061735e2679c84187f") (:authors ("Nasser Alshammari" . "designernasser@gmail.com")) (:maintainer "Nasser Alshammari" . "designernasser@gmail.com") (:keywords "academic" "convenience" "papers" "writing" "wp") (:url . "https://github.com/nashamri/academic-phrases"))]) + (ace-flyspell . [(20170309 509) ((avy (0 4 0))) "Jump to and correct spelling errors using `ace-jump-mode' and flyspell" single ((:commit . "538d4f8508d305262ba0228dfe7c819fb65b53c9") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions") (:url . "https://github.com/cute-jumper/ace-flyspell"))]) + (ace-isearch . [(20200912 754) ((emacs (24))) "A seamless bridge between isearch, ace-jump-mode, avy, helm-swoop and swiper" single ((:commit . "422aaa50b6452c2399682782cbf23168ed4357c6") (:authors ("Akira Tamamori")) (:maintainer "Akira Tamamori") (:url . "https://github.com/tam17aki/ace-isearch"))]) + (ace-jump-buffer . [(20171031 1550) ((avy (0 4 0)) (dash (2 4 0))) "fast buffer switching extension to `avy'" single ((:commit . "0d335064230caf3efdd5a732e8fbd67e3948ed6a") (:authors ("Justin Talbott" . "justin@waymondo.com")) (:maintainer "Justin Talbott" . "justin@waymondo.com") (:url . "https://github.com/waymondo/ace-jump-buffer"))]) + (ace-jump-helm-line . [(20160918 1836) ((avy (0 4 0)) (helm (1 6 3))) "Ace-jump to a candidate in helm window" single ((:commit . "1483055255df3f8ae349f7520f05b1e43ea3ed37") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions") (:url . "https://github.com/cute-jumper/ace-jump-helm-line"))]) + (ace-jump-mode . [(20140616 815) nil "a quick cursor location minor mode for emacs" single ((:commit . "8351e2df4fbbeb2a4003f2fb39f46d33803f3dac") (:authors ("winterTTr" . "winterTTr@gmail.com")) (:maintainer "winterTTr" . "winterTTr@gmail.com") (:keywords "motion" "location" "cursor") (:url . "https://github.com/winterTTr/ace-jump-mode/"))]) + (ace-jump-zap . [(20170717 1849) ((ace-jump-mode (1 0)) (dash (2 10 0))) "Character zapping, `ace-jump-mode` style" single ((:commit . "52b5d4c6c73bd0fc833a0dcb4e803a5287d8cae8") (:authors ("justin talbott" . "justin@waymondo.com")) (:maintainer "justin talbott" . "justin@waymondo.com") (:keywords "convenience" "tools" "extensions") (:url . "https://github.com/waymondo/ace-jump-zap"))]) + (ace-link . [(20210121 923) ((avy (0 4 0))) "Quickly follow links" single ((:commit . "e1b1c91b280d85fce2194fea861a9ae29e8b03dd") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "convenience" "links" "avy") (:url . "https://github.com/abo-abo/ace-link"))]) + (ace-mc . [(20190206 749) ((ace-jump-mode (1 0)) (multiple-cursors (1 0)) (dash (2 10 0))) "Add multiple cursors quickly using ace jump" single ((:commit . "6877880efd99e177e4e9116a364576def3da391b") (:authors ("Josh Moller-Mara" . "jmm@cns.nyu.edu")) (:maintainer "Josh Moller-Mara" . "jmm@cns.nyu.edu") (:keywords "motion" "location" "cursor") (:url . "https://github.com/mm--/ace-mc"))]) + (ace-pinyin . [(20190917 318) ((avy (0 2 0)) (pinyinlib (0 1 0))) "Jump to Chinese characters using avy or ace-jump-mode" single ((:commit . "8b2e9335b02486730ea4ceee790130cc5328f9ea") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions") (:url . "https://github.com/cute-jumper/ace-pinyin"))]) + (ace-popup-menu . [(20210608 839) ((emacs (24 3)) (avy-menu (0 1))) "Replace GUI popup menu with something more efficient" single ((:commit . "594a305704be8ca0ef79a12b787bdb59bc6077c0") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:keywords "convenience" "popup" "menu") (:url . "https://github.com/mrkkrp/ace-popup-menu"))]) + (ace-window . [(20200606 1259) ((avy (0 5 0))) "Quickly switch windows." single ((:commit . "c7cb315c14e36fded5ac4096e158497ae974bec9") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "window" "location") (:url . "https://github.com/abo-abo/ace-window"))]) + (achievements . [(20150531 1317) ((keyfreq (0 0 3))) "Achievements for emacs usage." tar ((:commit . "c8275ee492d56255999d58f2988129ab29145182") (:authors ("Ivan Andrus" . "darthandrus@gmail.com")) (:maintainer "Ivan Andrus" . "darthandrus@gmail.com") (:keywords "games"))]) + (ack-menu . [(20150504 2022) ((mag-menu (0 1 0))) "A menu-based front-end for ack" single ((:commit . "f77be93a4697926ecf3195a355eb69580f695f4d") (:authors ("Steven Thomas") ("Nikolaj Schumacher")) (:maintainer "Steven Thomas") (:keywords "tools" "matching" "convenience") (:url . "https://github.com/chumpage/ack-menu"))]) + (acme-theme . [(20210430 302) nil "A color theme based on Acme & Sam from Plan 9" single ((:commit . "7c408d111c5e451ecb8fdd5f76cf7d8074aec793") (:authors ("Ian Y.E. Pan")) (:maintainer "Ian Y.E. Pan") (:url . "https://github.com/ianpan870102/acme-emacs-theme"))]) + (actionscript-mode . [(20180527 1701) nil "A simple mode for editing Actionscript 3 files" single ((:commit . "75639cc7fe85392b5671a1e94dcedb409a949cae") (:authors ("Austin Haas")) (:maintainer "Austin Haas") (:keywords "language" "modes"))]) + (activity-watch-mode . [(20200416 637) ((emacs (25)) (request (0)) (json (0)) (cl-lib (0))) "Automatic time tracking extension." single ((:commit . "9d591c5ec9a2b2c7b55a754dd37c7434b2ef9fdc") (:authors ("Gabor Torok <gabor@20y.hu>, Alan Hamlett" . "alan@wakatime.com")) (:maintainer "Paul d'Hubert" . "paul.dhubert@ya.ru") (:keywords "calendar" "comm") (:url . "https://github.com/pauldub/activity-watch-mode"))]) + (adafruit-wisdom . [(20200217 306) ((emacs (25 1)) (request (0 3 1))) "Get/display adafruit.com quotes" single ((:commit . "a9314331ba6ea846be9e1f7bded1e2e0ab70cd8e") (:authors ("Neil Okamoto" . "neil.okamoto+melpa@gmail.com")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com") (:keywords "games") (:url . "https://github.com/gonewest818/adafruit-wisdom.el"))]) + (add-hooks . [(20171217 123) nil "Functions for setting multiple hooks" single ((:commit . "1845137703461fc44bd77cf24014ba58f19c369d") (:authors ("Nick McCurdy" . "nick@nickmccurdy.com")) (:maintainer "Nick McCurdy" . "nick@nickmccurdy.com") (:keywords "lisp") (:url . "https://github.com/nickmccurdy/add-hooks"))]) + (add-node-modules-path . [(20210305 312) nil "Add node_modules to your exec-path" single ((:commit . "7d9be65b3be062842b7ead862dec15d6f25db4a2") (:authors ("Neri Marschik" . "marschik_neri@cyberagent.co.jp")) (:maintainer "Neri Marschik" . "marschik_neri@cyberagent.co.jp") (:keywords "javascript" "node" "node_modules" "eslint") (:url . "https://github.com/codesuki/add-node-modules-path"))]) + (addressbook-bookmark . [(20190612 1638) ((emacs (24))) "An address book based on Standard Emacs bookmarks." single ((:commit . "d8e502fc2f3d3ab1508ce9e50ebf8a9addc6e5b3") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://github.com/thierryvolpiatto/addressbook-bookmark"))]) + (ado-mode . [(20210510 1902) ((emacs (25 1))) "Major mode for editing Stata-related files" tar ((:commit . "4832a51c2e94e969a99817ccdd13d656344d0afc") (:authors ("Bill Rising" . "brising@alum.mit.edu")) (:maintainer "Bill Rising" . "brising@alum.mit.edu") (:keywords "tools" "languages" "files" "convenience" "stata" "mata" "ado") (:url . "https://github.com/louabill/ado-mode"))]) + (adoc-mode . [(20160314 2130) ((markup-faces (1 0 0))) "a major-mode for editing AsciiDoc files in Emacs" single ((:commit . "745884359a1b8826ede2c4cfd2f0b5478953ac40") (:authors ("Florian Kaufmann" . "sensorflo@gmail.com")) (:maintainer "Florian Kaufmann" . "sensorflo@gmail.com") (:keywords "wp" "asciidoc") (:url . "https://github.com/sensorflo/adoc-mode/wiki"))]) + (aes . [(20171029 623) nil "Implementation of AES" single ((:commit . "b7d5da89c3443292e4f0b1c9d254d459933cf5af") (:authors ("Markus Sauermann" . "emacs-aes@sauermann-consulting.de")) (:maintainer "Markus Sauermann" . "emacs-aes@sauermann-consulting.de") (:keywords "data" "tools") (:url . "https://github.com/Sauermann/emacs-aes"))]) + (affe . [(20210603 1139) ((emacs (27 1)) (consult (0 7))) "Asynchronous Fuzzy Finder for Emacs" tar ((:commit . "dee51350e1d7d3cfbfb12069dea9246454a3df31") (:authors ("Daniel Mendler")) (:maintainer "Daniel Mendler") (:url . "https://github.com/minad/affe"))]) + (afternoon-theme . [(20140104 1859) ((emacs (24 1))) "Dark color theme with a deep blue background" single ((:commit . "89b1d778a1f8b385775c122f2bd1c62f0fbf931a") (:authors ("Ozan Sener" . "ozan@ozansener.com")) (:maintainer "Ozan Sener" . "ozan@ozansener.com") (:keywords "themes") (:url . "http://github.com/osener/emacs-afternoon-theme"))]) + (ag . [(20201031 2202) ((dash (2 8 0)) (s (1 9 0)) (cl-lib (0 5))) "A front-end for ag ('the silver searcher'), the C ack replacement." single ((:commit . "ed7e32064f92f1315cecbfc43f120bbc7508672c") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:url . "https://github.com/Wilfred/ag.el"))]) + (agda2-mode . [(20210505 1142) ((emacs (24 3)) (annotation (1 0)) (eri (1 0))) "interactive development for Agda, a dependently typed functional programming language" tar ((:commit . "044843c5281a7bdb9479317793a75c8c0fcfadd9"))]) + (aggressive-fill-paragraph . [(20180910 816) ((dash (2 10 0))) "A mode to automatically keep paragraphs filled" single ((:commit . "4a620e62b5e645a48b0a818bf4eb19daea4977df") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com") (:keywords "fill-paragraph" "automatic" "comments") (:url . "https://github.com/davidshepherd7/aggressive-fill-paragraph-mode"))]) + (aggressive-indent . [(20200824 2352) ((emacs (24 3))) "Minor mode to aggressively keep your code always indented" single ((:commit . "b0ec0047aaae071ad1647159613166a253410a63") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") (:keywords "indent" "lisp" "maint" "tools") (:url . "https://github.com/Malabarba/aggressive-indent-mode"))]) + (agtags . [(20200730 116) ((emacs (25))) "A frontend to GNU Global" tar ((:commit . "d80c6f61dee74040c07b7010d48cab1df13a3abf") (:authors ("Vietor Liu" . "vietor.liu@gmail.com")) (:maintainer "Vietor Liu" . "vietor.liu@gmail.com") (:keywords "tools" "convenience") (:url . "https://github.com/vietor/agtags"))]) + (ah . [(20201213 218) ((emacs (25 1))) "Additional hooks" single ((:commit . "869219e7853510aeb00af3580aede0e5d49b324a") (:authors ("Takaaki ISHIKAWA <takaxp at ieee dot org>")) (:maintainer "Takaaki ISHIKAWA <takaxp at ieee dot org>") (:keywords "convenience") (:url . "https://github.com/takaxp/ah"))]) + (ahg . [(20210412 847) nil "Alberto's Emacs interface for Mercurial (Hg)" single ((:commit . "77bc2a628df006dcd2dc359ac12acdf8091a1356") (:authors ("Alberto Griggio" . "agriggio@users.sourceforge.net")) (:maintainer "Alberto Griggio" . "agriggio@users.sourceforge.net") (:url . "https://bitbucket.org/agriggio/ahg"))]) + (ahk-mode . [(20200412 1832) ((emacs (24 3))) "Major mode for editing AHK (AutoHotkey and AutoHotkey_L)" single ((:commit . "729007b5f22a49f5187ff47fca18c0d674e73047") (:authors ("Rich Alesi")) (:maintainer "Rich Alesi") (:keywords "ahk" "autohotkey" "hotkey" "keyboard shortcut" "automation") (:url . "https://github.com/ralesi/ahk-mode"))]) + (ahungry-theme . [(20180131 328) ((emacs (24))) "Ahungry color theme for Emacs. Make sure to (load-theme 'ahungry)." single ((:commit . "a038d91ec593d1f1b19ca66a0576d59bbc24c523") (:authors ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com") (:keywords "ahungry" "palette" "color" "theme" "emacs" "color-theme" "deftheme") (:url . "https://github.com/ahungry/color-theme-ahungry"))]) + (aio . [(20200610 1904) ((emacs (26 1))) "async/await for Emacs Lisp" tar ((:commit . "da93523e235529fa97d6f251319d9e1d6fc24a41") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/emacs-aio"))]) + (airline-themes . [(20200511 1543) ((powerline (2 3))) "vim-airline themes for emacs powerline" tar ((:commit . "a6a3bd55baee29bd372869c835aded0f7d5e5f76") (:authors ("Anthony DiGirolamo" . "anthony.digirolamo@gmail.com")) (:maintainer "Anthony DiGirolamo" . "anthony.digirolamo@gmail.com") (:keywords "evil" "mode-line" "powerline" "airline" "themes") (:url . "http://github.com/AnthonyDiGirolamo/airline-themes"))]) + (airplay . [(20130212 1226) ((request (20130110 2144)) (simple-httpd (1 4 1)) (deferred (0 3 1))) "Airplay bindings to Emacs" tar ((:commit . "bd690aafcae3a887946e1bba8327597932d964ad") (:authors ("Wataru MIYAGUNI" . "gonngo@gmail.com")) (:maintainer "Wataru MIYAGUNI" . "gonngo@gmail.com") (:keywords "appletv" "airplay") (:url . "https://github.com/gongo/airplay-el"))]) + (alan-mode . [(20200723 1405) ((flycheck (32)) (emacs (25 1)) (s (1 12))) "Major mode for editing Alan files" single ((:commit . "fc1fc0312b3e7f868f95b917a66719afb96f0c9a") (:authors ("Paul van Dam" . "pvandam@kjerner.com")) (:maintainer "Paul van Dam" . "pvandam@kjerner.com") (:keywords "alan" "languages") (:url . "https://github.com/Kjerner/AlanForEmacs"))]) + (alarm-clock . [(20191204 716) ((emacs (24 4)) (f (0 17 0))) "Alarm Clock" tar ((:commit . "644f331071f8b09a898fae490541908b5054d2e6") (:authors ("Steve Lemuel" . "wlemuel@hotmail.com")) (:maintainer "Steve Lemuel" . "wlemuel@hotmail.com") (:keywords "calendar" "tools" "convenience") (:url . "https://github.com/wlemuel/alarm-clock"))]) + (alchemist . [(20180312 1304) ((elixir-mode (2 2 5)) (dash (2 11 0)) (emacs (24 4)) (company (0 8 0)) (pkg-info (0 4)) (s (1 11 0))) "Elixir tooling integration into Emacs" tar ((:commit . "6f99367511ae209f8fe2c990779764bbb4ccb6ed") (:authors ("Samuel Tonini" . "tonini.samuel@gmail.com")) (:maintainer "Samuel Tonini" . "tonini.samuel@gmail.com") (:keywords "languages" "elixir" "elixirc" "mix" "hex" "alchemist") (:url . "http://www.github.com/tonini/alchemist.el"))]) + (alda-mode . [(20180608 605) ((emacs (24 0))) "An Alda major mode" single ((:commit . "1692b9003d2c3de403251ec452c6ce43ec819c84") (:authors ("Jay Kamat" . "jaygkamat@gmail.com")) (:maintainer "Jay Kamat" . "jaygkamat@gmail.com") (:keywords "alda" "highlight") (:url . "http://gitlab.com/jgkamat/alda-mode"))]) + (alect-themes . [(20200801 2041) ((emacs (24 0))) "Configurable light, dark and black themes for Emacs 24 or later" tar ((:commit . "684249b83d711145865ec31650e66ed9aa6e691b") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "color" "theme") (:url . "https://github.com/alezost/alect-themes"))]) + (alectryon . [(20210518 1550) ((flycheck (31)) (emacs (25 1))) "Toggle between Coq and reStructuredText" tar ((:commit . "df5664e71c1026af4aaf69e6b227d427a728e7c6") (:authors ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/cpitclaudel/alectryon"))]) + (alert . [(20200303 2118) ((gntp (0 1)) (log4e (0 3 0)) (cl-lib (0 5))) "Growl-style notification system for Emacs" single ((:commit . "7046393272686c7a1a9b3e7f7b1d825d2e5250a6") (:authors ("John Wiegley" . "jwiegley@gmail.com")) (:maintainer "John Wiegley" . "jwiegley@gmail.com") (:keywords "notification" "emacs" "message") (:url . "https://github.com/jwiegley/alert"))]) + (alert-termux . [(20181119 951) ((emacs (24 4))) "alert.el notifications on Termux" single ((:commit . "47c414285c2f5971f3be52aaf0a4066ea6989238") (:authors ("Gergely Polonkai" . "gergely@polonkai.eu")) (:maintainer "Gergely Polonkai" . "gergely@polonkai.eu") (:keywords "terminals") (:url . "https://github.com/gergelypolonkai/alert-termux"))]) + (align-cljlet . [(20160112 2101) ((clojure-mode (1 11 5))) "Space align various Clojure forms" single ((:commit . "602d72a7ad52788a0265e3c6da519464a98166b8") (:url . "https://github.com/gstamp/align-cljlet"))]) + (all-ext . [(20200315 1443) ((emacs (24 4)) (all (1 0))) "M-x all with helm-swoop/anything/multiple-cursors/line-number" single ((:commit . "c865c62506af2c9edc7705a7c24dc8b70d5d4de2") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "matching" "all" "search" "replace" "anything" "helm" "helm-swoop" "occur") (:url . "https://github.com/rubikitch/all-ext"))]) + (all-the-icons . [(20210603 1604) ((emacs (24 3))) "A library for inserting Developer icons" tar ((:commit . "facbde4a7be292bf9490932cbe403b443273f45d") (:authors ("Dominic Charlesworth" . "dgc336@gmail.com")) (:maintainer "Dominic Charlesworth" . "dgc336@gmail.com") (:keywords "convenient" "lisp") (:url . "https://github.com/domtronn/all-the-icons.el"))]) + (all-the-icons-dired . [(20210422 921) ((emacs (24 4)) (all-the-icons (2 2 0))) "Shows icons for each file in dired mode" single ((:commit . "a294f45ec2c338e1255ae2dd98b19f3f143204e6") (:authors ("jtbm37")) (:maintainer "Jimmy Yuen Ho Wong" . "wyuenho@gmail.com") (:keywords "files" "icons" "dired") (:url . "https://github.com/wyuenho/all-the-icons-dired"))]) + (all-the-icons-gnus . [(20180511 654) ((emacs (24 4)) (dash (2 12 0)) (all-the-icons (3 1 0))) "Shows icons for in Gnus" single ((:commit . "27f78996da0725943bcfb2d18038e6f7bddfa9c7") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "mail" "tools"))]) + (all-the-icons-ibuffer . [(20210325 512) ((emacs (24 4)) (all-the-icons (2 2 0))) "Display icons for all buffers in ibuffer" single ((:commit . "5a984b4d7f811e2ad08fdc461a1e89205804b7bd") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Vincent Zhang" . "seagle0128@gmail.com") (:keywords "convenience" "icons" "ibuffer") (:url . "https://github.com/seagle0128/all-the-icons-ibuffer"))]) + (all-the-icons-ivy . [(20190508 1803) ((emacs (24 4)) (all-the-icons (2 4 0)) (ivy (0 8 0))) "Shows icons while using ivy and counsel" single ((:commit . "a70cbfa1effe36efc946a823a580cec686d5e88d") (:authors ("asok")) (:maintainer "asok") (:keywords "faces"))]) + (all-the-icons-ivy-rich . [(20210610 2054) ((emacs (25 1)) (ivy-rich (0 1 0)) (all-the-icons (2 2 0))) "Better experience with icons for ivy" single ((:commit . "557cfbf784a52cae1bcf17564b1c51147d995652") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Vincent Zhang" . "seagle0128@gmail.com") (:keywords "convenience" "icons" "ivy") (:url . "https://github.com/seagle0128/all-the-icons-ivy-rich"))]) + (almost-mono-themes . [(20210306 1040) ((emacs (24))) "Almost monochromatic color themes" tar ((:commit . "a7dc21078e25dab2b054d64e5b40ecce2878edb2") (:authors ("John Olsson" . "john@cryon.se")) (:maintainer "John Olsson" . "john@cryon.se") (:keywords "faces") (:url . "https://github.com/cryon/almost-mono-themes"))]) + (alsamixer . [(20191002 1133) nil "Functions to call out to amixer." single ((:commit . "1bdb99e433acd38685f05408562746cfbf2bc820") (:authors ("R.W. van 't Veer")) (:maintainer "R.W. van 't Veer") (:keywords "convenience") (:url . "https://github.com/remvee/alsamixer-el"))]) + (alt-codes . [(20200723 1037) ((emacs (24 4))) "Insert alt codes using meta key" single ((:commit . "b36c2b2bccc628da1579016381d5c3195c9e12b2") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/alt-codes"))]) + (amd-mode . [(20180111 1402) ((emacs (25)) (projectile (20161008 47)) (s (1 9 0)) (f (0 16 2)) (seq (2 16)) (makey (0 3)) (js2-mode (20140114)) (js2-refactor (0 6 1))) "Minor mode for handling JavaScript AMD module requirements." single ((:commit . "01fd19e0d635ccaf8e812364d8720733f2e84126") (:authors ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainer "Nicolas Petton" . "petton.nicolas@gmail.com") (:keywords "javascript" "amd" "projectile"))]) + (ameba . [(20200103 1454) ((emacs (24 4))) "An interface to Crystal Ameba linter" single ((:commit . "0c4925ae0e998818326adcb47ed27ddf9761c7dc") (:authors ("Vitalii Elenhaupt")) (:maintainer "Vitalii Elenhaupt") (:keywords "convenience") (:url . "https://github.com/crystal-ameba/ameba.el"))]) + (ammonite-term-repl . [(20200416 559) ((emacs (24 3)) (s (1 12 0)) (scala-mode (0 23))) "Scala Ammonite REPL in term mode." single ((:commit . "b552fe21977e005c1c460bf6607557e67241a6b6") (:authors ("zwild" . "judezhao@outlook.com")) (:maintainer "zwild" . "judezhao@outlook.com") (:keywords "processes" "ammnite" "term" "scala") (:url . "https://github.com/zwild/ammonite-term-repl"))]) + (ample-regexps . [(20200508 1021) nil "ample regular expressions for Emacs" tar ((:commit . "153969ce547afe410b8986f01c9ed4087c9cd20b") (:authors ("immerrr" . "immerrr@gmail.com")) (:maintainer "immerrr" . "immerrr@gmail.com") (:keywords "regexps" "extensions" "tools"))]) + (ample-theme . [(20180207 1745) nil "Calm Dark Theme for Emacs" tar ((:commit . "f5a163626e04abda2d3c168f703c3f330f302a7c") (:authors ("Jordon Biondo" . "jordonbiondo@gmail.com")) (:maintainer "Jordon Biondo" . "jordonbiondo@gmail.com") (:keywords "theme" "dark") (:url . "https://github.com/jordonbiondo/ample-theme"))]) + (ample-zen-theme . [(20150119 2154) nil "AmpleZen Theme for Emacs 24" single ((:commit . "b277bb7abd4b6624e8d59f02474b79af50a007bd") (:authors ("Michael Wall")) (:maintainer "Michael Wall") (:keywords "theme" "dark" "emacs 24") (:url . "https://github.com/mjwall/ample-zen"))]) + (amread-mode . [(20200623 1544) ((emacs (24 3)) (cl-lib (0 6 1))) "A minor mode helper user speed-reading" single ((:commit . "7b1ed6c8aea409e2dce4a3b59f304d716a8efab7") (:keywords "wp") (:url . "https://github.com/stardiviner/amread-mode"))]) + (amsreftex . [(20201004 2148) ((emacs (25 1))) "Add amsrefs bibliography support for reftex" single ((:commit . "46bc6683e904e898de8bae831df9106cf8881163") (:authors ("Fran Burstall" . "fran.burstall@gmail.com")) (:maintainer "Fran Burstall" . "fran.burstall@gmail.com") (:keywords "tex") (:url . "https://github.com/franburstall/amsreftex"))]) + (amx . [(20210305 118) ((emacs (24 4)) (s (0))) "Alternative M-x with extra features." single ((:commit . "37f9c7ae55eb0331b27200fb745206fc58ceffc0") (:authors ("Ryan C. Thompson" . "rct@thompsonclan.org") ("Cornelius Mika" . "cornelius.mika@gmail.com")) (:maintainer "Ryan C. Thompson" . "rct@thompsonclan.org") (:keywords "convenience" "usability" "completion") (:url . "http://github.com/DarwinAwardWinner/amx/"))]) + (anaconda-mode . [(20210409 1536) ((emacs (25 1)) (pythonic (0 1 0)) (dash (2 6 0)) (s (1 9)) (f (0 16 2))) "Code navigation, documentation lookup and completion for Python" tar ((:commit . "4f367c768a84465070c44327444b17015091d08d") (:authors ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainer "Artem Malyshev" . "proofit404@gmail.com") (:url . "https://github.com/proofit404/anaconda-mode"))]) + (anakondo . [(20210221 1727) ((emacs (26 3))) "Adds clj-kondo based Clojure[Script] editing facilities" single ((:commit . "c48518560815c49d8d78fb9069906d17e883385e") (:authors ("Didier A." . "didibus@users.noreply.github.com")) (:maintainer "Didier A." . "didibus@users.noreply.github.com") (:keywords "clojure" "clojurescript" "cljc" "clj-kondo" "completion" "languages" "tools") (:url . "https://github.com/didibus/anakondo"))]) + (anaphora . [(20180618 2200) nil "anaphoric macros providing implicit temp variables" single ((:commit . "3b2da3f759b244975852e79721c4a2dbad3905cf") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "extensions") (:url . "http://github.com/rolandwalker/anaphora"))]) + (android-env . [(20200722 1403) ((emacs (24 3))) "Helper functions for working in android" single ((:commit . "5c6a6d9449f300eec4f374a5410edc1cbab02e40") (:authors ("Fernando Jascovich")) (:maintainer "Fernando Jascovich") (:keywords "android" "gradle" "java" "tools" "convenience") (:url . "https://github.com/fernando-jascovich/android-env.el"))]) + (android-mode . [(20190903 811) nil "Minor mode for Android application development" single ((:commit . "d5332e339a1f5e30559a53feffb8442ca79265d6") (:authors ("R.W. van 't Veer")) (:maintainer "R.W. van 't Veer") (:keywords "tools" "processes") (:url . "https://github.com/remvee/android-mode"))]) + (angry-police-captain . [(20120829 1252) nil "Show quote from http://theangrypolicecaptain.com in the minibuffer" single ((:commit . "d11931c5cb63368dcc4a48797962428cca6d3e9d") (:authors ("Rolando Pereira" . "rolando_pereira@sapo.pt")) (:maintainer "Rolando Pereira" . "rolando_pereira@sapo.pt") (:keywords "games" "web" "fun"))]) + (angular-mode . [(20151201 2127) nil "Major mode for Angular.js" tar ((:commit . "8720cde86af0f1859ccc8580571e8d0ad1c52cff") (:authors ("Rudolf Olah" . "omouse@gmail.com")) (:maintainer "Rudolf Olah" . "omouse@gmail.com") (:keywords "languages" "javascript") (:url . "https://github.com/omouse/angularjs-mode"))]) + (angular-snippets . [(20140514 523) ((s (1 4 0)) (dash (1 2 0))) "Yasnippets for AngularJS" tar ((:commit . "af5ae0a4a8603b040446c28afcf6ca01a8b4bd7b") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "snippets"))]) + (anki-connect . [(20191123 1858) ((emacs (24 3))) "AnkiConnect API" single ((:commit . "1324f0c248aa2c6e73d6cf93fad6119d699f7dae") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "lisp" "anki") (:url . "https://github.com/lujun9972/anki-connect.el"))]) + (anki-editor . [(20190922 1223) ((emacs (25)) (request (0 3 0)) (dash (2 12 0))) "Minor mode for making Anki cards with Org" tar ((:commit . "546774a453ef4617b1bcb0d1626e415c67cc88df") (:authors ("Lei Tan")) (:maintainer "Lei Tan") (:url . "https://github.com/louietan/anki-editor"))]) + (anki-mode . [(20201223 719) ((emacs (24 4)) (dash (2 12 0)) (markdown-mode (2 2)) (s (1 11 0)) (request (0 3 0))) "A major mode for creating anki cards" single ((:commit . "d9b84028cd6a1ae040fb5604080a8b5fa8138562") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com") (:keywords "tools") (:url . "https://github.com/davidshepherd7/anki-mode"))]) + (anki-vocabulary . [(20200103 325) ((emacs (24 4)) (s (1 0)) (youdao-dictionary (0 4)) (anki-connect (1 0)) (s (1 10))) "Help you to create vocabulary cards in Anki" single ((:commit . "863fe0219577f996ab126f1b7902db3c2cc59b2b") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "lisp" "anki" "translator" "chinese") (:url . "https://github.com/lujun9972/anki-vocabulary.el"))]) + (annalist . [(20190929 207) ((emacs (24 4)) (cl-lib (0 5))) "Record and display information such as keybindings" tar ((:commit . "134fa3f0fb91a636a1c005c483516d4b64905a6d") (:authors ("Fox Kiester" . "noct@posteo.net")) (:maintainer "Fox Kiester" . "noct@posteo.net") (:keywords "convenience" "tools" "keybindings" "org") (:url . "https://github.com/noctuid/annalist.el"))]) + (annotate . [(20210519 1401) nil "annotate files without changing them" single ((:commit . "b22f594f3b813b12e442860344d2feb39d944b53") (:authors ("Bastian Bechtold")) (:maintainer "Bastian Bechtold") (:url . "https://github.com/bastibe/annotate.el"))]) + (annotate-depth . [(20160520 2040) nil "Annotate buffer if indentation depth is beyond threshold." single ((:commit . "fcb24fa36287250e40d195590c4ca4a8a696277b") (:authors ("Morten Slot Kristensen <msk AT nullpointer DOT dk>")) (:maintainer "Morten Slot Kristensen <msk AT nullpointer DOT dk>") (:keywords "convenience") (:url . "https://github.com/netromdk/annotate-depth"))]) + (annotation . [(20200914 644) nil "Functions for annotating text with faces and help bubbles" single ((:commit . "044843c5281a7bdb9479317793a75c8c0fcfadd9") (:url . "https://github.com/agda/agda"))]) + (annoying-arrows-mode . [(20161024 646) ((cl-lib (0 5))) "Ring the bell if using arrows too much" single ((:commit . "3c42e9807d7696da2da2a21b63beebf9cdb3f5dc") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))]) + (ansi . [(20200611 944) ((emacs (24 1)) (cl-lib (0 6)) (s (1 6 1)) (dash (1 5 0))) "Turn string into ansi strings" single ((:commit . "a41d5cc719297515d85bb5256980cd1204a71b88") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "terminals" "color" "ansi") (:url . "http://github.com/rejeep/ansi"))]) + (ansible . [(20210103 543) ((s (1 9 0)) (f (0 16 2))) "Ansible minor mode" tar ((:commit . "40af0d2bbb6c5bbcf7aa9269ac9a07e22622d263") (:authors ("k1LoW (Kenichirou Oyama), <k1lowxb [at] gmail [dot] com> <k1low [at] 101000lab [dot] org>")) (:maintainer "k1LoW (Kenichirou Oyama), <k1lowxb [at] gmail [dot] com> <k1low [at] 101000lab [dot] org>") (:url . "http://101000lab.org"))]) + (ansible-doc . [(20160924 824) ((emacs (24 3))) "Ansible documentation Minor Mode" single ((:commit . "86083a7bb2ed0468ca64e52076b06441a2f8e9e0") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn") (:keywords "tools" "help") (:url . "https://github.com/lunaryorn/ansible-doc.el"))]) + (ansible-vault . [(20200305 2240) ((emacs (24 3)) (seq (2 20))) "Minor mode for editing ansible vault files" single ((:commit . "c4fe4b0af2ac7f9d32acee234716ab31fa824cef") (:maintainer "Zachary Elliott" . "contact@zell.io") (:keywords "ansible" "ansible-vault" "tools") (:url . "http://github.com/zellio/ansible-vault-mode"))]) + (ant . [(20160211 1543) nil "helpers for compiling with ant" single ((:commit . "510b5a3f57ee4b2855422d88d359a28922c1ab70") (:keywords "compilation" "ant" "java"))]) + (anti-zenburn-theme . [(20180712 1838) nil "Low-contrast Zenburn-inverted theme" single ((:commit . "dbafbaa86be67c1d409873f57a5c0bbe1e7ca158") (:authors ("Andrey Kotlarski" . "m00naticus@gmail.com")) (:maintainer "Andrey Kotlarski" . "m00naticus@gmail.com") (:url . "https://github.com/m00natic/anti-zenburn-theme"))]) + (anx-api . [(20140208 1514) nil "Interact with the AppNexus API from Emacs." single ((:commit . "b2411ebc966ac32c3ffc61bc22bf183834df0fa0") (:authors ("Rich Loveland")) (:maintainer "Rich Loveland") (:keywords "convenience" "json" "rest" "api" "appnexus"))]) + (anybar . [(20160816 1421) nil "Control AnyBar from Emacs" single ((:commit . "7a0743e0d31bcb36ab1bb2e351f3e7139c422ac5") (:authors ("Christopher Shea" . "cmshea@gmail.com")) (:maintainer "Christopher Shea" . "cmshea@gmail.com") (:keywords "anybar"))]) + (anyins . [(20131229 1041) nil "Insert content at multiple places from shell command or kill-ring" single ((:commit . "83844c17ac9b5b6c7655ee556b75689e4c8ea663") (:authors ("Anthony HAMON" . "hamon.anth@gmail.com")) (:maintainer "Anthony HAMON" . "hamon.anth@gmail.com") (:keywords "insert" "rectangular") (:url . "http://github.com/antham/anyins"))]) + (anzu . [(20201203 529) ((emacs (25 1))) "Show number of matches in mode-line while searching" single ((:commit . "bdb3da5028935a4aea55c40769bc191a81afb54e") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com") (:url . "https://github.com/emacsorphanage/anzu"))]) + (aozora-view . [(20140310 1317) nil "Aozora Bunko text Emacs viewer." tar ((:commit . "b0390616d19e45f15f9a2f5d5688274831e721fd") (:authors ("KAWABATA, Taichi <kawabata.taichi_at_gmail.com>")) (:maintainer "KAWABATA, Taichi <kawabata.taichi_at_gmail.com>") (:keywords "text") (:url . "https://github.com/kawabata/aozora-view"))]) + (apache-mode . [(20210519 1931) nil "Major mode for editing Apache httpd configuration files" single ((:commit . "f2c11aac2f5fc598123e04f4604bea248689a117") (:authors ("Karl Chen" . "quarl@nospam.quarl.org")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "languages" "faces") (:url . "https://github.com/emacs-php/apache-mode"))]) + (apdl-mode . [(20210423 1115) ((emacs (25 1))) "Major mode for the APDL programming language." tar ((:commit . "5e9de43494cc307a3b43b0eebf774c03670a4582") (:authors ("H. Dieter Wilhelm" . "dieter@duenenhof-wilhelm.de")) (:maintainer "H. Dieter Wilhelm") (:keywords "languages" "convenience" "tools" "ansys" "apdl") (:url . "https://github.com/dieter-wilhelm/apdl-mode"))]) + (apel . [(20201106 2221) ((emacs (24 5))) "A Portable Emacs Library provides support for portable Emacs Lisp programs" tar ((:commit . "4e3269b6e702db2dba48cf560563ac883e81e3bf"))]) + (apib-mode . [(20200101 1017) ((markdown-mode (2 1))) "Major mode for API Blueprint files" single ((:commit . "c6dd05201f6eb9295736d8668a79a7510d11159e") (:authors ("Vilibald Wanča" . "vilibald@wvi.cz")) (:maintainer "Vilibald Wanča" . "vilibald@wvi.cz") (:keywords "tools" "api-blueprint") (:url . "http://github.com/w-vi/apib-mode"))]) + (apiwrap . [(20180602 2231) ((emacs (25))) "api-wrapping macros" single ((:commit . "a4fb21d96027369307b22439a4a6c765ee272f44") (:authors ("Sean Allred" . "code@seanallred.com")) (:maintainer "Sean Allred" . "code@seanallred.com") (:keywords "tools" "maint" "convenience") (:url . "https://github.com/vermiculus/apiwrap.el"))]) + (apparmor-mode . [(20201213 1118) ((emacs (24 4))) "Major mode for editing AppArmor policy files" single ((:commit . "8c0c20b6896bba65c7f6cfe0a21e22b21a12c5f9") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/apparmor-mode"))]) + (apples-mode . [(20110121 418) nil "Major mode for editing and executing AppleScript code" tar ((:commit . "83a9ab0d6ba82496e2f7df386909b1a55701fccb") (:authors ("tequilasunset" . "tequilasunset.mac@gmail.com")) (:maintainer "tequilasunset" . "tequilasunset.mac@gmail.com") (:keywords "applescript" "languages"))]) + (applescript-mode . [(20210223 1539) ((emacs (24 3))) "major mode for editing AppleScript source" single ((:commit . "a45c426b7e4a450faea004ef5b842fd37e17a7c6") (:authors ("sakito" . "sakito@users.sourceforge.jp")) (:maintainer "sakito" . "sakito@users.sourceforge.jp") (:keywords "languages" "tools") (:url . "https://github.com/emacsorphanage/applescript-mode"))]) + (aproject . [(20190730 152) nil "Basic project framework for Emacs" tar ((:commit . "b534e2a62738ad59a8a3cddd386466c145dad3b2") (:authors ("Vietor Liu" . "vietor.liu@gmail.com")) (:maintainer "Vietor Liu" . "vietor.liu@gmail.com") (:keywords "environment" "project") (:url . "https://github.com/vietor/aproject"))]) + (apropospriate-theme . [(20210514 1710) nil "A colorful, low-contrast, light & dark theme set for Emacs with a fun name." tar ((:commit . "b17a8ce0686848ffd7c6d20aa66bf2e97b7ce3e5"))]) + (apt-sources-list . [(20180527 1241) ((emacs (24 4))) "Mode for editing APT source.list files" single ((:commit . "5289443ceff230dfc8a2c1c6b524c90560eb08a5") (:authors ("Dr. Rafael Sepúlveda" . "drs@gnulinux.org.mx")) (:maintainer "Joe Wreschnig" . "joe.wreschnig@gmail.com") (:url . "https://git.korewanetadesu.com/apt-sources-list.git"))]) + (aqi . [(20200215 1334) ((emacs (25 1)) (request (0 3)) (let-alist (0 0))) "Air quality data from the World Air Quality Index" single ((:commit . "c107a2e21cd1ac6008d8baaeeedb3fab26583d45") (:authors ("nik gaffney" . "nik@fo.am")) (:maintainer "nik gaffney" . "nik@fo.am") (:keywords "air quality" "aqi" "pollution" "weather" "data") (:url . "https://github.com/zzkt/aqi"))]) + (arc-dark-theme . [(20190314 1632) ((emacs (24))) "Arc dark theme" single ((:commit . "ee17dcca35dd0304145efc468b3f25af6907a59d") (:authors ("Christopher Fraser" . "cfraz89@gmail.com")) (:maintainer "Christopher Fraser" . "cfraz89@gmail.com") (:keywords "faces" "theme") (:url . "https://github.com/cfraz89/arc-dark-theme"))]) + (arch-packer . [(20170730 1321) ((emacs (25 1)) (s (1 11 0)) (async (1 9 2)) (dash (2 12 0))) "Arch Linux package management frontend" single ((:commit . "940e96f7d357c6570b675a0f942181c787f1bfd7") (:authors ("Fritz Stelzer" . "brotzeitmacher@gmail.com")) (:maintainer "Fritz Stelzer" . "brotzeitmacher@gmail.com") (:url . "https://github.com/brotzeitmacher/arch-packer"))]) + (archive-region . [(20200316 1425) ((emacs (24 4))) "Move region to archive file instead of killing" single ((:commit . "53cd2d96ea7c33f320353982b36854f25c900c2e") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "languages") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/archive-region.el"))]) + (archive-rpm . [(20180706 1232) ((emacs (24 4))) "RPM and CPIO support for archive-mode" tar ((:commit . "59f83caebbd2f92fd634f6968e6d17b50ffa3dc7") (:authors ("Magnus Henoch" . "magnus.henoch@gmail.com")) (:maintainer "Magnus Henoch" . "magnus.henoch@gmail.com") (:keywords "files"))]) + (arduino-cli-mode . [(20210511 653) ((emacs (25 1))) "Arduino-CLI command wrapper" single ((:commit . "a93de7e8fef202163df4657f2ab522b57f70f202") (:authors ("Love Lagerkvist")) (:maintainer "Love Lagerkvist") (:keywords "processes" "tools") (:url . "https://github.com/motform/arduino-cli-mode"))]) + (arduino-mode . [(20210527 1341) ((emacs (25 1)) (spinner (1 7 3))) "Major mode for editing Arduino code" tar ((:commit . "d7c87812c205bc01c8c8a7ab02f201b6138c7e57") (:maintainer "stardiviner" . "numbchild@gmail.com") (:keywords "languages" "arduino") (:url . "https://github.com/stardiviner/arduino-mode"))]) + (aria2 . [(20190816 25) ((emacs (24 4))) "Control aria2c commandline tool from Emacs" single ((:commit . "32e08d5a8ad2f305578e0f783e087c1d312238c7") (:authors ("Łukasz Gruner" . "lukasz@gruner.lu")) (:maintainer "Łukasz Gruner" . "lukasz@gruner.lu") (:keywords "download" "bittorrent" "aria2") (:url . "https://bitbucket.org/ukaszg/aria2-mode"))]) + (ariadne . [(20131117 1711) ((bert (0 1))) "Ariadne plugin for Emacs" single ((:commit . "6fe401c7f996bcbc2f685e7971324c6f5e5eaf15") (:authors ("Oleksandr Manzyuk" . "manzyuk@gmail.com")) (:maintainer "Oleksandr Manzyuk" . "manzyuk@gmail.com") (:keywords "comm" "convenience" "processes"))]) + (arjen-grey-theme . [(20170522 2047) nil "A soothing dark grey theme" single ((:commit . "4cd0be72b65d42390e2105cfdaa408a1ead8d8d1") (:authors ("Arjen Wiersma" . "arjen@wiersma.org")) (:maintainer "Arjen Wiersma" . "arjen@wiersma.org") (:keywords "faces") (:url . "https://github.com/credmp/arjen-grey"))]) + (artbollocks-mode . [(20170524 422) nil "Improve your writing (especially about art)" single ((:commit . "33a41ca4f8206f57e5498a526d3b0ea18d08bb93") (:authors ("Rob Myers <rob@robmyers.org>, Sacha Chua" . "sacha@sachachua.com")) (:maintainer "Rob Myers <rob@robmyers.org>, Sacha Chua" . "sacha@sachachua.com") (:url . "https://github.com/sachac/artbollocks-mode"))]) + (arview . [(20160419 2109) nil "extract and view archives in the temporary directory" single ((:commit . "5437b4221b64b238c273a651d4792c577dba6d45") (:authors ("Andrey Fainer" . "fandrey@gmx.com")) (:maintainer "Andrey Fainer" . "fandrey@gmx.com") (:keywords "files") (:url . "https://github.com/afainer/arview"))]) + (ascii-table . [(20201019 700) ((emacs (24 3)) (cl-lib (0 5))) "Interactive ASCII table" single ((:commit . "4f68ad0b36c365c0652756691ab1703d0d46b4b4") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "help" "tools") (:url . "https://github.com/lassik/emacs-ascii-table"))]) + (asilea . [(20150105 1525) ((emacs (24)) (cl-lib (0 5))) "Find best compiler options using simulated annealing" single ((:commit . "2aab1cc63b64ef08d12e84fd7ba5c94065f6039f") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/asilea"))]) + (asn1-mode . [(20170729 226) ((emacs (24 3)) (s (1 10 0))) "ASN.1/GDMO mode for GNU Emacs" single ((:commit . "d5d4a8259daf708411699bcea85d322f18beb972") (:authors ("Taichi Kawabata <kawabata.taichi_at_gmail.com>")) (:maintainer "Taichi Kawabata <kawabata.taichi_at_gmail.com>") (:keywords "languages" "processes" "tools") (:url . "https://github.com/kawabata/asn1-mode/"))]) + (assess . [(20200211 1817) ((emacs (24 4)) (m-buffer (0 15))) "Test support functions" tar ((:commit . "5bac045b273623772b6a2d820997d50f7ab4e466") (:authors ("Phillip Lord" . "phillip.lord@russet.org.uk")) (:maintainer "Phillip Lord" . "phillip.lord@russet.org.uk"))]) + (astyle . [(20200328 616) ((emacs (24 4)) (reformatter (0 3))) "Astyle formatter functions" single ((:commit . "04ff2941f08c4b731fe6a18ee1697436d1ca1cc0") (:authors ("Petter Storvik")) (:maintainer "Petter Storvik") (:keywords "astyle" "c" "c++" "cpp" "reformatter") (:url . "https://github.com/storvik/emacs-astyle"))]) + (asx . [(20191024 1100) ((emacs (26 1))) "Ask StackExchange/StackOverflow" single ((:commit . "ec4bf74de602b97df1f306d51acf4cda45184aac") (:authors ("Alex Ragone" . "ragonedk@gmail.com")) (:maintainer "Alex Ragone" . "ragonedk@gmail.com") (:keywords "convenience") (:url . "https://github.com/ragone/asx"))]) + (async . [(20210501 1527) ((emacs (24 4))) "Asynchronous processing in Emacs" tar ((:commit . "9a8cd0c3d5c120bfa03187c54dba6e33f6e3ca19") (:authors ("John Wiegley" . "jwiegley@gmail.com")) (:maintainer "John Wiegley" . "jwiegley@gmail.com") (:keywords "async") (:url . "https://github.com/jwiegley/emacs-async"))]) + (async-await . [(20200117 828) ((emacs (25 1)) (promise (1 1)) (iter2 (0 9 10))) "Async/Await" single ((:commit . "deef2bb343463f5196545f1dd8c2a32d0cb3b146") (:authors ("chuntaro" . "chuntaro@sakura-games.jp")) (:maintainer "chuntaro" . "chuntaro@sakura-games.jp") (:keywords "async" "await" "convenience") (:url . "https://github.com/chuntaro/emacs-async-await"))]) + (atcoder-tools . [(20200109 1236) ((emacs (26)) (f (0 20)) (s (1 12))) "An atcoder-tools client" single ((:commit . "cfe61ed18ea9b3b1bfb6f9e7d80a47599680cd1f") (:authors ("Seong Yong-ju" . "sei40kr@gmail.com")) (:maintainer "Seong Yong-ju" . "sei40kr@gmail.com") (:keywords "extensions" "tools") (:url . "https://github.com/sei40kr/atcoder-tools"))]) + (atl-long-lines . [(20201026 339) ((emacs (24 3))) "Turn off truncate-lines when the line is long" single ((:commit . "449596a61f551ba5f8f3ff731984316e3b99faba") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/atl-long-lines"))]) + (atl-markup . [(20200810 845) ((emacs (24 3))) "Automatically truncate lines for markup languages" single ((:commit . "79adac0149bb6083ad3a327c6bbdf56537282ee9") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/atl-markup"))]) + (atom-dark-theme . [(20181022 1602) nil "An Emacs port of the Atom Dark theme from Atom.io." single ((:commit . "5c8610d0b45a536b8f7f9777297c86362685a357") (:authors (nil . "Jeremy Whitlock <jwhitlock@apache.org")) (:maintainer nil . "Jeremy Whitlock <jwhitlock@apache.org") (:keywords "themes" "atom" "dark") (:url . "https://github.com/whitlockjc/atom-dark-theme-emacs"))]) + (atom-one-dark-theme . [(20210128 1640) nil "Atom One Dark color theme" single ((:commit . "b34b62e85593812b55ee552a1cb0eecfb04767bb") (:authors ("Jonathan Chu" . "me@jonathanchu.is")) (:maintainer "Jonathan Chu" . "me@jonathanchu.is") (:url . "https://github.com/jonathanchu/atom-one-dark-theme"))]) + (atomic-chrome . [(20210221 59) ((emacs (24 4)) (let-alist (1 0 4)) (websocket (1 4))) "Edit Chrome text area with Emacs using Atomic Chrome" single ((:commit . "c73367d8aa660f2b3c3f70ef5c39f5b502d60404") (:authors ("alpha22jp" . "alpha22jp@gmail.com")) (:maintainer "alpha22jp" . "alpha22jp@gmail.com") (:keywords "chrome" "edit" "textarea") (:url . "https://github.com/alpha22jp/atomic-chrome"))]) + (attrap . [(20210426 1348) ((dash (2 12 0)) (emacs (25 1)) (f (0 19 0)) (flycheck (0 30)) (s (1 11 0))) "ATtempt To Repair At Point" single ((:commit . "a5bc695af27349ae6fe4541a581e6fd449d2a026") (:authors ("Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com")) (:maintainer "Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com") (:keywords "programming" "tools") (:url . "https://github.com/jyp/attrap"))]) + (auctex-cluttex . [(20210226 302) ((emacs (24 4)) (auctex (12 2))) "ClutTeX support for AUCTeX" single ((:commit . "9a15742a6de1285831329eac93f9e35752472685") (:authors ("Masahiro Nakamura" . "tsuucat@icloud.com")) (:maintainer "Masahiro Nakamura" . "tsuucat@icloud.com") (:keywords "tex") (:url . "https://github.com/tsuu32/auctex-cluttex"))]) + (auctex-latexmk . [(20170618 1636) ((auctex (11 87))) "Add LatexMk support to AUCTeX" single ((:commit . "4d353522650d7685acbf1d38f7dbc504f734bd84") (:authors ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainer "Tomoya Tanjo" . "ttanjo@gmail.com") (:keywords "tex") (:url . "https://github.com/tom-tan/auctex-latexmk/"))]) + (auctex-lua . [(20151121 1610) ((auctex (11 86)) (lua-mode (20130419))) "Lua editing support for AUCTeX" single ((:commit . "799cd8ac10c96991bb63d9aa60528ae5d8c786b5") (:authors ("Sean Allred" . "seallred@smcm.edu")) (:maintainer "Sean Allred" . "seallred@smcm.edu") (:keywords "latex" "lua") (:url . "http://github.com/vermiculus/auctex-lua"))]) + (audio-notes-mode . [(20170611 2159) nil "Play audio notes synced from somewhere else." single ((:commit . "fa38350829c7e97257efc746a010471d33748a68") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com") (:keywords "hypermedia" "convenience") (:url . "http://github.com/Bruce-Connor/audio-notes-mode"))]) + (aurel . [(20170114 937) ((emacs (24 3)) (bui (1 1 0)) (dash (2 11 0))) "Search, get info, vote for and download AUR packages" single ((:commit . "fc7ad208f43f8525f84a18941c9b55f956df8961") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "tools") (:url . "https://github.com/alezost/aurel"))]) + (aurora-config-mode . [(20180216 2302) nil "Major mode for Apache Aurora configuration files" single ((:commit . "8273ec7937a21b469b9dbb6c11714255b890f410") (:authors ("Berk D. Demir" . "bdd@mindcast.org")) (:maintainer "Berk D. Demir" . "bdd@mindcast.org") (:keywords "languages" "configuration") (:url . "https://github.com/bdd/aurora-config.el"))]) + (auth-source-keytar . [(20210516 556) ((emacs (24 4)) (keytar (0 1 2)) (s (1 12 0))) "Integrate auth-source with keytar" single ((:commit . "9ecdd6226b50a1a04675b65589e6cc36fd3aea2c") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/emacs-grammarly/auth-source-keytar"))]) + (auth-source-kwallet . [(20210605 1032) ((emacs (24 4))) "KWallet integration for auth-source" single ((:commit . "053ed5e964acaf6f16a1708c36d812eeb7c1817d") (:authors ("Ekaterina Vaartis" . "vaartis@kotobank.ch")) (:maintainer "Ekaterina Vaartis" . "vaartis@kotobank.ch") (:url . "https://github.com/vaartis/auth-source-kwallet"))]) + (auth-source-pass . [(20210210 1908) ((emacs (27 1))) "Integrate auth-source with password-store" single ((:commit . "fa8b964494c1ef42035fad340ff5f29fcdbed21c") (:authors ("Damien Cassou" . "damien@cassou.me") ("Nicolas Petton" . "nicolas@petton.fr") ("Keith Amidon" . "camalot@picnicpark.org")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://github.com/DamienCassou/auth-source-pass"))]) + (auth-source-xoauth2 . [(20200911 1554) ((emacs (26 1))) "Integrate auth-source with XOAUTH2" single ((:commit . "d3890eaa3a46dc89758ec6b789949e70ae782896") (:authors ("Cesar Crusius" . "ccrusius@google.com")) (:maintainer "Cesar Crusius" . "ccrusius@google.com") (:url . "https://github.com/ccrusius/auth-source-xoauth2"))]) + (auto-async-byte-compile . [(20160916 454) nil "Automatically byte-compile when saved" single ((:commit . "8681e74ddb8481789c5dbb3cafabb327db4c4484") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "lisp" "convenience") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/auto-async-byte-compile.el"))]) + (auto-auto-indent . [(20131106 1903) ((es-lib (0 1)) (cl-lib (1 0))) "Indents code as you type" single ((:commit . "0139378577f936d34b20276af6f022fb457af490") (:authors ("sabof")) (:maintainer "sabof") (:url . "https://github.com/sabof/auto-auto-indent"))]) + (auto-compile . [(20210518 1020) ((emacs (25 1)) (packed (3 0 3))) "automatically compile Emacs Lisp libraries" single ((:commit . "3af0b02393ca4f207f1e454161f7bd8a747f3051") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "compile" "convenience" "lisp") (:url . "https://github.com/emacscollective/auto-compile"))]) + (auto-complete . [(20201213 1255) ((popup (0 5 0)) (cl-lib (0 5))) "Auto Completion for GNU Emacs" tar ((:commit . "aafd3f566a8002a1e9b3e197721a2660c0a835ff") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainer "Tomohiro Matsuyama" . "m2ym.pub@gmail.com") (:keywords "completion" "convenience") (:url . "https://github.com/auto-complete/auto-complete"))]) + (auto-complete-auctex . [(20140223 1758) ((yasnippet (0 6 1)) (auto-complete (1 4))) "auto-completion for auctex" single ((:commit . "855633f668bcc4b9408396742a7cb84e0c4a2f77") (:authors ("Christopher Monsanto" . "chris@monsan.to")) (:maintainer "Christopher Monsanto" . "chris@monsan.to"))]) + (auto-complete-c-headers . [(20150912 323) ((auto-complete (1 4))) "An auto-complete source for C/C++ header files" single ((:commit . "52fef720c6f274ad8de52bef39a343421006c511") (:authors ("Masafumi Oyamada" . "stillpedant@gmail.com")) (:maintainer "Masafumi Oyamada" . "stillpedant@gmail.com") (:keywords "c"))]) + (auto-complete-chunk . [(20140225 946) ((auto-complete (1 4))) "Auto-completion for dot.separated.words." single ((:commit . "a9aa77ffb84a1037984a7ce4dda25074272f13fe") (:authors ("ARAKAKI, Takafumi")) (:maintainer "ARAKAKI, Takafumi") (:url . "https://github.com/tkf/auto-complete-chunk"))]) + (auto-complete-clang . [(20140409 752) ((auto-complete (1 3 1))) "Auto Completion source for clang for GNU Emacs" single ((:commit . "a195db1d0593b4fb97efe50885e12aa6764d998c") (:authors ("Brian Jiang" . "brianjcj@gmail.com")) (:maintainer "Brian Jiang" . "brianjcj@gmail.com") (:keywords "completion" "convenience") (:url . "https://github.com/brianjcj/auto-complete-clang"))]) + (auto-complete-clang-async . [(20130526 1514) nil "Auto Completion source for clang for GNU Emacs" single ((:commit . "5d9c5cabbb6b31e0ac3637631c0c8b25184aa8b4") (:keywords "completion" "convenience"))]) + (auto-complete-distel . [(20180827 1344) ((auto-complete (1 4)) (distel-completion-lib (1 0 0))) "Erlang/distel completion backend for auto-complete-mode" single ((:commit . "acc4c0a5521904203d797fe96b08e5fae4233c7e") (:authors ("Sebastian Weddmark Olsson")) (:maintainer "Sebastian Weddmark Olsson") (:keywords "erlang" "distel" "auto-complete") (:url . "github.com/sebastiw/distel-completion"))]) + (auto-complete-exuberant-ctags . [(20140320 724) ((auto-complete (1 4 0))) "Exuberant ctags auto-complete.el source" single ((:commit . "ff6121ff8b71beb5aa606d28fd389c484ed49765") (:authors ("Kenichirou Oyama" . "k1lowxb@gmail.com")) (:maintainer "Kenichirou Oyama" . "k1lowxb@gmail.com") (:keywords "anto-complete" "exuberant ctags") (:url . "http://code.101000lab.org"))]) + (auto-complete-nxml . [(20140221 458) ((auto-complete (1 4))) "do completion by auto-complete.el on nXML-mode" single ((:commit . "ac7b09a23e45f9bd02affb31847263de4180163a") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "completion" "html" "xml") (:url . "https://github.com/aki2o/auto-complete-nxml"))]) + (auto-complete-pcmp . [(20140227 651) ((auto-complete (1 4 0)) (log4e (0 2 0)) (yaxception (0 1))) "Provide auto-complete sources using pcomplete results" single ((:commit . "2595d3dab1ef3549271ca922f212928e9d830eec") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "completion") (:url . "https://github.com/aki2o/auto-complete-pcmp"))]) + (auto-complete-rst . [(20140225 944) ((auto-complete (1 4))) "Auto-complete extension for ReST and Sphinx" tar ((:commit . "4803ce41a96224e6fa54e6741a5b5f40ebed7351") (:authors ("ARAKAKI, Takafumi")) (:maintainer "ARAKAKI, Takafumi") (:url . "https://github.com/tkf/auto-complete-rst"))]) + (auto-complete-sage . [(20160514 751) ((auto-complete (1 5 1)) (sage-shell-mode (0 1 0))) "An auto-complete source for sage-shell-mode." single ((:commit . "51b8e3905196d266e1f8aa47881189833151b398") (:authors ("Sho Takemori" . "stakemorii@gmail.com")) (:maintainer "Sho Takemori" . "stakemorii@gmail.com") (:keywords "sage" "math" "auto-complete") (:url . "https://github.com/stakemori/auto-complete-sage"))]) + (auto-dictionary . [(20150410 1610) nil "automatic dictionary switcher for flyspell" single ((:commit . "b364e08009fe0062cf0927d8a0582fad5a12b8e7") (:authors ("Nikolaj Schumacher <bugs * nschum de>")) (:maintainer "Nikolaj Schumacher <bugs * nschum de>") (:keywords "wp") (:url . "http://nschum.de/src/emacs/auto-dictionary/"))]) + (auto-dim-other-buffers . [(20210210 1744) nil "Makes windows without focus less prominent" single ((:commit . "62c936d502f35d168b9e59a66c994d74a62ad2cf") (:authors ("Michal Nazarewicz" . "mina86@mina86.com")) (:maintainer "Michal Nazarewicz" . "mina86@mina86.com") (:url . "https://github.com/mina86/auto-dim-other-buffers.el"))]) + (auto-highlight-symbol . [(20210108 1841) nil "Automatic highlighting current symbol minor mode" single ((:commit . "5ad84d0a12b175360b18504cd04e6bf7ab1cf5c8") (:authors ("Mitsuo Saito" . "arch320@NOSPAM.gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "highlight" "face" "match" "convenience") (:url . "http://github.com/jcs-elpa/auto-highlight-symbol"))]) + (auto-indent-mode . [(20191112 1418) nil "Auto indent Minor mode" tar ((:commit . "ebb1ee5ca24f3040c34b9455502a0e94f19903d0") (:authors ("Matthew L. Fidler, Le Wang & Others")) (:maintainer "Matthew L. Fidler") (:keywords "auto" "indentation") (:url . "https://github.com/mlf176f2/auto-indent-mode.el/"))]) + (auto-minor-mode . [(20180527 1123) ((emacs (24 4))) "Enable minor modes by file name and contents" single ((:commit . "17cfa1b54800fdef2975c0c0531dad34846a5065") (:authors ("Joe Wreschnig" . "joe.wreschnig@gmail.com")) (:maintainer "Joe Wreschnig" . "joe.wreschnig@gmail.com") (:keywords "convenience") (:url . "https://github.com/joewreschnig/auto-minor-mode"))]) + (auto-org-md . [(20180213 2343) ((emacs (24 4))) "export a markdown file automatically when you save an org-file" single ((:commit . "9318338bdb7fe8bd698d88f3af89b2d6413efdd2") (:authors ("jamcha" . "jamcha.aa@gmail.com")) (:maintainer "jamcha" . "jamcha.aa@gmail.com") (:keywords "org" "markdown") (:url . "https://github.com/jamcha-aa/auto-org-md"))]) + (auto-package-update . [(20210211 2036) ((emacs (24 4)) (dash (2 1 0))) "Automatically update Emacs packages." single ((:commit . "22130fb17d00d79497253c94f3e88382cb40c3ac") (:authors ("Renan Ranelli")) (:maintainer "Renan Ranelli") (:keywords "package" "update") (:url . "http://github.com/rranelli/auto-package-update.el"))]) + (auto-pause . [(20160426 1216) ((emacs (24 4))) "Run processes which will be paused when Emacs is idle" single ((:commit . "a4d778de774ca3895542cb559a953e0d98657338") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "convenience" "menu") (:url . "https://github.com/lujun9972/auto-pause"))]) + (auto-read-only . [(20200827 1754) ((emacs (25 1)) (cl-lib (0 5))) "Automatically make the buffer to read-only" single ((:commit . "db209bf5b7f76f4c3dc4d0892fc6a24430779f29") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "files" "convenience") (:url . "https://github.com/zonuexe/auto-read-only.el"))]) + (auto-rename-tag . [(20210418 1758) ((emacs (24 4))) "Automatically rename paired HTML/XML tag" single ((:commit . "8dbf13b344f6d5eba5c4876b18905d30b3118bb9") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/auto-rename-tag"))]) + (auto-save-buffers-enhanced . [(20161109 710) nil "Automatically save buffers in a decent way" single ((:commit . "461e8c816c1b7c650be5f209078b381fe55da8c6") (:authors ("Kentaro Kuribayashi" . "kentarok@gmail.com")) (:maintainer "Kentaro Kuribayashi" . "kentarok@gmail.com"))]) + (auto-shell-command . [(20180817 1502) ((deferred (20130312)) (popwin (20130329))) "Run the shell command asynchronously that you specified when you save the file." single ((:commit . "a8f9213e3c773b5687b81881240e6e648f2f56ba") (:authors ("ongaeshi")) (:maintainer "ongaeshi") (:keywords "shell" "save" "async" "deferred" "auto"))]) + (auto-sudoedit . [(20210522 612) ((emacs (26 1)) (f (0 19 0))) "Auto sudo edit by tramp" single ((:commit . "0dec9e632f1f3208f0da2f94b57efa1aae9ce2ab") (:authors ("ncaq" . "ncaq@ncaq.net")) (:maintainer "ncaq" . "ncaq@ncaq.net") (:url . "https://github.com/ncaq/auto-sudoedit"))]) + (auto-virtualenv . [(20200729 2204) ((cl-lib (0 5)) (pyvenv (1 9)) (s (1 10 0))) "Auto activate python virtualenvs" single ((:commit . "214604ebd3366078d03814a344c3249268d1f15a") (:authors ("Marcwebbie" . "marcwebbie@gmail.com")) (:maintainer "Marcwebbie" . "marcwebbie@gmail.com") (:keywords "python" "virtualenv" "tools") (:url . "http://github.com/marcwebbie/auto-virtualenv"))]) + (auto-virtualenvwrapper . [(20200510 1006) ((cl-lib (0 6)) (s (1 10 0)) (virtualenvwrapper (0))) "Lightweight auto activate python virtualenvs" single ((:commit . "30fb54aa3c99f3c614ea9a92669d634df30c9439") (:authors ("Marcwebbie" . "marcwebbie@gmail.com") ("Robert Zaremba" . "robert-zaremba@scale-it.pl")) (:maintainer "Marcwebbie" . "marcwebbie@gmail.com") (:keywords "python" "virtualenv" "tools"))]) + (auto-yasnippet . [(20191015 942) ((yasnippet (0 13 0))) "Quickly create disposable yasnippets" single ((:commit . "db9e0dd4335b2202cd5dac95bbbc87a1032d9bbe") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/auto-yasnippet"))]) + (autobookmarks . [(20190919 841) ((dash (2 10 0)) (cl-lib (0 5))) "Save recently visited files and buffers" single ((:commit . "224b24950d3ae57cd16d7417c07fda337fe0ea09") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "files"))]) + (autobuild . [(20200713 227) ((cl-lib (0 3)) (emacs (26 1))) "Define and execute build rules and compilation pipelines" single ((:commit . "9b068d979bad78aba8e8bef9f9e7c3bfecb34d2d") (:authors ("Ernesto Alfonso")) (:maintainer nil . "(concat \"erjoalgo\" \"@\" \"gmail\" \".com\")") (:keywords "compile" "build" "pipeline" "autobuild" "extensions" "processes" "tools") (:url . "https://github.com/erjoalgo/autobuild"))]) + (autocrypt . [(20210412 1127) ((emacs (25 1)) (cl-generic (0 3))) "Autocrypt implementation" tar ((:commit . "5b55f8d37545e9c441788627c17e350d7edf4055") (:authors ("Philip K." . "philip@warpmail.net")) (:maintainer "Philip K." . "philip@warpmail.net") (:keywords "comm") (:url . "https://git.sr.ht/~zge/autocrypt"))]) + (autodisass-java-bytecode . [(20151005 1612) nil "Automatically disassemble Java bytecode" tar ((:commit . "3d61dbe266133c950b39e880f78d142751c7dc4c") (:authors ("George Balatsouras <gbalats(at)gmail(dot)com>")) (:maintainer "George Balatsouras <gbalats(at)gmail(dot)com>") (:keywords "convenience" "data" "files"))]) + (autodisass-llvm-bitcode . [(20150411 125) nil "Automatically disassemble LLVM bitcode" tar ((:commit . "d2579e3a1427af2dc947c343e49eb3434078bf04") (:authors ("George Balatsouras <gbalats(at)gmail(dot)com>")) (:maintainer "George Balatsouras <gbalats(at)gmail(dot)com>") (:keywords "convenience" "data" "files"))]) + (autotest . [(20190331 2230) nil "ZenTest's autotest integration with emacs." single ((:commit . "2d76365d2aa13543121d5c623df465adb68b76f7") (:authors ("Ryan Davis" . "ryand-ruby@zenspider.com")) (:maintainer "Ryan Davis" . "ryand-ruby@zenspider.com") (:keywords "testing" "ruby" "convenience") (:url . "https://github.com/zenspider/elisp/blob/master/autotest.el"))]) + (autotetris-mode . [(20141114 1646) ((cl-lib (0 5))) "automatically play tetris" single ((:commit . "0c3a746dcc304a67d2a6e7ad4ef93f512486343a") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/autotetris-mode"))]) + (autothemer . [(20180920 923) ((dash (2 10 0)) (emacs (24)) (cl-lib (0 5))) "Conveniently define themes." single ((:commit . "8ec0c27a73b2d0a335eda63fde695a101e2956b2") (:authors ("Sebastian Sturm")) (:maintainer "Sebastian Sturm") (:url . "https://github.com/sebastiansturm/autothemer"))]) + (autumn-light-theme . [(20150515 1447) nil "A light color theme with muted, autumnal colors." single ((:commit . "1e3b2a43a3001e4a97a5ff073ba3f0d2ea3888f9") (:authors ("Adam Alpern" . "adam.alpern@gmail.com")) (:maintainer "Adam Alpern" . "adam.alpern@gmail.com") (:keywords "color" "theme") (:url . "http://github.com/aalpern/emacs-color-theme-autumn-light"))]) + (avandu . [(20170101 1903) nil "Gateway to Tiny Tiny RSS" tar ((:commit . "f44588d8e747fa880411cb4542cc39962252b90a") (:authors ("Tom Willemse" . "tom@ryuslash.org")) (:maintainer "Tom Willemse" . "tom@ryuslash.org") (:keywords "net"))]) + (avk-emacs-themes . [(20210521 1051) nil "Collection of avk themes" tar ((:commit . "7b9b6517873c4d4d73e6e34ca56c54062db60759") (:authors ("Alex V. Koval" . "alex@koval.kharkov.ua")) (:maintainer "Alex V. Koval" . "alex@koval.kharkov.ua") (:keywords "theme") (:url . "https://github.com/avkoval/avk-emacs-themes"))]) + (avy . [(20201226 1734) ((emacs (24 1)) (cl-lib (0 5))) "Jump to arbitrary positions in visible text and select text quickly." single ((:commit . "e92cb37457b43336b765630dbfbea8ba4be601fa") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "point" "location") (:url . "https://github.com/abo-abo/avy"))]) + (avy-embark-collect . [(20210125 2115) ((emacs (25 1)) (embark (0 9)) (avy (0 5))) "Use avy to jump to Embark Collect entries" single ((:commit . "ef609bf15368a68c4eb3c46fd8cc1bb623b6b83e") (:authors ("Omar Antolín Camarena" . "omar@matem.unam.mx")) (:maintainer "Omar Antolín Camarena" . "omar@matem.unam.mx") (:keywords "convenience") (:url . "https://github.com/oantolin/embark"))]) + (avy-flycheck . [(20160720 1500) ((emacs (24 1)) (flycheck (0 14)) (seq (1 11)) (avy (0 4 0))) "Jump to and fix syntax errors using `flycheck' with `avy' interface" single ((:commit . "5522f3bbbed1801d9278ed696ec0cbba38352985") (:authors ("Xu Ma" . "magicdirac@gmail.com")) (:maintainer "Xu Ma" . "magicdirac@gmail.com") (:keywords "tools" "convenience" "avy" "flycheck") (:url . "https://github.com/magicdirac/avy-flycheck"))]) + (avy-menu . [(20210321 1732) ((emacs (24 3)) (avy (0 4 0))) "Library providing avy-powered popup menu" single ((:commit . "2c5e0c08d6cb27c213a8eda5c7033e3ff2aa9661") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:keywords "popup" "menu") (:url . "https://github.com/mrkkrp/avy-menu"))]) + (avy-migemo . [(20180716 1455) ((emacs (24 4)) (avy (0 4 0)) (migemo (1 9))) "avy with migemo" tar ((:commit . "922a6dd82c0bfa316b0fbb56a9d4dd4ffa5707e7") (:authors ("momomo5717")) (:maintainer "momomo5717") (:keywords "avy" "migemo") (:url . "https://github.com/momomo5717/avy-migemo"))]) + (avy-zap . [(20190801 329) ((avy (0 2 0))) "Zap to char using `avy'" single ((:commit . "7c8d1f40e43d03e2f6c1696bfa547526528ce8cb") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions") (:url . "https://github.com/cute-jumper/avy-zap"))]) + (aws-ec2 . [(20161007 1914) ((emacs (24 4)) (dash (2 12 1)) (tblui (0 1 0))) "Manage AWS EC2 instances" single ((:commit . "5601d4f268fc34b86a02ca90cde7d3771619a368") (:authors ("Yuki Inoue <inouetakahiroki _at_ gmail.com>")) (:maintainer "Yuki Inoue <inouetakahiroki _at_ gmail.com>") (:url . "https://github.com/Yuki-Inoue/aws.el"))]) + (aws-snippets . [(20191203 1553) ((yasnippet (0 8 0))) "Yasnippets for AWS" tar ((:commit . "557d19a0bc486e0fddb597b2be5087769d9bd47e") (:keywords "snippets"))]) + (awscli-capf . [(20190930 1517) ((emacs (26))) "Completion at point function for the AWS CLI" single ((:commit . "eadfb26b35802ae8164565581e4a9c4d0280a7b5") (:authors ("Sebastian Monia" . "smonia@outlook.com")) (:maintainer "Sebastian Monia" . "smonia@outlook.com") (:keywords "tools" "convenience" "abbrev") (:url . "https://github.com/sebasmonia/awscli-capf.git"))]) + (axe . [(20201113 2237) ((emacs (25 1)) (hmac (0 0)) (request (0 3 2)) (s (1 12 0)) (xmlgen (0 5)) (dash (2 17 0)) (mimetypes (1 0))) "AWS Extensions" tar ((:commit . "f6fb37f6035605755be41d018ca8b70caa2bc75a") (:authors ("Craig Niles <niles.c at gmail.com>")) (:maintainer "Craig Niles <niles.c at gmail.com>") (:url . "https://github.com/cniles/axe"))]) + (axiom-environment . [(20210312 2248) ((emacs (24 2))) "An environment for using Axiom/OpenAxiom/FriCAS" tar ((:commit . "ac8228a702290732ba12c5d13b38576a57afb0d6") (:authors ("Paul Onions" . "paul.onions@acm.org")) (:maintainer "Paul Onions" . "paul.onions@acm.org") (:keywords "axiom" "openaxiom" "fricas"))]) + (ayu-theme . [(20200521 1157) ((emacs (24 1))) "Ayu theme" tar ((:commit . "ed98a9f41d9f0e08458ee71cc1038f66c50e1979") (:authors ("Tran Anh Vu")) (:maintainer "Tran Anh Vu") (:keywords "lisp" "theme" "emacs") (:url . "https://github.com/vutran1710/Ayu-Theme-Emacs"))]) + (babel . [(20210612 640) nil "interface to web translation services such as Babelfish" single ((:commit . "946e69c61188bc41793402ac48466d8967ddb43d") (:authors ("Juergen Hoetzel" . "juergen@hoetzel.info") ("Eric Marsden" . "emarsden@laas.fr")) (:maintainer "Juergen Hoetzel" . "juergen@hoetzel.info") (:keywords "translation" "web") (:url . "http://github.com/juergenhoetzel/babel"))]) + (babel-repl . [(20160504 2201) ((emacs (24))) "Run babel REPL" single ((:commit . "e619c16e349a1ee7bd0ee0d7f3650d33bff73fc3") (:authors ("Hung Phan")) (:maintainer "Hung Phan") (:keywords "babel" "javascript" "es6") (:url . "https://github.com/hung-phan/babel-repl/"))]) + (back-button . [(20150804 2004) ((nav-flash (1 0 0)) (smartrep (0 0 3)) (ucs-utils (0 7 2)) (list-utils (0 4 2)) (persistent-soft (0 8 8)) (pcache (0 2 3))) "Visual navigation through mark rings" single ((:commit . "98d92984a740acd1547bd7ed05cca0affdb21c3e") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "convenience" "navigation" "interface") (:url . "http://github.com/rolandwalker/back-button"))]) + (backlight . [(20210513 129) ((emacs (24 3))) "backlight brightness adjustment on GNU/Linux" single ((:commit . "b6826a60440d8bf440618e3cdafb40158de920e6") (:authors ("Michael Schuldt" . "mbschuldt@gmail.com")) (:maintainer "Michael Schuldt" . "mbschuldt@gmail.com") (:keywords "hardware") (:url . "https://github.com/mschuldt/backlight.el"))]) + (backline . [(20200104 1851) ((emacs (25 1)) (outline-minor-faces (0 1 2))) "Preserve appearance of outline headings" single ((:commit . "dc541a6daf82ab73774904ae9ccecd13e3c2af48") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "outlines") (:url . "https://github.com/tarsius/backline"))]) + (backup-each-save . [(20180227 557) nil "backup each savepoint of a file" single ((:commit . "3c414b9d6b278911c95c5b8b71819e6af6f8a02a") (:authors ("Benjamin Rutt" . "brutt@bloomington.in.us")) (:maintainer "Conor Nash" . "conor@nashcobusinessservicesllc.com"))]) + (backup-walker . [(20130720 1516) nil "quickly traverse all backups of a file" single ((:commit . "934a4128c122972ac32bb9952addf279a60a94da") (:authors ("Le Wang")) (:maintainer "Le Wang") (:keywords "backup") (:url . "https://github.com/lewang/backup-walker"))]) + (backward-forward . [(20161229 550) ((emacs (24 5))) "navigation backwards and forwards across marks" single ((:commit . "58489957a62a0da25dfb5df902624d2548d800b4") (:authors ("Currell Berry" . "currellberry@gmail.com")) (:maintainer "Currell Berry" . "currellberry@gmail.com") (:keywords "navigation" "convenience" "backward" "forward") (:url . "https://gitlab.com/vancan1ty/emacs-backward-forward/tree/master"))]) + (badger-theme . [(20140717 232) nil "A dark theme for Emacs 24." single ((:commit . "493d672d5a5478976da7d5ca752008cc7837c57f") (:authors ("Cody Canning" . "cocanning11@gmail.com")) (:maintainer "Cody Canning" . "cocanning11@gmail.com") (:url . "https://github.com/ccann/badger-theme"))]) + (badwolf-theme . [(20161004 715) ((emacs (24))) "Bad Wolf color theme" single ((:commit . "ea01a3d9358e968f75e3ed15dec6a2a96ce3d9a1") (:authors ("bkruczyk" . "bartlomiej.kruczyk@gmail.com")) (:maintainer "bkruczyk" . "bartlomiej.kruczyk@gmail.com") (:keywords "themes") (:url . "https://github.com/bkruczyk/badwolf-emacs"))]) + (baff . [(20200824 1807) ((emacs (24 3)) (f (0 20 0))) "Create a byte array from a file" single ((:commit . "7af72db9c6e542ed2b60952933113d0aa86728cf") (:authors ("Dave Footitt" . "dave.footitt@gmail.com")) (:maintainer "Dave Footitt" . "dave.footitt@gmail.com") (:keywords "convenience" "usability") (:url . "https://github.com/dave-f/baff/"))]) + (baidu-translate . [(20190817 1318) nil "A plugin using baidu-translate-api" single ((:commit . "b04a74d09ff5e3fbefd1b39b2abe79a9e272321a") (:authors (nil . "<LiShizhen gsu4017@gmail.com>")) (:maintainer nil . "<LiShizhen gsu4017@gmail.com>") (:keywords "docs") (:url . "https://github.com/liShiZhensPi/baidu-translate"))]) + (balanced-windows . [(20190903 1120) ((emacs (25))) "Keep windows balanced" single ((:commit . "1da5354ad8a9235d13928e2ee0863f3642ccdd13") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee") (:keywords "convenience") (:url . "https://github.com/wbolster/emacs-balanced-windows"))]) + (banner-comment . [(20190606 1809) ((emacs (24 4))) "For producing banner comments." single ((:commit . "35d3315683d3f97605207691b77e9f447af18fe2") (:authors ("James Ferguson" . "james@faff.org")) (:maintainer "James Ferguson" . "james@faff.org") (:keywords "convenience") (:url . "https://github.com/WJCFerguson/banner-comment"))]) + (bap-mode . [(20200128 1354) nil "Major-mode for BAP's IR" single ((:commit . "8969679f60db0aa918d35f40d959c0a9c723b111") (:authors ("Thomas Barabosch <http://github/tbarabosch>")) (:maintainer "Thomas Barabosch" . "thomas.barabosch@fkie.fraunhofer.de") (:keywords "languages") (:url . "https://github.com/fkie-cad/bap-mode"))]) + (bar-cursor . [(20201204 2244) nil "package used to switch block cursor to a bar" single ((:commit . "78f195b6db63459033c4f1c7e7add5d82f3ce424") (:authors ("Joe Casadonte" . "emacs@northbound-train.com")) (:maintainer "Andrew Johnson" . "andrew@andrewjamesjohnson.com") (:keywords "files") (:url . "https://github.com/ajsquared/bar-cursor"))]) + (bart-mode . [(20190601 1004) ((emacs (24 3))) "Real time BART departures info." single ((:commit . "f70b6c42452e47c0c6b3ebd4c90e555a9bedeec7") (:authors ("Michael Schuldt" . "mbschuldt@gmail.com")) (:maintainer "Michael Schuldt" . "mbschuldt@gmail.com") (:keywords "convenience" "transit") (:url . "https://github.com/mschuldt/bart-mode"))]) + (base16-theme . [(20210506 1530) nil "Collection of themes built on combinations of 16 base colors" tar ((:commit . "59692942f34b9be0447a7766ad03115d04e79874") (:authors ("Kaleb Elwert" . "belak@coded.io") ("Neil Bhakta")) (:maintainer "Kaleb Elwert" . "belak@coded.io") (:url . "https://github.com/belak/base16-emacs"))]) + (bash-completion . [(20201011 916) ((emacs (24 3))) "BASH completion for the shell buffer" single ((:commit . "65e54c6f9c0ffebf94f7c505694bd249b9b53d32") (:authors ("Stephane Zermatten" . "szermatt@gmx.net")) (:maintainer "Stephane Zermatten" . "szermatt@gmail.com") (:keywords "shell" "bash" "bash-completion") (:url . "http://github.com/szermatt/emacs-bash-completion"))]) + (basic-c-compile . [(20170302 1112) ((cl-lib (0 5)) (f (0 19 0))) "Quickly create a Makefile, compile and run C." single ((:commit . "0129786aeee50d7bb0020d9fc2b7508875d403e8") (:authors ("Nick Spain" . "nicholas.spain96@gmail.com")) (:maintainer "Nick Spain" . "nicholas.spain96@gmail.com") (:keywords "c" "makefile" "compilation" "convenience") (:url . "https://github.com/nick96/basic-c-compile"))]) + (basic-ide . [(20200429 1104) ((emacs (25)) (basic-mode (0 4 2)) (company (0 9 12)) (flycheck (0 22)) (dash (2 12 0)) (f (0 17 0))) "BASIC IDE c64" single ((:commit . "1d026b6ae70db9cde36596dcf46b101058a2e004") (:authors ("Fermin MF" . "fmfs@posteo.net")) (:maintainer "Fermin MF" . "fmfs@posteo.net") (:keywords "languages" "basic") (:url . "https://gitlab.com/sasanidas/emacs-c64-basic-ide"))]) + (basic-mode . [(20210316 1253) ((seq (2 20)) (emacs (24 3))) "major mode for editing BASIC code" single ((:commit . "eaa5f24d2fb303d9e5d7de2a28c7c18b01532ab6") (:authors ("Johan Dykstrom")) (:maintainer "Johan Dykstrom") (:keywords "basic" "languages") (:url . "https://github.com/dykstrom/basic-mode"))]) + (basic-theme . [(20160817 827) ((emacs (24))) "Minimalistic light color theme" single ((:commit . "e2a855bd39f4b78296228d4b790f9123156f7d7e") (:authors ("Felix Geller" . "fgeller@gmail.com")) (:maintainer "Felix Geller" . "fgeller@gmail.com") (:keywords "theme" "basic" "minimal" "colors") (:url . "http://github.com/fgeller/basic-theme.el"))]) + (bats-mode . [(20160514 615) nil "Emacs mode for editing and running Bats tests" single ((:commit . "d519f7c89f5ae17dfc33400596df4564b478315f") (:authors ("Doug MacEachern")) (:maintainer "Doug MacEachern") (:keywords "bats" "tests") (:url . "https://github.com/dougm/bats-mode"))]) + (battery-notifier . [(20210521 1238) ((alert (1 3))) "Notify when battery capacity is low" single ((:commit . "ae2043db954e131d9de7347ab1a6107fd07e8893") (:authors ("Jason Johnson" . "jason@fullsteamlabs.com")) (:maintainer "Jason Johnson" . "jason@fullsteamlabs.com") (:keywords "hardware" "battery") (:url . "https://github.com/jasonmj/battery-notifier"))]) + (battle-haxe . [(20210219 354) ((emacs (25)) (company (0 9 9)) (helm (3 0)) (async (1 9 3)) (cl-lib (0 5)) (dash (2 18 0)) (s (1 10 0)) (f (0 19 0))) "A Haxe development system, with code completion and more" single ((:commit . "2f32c81dcecfc68fd410cb9d2aca303d6e3028c7") (:authors ("Alon Tzarafi " . "alontzarafi@gmail.com")) (:maintainer "Alon Tzarafi " . "alontzarafi@gmail.com") (:keywords "programming" "languages" "completion") (:url . "https://github.com/AlonTzarafi/battle-haxe"))]) + (bazel . [(20210605 906) ((emacs (26 1))) "Bazel support for Emacs" single ((:commit . "667554f76696a3cbb50c4c01b121c1aef882195a") (:keywords "build tools" "languages") (:url . "https://github.com/bazelbuild/emacs-bazel-mode"))]) + (bbcode-mode . [(20190304 2122) ((emacs (24)) (cl-lib (0 5))) "Major mode for phpBB posts (BBCode markup)" single ((:commit . "e16619c80ea21154b4a4ccc2e13d0077e97c9caf") (:authors ("Eric James Michael Ritz" . "lobbyjones@gmail.com")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "bbcode" "languages") (:url . "https://github.com/lassik/emacs-bbcode-mode"))]) + (bbdb . [(20210108 38) nil "The Insidious Big Brother Database for GNU Emacs" tar ((:commit . "03c9ab00642fd54d7fb601f95a094b8b7f0eefb0") (:maintainer "Roland Winkler" . "winkler@gnu.org"))]) + (bbdb- . [(20140221 2354) ((bbdb (20140123 1541)) (log4e (0 2 0)) (yaxception (0 1))) "provide interface for more easily search/choice than BBDB." single ((:commit . "2839e84c894de2513af41053e80a277a1b483d22") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "bbdb" "news" "mail") (:url . "https://github.com/aki2o/bbdb-"))]) + (bbdb-csv-import . [(20140802 1142) ((pcsv (1 3 3)) (dash (2 5 0)) (bbdb (20140412 1949))) "import csv to bbdb version 3+" single ((:commit . "dc9e722d1c1fcd55b71625ee3f05a4921851d186") (:authors ("Ian Kelling" . "ian@iankelling.org")) (:maintainer "Ian Kelling" . "ian@iankelling.org") (:keywords "csv" "util" "bbdb") (:url . "https://gitlab.com/iankelling/bbdb-csv-import"))]) + (bbdb-ext . [(20151220 2013) ((bbdb (2 36))) "Extra commands for BBDB" single ((:commit . "fee97b1b3faa83edaea00fbc5ad3cbca5e791a55") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:keywords "extensions") (:url . "https://github.com/vapniks/bbdb-ext"))]) + (bbdb-vcard . [(20210325 2208) ((bbdb (3 0))) "vCard import/export for BBDB" tar ((:commit . "113c66115ce68316e209f51ebce56de8dded3606") (:authors ("Bert Burgemeister" . "trebbu@googlemail.com") ("Toke Høiland-Jørgensen") ("Kevin Brubeck Unhammer") ("Steve Purcell") ("Vincent Geddes" . "vincent.geddes@gmail.com")) (:maintainer "Bert Burgemeister" . "trebbu@googlemail.com") (:keywords "data" "calendar" "mail" "news") (:url . "https://github.com/tohojo/bbdb-vcard"))]) + (bbdb2erc . [(20190822 907) ((bbdb (3 0))) "make bbdb show if pal is online with ERC, click i to chat" single ((:commit . "40b89e961762af3e7ade3a1844a9fbcd4084ac65") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org") (:keywords "irc" "contacts" "chat" "client" "internet"))]) + (bbyac . [(20180206 1441) ((browse-kill-ring (1 3)) (cl-lib (0 5))) "Type a little Bit, and Bang! You Are Completed." tar ((:commit . "9f0de9cad13801891ffb590dc09f51ff9a7cb225") (:authors ("Bao Haojun" . "baohaojun@gmail.com")) (:maintainer "Bao Haojun" . "baohaojun@gmail.com") (:keywords "abbrev") (:url . "https://github.com/baohaojun/bbyac"))]) + (beacon . [(20190104 1931) ((seq (2 14))) "Highlight the cursor whenever the window scrolls" single ((:commit . "bde78180c678b233c94321394f46a81dc6dce1da") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") (:keywords "convenience") (:url . "https://github.com/Malabarba/beacon"))]) + (beeminder . [(20201227 1533) ((emacs (24 3)) (seq (2 16)) (org (7))) "Emacs interface for Beeminder" tar ((:commit . "161d9c94c594614a01cb08219693d9e000af4f69") (:authors ("Phil Newton" . "phil@sodaware.net")) (:maintainer "Phil Newton" . "phil@sodaware.net") (:keywords "tools" "beeminder") (:url . "http://www.philnewton.net/code/beeminder-el/"))]) + (beginend . [(20210504 341) ((emacs (25 3))) "Redefine M-< and M-> for some modes" single ((:commit . "4b4e4808dc3248ea61b3d8bdd7c6b73edd3b6902") (:url . "https://github.com/DamienCassou/beginend"))]) + (belarus-holidays . [(20190102 1343) nil "Belarus holidays whith transfers" single ((:commit . "35a18273e19edc3b4c761030ffbd11116483b83e") (:authors ("Yauhen Makei" . "yauhen.makei@gmail.com")) (:maintainer "Yauhen Makei" . "yauhen.makei@gmail.com") (:url . "http://bitbucket.org/EugeneMakei/belarus-holidays.el"))]) + (benchmark-init . [(20150905 938) nil "Benchmarks Emacs require and load calls" tar ((:commit . "7a0f263282bbc86b01b662636306f22813082647") (:authors ("Steve Purcell")) (:maintainer "David Holm" . "dholmster@gmail.com") (:keywords "benchmark"))]) + (benchstat . [(20171014 312) nil "proper benchmarking made simple" single ((:commit . "a5b67cf7972ca2bbc9f5bc6a0f521ab02b76d4f0") (:authors ("Iskander Sharipov" . "quasilyte@gmail.com")) (:maintainer "Iskander Sharipov" . "quasilyte@gmail.com") (:keywords "lisp") (:url . "https://github.com/Quasilyte/benchstat.el"))]) + (bencoding . [(20200331 1102) ((emacs (25 1))) "Bencoding decoding and encoding" single ((:commit . "1e16ccfd5c6560a83ae2926afe4a5076a541d3d6") (:authors ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:keywords "tools") (:url . "https://github.com/xuchunyang/bencoding.el"))]) + (bento . [(20191024 2123) ((flycheck (0 22)) (emacs (25 1)) (f (0 20))) "Flycheck integration for the Bento code checker" single ((:commit . "31546a03475fc2b3ffd3159fe1beda55f7762224") (:authors ("Ash Zahlen" . "ash@returntocorp.com")) (:maintainer "Ash Zahlen" . "ash@returntocorp.com") (:url . "https://github.com/returntocorp/bento-emacs"))]) + (berrys-theme . [(20191201 1609) ((emacs (24 1))) "A light, clean and elegant theme" single ((:commit . "888a14206b2fb3dc45b5273aeb05075f3e0b5f60") (:authors ("Slava Buzin" . "v8v.buzin@gmail.com")) (:maintainer "Slava Buzin" . "v8v.buzin@gmail.com") (:url . "https://github.com/vbuzin/berrys-theme"))]) + (bert . [(20131117 1014) nil "BERT serialization library for Emacs" single ((:commit . "a3eec6980a725aa4abd2019e4c00246450260490") (:authors ("Oleksandr Manzyuk" . "manzyuk@gmail.com")) (:maintainer "Oleksandr Manzyuk" . "manzyuk@gmail.com") (:keywords "comm" "data"))]) + (better-defaults . [(20210222 1928) ((emacs (25 1))) "Fixing weird quirks and poor defaults" single ((:commit . "4c5409406ee35c5ba46880c6cfe98df4b14dc631") (:authors ("Phil Hagelberg")) (:maintainer "Phil Hagelberg") (:keywords "convenience") (:url . "https://github.com/technomancy/better-defaults"))]) + (better-jumper . [(20210110 1317) ((emacs (25 1))) "configurable jump list" single ((:commit . "411ecdf6e7a3e1b4ced7605070d2309e5fc46556") (:authors ("Bryan Gilbert <http://github/gilbertw1>")) (:maintainer "Bryan Gilbert" . "bryan@bryan.sh") (:keywords "convenience" "jump" "history" "evil") (:url . "https://github.com/gilbertw1/better-jumper"))]) + (better-scroll . [(20201013 1355) ((emacs (24 3))) "Improve user experience when scrolling window" single ((:commit . "eaa8dae6f048fcff773f3cca2e3113c52ad0463f") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/better-scroll"))]) + (better-shell . [(20191025 1737) ((emacs (24 4))) "Better shell management" single ((:commit . "70c787b981caeef8c5f8012b170eb7b9f167cd13") (:authors ("Russell Black" . "killdash9@github")) (:maintainer "Russell Black" . "killdash9@github") (:keywords "convenience") (:url . "https://github.com/killdash9/better-shell"))]) + (bf-mode . [(20130403 1442) nil "Browse file persistently on dired" single ((:commit . "7cc4d09aed64d9db6be95646f5f5067de68f8895") (:authors ("isojin")) (:maintainer "myuhe <yuhei.maeda_at_gmail.com>") (:keywords "convenience") (:url . "https://github.com/emacs-jp/bf-mode"))]) + (bfbuilder . [(20210228 1740) ((cl-lib (0 3)) (emacs (24 4))) "A brainfuck development environment with interactive debugger" single ((:commit . "689f320a9a1326cdeff43b8538e0d739f8519c4b") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://zk-phi.gitub.io/"))]) + (bibclean-format . [(20190302 2017) ((emacs (24 3)) (reformatter (0 3))) "Reformat BibTeX and Scribe using bibclean" single ((:commit . "b4003950a925d1c659bc359ab5e88e4441775d77") (:authors ("Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com")) (:maintainer "Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com") (:keywords "languages") (:url . "https://github.com/peterwvj/bibclean-format"))]) + (biblio . [(20210418 406) ((emacs (24 3)) (biblio-core (0 2))) "Browse and import bibliographic references from CrossRef, arXiv, DBLP, HAL, Dissemin, and doi.org" tar ((:commit . "517ec18f00f91b61481214b178f7ae0b8fbc499b") (:authors ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com") (:keywords "bib" "tex" "convenience" "hypermedia") (:url . "https://github.com/cpitclaudel/biblio.el"))]) + (biblio-bibsonomy . [(20190105 1200) ((emacs (24 4)) (biblio-core (0 2))) "Lookup bibliographic entries from Bibsonomy" single ((:commit . "778cc944db3c6dababe2e7fec5877fba42e8c00d") (:authors ("Andreas Jansson and contributors")) (:maintainer "Andreas Jansson and contributors") (:keywords "bib" "tex" "bibsonomy") (:url . "http://github.com/andreasjansson/biblio-bibsonomy/"))]) + (biblio-core . [(20210418 406) ((emacs (24 3)) (let-alist (1 0 4)) (seq (1 11)) (dash (2 12 1))) "A framework for looking up and displaying bibliographic entries" single ((:commit . "517ec18f00f91b61481214b178f7ae0b8fbc499b") (:authors ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com") (:keywords "bib" "tex" "convenience" "hypermedia") (:url . "https://github.com/cpitclaudel/biblio.el"))]) + (bibliothek . [(20190124 1828) ((emacs (24 4)) (pdf-tools (0 70)) (a (0 1 0 -3 4))) "Managing a digital library of PDFs" single ((:commit . "246120647e28a27506ca0894ba98e371086881fd") (:authors ("Göktuğ Kayaalp" . "self@gkayaalp.com")) (:maintainer "Göktuğ Kayaalp" . "self@gkayaalp.com") (:keywords "tools") (:url . "https://dev.gkayaalp.com/elisp/index.html#bibliothek-el"))]) + (bibretrieve . [(20191124 1855) ((auctex (11 87)) (emacs (24 3))) "Retrieve BibTeX entries from the internet" tar ((:commit . "81dc8e0db3629cc180eafb2bc34b60dcd8980316") (:authors ("Antonio Sartori")) (:maintainer "Pavel Zorin-Kranich" . "pzorin@uni-bonn.de") (:keywords "bibtex" "bibliography" "mathscinet" "arxiv" "zbmath") (:url . "https://github.com/pzorin/bibretrieve"))]) + (bibslurp . [(20151202 2346) ((s (1 6 0)) (dash (1 5 0))) "retrieve BibTeX entries from NASA ADS" single ((:commit . "0116bbb04840d20a6b087e6d9c921bb1c2489a8f") (:keywords "bibliography" "nasa ads") (:url . "https://github.com/mkmcc/bibslurp"))]) + (bibtex-actions . [(20210607 1230) ((emacs (26 3)) (bibtex-completion (1 0))) "Biblographic commands based on completing-read" single ((:commit . "07a3c64b12673b722a21c932eb85c595dea0c863") (:authors ("Bruce D'Arcus <https://github.com/bdarcus>")) (:maintainer "Bruce D'Arcus <https://github.com/bdarcus>") (:url . "https://github.com/bdarcus/bibtex-actions"))]) + (bibtex-completion . [(20210408 1649) ((parsebib (1 0)) (s (1 9 0)) (dash (2 6 0)) (f (0 16 2)) (cl-lib (0 5)) (biblio (0 2)) (emacs (26 1))) "A BibTeX backend for completion frameworks" single ((:commit . "9f6ea920a49457d85096caa0e61f086a42b2908e") (:authors ("Titus von der Malsburg" . "malsburg@posteo.de") ("Justin Burkett" . "justin@burkett.cc")) (:maintainer "Titus von der Malsburg" . "malsburg@posteo.de") (:url . "https://github.com/tmalsburg/helm-bibtex"))]) + (bibtex-utils . [(20190703 2117) nil "Provides utilities for extending BibTeX mode" single ((:commit . "26a8f0909b6adbf545a2b5e57ce7f779bf7a65af") (:authors ("Tyler Smith" . "tyler@plantarum.ca")) (:maintainer "Tyler Smith" . "tyler@plantarum.ca") (:keywords "bibtex") (:url . "https://github.com/plantarum/bibtex-utils"))]) + (bicycle . [(20201028 1854) ((emacs (25 1))) "cycle outline and code visibility" single ((:commit . "e3fbc0737bb5f891e4d57d048bbc1fe17401f17f") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "outlines") (:url . "https://github.com/tarsius/bicycle"))]) + (bifocal . [(20200325 539) ((emacs (24 4))) "Split-screen scrolling for comint-mode buffers" single ((:commit . "de8d09b08b0b30714c4f9b98c97e9577d47b9be6") (:keywords "frames" "processes") (:url . "https://github.com/riscy/bifocal-mode"))]) + (binclock . [(20170802 1116) ((cl-lib (0 5))) "Display the current time using a binary clock." single ((:commit . "87042230d7f3fe3e9a77fae0dbab7d8f7e7794ad") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "games" "time" "display") (:url . "https://github.com/davep/binclock.el"))]) + (bind-chord . [(20171204 2010) ((bind-key (1 0)) (key-chord (0 6))) "key-chord binding helper for use-package-chords" single ((:commit . "a7422fb8ab1baee19adb2717b5b47b9c3812a84c") (:authors ("Justin Talbott" . "justin@waymondo.com")) (:maintainer "Justin Talbott" . "justin@waymondo.com") (:keywords "convenience" "tools" "extensions") (:url . "https://github.com/waymondo/use-package-chords"))]) + (bind-key . [(20210210 1609) nil "A simple way to manage personal keybindings" single ((:commit . "a7422fb8ab1baee19adb2717b5b47b9c3812a84c") (:authors ("John Wiegley" . "johnw@newartisans.com")) (:maintainer "John Wiegley" . "johnw@newartisans.com") (:keywords "keys" "keybinding" "config" "dotemacs") (:url . "https://github.com/jwiegley/use-package"))]) + (bind-map . [(20161207 1511) ((emacs (24 3))) "Bind personal keymaps in multiple locations" single ((:commit . "bf4181e3a41463684adfffc6c5c305b30480e30f") (:authors ("Justin Burkett" . "justin@burkett.cc")) (:maintainer "Justin Burkett" . "justin@burkett.cc") (:url . "https://github.com/justbur/emacs-bind-map"))]) + (binder . [(20210131 1227) ((emacs (24 4)) (seq (2 20))) "Global minor mode to facilitate multi-file writing projects" tar ((:commit . "52f1c11b01a5f7e7a470a73dec4c3335dea4124b") (:authors ("Paul W. Rankin" . "pwr@bydasein.com")) (:maintainer "Paul W. Rankin" . "pwr@bydasein.com") (:keywords "files" "outlines" "wp" "text") (:url . "https://github.com/rnkn/binder"))]) + (bing-dict . [(20200216 110) nil "Minimalists' English-Chinese Bing dictionary" tar ((:commit . "1d581aaa9622b34f8fb83af5579fa252aa24cfef") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions") (:url . "https://github.com/cute-jumper/bing-dict.el"))]) + (birds-of-paradise-plus-theme . [(20130419 2129) nil "A brown/orange light-on-dark theme for Emacs 24 (deftheme)." single ((:commit . "bb9f9d4ef7f7872a388ec4eee1253069adcadb6f") (:authors ("Jim Myhrberg" . "contact@jimeh.me")) (:maintainer "Jim Myhrberg" . "contact@jimeh.me") (:keywords "themes") (:url . "https://github.com/jimeh/birds-of-paradise-plus-theme.el"))]) + (bison-mode . [(20210527 717) nil "Major mode for editing bison, yacc and lex files." single ((:commit . "4f2e20394a475931409618c1635e9c9f1cf07d9c") (:authors ("Eric Beuscher" . "beuscher@eecs.tulane.edu")) (:maintainer "Eric Beuscher" . "beuscher@eecs.tulane.edu") (:keywords "bison-mode" "yacc-mode"))]) + (bitbake . [(20190107 1155) ((emacs (24 1)) (dash (2 6 0)) (mmm-mode (0 5 4)) (s (1 10 0))) "Running bitbake from emacs" single ((:commit . "4896ff48712a6be37009605ba697a7104462e2fd") (:authors ("Damien Merenne")) (:maintainer "Damien Merenne") (:keywords "convenience") (:url . "https://github.com/canatella/bitbake-el"))]) + (bitbucket . [(20170405 446) ((emacs (24)) (request (0 1 0)) (s (1 9 0))) "Bitbucket API wrapper" tar ((:commit . "5e663da1bd38a14c1ecf4d66a79d4321ac833bcf") (:authors ("2017 Tjaart van der Walt" . "tjaart@tjaart.co.za")) (:maintainer "2017 Tjaart van der Walt" . "tjaart@tjaart.co.za") (:keywords "bitbucket") (:url . "http://github.com/tjaartvdwalt/bitbucket.el/"))]) + (bitlbee . [(20151203 0) nil "Help get Bitlbee (http://www.bitlbee.org) up and running." single ((:commit . "3a92a4119e0c007df2c7dcf1b1c3a5f23ee40e05"))]) + (blackboard-bold-mode . [(20160813 206) ((cl-lib (0 5))) "Easily insert Unicode mathematical double-struck characters" single ((:commit . "5299cb064ba71baa3e331b8560bf8dd38cbbc4ed") (:authors ("Grant Rettke" . "gcr@wisdomandwonder.com")) (:maintainer nil . "<gcr@wisdomandwonder.com>") (:keywords "unicode" "double struck" "blackboard bold" "math" "mathematical") (:url . "https://github.com/grettke/blackboard-bold-mode"))]) + (blackboard-theme . [(20161216 656) ((emacs (24))) "TextMate Blackboard Theme" single ((:commit . "7a0d79410feb728ff5cce75c140fadc19a3f9a6d") (:authors ("Dong Zheng")) (:maintainer "Dong Zheng") (:url . "https://github.com/don9z/blackboard-theme"))]) + (blacken . [(20210406 813) ((emacs (25 2))) "Reformat python buffers using the \"black\" formatter" single ((:commit . "880cf502198753643a3e2ccd4131ee6973be2e8a") (:authors ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainer "Artem Malyshev" . "proofit404@gmail.com") (:url . "https://github.com/proofit404/blacken"))]) + (blackout . [(20200404 1550) ((emacs (26))) "Better mode lighter overriding" single ((:commit . "d99ab1aad84e4bd2bd4a499877764c213cce50ff") (:authors ("Radon Rosborough" . "radon.neon@gmail.com")) (:maintainer "Radon Rosborough" . "radon.neon@gmail.com") (:keywords "extensions") (:url . "https://github.com/raxod502/blackout"))]) + (blgrep . [(20150401 1416) ((clmemo (20140321 715))) "Block grep" tar ((:commit . "605beda210610a5829750a987f5fcebea97af546") (:authors ("Masayuki Ataka" . "masayuki.ataka@gmail.com")) (:maintainer "Masayuki Ataka" . "masayuki.ataka@gmail.com") (:keywords "tools" "convenience"))]) + (blimp . [(20180903 2240) ((emacs (25)) (eimp (1 4 0))) "Bustling Image Manipulation Package" single ((:commit . "39562f02acc1113595cb253a85bb3b9da743ddd2") (:authors ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainer "Sebastian Wålinder" . "s.walinder@gmail.com") (:keywords "multimedia" "unix") (:url . "https://github.com/walseb/blimp"))]) + (bliss-theme . [(20170808 1307) ((emacs (24 0))) "an Emacs 24 theme based on Bliss (tmTheme)" single ((:commit . "c3cf6d8a666ab26909b7da158f9e94df71a5fbbf") (:authors ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))]) + (blitzmax-mode . [(20200415 1529) ((emacs (24 1))) "A major mode for editing BlitzMax source code" single ((:commit . "5f67bb3c8e4baf1f6881cc998f9f031641a7b08a") (:authors ("Phil Newton")) (:maintainer "Phil Newton") (:keywords "languages" "blitzmax") (:url . "https://www.sodaware.net/dev/tools/blitzmax-mode/"))]) + (bln-mode . [(20181121 918) nil "binary line navigation minor mode for cursor movement in long lines" single ((:commit . "a601b0bf975dd1432f6552ab6afe3f4f71133b4a") (:authors ("Maarten Grachten")) (:maintainer "Maarten Grachten") (:keywords "motion" "location" "cursor" "convenience") (:url . "https://github.com/mgrachten/bln-mode"))]) + (block-nav . [(20201005 202) ((emacs (25 1))) "Jump across indentation levels for quick navigation" single ((:commit . "d69acaa3d6c75bf4c518d8ab8896ad63580253fc") (:maintainer "Philip Dumaresq" . "phdumaresq@protonmail.com") (:keywords "convenience") (:url . "https://github.com/nixin72/block-nav.el"))]) + (blockdiag-mode . [(20160427 524) ((emacs (24 3))) "Major mode for editing blockdiag files" single ((:commit . "f3b21ba433d60327cebd103ae4492200750e24a9") (:authors ("xcezx" . "main.xcezx@gmail.com")) (:maintainer "xcezx" . "main.xcezx@gmail.com") (:url . "https://github.com/xcezx/xdiag-mode"))]) + (blog-admin . [(20170923 1409) ((ctable (0 1 1)) (s (1 10 0)) (f (0 17 3)) (names (20151201 0)) (cl-lib (0 5))) "Blog admin for emacs with hexo/org-page supported" tar ((:commit . "b5f2e1dad7d68ec903619f7280bb0bcb7e398a1e") (:authors (nil . "code.falling@gmail.com")) (:maintainer nil . "code.falling@gmail.com") (:keywords "tools" "blog" "org" "hexo" "org-page"))]) + (blog-minimal . [(20181021 849) ((ht (1 5)) (simple-httpd (1 4 6)) (mustache (0 22)) (s (1 11 0)) (org (9 0 3))) "a simple static site generator based on org mode" tar ((:commit . "356c878322258159021eecdd15757e11cf02e335") (:authors ("Thank Fly" . "thiefuniverses@gmail.com")) (:maintainer "Thank Fly" . "thiefuniverses@gmail.com") (:keywords "tools") (:url . "https://github.com/thiefuniverse/blog-minimal"))]) + (blox . [(20210225 1900) ((emacs (25 1))) "Interaction with Roblox tooling" single ((:commit . "2bf0e618451fb1da11263d8a35ffcd9210590c0a") (:authors ("Kenneth Loeffler" . "kenneth.loeffler@outlook.com")) (:maintainer "Kenneth Loeffler" . "kenneth.loeffler@outlook.com") (:keywords "roblox" "rojo" "tools") (:url . "https://github.com/kennethloeffler/blox"))]) + (bm . [(20210421 1351) nil "Visible bookmarks in buffer." tar ((:commit . "9a31c61f44e6f1033ca43bd7f3eb33ffdb2ca595") (:authors ("Jo Odland <jo.odland(at)gmail.com>")) (:maintainer "Jo Odland <jo.odland(at)gmail.com>") (:keywords "bookmark" "highlight" "faces" "persistent") (:url . "https://github.com/joodland/bm"))]) + (bmx-mode . [(20210319 620) ((emacs (25 1)) (cl-lib (0 5)) (company (0 9 4)) (dash (2 13 0)) (s (1 12 0))) "Batch Mode eXtras" single ((:commit . "6f008707efe0bb5646f0c1b0d6f57f0a8800e200") (:authors ("Jostein Kjønigsen" . "jostein@gmail.com")) (:maintainer "Jostein Kjønigsen" . "jostein@gmail.com") (:keywords "c" "convenience" "tools") (:url . "http://github.com/josteink/bmx-mode"))]) + (bnf-mode . [(20200323 1348) ((cl-lib (0 5)) (emacs (24 3))) "Major mode for editing BNF grammars." tar ((:commit . "2d1ee12f3ba6e75841066bf429d7bf836d4b89d7") (:authors ("Serghei Iakovlev" . "egrep@protonmail.ch")) (:maintainer "Serghei Iakovlev" . "egrep@protonmail.ch") (:keywords "languages") (:url . "https://github.com/sergeyklay/bnf-mode"))]) + (bnfc . [(20160605 1927) ((emacs (24 3))) "Define context-free grammars for the BNFC tool" single ((:commit . "1b58df1dd0cb9b81900632fb2843a03b94f56fdb") (:authors ("Jacob Mitchell" . "jmitchell@member.fsf.org")) (:maintainer "Jacob Mitchell" . "jmitchell@member.fsf.org") (:keywords "languages" "tools") (:url . "https://github.com/jmitchell/bnfc-mode"))]) + (bog . [(20201030 357) ((cl-lib (0 5))) "Extensions for research notes in Org mode" single ((:commit . "af929c164c4ffaee0c33ba97c06733f0ce9431d4") (:authors ("Kyle Meyer" . "kyle@kyleam.com")) (:maintainer "Kyle Meyer" . "kyle@kyleam.com") (:keywords "bib" "outlines") (:url . "https://github.com/kyleam/bog"))]) + (bolt-mode . [(20180310 810) ((emacs (24 3))) "Editing support for Bolt language" single ((:commit . "85a5a752bfbebb4aed884326c25db64c000e9934") (:authors ("Mikhail Pontus" . "mpontus@gmail.com")) (:maintainer "Mikhail Pontus" . "mpontus@gmail.com") (:keywords "languages") (:url . "https://github.com/mpontus/bolt-mode"))]) + (bongo . [(20201002 1020) ((cl-lib (0 5)) (emacs (24 1))) "play music with Emacs" tar ((:commit . "9e9629090262bba6d0003dabe5a375e47a4477f1"))]) + (bonjourmadame . [(20170919 1134) nil "Say \"Hello ma'am!\"" single ((:commit . "d3df185fce78aefa689fded8e56a654f0fde4ac0"))]) + (boogie-friends . [(20210323 1836) ((cl-lib (0 5)) (dash (2 10 0)) (flycheck (0 23)) (yasnippet (0 9 0 1)) (company (0 8 12))) "A collection of programming modes for Boogie, Dafny, and Z3 (SMTLIB v2)." tar ((:commit . "bc5572f796bc3ecafadadcbd93de73052304c856") (:authors ("Clément Pit--Claudel" . "clement.pitclaudel@live.com")) (:maintainer "Clément Pit--Claudel" . "clement.pitclaudel@live.com") (:keywords "convenience" "languages") (:url . "https://github.com/boogie-org/boogie-friends/"))]) + (bool-flip . [(20161215 1539) ((emacs (24 3))) "flip the boolean under the point" single ((:commit . "f58a9a7b9ab875bcfbd57c8262697ae404eb4485") (:authors ("Michael Brandt" . "michaelbrandt5@gmail.com")) (:maintainer "Michael Brandt" . "michaelbrandt5@gmail.com") (:keywords "boolean" "convenience" "usability") (:url . "http://github.com/michaeljb/bool-flip/"))]) + (boon . [(20210518 1244) ((emacs (25 1)) (dash (2 12 0)) (expand-region (0 10 0)) (multiple-cursors (1 3 0)) (pcre2el (1 8))) "Ergonomic Command Mode for Emacs." tar ((:commit . "db1cbdcdfb3ea246d0d0090534d998f7c9c19f4f"))]) + (borg . [(20210530 1158) ((emacs (26)) (epkg (3 3 0)) (magit (3 0 0))) "assimilate Emacs packages as Git submodules" tar ((:commit . "e2263534e16ed8bbc935ee466f6ad2acbe9c603e") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "tools") (:url . "https://github.com/emacscollective/borg"))]) + (borland-blue-theme . [(20160117 1321) ((emacs (24 1))) "Blue/yellow theme based on old DOS Borland/Turbo C IDE" single ((:commit . "db74eefebbc89d3c62575f8f50b319e87b4a3470") (:authors ("Alexey Veretennikov <alexey dot veretennikov at gmail dot com>")) (:maintainer "Alexey Veretennikov <alexey dot veretennikov at gmail dot com>") (:keywords "themes") (:url . "http://github.com/fourier/borland-blue-theme"))]) + (boron-theme . [(20170808 1308) ((emacs (24 0))) "an Emacs 24 theme based on Boron (tmTheme)" single ((:commit . "87ae1a765e07429fec25d2f29b004f84b52d2e0a") (:authors ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))]) + (boxquote . [(20200727 1203) ((cl-lib (0 5))) "Quote text with a semi-box." single ((:commit . "bdc6c84b9274b228dbc383a14abf9694157e869c") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "quoting") (:url . "https://github.com/davep/boxquote.el"))]) + (bpe . [(20141228 2205) ((emacs (24 1))) "Blog from Org mode to Blogger" single ((:commit . "7b5b25f83506e6c9f4075d3803fa32404943a189") (:authors ("Yuta Yamada <cokesboy\"at\"gmail.com>")) (:maintainer "Yuta Yamada <cokesboy\"at\"gmail.com>") (:keywords "blogger" "blog") (:url . "https://github.com/yuutayamada/bpe"))]) + (bpftrace-mode . [(20190608 2201) ((emacs (24 0))) "Major mode for editing bpftrace script files" single ((:commit . "181065e1f9ab4ec7096bafffe6818b0d7f5362b1") (:authors ("Jay Kamat" . "jaygkamat@gmail.com")) (:maintainer "Jay Kamat" . "jaygkamat@gmail.com") (:keywords "highlight" "c") (:url . "http://gitlab.com/jgkamat/bpftrace-mode"))]) + (bpr . [(20180220 1844) ((emacs (24))) "Background Process Runner" tar ((:commit . "7f3c787ed80ac0e83447192ac5450dfa7110ade1") (:authors ("Ilya Babanov" . "ilya-babanov@ya.ru")) (:maintainer "Ilya Babanov" . "ilya-babanov@ya.ru") (:keywords "background" "async" "process" "management") (:url . "https://github.com/ilya-babanov/emacs-bpr"))]) + (bracketed-paste . [(20160407 2348) ((emacs (24 3))) "bracketed paste mode support within emacs -nw" single ((:commit . "843ce3bbb63d560face889e13a57a2f7543957d5") (:authors ("Takeshi Banse" . "takebi@laafc.net")) (:maintainer "Takeshi Banse" . "takebi@laafc.net") (:keywords "terminals"))]) + (brainfuck-mode . [(20150113 842) ((langdoc (20130601 1450))) "Brainfuck mode for Emacs" single ((:commit . "36e69552bb3b97a4f888d362c59845651bd0d492") (:authors ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainer "Tomoya Tanjo" . "ttanjo@gmail.com") (:keywords "brainfuck" "langdoc") (:url . "https://github.com/tom-tan/brainfuck-mode/"))]) + (brazilian-holidays . [(20210302 107) ((emacs (26))) "Brazilian holidays" single ((:commit . "68811fd5f3e9d9c0572995c3ca46ead2c35eb421") (:authors ("Jaguaraquem A. Reinaldo" . "jaguar.adler@gmail.com")) (:maintainer "Jaguaraquem A. Reinaldo" . "jaguar.adler@gmail.com") (:keywords "calendar" "holidays" "brazilian") (:url . "https://github.com/jadler/brazilian-holidays"))]) + (brf . [(20210509 1534) ((fringe-helper (0 1 1)) (emacs (24 3))) "Add functionality from the editor Brief" tar ((:commit . "9e66643e1153133508bb1d63a21f3bd8f46908fd") (:authors ("Mike Woolley" . "mike@bulsara.com")) (:maintainer "Mike Woolley" . "mike@bulsara.com") (:keywords "brief" "crisp" "emulations") (:url . "https://bitbucket.org/MikeWoolley/brf-mode"))]) + (brightscript-mode . [(20200321 2126) ((emacs (26 3))) "Major mode for editing Brightscript files" single ((:commit . "3b34032bdde6a37b4566c45ce93cb38da21d4965") (:authors ("Daniel Mircea" . "daniel@viseztrance.com")) (:maintainer nil . "daniel@viseztrance.com") (:keywords "languages") (:url . "https://github.com/viseztrance/brightscript-mode"))]) + (broadcast . [(20151205 212) ((emacs (24 4))) "Links buffers together for simultaneous editing." single ((:commit . "f6f9cd2e0e3f8c31d6b8e7446c27eb0e50b25f16") (:authors ("Russell Black" . "killdash9@github")) (:maintainer "Russell Black" . "killdash9@github") (:keywords "convenience" "frames" "link" "cursors") (:url . "https://github.com/killdash9/broadcast.el"))]) + (browse-at-remote . [(20210603 802) ((f (0 17 2)) (s (1 9 0)) (cl-lib (0 5))) "Open github/gitlab/bitbucket/stash/gist/phab/sourcehut page from Emacs" single ((:commit . "cef26f2c063f2473af42d0e126c8613fe2f709e4") (:authors ("Rustem Muslimov" . "r.muslimov@gmail.com")) (:maintainer "Rustem Muslimov" . "r.muslimov@gmail.com") (:keywords "github" "gitlab" "bitbucket" "gist" "stash" "phabricator" "sourcehut" "pagure") (:url . "https://github.com/rmuslimov/browse-at-remote"))]) + (browse-kill-ring . [(20200210 921) nil "interactively insert items from kill-ring" single ((:commit . "c7a188a6148f6391b6926d25b9cf191d4a8b3f42") (:authors ("Colin Walters" . "walters@verbum.org")) (:maintainer "browse-kill-ring" . "browse-kill-ring@tonotdo.com") (:keywords "convenience") (:url . "https://github.com/browse-kill-ring/browse-kill-ring"))]) + (browse-url-dwim . [(20140731 1922) ((string-utils (0 3 2))) "Context-sensitive external browse URL or Internet search" single ((:commit . "3d611dbb167c286109ac53995ad68286d87aafb9") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "hypermedia") (:url . "http://github.com/rolandwalker/browse-url-dwim"))]) + (brutal-theme . [(20210226 1538) ((emacs (24 1))) "Brutalist theme" single ((:commit . "8173b7d041cccfa3e5bb3f3f85ec8c6109fd264b") (:authors ("Topi Kettunen" . "topi@kettunen.io")) (:maintainer "Topi Kettunen" . "topi@kettunen.io") (:url . "https://github.com/topikettunen/brutal-emacs"))]) + (brutalist-theme . [(20181023 1222) nil "Brutalist theme" tar ((:commit . "6568844b83dc916a5d6aa69960cbc85ded5f7d73") (:authors ("Gergely Nagy")) (:maintainer "Gergely Nagy") (:url . "https://git.madhouse-project.org/algernon/brutalist-theme.el"))]) + (bshell . [(20201219 139) ((emacs (26)) (buffer-manage (0 11))) "Manage and track multiple inferior shells" single ((:commit . "469c841f19f28c271b4f172b40f3f9ca830254df") (:authors ("Paul Landes")) (:maintainer "Paul Landes") (:keywords "unix" "interactive" "shell" "management") (:url . "https://github.com/plandes/bshell"))]) + (btc-ticker . [(20151113 1459) ((json (1 2)) (request (0 2 0))) "Shows latest bitcoin price" single ((:commit . "845235b545f070d0812cd1654cbaa4997565824f") (:authors ("Jorge Niedbalski R." . "jnr@metaklass.org")) (:maintainer "Jorge Niedbalski R." . "jnr@metaklass.org") (:keywords "news"))]) + (bts . [(20151109 1333) ((widget-mvc (0 0 2)) (log4e (0 3 0)) (yaxception (0 3 3)) (dash (2 9 0)) (s (1 9 0)) (pos-tip (0 4 5))) "A unified UI for various bug tracking systems" single ((:commit . "df42d58a36447697f93b56e69f5e700b2baef1f9") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "convenience") (:url . "https://github.com/aki2o/emacs-bts"))]) + (bts-github . [(20170401 1249) ((bts (0 0 1)) (gh (0 8 2))) "A plugin of bts.el for GitHub" single ((:commit . "ef2cf9202dc2128e5efdb613bfde9276a8cd95ad") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "convenience" "git" "github") (:url . "https://github.com/aki2o/emacs-bts-github"))]) + (bubbleberry-theme . [(20141017 944) ((emacs (24 1))) "A theme based on LightTable for Emacs24" single ((:commit . "22e9adf4586414024e4592972022ec297321b320") (:authors ("Jason Milkins" . "jasonm23@gmail.com") ("Gaurav Giri github.com/grvgr")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com") (:url . "https://github.com/jasonm23/emacs-bubbleberry-theme"))]) + (buckwalter . [(20191119 1950) nil "Write arabic using Buckwalter transliteration" single ((:commit . "1ef6f210f38c0686bc5b445b9704190f168f30ea") (:authors ("Joe HAKIM RAHME" . "joehakimrahme@gmail.com")) (:maintainer "Joe HAKIM RAHME" . "joehakimrahme@gmail.com") (:keywords "arabic" "transliteration" "i18n") (:url . "https://github.com/joehakimrahme/buckwalter-arabic"))]) + (buffer-buttons . [(20150106 1439) nil "Define, save, and load code-safe buttons in files for emacs" single ((:commit . "2feb8494fa7863b98256bc85da670d74a3a8a975") (:authors ("Ryan Pavlik" . "rpavlik@gmail.com")) (:maintainer "Ryan Pavlik" . "rpavlik@gmail.com") (:url . "https://github.com/rpav/buffer-buttons"))]) + (buffer-env . [(20210520 1616) ((emacs (27 1))) "Buffer-local process environments" single ((:commit . "32c1cfdf06dfa7bdbd79aba8066064212672e755") (:authors ("Augusto Stoffel" . "arstoffel@gmail.com")) (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com") (:keywords "processes" "tools") (:url . "https://github.com/astoff/buffer-env"))]) + (buffer-flip . [(20180307 2251) nil "Cycle through buffers like Alt-Tab in Windows" single ((:commit . "b8ecbf0251a59c351a3e44607ee502af343da64b") (:authors ("Russell Black" . "killdash9@github")) (:maintainer "Russell Black" . "killdash9@github") (:keywords "convenience") (:url . "https://github.com/killdash9/buffer-flip.el"))]) + (buffer-manage . [(20201221 122) ((emacs (26 1)) (choice-program (0 13)) (dash (2 17 0))) "Manage buffers" tar ((:commit . "800f22e024a2f364ac69d9efddd25ea0ac7c49c0") (:authors ("Paul Landes")) (:maintainer "Paul Landes") (:keywords "internal" "maint") (:url . "https://github.com/plandes/buffer-manage"))]) + (buffer-move . [(20160615 1803) nil "easily swap buffers" single ((:commit . "cb517ecf8409b5fdcda472d7190c6021f0c49751") (:keywords "lisp" "convenience") (:url . "https://github.com/lukhas/buffer-move"))]) + (buffer-ring . [(20210529 2059) ((emacs (25 1)) (dynaring (0 2 0)) (s (1 12 0)) (ht (2 0))) "Rings and tori for buffer navigation" single ((:commit . "30572b4d8fff519c4996078a5ad743583fb22b0e") (:authors ("Mike Mattie" . "codermattie@gmail.com") ("Sid Kasivajhula" . "sid@countvajhula.com")) (:maintainer "Sid Kasivajhula" . "sid@countvajhula.com") (:url . "https://github.com/countvajhula/buffer-ring"))]) + (buffer-sets . [(20170718 340) ((cl-lib (0 5))) "Sets of Buffers for Buffer Management" single ((:commit . "bc84c2f79a33609cccf3c996101125859b2e26ab") (:authors ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org") (:keywords "buffer-management") (:url . "http://github.com/swflint/buffer-sets"))]) + (buffer-utils . [(20140512 1400) nil "Buffer-manipulation utility functions" single ((:commit . "685b13457e3a2085b7584e41365d2aa0779a1b6f") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "extensions") (:url . "http://github.com/rolandwalker/buffer-utils"))]) + (buffer-watcher . [(20170913 839) ((f (0 16 2)) (cl-lib (0 5))) "Easily run shell scripts per filetype/directory when a buffer is saved" single ((:commit . "b32c67c8a5d724257d759f4c903d0dedc32246ef") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr"))]) + (buffer-wrap . [(20200924 345) ((emacs (24 4))) "Wrap the beginning and the end of buffer" single ((:commit . "2b12ed29cbcd733ad21d91475d1fcbd4092c604e") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/buffer-wrap"))]) + (bufler . [(20201226 2149) ((emacs (26 3)) (dash (2 17)) (dash-functional (2 17)) (f (0 17)) (pretty-hydra (0 2 2)) (magit-section (0 1))) "Group buffers into workspaces with programmable rules" tar ((:commit . "097f4349920215bdd829fceabc1afdbba172c32a") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "convenience") (:url . "https://github.com/alphapapa/bufler.el"))]) + (bufshow . [(20130726 1838) ((emacs (24 1))) "A simple presentation tool for Emacs." single ((:commit . "d60a554e7239e6f7520d9c3436d5ecdbc9cf6957") (:authors ("Peter Jones" . "pjones@pmade.com")) (:maintainer "Peter Jones" . "pjones@pmade.com") (:url . "https://github.com/pjones/bufshow"))]) + (bug-reference-github . [(20200206 2158) nil "Set `bug-reference-url-format' in Github repos" tar ((:commit . "c9512a010f19633e69f1d4b1597eff7048b21112") (:authors ("Arne Jørgensen" . "arne@arnested.dk")) (:maintainer "Arne Jørgensen" . "arne@arnested.dk") (:keywords "programming" "tools") (:url . "https://github.com/arnested/bug-reference-github"))]) + (bui . [(20210108 1141) ((emacs (24 3)) (dash (2 11 0))) "Buffer interface library" tar ((:commit . "f3a137628e112a91910fd33c0cff0948fa58d470") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "tools") (:url . "https://github.com/alezost/bui.el"))]) + (build-farm . [(20181218 2002) ((emacs (24 4)) (bui (1 2 1)) (magit-popup (2 1 0))) "Interface for Nix and Guix build farms (Hydra and Cuirass)" tar ((:commit . "5c268a3c235ace0d79ef1ec82c440120317e06f5") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "tools") (:url . "https://gitlab.com/alezost-emacs/build-farm"))]) + (build-helper . [(20161009 1755) ((projectile (0 9 0))) "Utilities to help build code" single ((:commit . "7a6fe71125a26ed1c492dab77cc688a7fe1d68ac") (:authors ("Afonso Bordado" . "afonsobordado@az8.co")) (:maintainer "Afonso Bordado" . "afonsobordado@az8.co") (:keywords "convenience") (:url . "http://github.com/afonso360/build-helper"))]) + (build-status . [(20190807 1231) ((cl-lib (0 5))) "Mode line build status indicator" single ((:commit . "1a1d2473aa62f2fdda47d8bfeb9fe352d2579b48") (:authors ("Skye Shaw" . "skye.shaw@gmail.com")) (:maintainer "Skye Shaw" . "skye.shaw@gmail.com") (:keywords "mode-line" "ci" "circleci" "travis-ci") (:url . "http://github.com/sshaw/build-status"))]) + (bundler . [(20200129 1338) ((inf-ruby (2 1)) (cl-lib (0 5))) "Interact with Bundler from Emacs" single ((:commit . "43efb6be4ed118b06d787ce7fbcffd68a31732a7") (:authors ("Tobias Svensson" . "tob@tobiassvensson.co.uk")) (:maintainer "Tobias Svensson" . "tob@tobiassvensson.co.uk") (:keywords "bundler" "ruby") (:url . "http://github.com/endofunky/bundler.el"))]) + (burly . [(20201211 58) ((emacs (26 3)) (map (2 1))) "Save and restore frame/window configurations with buffers" tar ((:commit . "291c2b34eee255f64c0fd889b67dc11a3b69ef12") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "convenience") (:url . "https://github.com/alphapapa/burly.el"))]) + (burnt-toast . [(20201113 814) ((emacs (25 1)) (dash (2 10)) (alert (1 2))) "Elisp integration with the BurntToast PowerShell module" tar ((:commit . "eed66036d65b0ee26ce02371d14dce16a360acb4") (:authors ("Sam Cedarbaum" . "scedarbaum@gmail.com")) (:maintainer "Sam Cedarbaum" . "scedarbaum@gmail.com") (:keywords "alert" "notifications" "powershell" "comm") (:url . "https://github.com/cedarbaum/burnt-toast.el"))]) + (bury-successful-compilation . [(20181106 403) nil "Bury the *compilation* buffer after successful compilation" single ((:commit . "674644c844184605a1bb4f9487a60f7a780a6fe7") (:authors ("Eric Crosson" . "esc@ericcrosson.com")) (:maintainer "Eric Crosson" . "esc@ericcrosson.com") (:keywords "compilation"))]) + (buster-mode . [(20140928 1213) nil "Minor mode to speed up development when writing tests with Buster.js" single ((:commit . "de6958ef8369400922618b8d1e99abfa91b97ac5") (:keywords "buster" "testing" "javascript"))]) + (buster-snippets . [(20151125 1010) ((yasnippet (0 8 0))) "Yasnippets for the Buster javascript testing framework" tar ((:commit . "bb8769dae132659858e74d52f3f4e8790399423a") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "snippets"))]) + (busybee-theme . [(20170719 928) nil "port of vim's mustang theme" single ((:commit . "66b2315b030582d0ebee605cf455d386d8c30fcd") (:authors ("martin haesler")) (:maintainer "martin haesler") (:url . "http://github.com/mswift42/busybee-theme"))]) + (butler . [(20150812 8) ((deferred (0 3 2)) (json (1 2)) (emacs (24))) "Emacs client for Jenkins" tar ((:commit . "8ceb35737107572455cca9a61ff46b3ff78f1016") (:authors ("Ashton Kemerling" . "ashtonkemerling@gmail.com")) (:maintainer "Ashton Kemerling" . "ashtonkemerling@gmail.com") (:keywords "jenkins" "hudson" "ci") (:url . "http://www.github.com/AshtonKem/Butler.git"))]) + (buttercup . [(20210105 2255) nil "Behavior-Driven Emacs Lisp Testing" tar ((:commit . "1de6be465cfe2c3f00183de9351bd838690c9f81") (:authors ("Jorgen Schaefer" . "contact@jorgenschaefer.de")) (:maintainer "Jorgen Schaefer" . "contact@jorgenschaefer.de") (:url . "https://github.com/jorgenschaefer/emacs-buttercup"))]) + (buttercup-junit . [(20190802 2258) ((emacs (24 3)) (buttercup (1 15))) "JUnit reporting for Buttercup" single ((:commit . "3ae4f84813c9e04e03a6e703990ca998b62b6deb") (:authors ("Ola Nilsson" . "ola.nilsson@gmail.com")) (:maintainer "Ola Nilsson" . "ola.nilsson@gmail.com") (:keywords "tools" "test" "unittest" "buttercup" "ci") (:url . "https://bitbucket.org/olanilsson/buttercup-junit"))]) + (button-lock . [(20200309 1323) nil "Clickable text defined by regular expression" single ((:commit . "9afe0f4d05910b0cccc94cb6d4d880119f3b0528") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "mouse" "button" "hypermedia" "extensions") (:url . "http://github.com/rolandwalker/button-lock"))]) + (buttons . [(20201123 2333) ((cl-lib (0 3))) "Define and visualize hierarchies of keymaps" single ((:commit . "de41b48244574a13000c4289fdb4216a2b0490ff") (:authors ("Ernesto Alfonso")) (:maintainer nil . "(concat \"erjoalgo\" \"@\" \"gmail\" \".com\")") (:keywords "keymap" "template" "snippet") (:url . "http://github.com/erjoalgo/emacs-buttons"))]) + (c-c-combo . [(20151224 255) nil "Make stuff happen when you reach a target wpm" tar ((:commit . "a261a833499a7fdc29610863b3aafc74818770ba") (:authors ("Diego Berrocal" . "cestdiego@gmail.com")) (:maintainer "Diego Berrocal" . "cestdiego@gmail.com") (:url . "https://www.github.com/CestDiego/c-c-combo.el"))]) + (c-eldoc . [(20201004 2347) nil "helpful description of the arguments to C functions" single ((:commit . "f4ede1f37f6de583376669735326367d84a0a917") (:authors ("Nathaniel Flath" . "flat0103@gmail.com")) (:maintainer "Nathaniel Flath" . "flat0103@gmail.com") (:url . "http://github.com/nflath/c-eldoc"))]) + (c-eval . [(20210611 705) ((emacs (24 5))) "Compile and run one-off C code snippets" single ((:commit . "fd129bfcb75475ac6820cc33862bd8efb8097fae") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "c" "languages") (:url . "https://github.com/lassik/emacs-c-eval"))]) + (c0-mode . [(20151110 1852) nil "Major mode for editing C0 files" tar ((:commit . "c214093c36864d6208fcb9e6a72413ed17ed5d60") (:authors ("Jakob Max Uecker")) (:maintainer "Jakob Max Uecker") (:keywords "c0" "languages") (:url . "http://c0.typesafety.net/"))]) + (ca65-mode . [(20210218 106) ((emacs (26 1))) "Major mode for ca65 assembly files" single ((:commit . "590d90cc0e1c1864dd7ce03df99b741ba866d52a") (:authors ("Wendel Scardua" . "wendel@scardua.net")) (:maintainer "Wendel Scardua" . "wendel@scardua.net") (:keywords "languages" "assembly" "ca65" "6502") (:url . "https://github.com/wendelscardua/ca65-mode"))]) + (cabledolphin . [(20160204 938) ((emacs (24 4)) (seq (1 0))) "capture Emacs network traffic" single ((:commit . "fffc192cafa61558e924323d6da8166fe5f2a6f9") (:authors ("Magnus Henoch" . "magnus.henoch@gmail.com")) (:maintainer "Magnus Henoch" . "magnus.henoch@gmail.com") (:keywords "comm"))]) + (cache . [(20111019 2300) nil "implementation of a hash table whose key-value pairs expire" single ((:commit . "7499586b6c8224df9f5c5bc4dec96b008258d580") (:authors ("Nathaniel Flath")) (:maintainer "Nathaniel Flath"))]) + (cacoo . [(20120319 2359) ((concurrent (0 3 1))) "Minor mode for Cacoo : http://cacoo.com" tar ((:commit . "c9fa04fbe97639b24698709530361c2bb5f3273c") (:authors ("SAKURAI Masashi <m.sakurai atmark kiwanami.net>")) (:maintainer "SAKURAI Masashi <m.sakurai atmark kiwanami.net>") (:keywords "convenience" "diagram") (:url . "https://github.com/kiwanami/emacs-cacoo/"))]) + (caddyfile-mode . [(20181204 858) ((emacs (25)) (loop (1 3))) "Major mode for Caddy configuration files" single ((:commit . "976ad0664c3f44bfa11cb9b8787ddfb094d0a666") (:authors ("Thomas Jost" . "schnouki@schnouki.net")) (:maintainer "Thomas Jost" . "schnouki@schnouki.net") (:keywords "languages") (:url . "https://github.com/Schnouki/caddyfile-mode/"))]) + (cake-inflector . [(20140415 858) ((s (1 9 0))) "Lazy porting CakePHP infrector.php to el" single ((:commit . "a1d338ec4840b1b1bc14f7f9298c07e2c1d2d8fc") (:authors ("k1LoW (Kenichirou Oyama), <k1lowxb [at] gmail [dot] com> <k1low [at] 101000lab [dot] org>")) (:maintainer "k1LoW (Kenichirou Oyama), <k1lowxb [at] gmail [dot] com> <k1low [at] 101000lab [dot] org>") (:url . "https://github.com/k1LoW/emacs-cake-inflector"))]) + (cakecrumbs . [(20180929 139) ((emacs (24 4))) "Show parents on header for HTML/Jade/Sass/Stylus" single ((:commit . "cf8c1df885eee004602f73c4f841301e200e5850") (:authors ("ono hiroko <kuanyui.github.io>")) (:maintainer "ono hiroko <kuanyui.github.io>") (:keywords "languages" "html" "jade" "pug" "sass" "scss" "stylus") (:url . "https://github.com/kuanyui/cakecrumbs.el"))]) + (cal-china-x . [(20200924 1837) ((cl-lib (0 5))) "Chinese localization, lunar/horoscope/zodiac info and more..." tar ((:commit . "94005e678a1d2522b7a00299779f40c5c77286b8") (:authors ("William Xu" . "william.xwl@gmail.com")) (:maintainer "William Xu" . "william.xwl@gmail.com") (:url . "https://github.com/xwl/cal-china-x"))]) + (calc-at-point . [(20210219 1252) ((emacs (26)) (dash (2 18 0))) "Perform calculations at point or over selection" single ((:commit . "0c1a9e94b519b0edb0abcbacdf6101eea2f2a524") (:authors ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainer "Sebastian Wålinder" . "s.walinder@gmail.com") (:keywords "convenience") (:url . "https://github.com/walseb/calc-at-point"))]) + (calendar-norway . [(20210608 1136) nil "Norwegian calendar" single ((:commit . "4dd8c38ef30ad45931c8ae7bcdfd720c3fcffffc") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org") (:keywords "calendar" "norwegian" "localization"))]) + (calfw . [(20180118 45) nil "Calendar view framework on Emacs" single ((:commit . "03abce97620a4a7f7ec5f911e669da9031ab9088") (:authors ("SAKURAI Masashi <m.sakurai at kiwanami.net>")) (:maintainer "SAKURAI Masashi <m.sakurai at kiwanami.net>") (:keywords "calendar") (:url . "https://github.com/kiwanami/emacs-calfw"))]) + (calfw-cal . [(20170320 1206) nil "calendar view for emacs diary" single ((:commit . "03abce97620a4a7f7ec5f911e669da9031ab9088") (:authors ("SAKURAI Masashi <m.sakurai at kiwanami.net>")) (:maintainer "SAKURAI Masashi <m.sakurai at kiwanami.net>") (:keywords "calendar"))]) + (calfw-gcal . [(20120111 1000) nil "edit Google calendar for calfw.el." tar ((:commit . "14aab20687d6cc9e6c5ddb9e11984c4e14c3d870") (:authors ("myuhe <yuhei.maeda_at_gmail.com>")) (:maintainer "myuhe") (:keywords "convenience" "calendar" "calfw.el") (:url . "https://github.com/myuhe/calfw-gcal.el"))]) + (calfw-howm . [(20170704 4) nil "calendar view for howm" single ((:commit . "03abce97620a4a7f7ec5f911e669da9031ab9088") (:authors ("SAKURAI Masashi <m.sakurai at kiwanami.net>")) (:maintainer "SAKURAI Masashi <m.sakurai at kiwanami.net>") (:keywords "calendar"))]) + (calfw-ical . [(20150703 819) nil "calendar view for ical format" single ((:commit . "03abce97620a4a7f7ec5f911e669da9031ab9088") (:authors ("SAKURAI Masashi <m.sakurai at kiwanami.net>")) (:maintainer "SAKURAI Masashi <m.sakurai at kiwanami.net>") (:keywords "calendar"))]) + (calfw-org . [(20160303 258) nil "calendar view for org-agenda" single ((:commit . "03abce97620a4a7f7ec5f911e669da9031ab9088") (:authors ("SAKURAI Masashi <m.sakurai at kiwanami.net>")) (:maintainer "SAKURAI Masashi <m.sakurai at kiwanami.net>") (:keywords "calendar" "org"))]) + (calibredb . [(20210603 323) ((emacs (25 1)) (transient (0 1 0)) (s (1 12 0)) (dash (2 17 0))) "Yet another calibre client" tar ((:commit . "cb93563d0ec9e0c653210bc574f9546d1e7db437") (:authors ("Damon Chan" . "elecming@gmail.com")) (:maintainer "Damon Chan" . "elecming@gmail.com") (:keywords "tools") (:url . "https://github.com/chenyanming/calibredb.el"))]) + (call-graph . [(20210311 831) ((emacs (25)) (cl-lib (0 6 1)) (hierarchy (0 7 0)) (tree-mode (1 0 0)) (ivy (0 10 0)) (anaconda-mode (0 1 13))) "Library to generate call graph for c/c++ functions" tar ((:commit . "3e5c510c51dd8b3491a32a1d67ad6268033348ee") (:authors ("Huming Chen" . "chenhuming@gmail.com")) (:maintainer "Huming Chen" . "chenhuming@gmail.com") (:keywords "programming" "convenience") (:url . "https://github.com/beacoder/call-graph"))]) + (calmer-forest-theme . [(20130926 510) nil "Darkish theme with green/orange tint" single ((:commit . "87ba7bae389084d13fe3bc34e0c923017eda6ba0") (:authors ("Artur Hefczyc, created 2003-04-18") ("David Caldwell" . "david@porkrind.org")) (:maintainer "Artur Hefczyc, created 2003-04-18") (:url . "https://github.com/caldwell/calmer-forest-theme"))]) + (camcorder . [(20190317 2138) ((emacs (24)) (names (20150000)) (cl-lib (0 5))) "Record screencasts in gif or other formats." single ((:commit . "b11ca61491a27681bb3131b72b51c105fd996bed") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com") (:keywords "multimedia" "screencast") (:url . "http://github.com/Bruce-Connor/camcorder.el"))]) + (caml . [(20190413 1205) nil "OCaml code editing commands for Emacs" tar ((:commit . "38ebde12d3d529e6ef8078967997d32226e69e82") (:authors ("Jacques Garrigue" . "garrigue@kurims.kyoto-u.ac.jp") ("Ian T Zimmerman" . "itz@rahul.net")) (:maintainer "Damien Doligez" . "damien.doligez@inria.fr") (:keywords "ocaml") (:url . "https://github.com/ocaml/ocaml/"))]) + (cangjie . [(20200808 828) ((emacs (24 4)) (s (1 12 0)) (dash (2 14 1)) (f (0 2 0))) "Retrieve cangjie code for han characters" tar ((:commit . "0cbf706890df06b9e0d541692c579ed213da8252") (:keywords "convenience" "writing") (:url . "https://github.com/kisaragi-hiu/cangjie.el"))]) + (capture . [(20130828 1644) nil "screencasting with \"avconv\" or \"ffmpeg\"" tar ((:commit . "1bb26060311da76767f70096218313fc93b0c806") (:authors ("Sergey Pashinin <sergey at pashinin dot com>")) (:maintainer "Sergey Pashinin <sergey at pashinin dot com>"))]) + (carbon-now-sh . [(20201028 950) ((emacs (24 4))) "https://carbon.now.sh integration." single ((:commit . "6444a77a6065803cf97c3321f811bd34a8063d76") (:authors ("Vitalii Elenhaupt")) (:maintainer "Vitalii Elenhaupt") (:keywords "convenience") (:url . "https://github.com/veelenga/carbon-now-sh.el"))]) + (cargo . [(20210422 657) ((emacs (24 3)) (markdown-mode (2 4))) "Emacs Minor Mode for Cargo, Rust's Package Manager." tar ((:commit . "0174599fd1c1b429042c7ca67c3d45f07441a43d") (:authors ("Kevin W. van Rooijen")) (:maintainer "Kevin W. van Rooijen") (:keywords "tools"))]) + (cargo-mode . [(20210605 1003) ((emacs (25 1))) "Cargo Major Mode. Cargo is the Rust package manager" single ((:commit . "b98ea60ddec30eac174012671ee09e125748a193") (:authors ("Ayrat Badykov" . "ayratin555@gmail.com")) (:maintainer "Ayrat Badykov" . "ayratin555@gmail.com") (:keywords "tools") (:url . "https://github.com/ayrat555/cargo-mode"))]) + (caroline-theme . [(20160318 520) ((emacs (24))) "A trip down to New Orleans..." single ((:commit . "222fd483db304509f9e422dc82883d808e023ceb") (:authors ("Jack Killilea" . "jaaacckz1@gmail.com")) (:maintainer "Jack Killilea" . "jaaacckz1@gmail.com") (:url . "https://github.com/xjackk/carolines-theme"))]) + (cascading-dir-locals . [(20210221 1516) ((emacs (26 1))) "Apply all (!) .dir-locals.el from root to current directory" single ((:commit . "53967a3f4b2ac742ab8fd6b639c87cbb0229d5f8") (:authors ("Fritz Grabo" . "me@fritzgrabo.com")) (:maintainer "Fritz Grabo" . "me@fritzgrabo.com") (:keywords "convenience") (:url . "https://github.com/fritzgrabo/cascading-dir-locals"))]) + (caseformat . [(20160115 1615) ((emacs (24)) (cl-lib (0 5)) (dash (2 12 1)) (s (1 10 0))) "Format based letter case converter" single ((:commit . "75ddb9c64eeb78b46d9e1db99bef8d0fb1e46b99") (:authors ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainer "Hiroki YAMAKAWA" . "s06139@gmail.com") (:keywords "convenience") (:url . "https://github.com/HKey/caseformat"))]) + (cask . [(20210528 1605) ((emacs (24 1)) (s (1 8 0)) (f (0 16 0)) (epl (0 5)) (shut-up (0 1 0)) (cl-lib (0 3)) (package-build (0)) (ansi (0 4 1))) "Cask: Project management for package development" tar ((:commit . "daee4bec9c7d96a165366f7edeaa4616837bf432") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "speed" "convenience") (:url . "http://github.com/cask/cask"))]) + (cask-mode . [(20160410 1449) ((emacs (24 3))) "major mode for editing Cask files" single ((:commit . "7c6719d3bb4fe552958634bd5a11abc56681f3a7") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) + (cask-package-toolset . [(20170921 2256) ((emacs (24)) (cl-lib (0 3)) (s (1 6 1)) (dash (1 8 0)) (f (0 10 0)) (commander (0 2 0)) (ansi (0 1 0)) (shut-up (0 1 0))) "Toolsettize your package" tar ((:commit . "2c74cd827e88c7f8360581a841e45f0b794510e7") (:authors ("Adrien Becchis" . "adriean.khisbe@live.fr")) (:maintainer "Adrien Becchis" . "adriean.khisbe@live.fr") (:keywords "convenience" "tools") (:url . "http://github.com/AdrieanKhisbe/cask-package-toolset.el"))]) + (caskxy . [(20140513 1539) ((log4e (0 2 0)) (yaxception (0 1))) "Control Cask in Emacs" single ((:commit . "dc18dcab7ed526070ab76de071c9c5272e6ac40e") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "convenience") (:url . "https://github.com/aki2o/caskxy"))]) + (catmacs . [(20170826 1157) ((emacs (24))) "Simple CAT interface for Yaesu Transceivers." single ((:commit . "65d3e0563abe6ff9577202cf2278074d4130fbdd") (:authors ("Frank Singleton" . "b17flyboy@gmail.com")) (:maintainer "Frank Singleton" . "b17flyboy@gmail.com") (:keywords "comm" "hardware") (:url . "https://bitbucket.org/pymaximus/catmacs"))]) + (cbm . [(20171116 1240) ((cl-lib (0 5))) "Switch to similar buffers." single ((:commit . "5b41c936ba9f6d170309a85ffebc9939c1050b31") (:authors ("Lukas Fürmetz" . "fuermetz@mailbox.org")) (:maintainer "Lukas Fürmetz" . "fuermetz@mailbox.org") (:keywords "buffers") (:url . "http://github.com/akermu/cbm.el"))]) + (cc-cedict . [(20200705 443) ((emacs (26 1))) "Interface to CC-CEDICT (a Chinese-English dictionary)" single ((:commit . "6bb9481e48b889503626b4e3cb7cfec8d14cbf4b") (:authors ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:url . "https://github.com/xuchunyang/cc-cedict.el"))]) + (ccc . [(20210501 820) nil "buffer local cursor color control library" single ((:commit . "ce0517127586e26f95f94f45d22a832f40a28321") (:authors ("Masatake YAMATO" . "masata-y@is.aist-nara.ac.jp")) (:maintainer "SKK Development Team") (:keywords "cursor") (:url . "https://github.com/skk-dev/ddskk"))]) + (ccls . [(20200820 308) ((emacs (25 1)) (lsp-mode (6 3 1)) (dash (2 14 1))) "ccls client for lsp-mode" tar ((:commit . "675a5704c14a27931e835a431beea3631d92e8e6") (:authors ("Tobias Pisani, Fangrui Song")) (:maintainer "Tobias Pisani, Fangrui Song") (:keywords "languages" "lsp" "c++") (:url . "https://github.com/MaskRay/emacs-ccls"))]) + (cd-compile . [(20141108 1957) nil "run compile in a specific directory" single ((:commit . "10284ccae86afda4a37b09ba90acd1e2efedec9f") (:authors ("Jamie Nicol" . "jamie@thenicols.net")) (:maintainer "Jamie Nicol" . "jamie@thenicols.net"))]) + (cdb . [(20200904 1431) nil "constant database (cdb) reader for Emacs Lisp" single ((:commit . "ce0517127586e26f95f94f45d22a832f40a28321") (:authors ("Yusuke Shinyama <yusuke at cs . nyu . edu>")) (:maintainer "SKK Development Team") (:keywords "cdb") (:url . "https://github.com/skk-dev/ddskk"))]) + (cdlatex . [(20201016 1659) nil "Fast input methods for LaTeX environments and math" single ((:commit . "adf96bab0bbf28f65c882c0874f1c14fdb216bd8") (:authors ("Carsten Dominik" . "carsten.dominik@gmail.com")) (:maintainer "Carsten Dominik" . "carsten.dominik@gmail.com") (:keywords "tex"))]) + (cdnjs . [(20161031 1522) ((dash (2 13 0)) (deferred (0 4)) (f (0 17 2)) (pkg-info (0 5))) "A front end for http://cdnjs.com" single ((:commit . "ce19880d3ec3d81e6c665d0b1dfea99cc7a3f908") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com") (:keywords "tools") (:url . "https://github.com/yasuyk/cdnjs.el"))]) + (cedit . [(20200816 526) nil "paredit-like commands for c-like languages" single ((:commit . "cb38316903e6cfa8b8c978defa7e1dafcd4e0c12") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://zk-phi.gitub.io/"))]) + (celery . [(20170225 924) ((emacs (24)) (dash-functional (2 11 0)) (s (1 9 0)) (deferred (0 3 2))) "a minor mode to draw stats from celery and more?" single ((:commit . "51197d74f5eaa8ae09144af7663a2f4277f07d16") (:authors ("ardumont" . "eniotna.t@gmail.com")) (:maintainer "ardumont" . "eniotna.t@gmail.com") (:keywords "celery" "convenience") (:url . "https://github.com/ardumont/emacs-celery"))]) + (celestial-mode-line . [(20180518 822) ((emacs (24))) "Show lunar phase and sunrise/-set time in modeline" single ((:commit . "3f5794aca99b977f1592cf1ab4516ae7922196a1") (:authors ("Peter" . "craven@gmx.net")) (:maintainer "Peter" . "craven@gmx.net") (:keywords "extensions") (:url . "https://github.com/ecraven/celestial-mode-line"))]) + (centaur-tabs . [(20210507 1633) ((emacs (24 4)) (powerline (2 4)) (cl-lib (0 5))) "Aesthetic, modern looking customizable tabs plugin" tar ((:commit . "9c7c936e4e1de6f4f4095d70e43c9ae738d05086") (:authors ("Emmanuel Bustos" . "ema2159@gmail.com")) (:maintainer "Emmanuel Bustos" . "ema2159@gmail.com") (:url . "https://github.com/ema2159/centaur-tabs"))]) + (centered-cursor-mode . [(20200507 1529) nil "cursor stays vertically centered" single ((:commit . "4093821cc9759ca5a3c6e527d4cc915fc3a5ad74") (:authors ("André Riemann" . "andre.riemann@web.de")) (:maintainer "André Riemann" . "andre.riemann@web.de") (:keywords "convenience") (:url . "https://github.com/andre-r/centered-cursor-mode.el"))]) + (centered-window . [(20200426 1053) ((emacs (24 4))) "Center the text when there's only one window" single ((:commit . "f50859941ab5c7cbeaee410f2d38716252b552ac") (:authors ("Anler Hernández Peral" . "inbox+emacs@anler.me")) (:maintainer "Anler Hernández Peral" . "inbox+emacs@anler.me") (:keywords "faces" "windows") (:url . "https://github.com/anler/centered-window-mode"))]) + (centimacro . [(20201225 1132) nil "Assign multiple macros as global key bindings" single ((:commit . "0149877584b333c4f1953f0767f0cae23881b0df") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "macros") (:url . "https://github.com/abo-abo/centimacro"))]) + (cerbere . [(20181113 1641) ((pkg-info (0 5))) "Unit testing in Emacs for several programming languages" tar ((:commit . "c667c165d9c1657f13d2d46f09ba21b61f9402cc") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "python" "go" "php" "phpunit" "elisp" "ert" "tests" "tdd") (:url . "https://github.com/nlamirault/cerbere"))]) + (ceylon-mode . [(20180606 1324) ((emacs (25))) "Major mode for editing Ceylon source code" single ((:commit . "948515672bc596dc118e8e3ede3ede5ec6a3c95a") (:authors ("Lucas Werkmeister" . "mail@lucaswerkmeister.de")) (:maintainer "Lucas Werkmeister" . "mail@lucaswerkmeister.de") (:keywords "languages" "ceylon") (:url . "https://github.com/lucaswerkmeister/ceylon-mode"))]) + (cfengine-code-style . [(20171115 2108) nil "C code style for CFEngine project." single ((:commit . "e41fe1eae84cdf12d1cb7e26a9299bc32423cdad") (:authors ("Mikhail Gusarov" . "mikhail.gusarov@cfengine.com")) (:maintainer "Mikhail Gusarov" . "mikhail.gusarov@cfengine.com") (:url . "https://github.com/cfengine/core"))]) + (cff . [(20160118 2018) ((cl-lib (0 5)) (emacs (24))) "Search of the C/C++ file header by the source and vice versa" single ((:commit . "b6ab2a28e64ef06f281ec74cfe3114e450644dfa") (:authors ("Alexey Veretennikov" . "alexey.veretennikov@gmail.com")) (:maintainer "Alexey Veretennikov" . "alexey.veretennikov@gmail.com") (:keywords "find-file") (:url . "https://github.com/fourier/cff"))]) + (cfml-mode . [(20190617 1130) ((emacs (25))) "Emacs mode for editing CFML files" single ((:commit . "2de315abddb6af088a2346e142cc305889dcd775") (:authors ("Andrew Myers" . "am2605@gmail.com")) (:maintainer "Andrew Myers" . "am2605@gmail.com") (:url . "https://github.com/am2605/cfml-mode"))]) + (cfn-mode . [(20210129 2037) ((emacs (26 0)) (f (0 20 0)) (s (1 12 0)) (yaml-mode (0 0 13))) "AWS cloudformation mode" tar ((:commit . "a4ca40978e680f9edc86c141e696e0ae57c63533") (:authors ("William Orr" . "will@worrbase.com")) (:maintainer "William Orr" . "will@worrbase.com") (:keywords "convenience" "languages" "tools") (:url . "https://gitlab.com/worr/cfn-mode"))]) + (cframe . [(20201222 1930) ((emacs (26)) (buffer-manage (0 11)) (dash (2 17 0))) "Customize a frame and fast switch size and positions" single ((:commit . "38544521e82befc06e397123a118dd96dda2c6b6") (:authors ("Paul Landes")) (:maintainer "Paul Landes") (:keywords "frames") (:url . "https://github.com/plandes/cframe"))]) + (cfrs . [(20210609 1805) ((emacs (26 1)) (dash (2 11 0)) (s (1 10 0)) (posframe (0 6 0))) "Child-frame based read-string" single ((:commit . "2cb7f1cbf9292b0efe167ef372cfb5a7600564eb") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/cfrs"))]) + (cg . [(20201211 1238) ((emacs (24 3))) "major mode for editing Constraint Grammar files" single ((:commit . "6e0ad3007ab39e8438baaf87bde11aa72c6606f2") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org") (:keywords "languages") (:url . "https://visl.sdu.dk/constraint_grammar.html"))]) + (challenger-deep-theme . [(20210120 941) ((emacs (24))) "challenger-deep Theme" single ((:commit . "2a799259406a8b96a688873093ffab6630a3ad3b") (:authors ("MaxSt")) (:maintainer "MaxSt") (:url . "https://github.com/challenger-deep-theme/emacs"))]) + (change-inner . [(20210126 1456) ((expand-region (0 7))) "Change contents based on semantic units" single ((:commit . "42cad58aed2caec260f8e8ff61f78a7d3db72d1b") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "convenience" "extensions"))]) + (chapel-mode . [(20210513 457) ((emacs (25 1)) (hydra (0 15 0))) "A major mode for the Chapel programming language" single ((:commit . "39fd24bb7cf44808200354ac0496be4fc4fddd9a") (:keywords "chapel" "chpl" "programming" "languages") (:url . "https://github.com/damon-kwok/chapel-mode"))]) + (char-menu . [(20210321 1657) ((emacs (24 3)) (avy-menu (0 1))) "Create your own menu for fast insertion of arbitrary symbols" single ((:commit . "d77c4d64fc8acc386a0fb9727d346c838e75f011") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:keywords "convenience" "editing") (:url . "https://github.com/mrkkrp/char-menu"))]) + (charmap . [(20200616 1418) nil "Unicode table for Emacs" single ((:commit . "a810347b43b024a86167ab9be935dcf56c122743") (:authors ("Anan Mikami" . "lateau@gmail.com")) (:maintainer "Anan Mikami" . "lateau@gmail.com") (:keywords "unicode" "character" "ucs") (:url . "https://github.com/lateau/charmap"))]) + (chatwork . [(20170511 442) nil "ChatWork client for Emacs" single ((:commit . "fea231d479f06bf40dbfcf45de143eecc9ed744c") (:authors ("Masayuki Ataka" . "masayuki.ataka@gmail.com")) (:maintainer "Masayuki Ataka" . "masayuki.ataka@gmail.com") (:keywords "web") (:url . "https://github.com/ataka/chatwork"))]) + (cheat-sh . [(20210607 1307) ((emacs (25 1))) "Interact with cheat.sh" single ((:commit . "33bae22feae8d3375739c6bdef08d0dcdf47ee42") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "docs" "help") (:url . "https://github.com/davep/cheat-sh.el"))]) + (cheatsheet . [(20170126 2150) ((emacs (24)) (cl-lib (0 5))) "create your own cheatsheet" single ((:commit . "e4f8e0110167ea16a17a74517d1f10cb7ff805b8") (:authors ("Shirin Nikita" . "shirin.nikita@gmail.com")) (:maintainer "Shirin Nikita" . "shirin.nikita@gmail.com") (:keywords "convenience" "usability") (:url . "http://github.com/darksmile/cheatsheet/"))]) + (checkbox . [(20141117 58) ((emacs (24)) (cl-lib (0 5))) "Quick manipulation of textual checkboxes" single ((:commit . "335afa4404adf72973195a580458927004664d98") (:authors ("Cameron Desautels" . "camdez@gmail.com")) (:maintainer "Cameron Desautels" . "camdez@gmail.com") (:keywords "convenience") (:url . "http://github.com/camdez/checkbox.el"))]) + (chee . [(20171123 2233) ((dash (2 12 1)) (s (1 10 0)) (f (0 18 2))) "Interface to chee using dired and image-dired" tar ((:commit . "669ff9ee429f24c3c2d03b83d9cb9aec5f86bb8b") (:url . "https://github.com/eikek/chee/tree/release/0.3.0/emacs"))]) + (cheerilee . [(20160313 1835) ((xelb (0 1))) "Toolkit library" tar ((:commit . "41bd81b5b0bb657241ceda5be6af5e07254d7376") (:authors ("Alessio Vanni" . "vannilla@firemail.cc")) (:maintainer "Alessio Vanni" . "vannilla@firemail.cc") (:keywords "multimedia" "tools") (:url . "https://github.com/Vannil/cheerilee.el"))]) + (chef-mode . [(20180628 1453) nil "minor mode for editing an opscode chef repository" single ((:commit . "048d691cb63981ae235763d4a6ced4af5c729924") (:authors ("Maciej Pasternacki" . "maciej@pasternacki.net")) (:maintainer "Maciej Pasternacki" . "maciej@pasternacki.net") (:keywords "chef" "knife"))]) + (chembalance . [(20210601 1653) ((emacs (24 4))) "Balance chemical equations" single ((:commit . "ae36c823ca151f1dc6144ec96b2f5e98181c0dbb") (:authors ("Sergi Ruiz Trepat")) (:maintainer "Sergi Ruiz Trepat") (:keywords "convenience" "chemistry") (:url . "https://github.com/sergiruiztrepat/chembalance"))]) + (cherry-blossom-theme . [(20150622 342) ((emacs (24 0))) "a soothing color theme for Emacs24." single ((:commit . "eea7653e00f35973857ee23b27bc2fae5e753e50") (:authors ("Ben Yelsey" . "byelsey1@gmail.com")) (:maintainer "Ben Yelsey" . "byelsey1@gmail.com") (:url . "https://github.com/inlinestyle/emacs-cherry-blossom-theme"))]) + (chinese-conv . [(20170807 2128) ((cl-lib (0 5))) "Conversion between Chinese Characters with opencc or cconv" single ((:commit . "b56815bbb163d642e97fa73093b5a7e87cc32574") (:authors ("gucong" . "gucong43216@gmail.com")) (:maintainer "gucong" . "gucong43216@gmail.com") (:url . "https://github.com/gucong/emacs-chinese-conv"))]) + (chinese-number . [(20161008 509) nil "Convert numbers between Arabic and Chinese formats" single ((:commit . "7311c2a0c5eea5f016a90d733dfe75144c302fb2") (:authors (nil . "zhcosin<zhcosin@163.com>")) (:maintainer nil . "zhcosin<zhcosin@163.com>") (:url . "https://github.com/zhcosin/chinese-number"))]) + (chinese-wbim . [(20190727 854) nil "Enable Wubi Input Method in Emacs." tar ((:commit . "5d496364b0b6bbaaf0f9b37e5a6d260d4994f260") (:authors (nil . "Guanghui Qu<guanghui8827@gmail.com>")) (:maintainer nil . "Guanghui Qu<guanghui8827@gmail.com>") (:keywords "wubi" "input" "method.") (:url . "https://github.com/andyque/chinese-wbim"))]) + (chinese-word-at-point . [(20170811 941) ((cl-lib (0 5))) "Add `chinese-word' thing to `thing-at-point'" single ((:commit . "8223d7439e005555b86995a005b225ae042f0538") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:keywords "convenience" "chinese") (:url . "https://github.com/xuchunyang/chinese-word-at-point.el"))]) + (chinese-yasdcv . [(20171015 144) ((cl-lib (0 5)) (pyim (1 6 0))) "Yet another StarDict frontend" tar ((:commit . "5ab830daf1273d5a5cddcb94b56a9737f12d996f") (:authors ("Feng Shu" . "tumashu@gmail.com")) (:maintainer "Feng Shu" . "tumashu@gmail.com") (:keywords "convenience" "chinese" "dictionary") (:url . "https://github.com/tumashu/chinese-yasdcv"))]) + (chocolate-theme . [(20210128 1647) ((emacs (24 1)) (autothemer (0 2))) "A dark chocolaty theme" single ((:commit . "ccc05f7ad96d3d1332727689bf6250443adc7ec0") (:url . "http://github.com/SavchenkoValeriy/emacs-chocolate-theme"))]) + (choice-program . [(20201217 1751) ((emacs (26)) (dash (2 17 0))) "Parameter based program" tar ((:commit . "b8b1b6c5568f8778783454d5747912487c8e69b8") (:authors ("Paul Landes")) (:maintainer "Paul Landes") (:keywords "execution" "processes" "unix" "lisp") (:url . "https://github.com/plandes/choice-program"))]) + (chronometer . [(20190304 1528) ((emacs (24))) "a [not so] simple chronometer" single ((:commit . "8457b296ef87be339cbe47730b922757d60bdcd5") (:authors ("Marcelo Toledo" . "marcelo@marcelotoledo.com")) (:maintainer "Marcelo Toledo" . "marcelo@marcelotoledo.com") (:keywords "tools" "convenience") (:url . "https://github.com/marcelotoledo/chronometer"))]) + (chronometrist . [(20210611 2022) ((emacs (25 1)) (dash (2 16 0)) (seq (2 20)) (ts (0 2))) "A time tracker with a nice interface" tar ((:commit . "de41c158b5e21587aa6ad2601a2ed367d7f1534d") (:authors ("contrapunctus" . "xmpp:contrapunctus@jabjab.de")) (:maintainer "contrapunctus" . "xmpp:contrapunctus@jabjab.de") (:keywords "calendar") (:url . "https://tildegit.org/contrapunctus/chronometrist"))]) + (chronometrist-goal . [(20210510 1831) ((emacs (25 1)) (alert (1 2)) (chronometrist (0 7 0))) "Adds support for time goals to Chronometrist" single ((:commit . "6cb939d160f5d5966d7853aa23f3ed7c7ef9df44") (:authors ("contrapunctus" . "xmpp:contrapunctus@jabber.fr")) (:maintainer "contrapunctus" . "xmpp:contrapunctus@jabber.fr") (:keywords "calendar") (:url . "https://tildegit.org/contrapunctus/chronometrist-goal"))]) + (chronometrist-key-values . [(20210608 802) ((chronometrist (0 7 0))) "add key-values to Chronometrist data" tar ((:commit . "de41c158b5e21587aa6ad2601a2ed367d7f1534d") (:authors ("contrapunctus" . "xmpp:contrapunctus@jabjab.de")) (:maintainer "contrapunctus" . "xmpp:contrapunctus@jabjab.de") (:keywords "calendar") (:url . "https://tildegit.org/contrapunctus/chronometrist"))]) + (chronos . [(20150602 1529) nil "multiple simultaneous countdown / countup timers" tar ((:commit . "b360d9dae57aa553cf2a14ffa0756a51ad71de09") (:authors ("David Knight" . "dxknight@opmbx.org")) (:maintainer "David Knight" . "dxknight@opmbx.org") (:keywords "calendar") (:url . "http://github.com/dxknight/chronos"))]) + (chruby . [(20180114 1652) ((cl-lib (0 5))) "Emacs integration for chruby" single ((:commit . "42bc6d521f832eca8e2ba210f30d03ad5529788f") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net") (:keywords "languages") (:url . "https://github.com/plexus/chruby.el"))]) + (chyla-theme . [(20180302 1658) nil "chyla.org - green color theme." single ((:commit . "ae5e7ecace2ab474151eb0ac5ef07fba2dc32f8a") (:authors ("Adam Chyła" . "adam@chyla.org")) (:maintainer "Adam Chyła" . "adam@chyla.org") (:url . "https://github.com/chyla/ChylaThemeForEmacs"))]) + (cider . [(20210524 832) ((emacs (25)) (clojure-mode (5 12)) (parseedn (0 2)) (pkg-info (0 4)) (queue (0 2)) (spinner (1 7)) (seq (2 22)) (sesman (0 3 2))) "Clojure Interactive Development Environment that Rocks" tar ((:commit . "8f51546c0efb36226c4bae7d65465b0e0aa8c06f") (:authors ("Tim King" . "kingtim@gmail.com") ("Phil Hagelberg" . "technomancy@gmail.com") ("Bozhidar Batsov" . "bozhidar@batsov.com") ("Artur Malabarba" . "bruce.connor.am@gmail.com") ("Hugo Duncan" . "hugo@hugoduncan.org") ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.com") (:keywords "languages" "clojure" "cider") (:url . "http://www.github.com/clojure-emacs/cider"))]) + (cider-decompile . [(20151122 537) ((cider (0 3 0)) (javap-mode (9))) "decompilation extension for cider" single ((:commit . "5d87035f3c3c14025e8f01c0c53d0ce2c8f56651") (:authors ("Dmitry Bushenko")) (:maintainer "Dmitry Bushenko") (:keywords "languages" "clojure" "cider") (:url . "http://www.github.com/clojure-emacs/cider-decompile"))]) + (cider-eval-sexp-fu . [(20190311 2152) ((emacs (24)) (eval-sexp-fu (0 5 0))) "Briefly highlights an evaluated sexp." single ((:commit . "7fd229f1441356866aedba611fd0cf4e89b50921") (:authors ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com") (:keywords "languages" "clojure" "cider"))]) + (cider-hydra . [(20190816 1121) ((cider (0 22 0)) (hydra (0 13 0))) "Hydras for CIDER." single ((:commit . "c3b8a15d72dddfbc390ab6a454bd7e4c765a2c95") (:authors ("Tianxiang Xiong" . "tianxiang.xiong@gmail.com")) (:maintainer "Tianxiang Xiong" . "tianxiang.xiong@gmail.com") (:keywords "convenience" "tools") (:url . "https://github.com/clojure-emacs/cider-hydra"))]) + (ciel . [(20180914 815) ((emacs (24))) "A command that is clone of \"ci\" in vim." single ((:commit . "429773a3c551691a463ecfddd634b8bae2f48503") (:authors ("Takuma Matsushita" . "cs14095@gmail.com")) (:maintainer "Takuma Matsushita" . "cs14095@gmail.com") (:keywords "convinience") (:url . "https://github.com/cs14095/ciel.el"))]) + (cil-mode . [(20160622 1430) nil "Common Intermediate Language mode" single ((:commit . "a78a88ca9a66a82f069329a96e34b67478ae2d9b") (:authors ("Friedrich von Never" . "friedrich@fornever.me")) (:maintainer "Friedrich von Never" . "friedrich@fornever.me") (:keywords "languages") (:url . "https://github.com/ForNeVeR/cil-mode"))]) + (cinspect . [(20150716 233) ((emacs (24)) (cl-lib (0 5)) (deferred (0 3 1)) (python-environment (0 0 2))) "Use cinspect to look at the CPython source of builtins and other C objects!" single ((:commit . "4e199a90f89b335cccda1518aa0963e0a1d4fbab") (:authors ("Ben Yelsey" . "ben.yelsey@gmail.com")) (:maintainer "Ben Yelsey" . "ben.yelsey@gmail.com") (:keywords "python") (:url . "https://github.com/inlinestyle/cinspect-mode"))]) + (circadian . [(20181024 1256) ((emacs (24 4))) "Theme-switching based on daytime" single ((:commit . "925451a00e6defd4f5ac1a7fd76ffefefdbce3ef") (:authors ("Guido Schmidt")) (:maintainer "Guido Schmidt" . "git@guidoschmidt.cc") (:keywords "themes") (:url . "https://github.com/GuidoSchmidt/circadian"))]) + (circe . [(20210601 801) ((emacs (24 4)) (cl-lib (0 5))) "Client for IRC in Emacs" tar ((:commit . "c0b2f997b3b73640d635ee84627bb8cf36c9adfe") (:authors ("Jorgen Schaefer" . "forcer@forcix.cx")) (:maintainer "Jorgen Schaefer" . "forcer@forcix.cx") (:keywords "irc" "chat" "comm") (:url . "https://github.com/jorgenschaefer/circe"))]) + (circe-notifications . [(20180102 2318) ((emacs (24 4)) (circe (2 3)) (alert (1 2))) "Add desktop notifications to Circe." single ((:commit . "291149ac12877bbd062da993479d3533a26862b0") (:authors ("Ruben Maher" . "r@rkm.id.au")) (:maintainer "Ruben Maher" . "r@rkm.id.au") (:url . "https://github.com/eqyiel/circe-notifications"))]) + (circleci-api . [(20210227 1607) ((emacs (27)) (request (0 3 2))) "Bindings for the CircleCI API" single ((:commit . "2e39c5896819bb2063f9d7795c4299f419cf5542") (:authors ("Robin Schroer")) (:maintainer "Robin Schroer") (:url . "https://github.com/sulami/circleci-api"))]) + (citeproc . [(20201031 1642) ((emacs (25)) (dash (2 13 0)) (s (1 12 0)) (f (0 18 0)) (queue (0 2)) (string-inflection (1 0)) (org (9))) "A CSL 1.0.1 Citation Processor" tar ((:commit . "0857973409e3ef2ef0238714f2ef7ff724230d1c") (:authors ("András Simonyi" . "andras.simonyi@gmail.com")) (:maintainer "András Simonyi" . "andras.simonyi@gmail.com") (:keywords "bib") (:url . "https://github.com/andras-simonyi/citeproc-el"))]) + (citeproc-org . [(20200915 2009) ((emacs (25 1)) (dash (2 12 0)) (org (9)) (f (0 18 0)) (citeproc (0 1)) (org-ref (1 1 1))) "Render org-mode references in CSL styles" tar ((:commit . "22a759c4f0ec80075014dcc594baa4d1b470d995") (:authors ("András Simonyi" . "andras.simonyi@gmail.com")) (:maintainer "András Simonyi" . "andras.simonyi@gmail.com") (:keywords "org-ref" "org-mode" "cite" "bib") (:url . "https://github.com/andras-simonyi/citeproc-org"))]) + (cl-format . [(20160413 45) nil "CL format routine." tar ((:commit . "4380cb8009c47cc6d9098b383082b93b1aefa460") (:authors ("Andreas Politz" . "politza@fh-trier.de")) (:maintainer "Andreas Politz" . "politza@fh-trier.de") (:keywords "extensions"))]) + (cl-lib-highlight . [(20200210 1951) ((cl-lib (0 3))) "full cl-lib font-lock highlighting" single ((:commit . "72afc4dd0107c357543244d09903767f49651c5c") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/cl-lib-highlight"))]) + (cl-libify . [(20181130 230) ((emacs (25))) "Update elisp code to use cl-lib instead of cl" single ((:commit . "f215866d7d7c52e84220cd541f40608a5b85abf0") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "lisp") (:url . "https://github.com/purcell/cl-libify"))]) + (clang-capf . [(20201205 1229) ((emacs (24 4))) "Completion-at-point backend for c/c++ using clang" single ((:commit . "6d0fcae75044d930e989903673b6ab22d0401418") (:authors ("Philip K. <philipk [at] posteo [dot] net>")) (:maintainer "Philip K. <philipk [at] posteo [dot] net>") (:keywords "c" "abbrev" "convenience") (:url . "https://git.sr.ht/~zge/clang-capf"))]) + (clang-format . [(20191106 950) ((cl-lib (0 3))) "Format code using clang-format" single ((:commit . "e48ff8ae18dc7ab6118c1f6752deb48cb1fc83ac") (:keywords "tools" "c"))]) + (clang-format+ . [(20190824 2216) ((emacs (25 1)) (clang-format (20180406 1514))) "Minor mode for automatic clang-format application" single ((:commit . "ddd4bfe1a13c2fd494ce339a320a51124c1d2f68") (:keywords "c" "c++" "clang-format") (:url . "https://github.com/SavchenkoValeriy/emacs-clang-format-plus"))]) + (clean-aindent-mode . [(20171017 2043) nil "Simple indent and unindent, trims indent white-space" single ((:commit . "a97bcae8f43a9ff64e95473e4ef0d8bafe829211") (:authors ("peter marinov" . "efravia@gmail.com")) (:maintainer "peter marinov" . "efravia@gmail.com") (:keywords "indentation" "whitespace" "backspace") (:url . "https://github.com/pmarinov/clean-aindent-mode"))]) + (clean-buffers . [(20160529 2259) ((cl-lib (0 5))) "clean useless buffers" single ((:commit . "1be6c54e3095761b6b64bf749faae3dfce94e72a") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "convenience" "usability" "buffers"))]) + (clear-text . [(20160406 2043) nil "Make you use clear text" tar ((:commit . "b50669b6077d6948f72cb3c649281d206e0c2f2b") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:keywords "convenience") (:url . "https://github.com/xuchunyang/clear-text.el"))]) + (clevercss . [(20131229 155) nil "A major mode for editing CleverCSS files" single ((:commit . "b8a3c0dd674367c62b1a1ffec84d88fe0c0219bc") (:authors ("Joe Schafer" . "joesmoe10@gmail.com")) (:maintainer "Joe Schafer" . "joesmoe10@gmail.com") (:keywords "languages" "css"))]) + (clhs . [(20210428 1911) nil "Access the Common Lisp HyperSpec (CLHS)" single ((:commit . "7b106c4fb5a6388ab753f94740f6dfadcdeedcbb") (:maintainer "Sam Steingold" . "sds@gnu.org") (:keywords "lisp" "common lisp" "emacs" "ansi cl" "hyperspec") (:url . "https://gitlab.com/sam-s/clhs"))]) + (click-mode . [(20180611 44) ((emacs (24))) "Major mode for the Click Modular Router Project" single ((:commit . "b94ea8cce89cf0e753b2ab915202d49ffc470fb6") (:authors ("Brian Malehorn" . "bmalehorn@gmail.com")) (:maintainer "Brian Malehorn" . "bmalehorn@gmail.com") (:keywords "click" "router") (:url . "https://github.com/bmalehorn/click-mode"))]) + (clipetty . [(20200327 2241) ((emacs (25 1))) "Send every kill from a TTY frame to the system clipboard" single ((:commit . "01b39044b9b65fa4ea7d3166f8b1ffab6f740362") (:authors ("Mike Hamrick" . "mikeh@muppetlabs.com")) (:maintainer "Mike Hamrick" . "mikeh@muppetlabs.com") (:keywords "terminals" "convenience") (:url . "https://github.com/spudlyo/clipetty"))]) + (cliphist . [(20210426 245) ((emacs (24 3)) (ivy (0 9 0))) "Read data from clipboard managers at Linux and macOS" tar ((:commit . "0d02d72fb63453ff5623b26234a63f66090da7ac") (:authors ("Chen Bin <chenbin DOT sh AT gmail DOT com>")) (:maintainer "Chen Bin <chenbin DOT sh AT gmail DOT com>") (:keywords "clipboard" "manager" "history") (:url . "http://github.com/redguardtoo/cliphist"))]) + (clipmon . [(20180129 1054) nil "Clipboard monitor - watch system clipboard, add changes to kill ring/autoinsert" tar ((:commit . "95dc56c7ed84a654ec90f4740eb6df1050de8cf1") (:authors ("Brian Burns" . "bburns.km@gmail.com")) (:maintainer "Brian Burns" . "bburns.km@gmail.com") (:keywords "convenience") (:url . "https://github.com/bburns/clipmon"))]) + (clippy . [(20161028 1954) ((pos-tip (1 0))) "Show tooltip with function documentation at point" single ((:commit . "e77f6b63e54d74e243be98accad474e38f7e2a86") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:keywords "docs") (:url . "https://github.com/Fuco1/clippy.el"))]) + (clips-mode . [(20170909 823) nil "Major mode for editing CLIPS code and REPL" tar ((:commit . "dd38e2822640a38f7d8bfec4f69d8dd24be27074") (:authors ("David E. Young" . "david.young@fnc.fujitsu.com") ("Andrey Kotlarski" . "m00naticus@gmail.com") ("Grant Rettke" . "grettke@acm.org")) (:maintainer "Grant Rettke" . "grettke@acm.org") (:keywords "clips"))]) + (clj-decompiler . [(20201004 1019) ((emacs (26 1)) (clojure-mode (5 12)) (cider (0 18 0))) "Clojure Java decompiler expansion" single ((:commit . "f04e97af2678f170b872ff35dcbe81f86f7c39f2") (:authors ("Ben Sless" . "ben.sless@gmail.com")) (:maintainer "Ben Sless" . "ben.sless@gmail.com") (:keywords "languages" "clojure" "cider" "java" "decompiler") (:url . "https://www.github.com/bsless/clj-decompiler.el"))]) + (clj-refactor . [(20210518 1305) ((emacs (25 1)) (seq (2 19)) (yasnippet (0 6 1)) (paredit (24)) (multiple-cursors (1 2 2)) (clojure-mode (5 9)) (cider (1 0)) (parseedn (0 2)) (inflections (2 3)) (hydra (0 13 2))) "A collection of commands for refactoring Clojure code" tar ((:commit . "ae2f6344eaf66c872ebc4a87a389f34434ad7a3d") (:authors ("Magnar Sveen" . "magnars@gmail.com") ("Lars Andersen" . "expez@expez.com") ("Benedek Fazekas" . "benedek.fazekas@gmail.com") ("Bozhidar Batsov" . "bozhidar@batsov.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "convenience" "clojure" "cider"))]) + (cljr-helm . [(20160913 828) ((clj-refactor (0 13 0)) (helm-core (1 7 7)) (cl-lib (0 5))) "Wraps clojure refactor commands with helm" single ((:commit . "f2fc7b698a56e4a44d5dfbc6a55d77a93c0fa9a4") (:authors ("Phil Jackson" . "phil@shellarchive.co.uk")) (:maintainer "Phil Jackson" . "phil@shellarchive.co.uk") (:keywords "helm" "clojure" "refactor") (:url . "https://github.com/philjackson/cljr-helm"))]) + (cljr-ivy . [(20200602 1607) ((clj-refactor (2 5 0)) (ivy (0 13 0)) (emacs (24 3)) (cl-lib (0 6 1))) "Access clojure refactor with ivy completion" single ((:commit . "921ba65d0db7cda4edcd690c708946125b874a70") (:authors ("Wanderson Ferreira" . "iagwanderson@gmail.com")) (:maintainer "Wanderson Ferreira" . "iagwanderson@gmail.com") (:keywords "convenience" "matching") (:url . "https://github.com/wandersoncferreira/cljr-ivy"))]) + (cljsbuild-mode . [(20160402 1700) nil "A minor mode for the ClojureScript 'lein cljsbuild' command" single ((:commit . "fa2315660cb3ce944b5e16c679dcf5afd6a97f4c") (:keywords "clojure" "clojurescript" "leiningen" "compilation") (:url . "http://github.com/kototama/cljsbuild-mode"))]) + (clmemo . [(20160326 1623) nil "Change Log MEMO" tar ((:commit . "846a81b984d71edf8278a4d9f9b886e44d5b8365") (:authors ("Masayuki Ataka" . "masayuki.ataka@gmail.com")) (:maintainer "Masayuki Ataka" . "masayuki.ataka@gmail.com") (:keywords "convenience") (:url . "https://github.com/ataka/clmemo"))]) + (cloc . [(20170728 1824) ((cl-lib (0 5))) "count lines of code over emacs buffers" single ((:commit . "f30f0472e465cc8d433d2473e9d3b8dfe2c94491") (:authors ("Danny McClanahan" . "danieldmcclanahan@gmail.com")) (:maintainer "Danny McClanahan" . "danieldmcclanahan@gmail.com") (:keywords "cloc" "count" "source" "code" "lines") (:url . "https://github.com/cosmicexplorer/cloc-emacs"))]) + (clocker . [(20190214 1833) ((projectile (0 11 0)) (dash (2 10)) (spaceline (2 0 1))) "Note taker and clock-in enforcer" single ((:commit . "c4d76968a49287ce3bac0832bb5d5d076054c96f") (:authors ("Roman Gonzalez" . "romanandreg@gmail.com")) (:maintainer "Roman Gonzalez" . "romanandreg@gmail.com") (:keywords "org"))]) + (clojars . [(20180825 1951) ((request-deferred (0 2 0))) "clojars.org search interface" single ((:commit . "696c5b056e45067512a7d6dcce2515f3c639f61b") (:authors ("Joshua Miller" . "josh@joshmiller.io")) (:maintainer "Joshua Miller" . "josh@joshmiller.io") (:keywords "docs" "help" "tools") (:url . "https://github.com/joshuamiller/clojars.el"))]) + (clojure-essential-ref . [(20200619 1653) ((emacs (24)) (cider (0 24 0))) "Cider-doc to \"Clojure, The Essential Reference\"" single ((:commit . "13ac560c25f7355fba00d9ca8c9f4ca03e7fd189") (:url . "https://github.com/p3r7/clojure-essential-ref"))]) + (clojure-essential-ref-nov . [(20200719 608) ((emacs (24)) (dash (2 16 0)) (nov (0 3 1)) (clojure-essential-ref (0 1 0))) "Cider-doc to \"Clojure, The Essential Reference\" (EPUB)" single ((:commit . "13ac560c25f7355fba00d9ca8c9f4ca03e7fd189") (:url . "https://github.com/p3r7/clojure-essential-ref"))]) + (clojure-mode . [(20210505 712) ((emacs (25 1))) "Major mode for Clojure code" single ((:commit . "33f267ac182afe8fa82cc321e9f515c0397e35f6") (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.com") (:keywords "languages" "clojure" "clojurescript" "lisp") (:url . "http://github.com/clojure-emacs/clojure-mode"))]) + (clojure-mode-extra-font-locking . [(20210322 704) ((clojure-mode (3 0))) "Extra font-locking for Clojure mode" single ((:commit . "33f267ac182afe8fa82cc321e9f515c0397e35f6") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.com")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.com") (:keywords "languages" "lisp") (:url . "http://github.com/clojure-emacs/clojure-mode"))]) + (clojure-quick-repls . [(20150814 736) ((cider (0 8 1)) (dash (2 9 0))) "Quickly create Clojure and ClojureScript repls for a project." single ((:commit . "730311dd3ac4e0aceb0204f818b422017873467f") (:keywords "languages" "clojure" "cider" "clojurescript") (:url . "https://github.com/symfrog/clojure-quick-repls"))]) + (clojure-snippets . [(20180314 1308) ((yasnippet (0 10 0))) "Yasnippets for clojure" tar ((:commit . "6068dca90467a0f4ebc2cd39338a173d6f5ddc04") (:authors ("Max Penet" . "m@qbits.cc")) (:maintainer "Max Penet" . "m@qbits.cc") (:keywords "snippets"))]) + (clomacs . [(20201224 1358) ((emacs (24 3)) (cider (0 22 1)) (s (1 12 0)) (simple-httpd (1 4 6))) "Simplifies Emacs Lisp interaction with Clojure." single ((:commit . "ffcb122194507593815d67b26f5d2d8ffcc52bf8") (:authors ("Kostafey" . "kostafey@gmail.com")) (:maintainer "Kostafey" . "kostafey@gmail.com") (:keywords "clojure" "interaction") (:url . "https://github.com/clojure-emacs/clomacs"))]) + (closql . [(20210530 1136) ((emacs (25 1)) (emacsql-sqlite (3 0 0))) "store EIEIO objects using EmacSQL" single ((:commit . "1b0e5bfef95de49bf669c54a15571386f10f4705") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "extensions") (:url . "https://github.com/emacscollective/closql"))]) + (closure-lint-mode . [(20101118 2124) nil "minor mode for the Closure Linter" single ((:commit . "bc3d2fd5c35580bf1b8af43b12484c95a343b4b5") (:authors ("Roman Scherer" . "roman@burningswell.com")) (:maintainer "Roman Scherer" . "roman@burningswell.com") (:keywords "tools" "closure" "javascript" "lint" "flymake") (:url . "https://github.com/r0man/closure-lint-mode"))]) + (cloud-theme . [(20200221 2201) ((emacs (24))) "A light colored theme" single ((:commit . "bdac53baf1c38f83a16091db515047f7d42dac14") (:authors ("Valerii Lysenko" . "vallyscode@gmail.com")) (:maintainer "Valerii Lysenko" . "vallyscode@gmail.com") (:keywords "color" "theme") (:url . "https://github.com/vallyscode/cloud-theme"))]) + (cloud-to-butt-erc . [(20130627 2308) nil "Replace 'the cloud' with 'my butt'" single ((:commit . "6710c03d1bc91736435cbfe845924940cae34e5c") (:authors ("David Leatherman" . "leathekd@gmail.com")) (:maintainer "David Leatherman" . "leathekd@gmail.com") (:url . "http://www.github.com/leathekd/cloud-to-butt-erc"))]) + (clues-theme . [(20161213 1127) ((emacs (24 0))) "an Emacs 24 theme which may well be fully awesome..." single ((:commit . "abd61f2b7f3e98de58ca26e6d1230e70c6406cc7") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com") (:url . "https://github.com/emacsfodder/emacs-clues-theme"))]) + (cm-mode . [(20170203 2107) ((cl-lib (0 5))) "Minor mode for CriticMarkup" single ((:commit . "276d49c859822265070ae5dfbb403fd7d8d06436") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm") (:keywords "text" "markdown"))]) + (cmake-font-lock . [(20210103 1558) ((cmake-mode (0 0))) "Advanced, type aware, highlight support for CMake" single ((:commit . "5e20ed32193c2c7ebae920a6a3cd711c8c950597") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "faces" "languages") (:url . "https://github.com/Lindydancer/cmake-font-lock"))]) + (cmake-ide . [(20210610 1525) ((emacs (24 4)) (cl-lib (0 5)) (seq (1 11)) (levenshtein (0)) (s (1 11 0))) "Calls CMake to find out include paths and other compiler flags" single ((:commit . "28dc4ab5bd01d99553901b4efeb7234280928b18") (:authors ("Atila Neves" . "atila.neves@gmail.com")) (:maintainer "Atila Neves" . "atila.neves@gmail.com") (:keywords "languages") (:url . "http://github.com/atilaneves/cmake-ide"))]) + (cmake-mode . [(20210104 1831) ((emacs (24 1))) "major-mode for editing CMake sources" single ((:commit . "8a4f3fd8611b9ea3b18d4f74c42d071f10d306a7"))]) + (cmake-project . [(20171121 1115) nil "Integrates CMake build process with Emacs" single ((:commit . "a7cf9e4c01c4683e14b6942cc5cc5e8cddc98721") (:authors ("Alexander Lamaison" . "alexander.lamaison@gmail")) (:maintainer "Alexander Lamaison" . "alexander.lamaison@gmail") (:keywords "c" "cmake" "languages" "tools") (:url . "http://github.com/alamaison/emacs-cmake-project"))]) + (cmd-to-echo . [(20161203 2133) ((emacs (24 4)) (s (1 11 0)) (shell-split-string (20151224 208))) "Show the output of long-running commands in the echo area" single ((:commit . "e0e874fc0e1ad6d291e39ed76023445297ad438a") (:authors ("Tijs Mallaerts" . "tijs.mallaerts@gmail.com")) (:maintainer "Tijs Mallaerts" . "tijs.mallaerts@gmail.com"))]) + (cmm-mode . [(20150225 746) nil "Major mode for C-- source code" single ((:commit . "c3ad514dff3eb30434f6b20d953276d4c00de1ee"))]) + (cnfonts . [(20200824 240) ((emacs (24))) "A simple Chinese fonts config tool" tar ((:commit . "b967605d571d827c1cb041c174fb363985758729") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:keywords "convenience" "chinese" "font") (:url . "https://github.com/tumashu/cnfonts"))]) + (cobalt . [(20180304 1155) ((emacs (24))) "Easily use the Cobalt.rs static site generator" single ((:commit . "634ace275697e188746ca22a30ff94380ec756be") (:authors ("Juan Karlo Licudine" . "accidentalrebel@gmail.com")) (:maintainer "Juan Karlo Licudine" . "accidentalrebel@gmail.com") (:keywords "convenience") (:url . "https://github.com/cobalt-org/cobalt.el"))]) + (cobra-mode . [(20140116 2116) nil "Major mode for .NET-based Cobra language" single ((:commit . "acd6e53f6286af5176471d01f25257e5ddb6dd01") (:authors ("Taylor \"Nekroze\" Lawson")) (:maintainer "Taylor \"Nekroze\" Lawson") (:keywords "languages") (:url . "http://github.com/Nekroze/cobra-mode"))]) + (codcut . [(20190915 1009) nil "Share pieces of code to Codcut" single ((:commit . "7ca7db69e8c38ec45eb572ad16ab2b56086f2131") (:authors ("Diego Pasquali" . "hello@dgopsq.space")) (:maintainer "Diego Pasquali" . "hello@dgopsq.space") (:keywords "comm" "tools" "codcut" "share") (:url . "https://github.com/codcut/codcut-emacs"))]) + (code-archive . [(20190612 308) ((emacs (24 3))) "git supported code archive and reference for org-mode" single ((:commit . "1ad9af6679d0294c3056eab9cad673f29c562721") (:authors ("Michael Schuldt" . "mbschuldt@gmail.com")) (:maintainer "Michael Schuldt" . "mbschuldt@gmail.com") (:url . "https://github.com/mschuldt/code-archive"))]) + (code-cells . [(20210612 755) ((emacs (27 1))) "Work with code split into cells, including Jupyter notebooks" single ((:commit . "1bd650391a6fe84eb267f2534a0750ea1b5549f4") (:authors ("Augusto Stoffel" . "arstoffel@gmail.com")) (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com") (:keywords "convenience" "outlines") (:url . "https://github.com/astoff/code-cells.el"))]) + (code-library . [(20160426 1218) ((gist (1 3 1))) "use org-mode to collect code snippets" single ((:commit . "32d59c5c845d6dbdda18f9bd1c03a58d55417fc5") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "lisp" "code"))]) + (code-stats . [(20201209 2135) ((emacs (25)) (request (0 3 0))) "Code::Stats plugin" single ((:commit . "9a467dfd6a3cef849468623e1c085cbf59dac154") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:url . "https://github.com/xuchunyang/code-stats-emacs"))]) + (codebug . [(20140929 2137) nil "Interact with codebug" single ((:commit . "ac0e4331ba94ccb5203fa492570e1ca6b90c3d52") (:authors ("Shane Dowling")) (:maintainer "Shane Dowling") (:url . "http://www.shanedowling.com/"))]) + (codesearch . [(20181006 1431) ((log4e (0 3 1))) "Core support for managing codesearch tools" tar ((:commit . "f6eb96f034a925444412cfa03e45e0ccbbafe3f2") (:authors ("Austin Bingham" . "austin.bingham@gmail.com") ("Youngjoo Lee" . "youngker@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:keywords "tools" "development" "search") (:url . "https://github.com/abingham/emacs-codesearch"))]) + (codic . [(20150926 1127) ((emacs (24)) (cl-lib (0 5))) "Search Codic (codic.jp) naming dictionaries" tar ((:commit . "52bbb6997ef4ab9fb7fea43bbfff7f04671aa557") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-codic"))]) + (coffee-fof . [(20131012 1230) ((coffee-mode (0 4 1))) "A coffee-mode configuration for `ff-find-other-file'." single ((:commit . "211529594bc074721c6cbc4edb73a63cc05f89ac") (:authors ("Yasuyki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyki Oka" . "yasuyk@gmail.com") (:keywords "coffee-mode") (:url . "http://github.com/yasuyk/coffee-fof"))]) + (coffee-mode . [(20200315 1133) ((emacs (24 3))) "Major mode for CoffeeScript code" single ((:commit . "35a41c7d8233eac0b267d9593e67fb8b6235e134") (:authors ("Chris Wanstrath" . "chris@ozmm.org")) (:maintainer "Chris Wanstrath" . "chris@ozmm.org") (:keywords "coffeescript" "major" "mode") (:url . "http://github.com/defunkt/coffee-mode"))]) + (coin-ticker . [(20170611 727) ((request (0 3 0)) (emacs (25))) "Show a cryptocurrency price ticker" single ((:commit . "9efab90fe4e6f29464af14e0d8fd1e20c0147b80") (:authors ("Evan Klitzke" . "evan@eklitzke.org")) (:maintainer "Evan Klitzke" . "evan@eklitzke.org") (:keywords "news") (:url . "https://github.com/eklitzke/coin-ticker-mode"))]) + (colemak-evil . [(20200326 2359) ((evil (20170323 1140))) "Colemak-friendly keybindings for Evil." single ((:commit . "981bdcb1a48c6d9139493abe7e25fabe126e43c3") (:authors ("Patrick Brinich-Langlois" . "pbrinichlanglois@gmail.com")) (:maintainer "Patrick Brinich-Langlois" . "pbrinichlanglois@gmail.com") (:url . "https://github.com/patbl/colemak-evil"))]) + (colonoscopy-theme . [(20170808 1309) ((emacs (24 0))) "an Emacs 24 theme based on Colonoscopy (tmTheme)" single ((:commit . "64bbb322b13dae91ce9f1e3581f836f94f800ead") (:authors ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))]) + (color-identifiers-mode . [(20210607 1842) ((dash (2 5 0)) (emacs (24))) "Color identifiers based on their names" single ((:commit . "fa42b60f9e84995a8109a49798c0b4c618fc1ed3") (:authors ("Ankur Dave" . "ankurdave@gmail.com")) (:maintainer "Ankur Dave" . "ankurdave@gmail.com") (:keywords "faces" "languages") (:url . "https://github.com/ankurdave/color-identifiers-mode"))]) + (color-moccur . [(20141223 35) nil "multi-buffer occur (grep) mode" single ((:commit . "4f1c59ffd1ccc2ab1a171cd6b721e8cb9e002fb7") (:keywords "convenience") (:url . "http://www.bookshelf.jp/elc/color-moccur.el"))]) + (color-theme . [(20190220 1115) nil "An OBSOLETE color-theme implementation" tar ((:commit . "3a2f6b615f5e2401e30d93a3e0adc210bbb4b7aa") (:authors ("Jonadab the Unsightly One" . "jonadab@bright.net")) (:maintainer "Xavier Maillard" . "zedek@gnu.org") (:keywords "faces") (:url . "http://www.emacswiki.org/cgi-bin/wiki.pl?ColorTheme"))]) + (color-theme-approximate . [(20140228 436) nil "Makes Emacs theme works on terminal transparently" single ((:commit . "f54301ca39bc5d2ffb000f233f8114184a3e7d71") (:authors ("Tung Dao" . "me@tungdao.com")) (:maintainer "Tung Dao" . "me@tungdao.com"))]) + (color-theme-buffer-local . [(20170126 601) ((color-theme (0))) "Install color-themes by buffer." single ((:commit . "e606dec66f16a06140b9aad625a4fd52bca4f936") (:authors ("Victor Borja" . "vic.borja@gmail.com")) (:maintainer "Victor Borja" . "vic.borja@gmail.com") (:keywords "faces") (:url . "http://github.com/vic/color-theme-buffer-local"))]) + (color-theme-modern . [(20200729 921) ((emacs (24))) "Reimplement colortheme with Emacs 24 theme framework." tar ((:commit . "a996eca37f4df726eec95406deb76b538320771a") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/emacs-jp/replace-colorthemes"))]) + (color-theme-sanityinc-solarized . [(20200805 603) ((emacs (24 1)) (cl-lib (0 6))) "A version of Ethan Schoonover's Solarized themes" tar ((:commit . "7ef39ac9d99bfb699903cfc3623521c0ceec7b86") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "faces" "themes") (:url . "https://github.com/purcell/color-theme-sanityinc-solarized"))]) + (color-theme-sanityinc-tomorrow . [(20210528 2344) nil "A version of Chris Kempson's \"tomorrow\" themes" tar ((:commit . "c1a1091e39ecd69822e1494d8b6f0bbcb21eb9b1") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "faces" "themes") (:url . "https://github.com/purcell/color-theme-sanityinc-tomorrow"))]) + (color-theme-x . [(20201204 2245) ((cl-lib (0 5))) "convert color themes to X11 resource settings" single ((:commit . "ec853dd931d625e07116fbc91d8829bd15f90889") (:authors ("Matthew Kennedy" . "mkennedy@killr.ath.cx")) (:maintainer "Andrew Johnson" . "andrew@andrewjamesjohnson.com") (:keywords "convenience" "faces" "frames") (:url . "https://github.com/ajsquared/color-theme-x"))]) + (colorless-themes . [(20210102 1035) ((emacs (24 1))) "A macro to generate mostly colorless themes" single ((:commit . "c1ed1e12541cf05cc6c558d23c089c07e10b54d7") (:authors ("Thomas Letan" . "contact@thomasletan.fr")) (:maintainer "Thomas Letan" . "contact@thomasletan.fr") (:keywords "faces themes" "faces") (:url . "https://git.sr.ht/~lthms/colorless-themes.el"))]) + (colormaps . [(20171008 2224) ((emacs (25))) "Hex colormaps" single ((:commit . "19fbb64a6288d505b9cf45c9b5a3eed0bfb135e2") (:authors ("Abhinav Tushar" . "lepisma@fastmail.com")) (:maintainer "Abhinav Tushar" . "lepisma@fastmail.com") (:keywords "tools") (:url . "https://github.com/lepisma/colormaps.el"))]) + (column-enforce-mode . [(20200605 1933) nil "Highlight text that extends beyond a column" single ((:commit . "14a7622f2268890e33536ccd29510024d51ee96f") (:authors ("Jordon Biondo")) (:maintainer "Jordon Biondo") (:url . "www.github.com/jordonbiondo/column-enforce-mode"))]) + (com-css-sort . [(20201002 1430) ((emacs (25 1)) (s (1 12 0))) "Common way of sorting the CSS attributes" single ((:commit . "61244e12594f117ffac047454311212604399d52") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs090218/com-css-sort"))]) + (comb . [(20201010 1147) ((emacs (25 1))) "Interactive code auditing and grep tool" tar ((:commit . "31f3e94afb2a7f7d18d30c2468a0c683700f7a66") (:authors ("Andrea Cardaci" . "cyrus.and@gmail.com")) (:maintainer "Andrea Cardaci" . "cyrus.and@gmail.com") (:keywords "matching") (:url . "https://github.com/cyrus-and/comb"))]) + (comby . [(20200629 140) ((emacs (25 1))) "Emacs comby integration" single ((:commit . "928b8b8959a2556aba5526f2a25801341eb59dc3") (:authors ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainer "Sergey Kostyaev" . "feo.me@ya.ru") (:keywords "languages") (:url . "https://github.com/s-kostyaev/comby.el"))]) + (comint-hyperlink . [(20191104 2224) ((emacs (24 3))) "Create hyperlinks in comint for SGR URL control sequences" single ((:commit . "a7878825788ff6b9d6b8a5adf0214a028bad895e") (:authors ("Matthew Bauer" . "mjbauer95@gmail.com")) (:maintainer "Matthew Bauer" . "mjbauer95@gmail.com") (:keywords "comint" "shell" "processes" "hypermedia" "terminals") (:url . "https://github.com/matthewbauer/comint-hyperlink"))]) + (comint-intercept . [(20200106 454) ((emacs (24 3))) "Intercept input in comint-mode" single ((:commit . "3c9a6125e450435b79ab5e6466f830e57c5e0a30") (:authors ("\"Huang, Ying\"" . "huang.ying.caritas@gmail.com")) (:maintainer "\"Huang, Ying\"" . "huang.ying.caritas@gmail.com") (:keywords "processes" "terminals") (:url . "https://github.com/hying-caritas/comint-intercept"))]) + (command-log-mode . [(20160413 447) nil "log keyboard commands to buffer" single ((:commit . "af600e6b4129c8115f464af576505ea8e789db27") (:authors ("Michael Weber" . "michaelw@foldr.org")) (:maintainer "Michael Weber" . "michaelw@foldr.org") (:keywords "help") (:url . "https://github.com/lewang/command-log-mode"))]) + (command-queue . [(20160328 1725) ((emacs (24 3))) "shell command queue" single ((:commit . "f327c6f852592229a755ec6de0c62c6aeafd6659") (:authors ("Yuki INOUE <inouetakahiroki at gmail.com>")) (:maintainer "Yuki INOUE <inouetakahiroki at gmail.com>") (:url . "https://github.com/Yuki-Inoue/command-queue"))]) + (commander . [(20140120 1852) ((s (1 6 0)) (dash (2 0 0)) (cl-lib (0 3)) (f (0 6 1))) "Emacs command line parser" single ((:commit . "9ba1456b0a389a2f7b42b6f42a4208ddd87ce609") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "cli" "argv") (:url . "http://github.com/rejeep/commander.el"))]) + (comment-dwim-2 . [(20210101 1820) ((emacs (24 4))) "An all-in-one comment command to rule them all" single ((:commit . "7cdafd6d98234a7402865b8abdae54a2f2551c94") (:authors ("Rémy Ferré" . "dev@remyferre.net")) (:maintainer "Rémy Ferré" . "dev@remyferre.net") (:keywords "convenience") (:url . "https://github.com/remyferre/comment-dwim-2"))]) + (comment-or-uncomment-sexp . [(20190225 1122) ((emacs (24))) "Command for commenting the sexp under point." single ((:commit . "bec730d3fc1e6c17ff1339eb134af16c034a4d95") (:authors ("Artur Malabarba" . "artur@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "artur@endlessparentheses.com") (:keywords "convenience") (:url . "https://github.com/Malabarba/comment-or-uncomment-sexp"))]) + (comment-tags . [(20170910 1735) ((emacs (24 5))) "Highlight & navigate comment tags like 'TODO'." single ((:commit . "7d914097f0a03484af71e621db533737fc692f58") (:authors ("Vincent Dumas" . "vincekd@gmail.com")) (:maintainer "Vincent Dumas" . "vincekd@gmail.com") (:keywords "convenience" "comments" "tags") (:url . "https://github.com/vincekd/comment-tags"))]) + (commentary-theme . [(20181213 1045) ((emacs (24))) "A minimal theme with contrasting comments" single ((:commit . "dede0f8ecb72156fa6ae81198ea570ead02997ff") (:url . "https://github.com/pzel/commentary-theme"))]) + (commenter . [(20160219 1627) ((emacs (24 4)) (let-alist (1 0 4))) "multiline-comment support package" single ((:commit . "6d1885419434ba779270c6fda0e30d390bb074bd") (:authors ("Yuta Yamada <cokesboy\"at\"gmail.com>")) (:maintainer "Yuta Yamada <cokesboy\"at\"gmail.com>") (:keywords "comment") (:url . "https://github.com/yuutayamada/commenter"))]) + (commify . [(20200921 2002) ((s (1 9 0))) "Toggle grouping commas in numbers" single ((:commit . "b1c1a06e488208ef653e0d86c97b746fd6d2bbc2") (:authors ("Daniel E. Doherty" . "ded-commify@ddoherty.net")) (:maintainer "Daniel E. Doherty" . "ded-commify@ddoherty.net") (:keywords "convenience" "editing" "numbers" "grouping" "commas") (:url . "https://github.com/ddoherty03/commify"))]) + (common-lisp-snippets . [(20180226 1523) ((yasnippet (0 8 0))) "Yasnippets for Common Lisp" tar ((:commit . "c82ebf18f4ad49f390dd96ffcc59f8683c1a868b") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:keywords "snippets") (:url . "https://github.com/mrkkrp/common-lisp-snippets"))]) + (company . [(20210611 1224) ((emacs (25 1))) "Modular text completion framework" tar ((:commit . "b7120176b8107048a32e9083e48acd8abec2c20c") (:authors ("Nikolaj Schumacher")) (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru") (:keywords "abbrev" "convenience" "matching") (:url . "http://company-mode.github.io/"))]) + (company-anaconda . [(20200404 1859) ((company (0 8 0)) (anaconda-mode (0 1 1)) (cl-lib (0 5 0)) (dash (2 6 0)) (s (1 9))) "Anaconda backend for company-mode" single ((:commit . "da1566db41a68809ef7f91ebf2de28118067c89b") (:authors ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainer "Artem Malyshev" . "proofit404@gmail.com") (:url . "https://github.com/proofit404/anaconda-mode"))]) + (company-ansible . [(20200306 1441) ((emacs (24 4)) (company (0 8 12))) "A company back-end for ansible" tar ((:commit . "79dd421b161efa49fbdffad57fa40edb41f484a3") (:authors ("Krzysztof Magosa" . "krzysztof@magosa.pl")) (:maintainer "Krzysztof Magosa" . "krzysztof@magosa.pl") (:keywords "ansible") (:url . "https://github.com/krzysztof-magosa/company-ansible"))]) + (company-arduino . [(20160306 1739) ((emacs (24 1)) (company (0 8 0)) (irony (0 1 0)) (cl-lib (0 5)) (company-irony (0 1 0)) (company-c-headers (20140930)) (arduino-mode (1 0))) "company-mode for Arduino" single ((:commit . "d7e369702b8eee63e6dfdeba645ce28b6dc66fb1") (:authors ("Yuta Yamada" . "sleepboy.zzz@gmail.com")) (:maintainer "Yuta Yamada" . "sleepboy.zzz@gmail.com") (:keywords "convenience" "development" "company") (:url . "https://github.com/yuutayamada/company-arduino"))]) + (company-auctex . [(20200529 1835) ((yasnippet (0 8 0)) (company (0 8 0)) (auctex (11 87))) "Company-mode auto-completion for AUCTeX" single ((:commit . "9400a2ec7459dde8cbf1a5d50dfee4e300ed7e18") (:authors ("Christopher Monsanto <chris@monsan.to>, Alexey Romanov" . "alexey.v.romanov@gmail.com")) (:maintainer "Christopher Monsanto <chris@monsan.to>, Alexey Romanov" . "alexey.v.romanov@gmail.com") (:url . "https://github.com/alexeyr/company-auctex/"))]) + (company-axiom . [(20191027 1928) ((emacs (24)) (company (0 9)) (axiom-environment (20171021))) "A company-mode backend for the axiom-environment system" single ((:commit . "ac8228a702290732ba12c5d13b38576a57afb0d6") (:authors ("Paul Onions" . "paul.onions@acm.org")) (:maintainer "Paul Onions" . "paul.onions@acm.org") (:keywords "axiom" "openaxiom" "fricas" "axiom-environment"))]) + (company-bibtex . [(20171105 644) ((company (0 9 0)) (cl-lib (0 5)) (parsebib (1 0))) "Company completion for bibtex keys" single ((:commit . "da67faf3a6faba8e7f1b222dedfc5521b02c7655") (:authors ("GB Gardner" . "gbgar@users.noreply.github.com")) (:maintainer "GB Gardner" . "gbgar@users.noreply.github.com") (:keywords "company-mode" "bibtex") (:url . "https://github.com/gbgar/company-bibtex"))]) + (company-box . [(20210330 1155) ((emacs (26 0 91)) (dash (2 13)) (dash-functional (1 2 0)) (company (0 9 6)) (frame-local (0 0 1))) "Company front-end with icons" tar ((:commit . "aa5f09a5492344e3cc831f0f169a6a8345dec358") (:authors ("Sebastien Chapuis" . "sebastien@chapu.is")) (:maintainer "Sebastien Chapuis" . "sebastien@chapu.is") (:keywords "company" "completion" "front-end" "convenience") (:url . "https://github.com/sebastiencs/company-box"))]) + (company-c-headers . [(20190825 1631) ((emacs (24 1)) (company (0 8))) "Company mode backend for C/C++ header files" single ((:commit . "9d384571b1190e99d0a789e5296176d69a3d0771") (:authors ("Alastair Rankine" . "alastair@girtby.net")) (:maintainer "Alastair Rankine" . "alastair@girtby.net") (:keywords "development" "company"))]) + (company-cabal . [(20170917 1317) ((cl-lib (0 5)) (company (0 8 0)) (emacs (24))) "company-mode cabal backend" tar ((:commit . "62112a7259e24bd6c08885629a185afe512b7d3d") (:authors ("Iku Iwasa" . "iku.iwasa@gmail.com")) (:maintainer "Iku Iwasa" . "iku.iwasa@gmail.com") (:url . "https://github.com/iquiw/company-cabal"))]) + (company-coq . [(20210420 215) ((cl-lib (0 5)) (dash (2 12 1)) (yasnippet (0 11 0)) (company (0 8 12)) (company-math (1 1))) "A collection of extensions for Proof General's Coq mode" tar ((:commit . "6a23da61e4008f54cf1b713f8b8bffd37887e172") (:authors ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com") (:keywords "convenience" "languages") (:url . "https://github.com/cpitclaudel/company-coq"))]) + (company-ctags . [(20210610 118) ((emacs (25 1)) (company (0 9 0))) "Fastest company-mode completion backend for ctags" single ((:commit . "ecf951fae561cab261e86cbab18c0a035d7a876a") (:authors ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com") (:keywords "convenience") (:url . "https://github.com/redguardtoo/company-ctags"))]) + (company-dcd . [(20210307 649) ((company (0 9)) (flycheck-dmd-dub (0 7)) (yasnippet (0 8)) (popwin (0 7)) (cl-lib (0 5)) (ivy (20160804 326))) "Company backend for Dlang using DCD." single ((:commit . "858500115d4f0285f963698ede9492f409a90e52") (:authors ("tsukimizake <shomasd_at_gmail.com>")) (:maintainer "tsukimizake <shomasd_at_gmail.com>") (:keywords "languages") (:url . "http://github.com/tsukimizake/company-dcd"))]) + (company-dict . [(20190302 5) ((emacs (24 4)) (company (0 8 12)) (parent-mode (2 3))) "A backend that emulates ac-source-dictionary" single ((:commit . "cd7b8394f6014c57897f65d335d6b2bd65dab1f4") (:authors ("Henrik Lissner <http://github/hlissner>")) (:maintainer "Henrik Lissner" . "henrik@lissner.net") (:keywords "company" "dictionary" "ac-source-dictionary") (:url . "https://github.com/hlissner/emacs-company-dict"))]) + (company-distel . [(20180827 1344) ((distel-completion-lib (1 0 0))) "Erlang/distel completion backend for company-mode" single ((:commit . "acc4c0a5521904203d797fe96b08e5fae4233c7e") (:authors ("Sebastian Weddmark Olsson")) (:maintainer "Sebastian Weddmark Olsson") (:keywords "erlang" "distel" "company") (:url . "github.com/sebastiw/distel-completion"))]) + (company-emacs-eclim . [(20180911 1121) ((eclim (0 3)) (company (0 7)) (cl-lib (0 5))) "Eclim company backend" single ((:commit . "222ddd48fcf0ee01592dec77c58e0cf3f2ea1100"))]) + (company-emoji . [(20210427 2151) ((cl-lib (0 5)) (company (0 8 0))) "company-mode backend for emoji" tar ((:commit . "90594eb58b20fb937cfd4e946efcc446ee630e6f") (:authors ("Alex Dunn" . "dunn.alex@gmail.com")) (:maintainer "Alex Dunn" . "dunn.alex@gmail.com") (:keywords "emoji" "company") (:url . "https://github.com/dunn/company-emoji.git"))]) + (company-erlang . [(20170123 538) ((emacs (24 4)) (ivy-erlang-complete (0 1)) (company (0 9 2))) "company backend based on ivy-erlang-complete" single ((:commit . "bc0524a16f17b66c7397690e4ca0e004f09ea6c5") (:authors ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainer "Sergey Kostyaev" . "feo.me@ya.ru") (:keywords "tools"))]) + (company-flow . [(20180225 2159) ((company (0 8 0)) (dash (2 13 0))) "Flow backend for company-mode" single ((:commit . "76ef585c70d2a3206c2eadf24ba61e59124c3a16") (:authors ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Aaron Jensen" . "aaronjensen@gmail.com") (:url . "https://github.com/aaronjensen/company-flow"))]) + (company-flx . [(20180103 518) ((emacs (24)) (company (0 8 12)) (flx (0 5))) "flx based fuzzy matching for company" single ((:commit . "16ca0d2f84e8e768bf2db8c5cfe421230a00bded") (:authors ("PythonNut" . "pythonnut@pythonnut.com")) (:maintainer "PythonNut" . "pythonnut@pythonnut.com") (:keywords "convenience" "company" "fuzzy" "flx") (:url . "https://github.com/PythonNut/company-flx"))]) + (company-fuzzy . [(20210608 1454) ((emacs (24 4)) (company (0 8 12)) (s (1 12 0)) (ht (2 0))) "Fuzzy matching for `company-mode'" single ((:commit . "b35c6fd89ad111c662916751cf8b3facc8acb1c0") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/company-fuzzy"))]) + (company-ghci . [(20190707 311) ((company (0 8 11)) (haskell-mode (13))) "company backend which uses the current ghci process." single ((:commit . "a1d25652583ab4666c5a78cac18cd8039776b50d") (:authors ("Hector Orellana" . "hofm92@gmail.com")) (:maintainer "Hector Orellana" . "hofm92@gmail.com"))]) + (company-glsl . [(20210109 1403) ((company (0 9 4)) (glsl-mode (2 4)) (emacs (24 4))) "Support glsl in company-mode" single ((:commit . "3a40501ba831a30a7fd3e8529b20d1305d0454aa") (:authors ("Guido Schmidt" . "git@guidoschmidt.cc")) (:maintainer "Guido Schmidt" . "git@guidoschmidt.cc") (:url . "https://github.com/guidoschmidt/company-glsl"))]) + (company-go . [(20190203 19) ((company (0 8 0)) (go-mode (1 0 0))) "company-mode backend for Go (using gocode)" single ((:commit . "4acdcbdea79de6b3dee1c637eca5cbea0fdbe37c") (:authors ("nsf" . "no.smile.face@gmail.com")) (:maintainer "nsf" . "no.smile.face@gmail.com") (:keywords "languages"))]) + (company-inf-ruby . [(20140805 2054) ((company (0 6 10)) (inf-ruby (2 2 7)) (emacs (24 1))) "company-mode completion back-end for inf-ruby" single ((:commit . "fe3e4863bc971fbb81edad447efad5795ead1b17") (:authors ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru") (:url . "https://github.com/company-mode/company-inf-ruby"))]) + (company-ipa . [(20210307 1838) ((emacs (24 3)) (company (0 8 12))) "IPA backend for company" single ((:commit . "8634021cac885f53f3274ef6dcce7eab19321046") (:authors ("Matías Guzmán Naranjo" . "mguzmann89@gmail.com")) (:maintainer "Matías Guzmán Naranjo" . "mguzmann89@gmail.com") (:keywords "convenience" "company" "ipa") (:url . "https://github.com/mguzmann/company-ipa"))]) + (company-irony . [(20190124 2346) ((emacs (24 1)) (company (0 8 0)) (irony (1 1 0)) (cl-lib (0 5))) "company-mode completion back-end for irony-mode" single ((:commit . "b44711dfce445610c1ffaec4951c6ff3882b216a") (:authors ("Guillaume Papin" . "guillaume.papin@epitech.eu")) (:maintainer "Guillaume Papin" . "guillaume.papin@epitech.eu") (:keywords "convenience") (:url . "https://github.com/Sarcasm/company-irony/"))]) + (company-irony-c-headers . [(20151018 909) ((cl-lib (0 5)) (company (0 9 0)) (irony (0 2 0))) "Company mode backend for C/C++ header files with Irony" single ((:commit . "72c386aeb079fb261d9ec02e39211272f76bbd97") (:authors ("Yutian Li" . "hotpxless@gmail.com")) (:maintainer "Yutian Li" . "hotpxless@gmail.com") (:keywords "c" "company") (:url . "https://github.com/hotpxl/company-irony-c-headers"))]) + (company-jedi . [(20200324 25) ((emacs (24)) (cl-lib (0 5)) (company (0 8 11)) (jedi-core (0 2 7))) "Company-mode completion back-end for Python JEDI" single ((:commit . "4775b659564f1d57bc68c88c9faabf44c9fe4e4d") (:authors ("Boy" . "boyw165@gmail.com")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com") (:url . "https://github.com/emacsorphanage/company-jedi"))]) + (company-lean . [(20210305 1705) ((emacs (24 3)) (dash (2 18 0)) (s (1 10 0)) (f (0 19 0)) (company (0 9 3)) (lean-mode (3 3 0))) "A company backend for lean-mode" single ((:commit . "bf32bb97930ed67c5cbe0fe3d4a69dedcf68be44") (:authors ("Leonardo de Moura" . "leonardo@microsoft.com") ("Soonho Kong " . "soonhok@cs.cmu.edu") ("Gabriel Ebner " . "gebner@gebner.org") ("Sebastian Ullrich" . "sebasti@nullri.ch")) (:maintainer "Sebastian Ullrich" . "sebasti@nullri.ch") (:keywords "languages") (:url . "https://github.com/leanprover/lean-mode"))]) + (company-ledger . [(20200726 1825) ((emacs (24 3)) (company (0 8 0))) "Fuzzy auto-completion for Ledger & friends" single ((:commit . "9fe9e3b809d6d2bc13c601953f696f43b09ea296") (:authors ("Debanjum Singh Solanky <debanjum AT gmail DOT com>")) (:maintainer "Debanjum Singh Solanky <debanjum AT gmail DOT com>") (:keywords "abbrev" "matching" "auto-complete" "beancount" "ledger" "company") (:url . "https://github.com/debanjum/company-ledger"))]) + (company-lua . [(20171108 2306) ((company (0 8 12)) (s (1 10 0)) (f (0 17 0)) (lua-mode (20151025))) "Company backend for Lua" tar ((:commit . "29f6819de4d691e5fd0b62893a9f4fbc1c6fcb52") (:authors ("Peter Vasil" . "mail@petervasil.net")) (:maintainer "Peter Vasil" . "mail@petervasil.net"))]) + (company-manually . [(20200709 913) ((emacs (24 3)) (company (0 9 0)) (ivy (0 13 0))) "A company backend that lets you manually build candidates" single ((:commit . "44c7a655e5f2a462835a96d1f0ed2ce434848416") (:authors ("Yanghao Xie")) (:maintainer "Yanghao Xie" . "yhaoxie@gmail.com") (:keywords "convenience" "company-mode" "manually build candidates") (:url . "https://github.com/yanghaoxie/company-manually"))]) + (company-math . [(20200131 2337) ((company (0 8 0)) (math-symbol-lists (1 3))) "Completion backends for unicode math symbols and latex tags" single ((:commit . "a796053590012e6a15c8b527b521ffc15d137bd0") (:authors ("Vitalie Spinu" . "spinuvit@gmail.com")) (:maintainer "Vitalie Spinu" . "spinuvit@gmail.com") (:keywords "unicode" "symbols" "completion") (:url . "https://github.com/vspinu/company-math"))]) + (company-maxima . [(20210520 2034) ((emacs (25 1)) (maxima (0 6 1)) (seq (2 20)) (company (0 9 13))) "Maxima company integration" single ((:commit . "74e10d5dedb16f74efc28299c98dd7db9a4392d6") (:authors ("Fermin Munoz")) (:maintainer "Fermin Munoz" . "fmfs@posteo.net") (:keywords "languages" "tools" "convenience") (:url . "https://gitlab.com/sasanidas/maxima"))]) + (company-nand2tetris . [(20171201 1813) ((nand2tetris (1 1 0)) (company (0 5)) (cl-lib (0 5 0))) "Company backend for nand2tetris major mode" single ((:commit . "33acee34d24b1c6a87db833b7d23449cf858f64f") (:authors ("Diego Berrocal" . "cestdiego@gmail.com")) (:maintainer "Diego Berrocal" . "cestdiego@gmail.com") (:keywords "nand2tetris" "hdl" "company") (:url . "http://www.github.com/CestDiego/nand2tetris.el/"))]) + (company-native-complete . [(20200315 2144) ((emacs (25 1)) (company (0 9 0)) (native-complete (0 1 0))) "Company completion using native-complete" single ((:commit . "cf142e84eaa4dd91bc75d96a5d26dab5e38eba4c") (:authors ("Troy Hinckley" . "troy.hinckley@gmail.com")) (:maintainer "Troy Hinckley" . "troy.hinckley@gmail.com") (:url . "https://github.com/CeleritasCelery/emacs-native-shell-complete"))]) + (company-nginx . [(20201020 2038) ((emacs (24)) (cl-lib (0)) (company (0))) "company-mode keywords support for nginx-mode" single ((:commit . "82bdb730ad5971c594d9c99c069f3c7bb067897d") (:keywords "company" "nginx") (:url . "https://github.com/stardiviner/company-nginx"))]) + (company-ngram . [(20170129 1913) ((cl-lib (0 5)) (company (0 8 0))) "N-gram based completion" tar ((:commit . "09a68b802e64799e95f205b438d469bbd78cd2e6") (:authors ("kshramt")) (:maintainer "kshramt") (:url . "https://github.com/kshramt/company-ngram"))]) + (company-nixos-options . [(20160215 857) ((company (0 8 0)) (nixos-options (0 0 1)) (cl-lib (0 5 0))) "Company Backend for nixos-options" single ((:commit . "053a2d5110ce05b7f99bcc2ac4804b70cbe87916") (:authors ("Diego Berrocal" . "cestdiego@gmail.com") ("Travis B. Hartwell" . "nafai@travishartwell.net")) (:maintainer "Diego Berrocal" . "cestdiego@gmail.com") (:keywords "unix") (:url . "http://www.github.com/travisbhartwell/nix-emacs/"))]) + (company-org-block . [(20210609 1451) ((emacs (25 1)) (company (0 8 0)) (org (9 2 0))) "Org blocks company backend" single ((:commit . "e1ff6f1696f286100e0468cfb03a23fa6f39de66") (:authors ("Alvaro Ramirez")) (:maintainer "Alvaro Ramirez") (:url . "https://github.com/xenodium/company-org-block"))]) + (company-php . [(20201009 1025) ((cl-lib (0 5)) (ac-php-core (2 0)) (company (0 9))) "A company back-end for PHP." single ((:commit . "9770c95bf2df93d9cb0f200723b03b3d9a480640") (:authors ("jim" . "xcwenn@qq.com")) (:maintainer "jim") (:keywords "completion" "convenience" "intellisense") (:url . "https://github.com/xcwen/ac-php"))]) + (company-phpactor . [(20200121 1218) ((emacs (24 3)) (company (0 9 6)) (phpactor (0 1 0))) "company-mode backend for Phpactor" single ((:commit . "debf66848c6099415c731b179dcd47e96db3b50b") (:authors ("Martin Tang" . "martin.tang365@gmail.com") ("Mikael Kermorgant" . "mikael@kgtech.fi")) (:maintainer "Martin Tang" . "martin.tang365@gmail.com") (:keywords "tools" "php") (:url . "https://github.com/emacs-php/phpactor.el"))]) + (company-plisp . [(20200531 1927) ((emacs (25)) (s (1 2 0)) (company (0 8 12)) (dash (2 12 0)) (cl-lib (0 5))) "Company mode backend for PicoLisp language" tar ((:commit . "fc0b56d2a711340ca3e63119bfe692bb3e8620fb") (:authors ("Fermin MF" . "fmfs@posteo.net")) (:maintainer "Fermin MF" . "fmfs@posteo.net") (:keywords "company" "plisp" "convenience" "auto-completion") (:url . "https://gitlab.com/sasanidas/company-plisp"))]) + (company-plsense . [(20180118 58) ((company (0 9 3)) (cl-lib (0 5 0)) (dash (2 12 0)) (s (1 12)) (emacs (24))) "Company backend for Perl" single ((:commit . "b48e3181e08ec597269621d621aa06636f02d883") (:authors ("Troy Hinckley" . "troy.hinckley@gmail.com")) (:maintainer "Troy Hinckley" . "troy.hinckley@gmail.com") (:url . "https://github.com/CeleritasCelery/company-plsense"))]) + (company-pollen . [(20160812 1510) ((company (0 9 0)) (pollen-mode (1 0))) "company-mode completion backend for pollen" single ((:commit . "09a9dc48c468dcd385982b9629f325e70d569faf") (:authors ("Junsong Li <ljs.darkfish AT GMAIL>")) (:maintainer "Junsong Li") (:keywords "languages" "pollen" "pollenpub" "company") (:url . "https://github.com/lijunsong/pollen-mode"))]) + (company-posframe . [(20210419 607) ((emacs (26 0)) (company (0 9 0)) (posframe (0 9 0))) "Use a posframe as company candidate menu" single ((:commit . "c7a820a35ff132aaec53c81e05afc829de39eb68") (:authors ("Clément Pit-Claudel, Feng Shu, Lars Andersen" . "expez@expez.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:keywords "abbrev" "convenience" "matching") (:url . "https://github.com/tumashu/company-posframe"))]) + (company-prescient . [(20210227 600) ((emacs (25 1)) (prescient (5 1)) (company (0 9 6))) "prescient.el + Company" single ((:commit . "4a0f5405798cfcb98ea005078ef2e2d490e922c4") (:authors ("Radon Rosborough" . "radon.neon@gmail.com")) (:maintainer "Radon Rosborough" . "radon.neon@gmail.com") (:keywords "extensions") (:url . "https://github.com/raxod502/prescient.el"))]) + (company-qml . [(20170428 1708) ((qml-mode (0 1)) (company (0 8 12))) "Company backend for QML files" tar ((:commit . "4af4f32a7ad86d86bb9293fb0b675aec513b5736") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions"))]) + (company-quickhelp . [(20210515 2212) ((emacs (24 3)) (company (0 8 9)) (pos-tip (0 4 6))) "Popup documentation for completion candidates" single ((:commit . "530b29380f0f95ae338cbe089693d786e6f53d86") (:authors ("Lars Andersen" . "expez@expez.com")) (:maintainer "Lars Andersen" . "expez@expez.com") (:keywords "company" "popup" "documentation" "quickhelp") (:url . "https://www.github.com/expez/company-quickhelp"))]) + (company-quickhelp-terminal . [(20200904 305) ((emacs (24 4)) (company-quickhelp (2 2 0)) (popup (0 5 3))) "Terminal support for `company-quickhelp'" single ((:commit . "c2e077e8d32610f80a506c410ab51a4ba747a47f") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/company-quickhelp-terminal"))]) + (company-racer . [(20171205 310) ((emacs (24 4)) (cl-lib (0 5)) (company (0 8 0)) (deferred (0 3 1))) "Company integration for racer" single ((:commit . "a00381c9d416f375f783fcb6ae8d40669ce1f567") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:keywords "convenience") (:url . "https://github.com/emacs-pe/company-racer"))]) + (company-reftex . [(20210418 1316) ((emacs (25 1)) (s (1 12)) (company (0 8))) "Company backend based on RefTeX." single ((:commit . "42eb98c6504e65989635d95ab81b65b9d5798e76") (:authors ("Eivind Fonn" . "evfonn@gmail.com")) (:maintainer "Eivind Fonn" . "evfonn@gmail.com") (:keywords "bib" "tex" "company" "latex" "reftex" "references" "labels" "citations") (:url . "https://github.com/TheBB/company-reftex"))]) + (company-restclient . [(20190426 1312) ((cl-lib (0 5)) (company (0 8 0)) (emacs (24)) (know-your-http-well (0 2 0)) (restclient (0 0 0))) "company-mode completion back-end for restclient-mode" single ((:commit . "e5a3ec54edb44776738c13e13e34c85b3085277b") (:authors ("Iku Iwasa" . "iku.iwasa@gmail.com")) (:maintainer "Iku Iwasa" . "iku.iwasa@gmail.com") (:url . "https://github.com/iquiw/company-restclient"))]) + (company-rtags . [(20191222 920) ((emacs (24 3)) (company (0 8 1)) (rtags (2 10))) "RTags back-end for company" single ((:commit . "63f18acb21e664fd92fbc19465f0b5df085b5e93") (:authors ("Jan Erik Hanssen" . "jhanssen@gmail.com") ("Anders Bakken" . "agbakken@gmail.com")) (:maintainer "Jan Erik Hanssen" . "jhanssen@gmail.com") (:url . "https://github.com/Andersbakken/rtags"))]) + (company-shell . [(20170518 541) ((emacs (24 4)) (company (0 8 12)) (dash (2 12 0)) (cl-lib (0 5))) "Company mode backend for shell functions" single ((:commit . "52f3bf26b74adc30a275f5f4290a1fc72a6876ff") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:keywords "company" "shell" "auto-completion") (:url . "https://github.com/Alexander-Miller/company-shell"))]) + (company-solidity . [(20181117 1518) ((company (0 9 0)) (cl-lib (0 5 0)) (solidity-mode (0 1 9))) "Company-mode back-end for solidity-mode" single ((:commit . "383ac144727c716c65989c079ae76127e25144c3") (:authors ("Samuel Smolkin" . "sam@future-precedent.org")) (:maintainer "Samuel Smolkin" . "sam@future-precedent.org") (:keywords "solidity" "completion" "company") (:url . "https://github.com/ethereum/emacs-solidity"))]) + (company-sourcekit . [(20210430 2155) ((emacs (24 3)) (company (0 8 12)) (dash (2 18 0)) (sourcekit (0 2 0))) "company-mode completion backend for SourceKit" single ((:commit . "a1860ad4dd3a542acd2fa0dfac2a388cbdf4af0c") (:authors ("Nathan Kot" . "nk@nathankot.com")) (:maintainer "Nathan Kot" . "nk@nathankot.com") (:keywords "abbrev") (:url . "https://github.com/nathankot/company-sourcekit"))]) + (company-stan . [(20210130 1325) ((emacs (24 3)) (company (0 9 10)) (stan-mode (10 2 1))) "A company-mode completion backend for stan" single ((:commit . "9bb858b9f1314dcf1a5df23e39f9af522098276b") (:authors ("Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu")) (:maintainer "Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu") (:keywords "languages") (:url . "https://github.com/stan-dev/stan-mode/tree/master/company-stan"))]) + (company-statistics . [(20170210 1933) ((emacs (24 3)) (company (0 8 5))) "Sort candidates using completion history" single ((:commit . "e62157d43b2c874d2edbd547c3bdfb05d0a7ae5c") (:authors ("Ingo Lohmar" . "i.lohmar@gmail.com")) (:maintainer "Ingo Lohmar" . "i.lohmar@gmail.com") (:keywords "abbrev" "convenience" "matching") (:url . "https://github.com/company-mode/company-statistics"))]) + (company-suggest . [(20200911 1845) ((company (0 9 0)) (emacs (25 1))) "Company-mode back-end for search engine suggests" single ((:commit . "1c89c9de3852f07ce28b0bedf1fbf56fe6eedcdc") (:authors ("Jürgen Hötzel" . "juergen@archlinux.org")) (:maintainer "Jürgen Hötzel" . "juergen@archlinux.org") (:keywords "completion" "convenience") (:url . "https://github.com/juergenhoetzel/company-suggest"))]) + (company-tabnine . [(20210310 2247) ((emacs (25)) (company (0 9 3)) (cl-lib (0 5)) (dash (2 16 0)) (s (1 12 0)) (unicode-escape (1 1))) "A company-mode backend for TabNine" single ((:commit . "98e9e8b38b6ca289fbe265b0a7b62c7fe38ed0e2") (:authors ("Tommy Xiang" . "tommyx058@gmail.com")) (:maintainer "Tommy Xiang" . "tommyx058@gmail.com") (:keywords "convenience") (:url . "https://github.com/TommyX12/company-tabnine/"))]) + (company-terraform . [(20190607 1037) ((emacs (24 4)) (company (0 8 12)) (terraform-mode (0 6))) "A company backend for terraform" tar ((:commit . "2d11a21fee2f298e48968e479ddcaeda4d736e12") (:authors ("Rafał Cieślak" . "rafalcieslak256@gmail.com")) (:maintainer "Rafał Cieślak" . "rafalcieslak256@gmail.com") (:keywords "abbrev" "convenience" "terraform" "company") (:url . "https://github.com/rafalcieslak/emacs-company-terraform"))]) + (company-try-hard . [(20200417 1603) ((emacs (24 3)) (company (0 8 0)) (dash (2 0))) "get all completions from company backends" single ((:commit . "2b41136b5ed6e02032d99bcdb0599ecf00394fa5") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:keywords "matching") (:url . "https://github.com/Wilfred/company-try-hard"))]) + (company-web . [(20180402 1155) ((company (0 8 0)) (dash (2 8 0)) (cl-lib (0 5 0)) (web-completion-data (0 1 0))) "Company version of ac-html, complete for web,html,emmet,jade,slim modes" tar ((:commit . "f0cc9187c9c34f72ad71f5649a69c74f996bae9a") (:authors ("Olexandr Sydorchuk" . "olexandr.syd@gmail.com")) (:maintainer "Olexandr Sydorchuk" . "olexandr.syd@gmail.com") (:keywords "html" "company") (:url . "https://github.com/osv/company-web"))]) + (company-wordfreq . [(20210201 1839) ((emacs (27 1)) (company (0 9))) "Company backend for human language texts" single ((:commit . "3787785af2135c42af7b22562da554628141afdb") (:authors ("Johannes Mueller" . "github@johannes-mueller.org")) (:maintainer "Johannes Mueller" . "github@johannes-mueller.org") (:keywords "company" "convenience" "matching") (:url . "https://github.com/johannes-mueller/company-wordfreq.el"))]) + (company-ycm . [(20140904 1817) ((ycm (0 1))) "company-ycm" single ((:commit . "4da8a14abcd0f4fa3235042ade2e12b5068c0601") (:authors ("Ajay Gopinathan" . "ajay@gopinathan.net")) (:maintainer "Ajay Gopinathan" . "ajay@gopinathan.net") (:keywords "abbrev"))]) + (company-ycmd . [(20180520 1053) ((ycmd (1 3)) (company (0 9 3)) (deferred (0 5 1)) (s (1 11 0)) (dash (2 13 0)) (let-alist (1 0 5)) (f (0 19 0))) "company-mode backend for ycmd" single ((:commit . "c17ff9e0250a9b39d23af37015a2b300e2f36fed") (:url . "https://github.com/abingham/emacs-ycmd"))]) + (compdef . [(20200304 611) ((emacs (24 4))) "A local completion definer" single ((:commit . "30fb5846ed851efee641ce8c5d8879ad36cd7ac6") (:authors ("Uros Perisic")) (:maintainer "Uros Perisic") (:keywords "convenience") (:url . "https://gitlab.com/jjzmajic/compdef"))]) + (competitive-programming-snippets . [(20201115 1702) ((emacs (26)) (yasnippet (0 8 0))) "Competitive Programming snippets for yasnippet" tar ((:commit . "3b43c1aeaa6676d1d3d0c47e78790db9bee150b6") (:authors ("Seong Yong-ju" . "sei40kr@gmail.com")) (:maintainer "Seong Yong-ju" . "sei40kr@gmail.com") (:keywords "tools") (:url . "https://github.com/sei40kr/competitive-programming-snippets"))]) + (compiler-explorer . [(20210513 409) ((emacs (26 1)) (request (0 3 0))) "Compiler explorer client (godbolt.org)" single ((:commit . "70cae42f0d624b6ce03b55c35ba9a6c2318a827d") (:authors ("Michał Krzywkowski" . "k.michal@zoho.com")) (:maintainer "Michał Krzywkowski" . "k.michal@zoho.com") (:keywords "c" "tools") (:url . "https://github.com/mkcms/compiler-explorer.el"))]) + (completions-frame . [(20210430 640) ((emacs (26 1))) "Show completions in child frame" single ((:commit . "860e5b97730df7ef5c34584ad164bc69c561db84") (:authors ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainer "Andrii Kolomoiets" . "andreyk.mad@gmail.com") (:keywords "frames") (:url . "https://github.com/muffinmad/emacs-completions-frame"))]) + (composable . [(20201024 1458) ((emacs (24 4))) "composable editing" tar ((:commit . "6f2efaa7018feb854720cc2518e4274ad708f793") (:authors ("Simon Friis Vindum" . "simon@vindum.io")) (:maintainer "Simon Friis Vindum" . "simon@vindum.io") (:keywords "lisp"))]) + (composer . [(20200616 1717) ((emacs (24 3)) (s (1 9 0)) (f (0 17)) (seq (1 9)) (php-runtime (0 1 0))) "Interface to PHP Composer" single ((:commit . "7c7f89df226cac69664d7eca5e913b544dc475c5") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "tools" "php" "dependency" "manager") (:url . "https://github.com/zonuexe/composer.el"))]) + (comware-router-mode . [(20201229 1706) ((dash (2 16 0)) (emacs (24 3))) "Major mode for editing Comware configuration files" single ((:commit . "f0f884f0fe9ab2c3420e62d27eadc59ac2209a4a") (:authors ("Davide Restivo" . "davide.restivo@yahoo.it")) (:maintainer "Davide Restivo" . "davide.restivo@yahoo.it") (:keywords "convenience" "faces") (:url . "https://github.com/daviderestivo/comware-router-mode"))]) + (concurrent . [(20161229 330) ((emacs (24 3)) (deferred (0 5 0))) "Concurrent utility functions for emacs lisp" single ((:commit . "2239671d94b38d92e9b28d4e12fd79814cfb9c16") (:authors ("SAKURAI Masashi <m.sakurai at kiwanami.net>")) (:maintainer "SAKURAI Masashi <m.sakurai at kiwanami.net>") (:keywords "deferred" "async" "concurrent") (:url . "https://github.com/kiwanami/emacs-deferred/blob/master/README-concurrent.markdown"))]) + (conda . [(20210409 37) ((emacs (24 4)) (pythonic (0 1 0)) (dash (2 13 0)) (s (1 11 0)) (f (0 18 2))) "Work with your conda environments" single ((:commit . "6db0720b6dc8880d7d6e7dc2953b4769ca6bbf71") (:authors ("Rami Chowdhury" . "rami.chowdhury@gmail.com")) (:maintainer "Rami Chowdhury" . "rami.chowdhury@gmail.com") (:keywords "python" "environment" "conda") (:url . "http://github.com/necaris/conda.el"))]) + (config-general-mode . [(20171024 1840) nil "Config::General config file mode" single ((:commit . "b4a8e6ba0bb027a77e4a0f701409f3e57bb2e4c0") (:authors ("T.v.Dein" . "tlinden@cpan.org")) (:maintainer "T.v.Dein" . "tlinden@cpan.org") (:keywords "files") (:url . "https://github.com/tlinden/config-general-mode"))]) + (config-parser . [(20160426 1219) ((emacs (24 4))) "a library for parsing config file" single ((:commit . "85d559e7889d8f5b98b8794b79426ae25ec3caa5") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "convenience" "config") (:url . "https://github.com/lujun9972/el-config-parser"))]) + (confluence . [(20151021 128) ((xml-rpc (1 6 4))) "Emacs mode for interacting with confluence wikis" tar ((:commit . "4518d270a07760644c4204985c83d234ece4738b") (:authors ("James Ahlborn")) (:maintainer "James Ahlborn") (:keywords "confluence" "wiki" "xmlrpc") (:url . "http://code.google.com/p/confluence-el/"))]) + (conkeror-minor-mode . [(20150114 1604) nil "Mode for editing conkeror javascript files." single ((:commit . "476e81c27b056e21c192391fe674a2bf875466b0") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com>")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com>") (:keywords "programming" "tools") (:url . "http://github.com/Bruce-Connor/conkeror-minor-mode"))]) + (conllu-mode . [(20200501 2328) ((emacs (25)) (cl-lib (0 5)) (flycheck (30)) (hydra (0 13 0)) (s (1 0))) "editing mode for CoNLL-U files" tar ((:commit . "0db3063572b0de08874822e20570bb153747e6ed") (:authors ("bruno cuconato" . "bcclaro+emacs@gmail.com")) (:maintainer "bruno cuconato" . "bcclaro+emacs@gmail.com") (:keywords "extensions") (:url . "https://github.com/odanoburu/conllu-mode"))]) + (connection . [(20191111 446) nil "TCP-based client connection" single ((:commit . "bdf0aa7761d1c1a3bc0652b2fdc4a54b3acdb06a") (:authors ("Torsten Hilbrich" . "torsten.hilbrich@gmx.net")) (:maintainer "Torsten Hilbrich" . "torsten.hilbrich@gmx.net") (:keywords "network"))]) + (constant-theme . [(20180921 1012) ((emacs (24 1))) "A calm, dark, almost monochrome color theme." tar ((:commit . "23543a09729569b566175abe1efbe774048d3fa8") (:authors ("Jannis Pohlmann" . "contact@jannispohlmann.de")) (:maintainer "Jannis Pohlmann" . "contact@jannispohlmann.de") (:keywords "themes") (:url . "https://github.com/jannis/emacs-constant-theme"))]) + (consult . [(20210606 1237) ((emacs (26 1))) "Consulting completing-read" tar ((:commit . "ae905501bcdb8fdda0d10a0846d575fd2a38e6d7") (:authors ("Daniel Mendler and Consult contributors")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:url . "https://github.com/minad/consult"))]) + (consult-flycheck . [(20210530 202) ((consult (0 8)) (flycheck (31)) (emacs (26 1))) "Provides the command `consult-flycheck'" single ((:commit . "92b259e6a8ebe6439f67d3d7ffa44b7e64b76478") (:authors ("Daniel Mendler and Consult contributors")) (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de") (:url . "https://github.com/minad/consult"))]) + (consult-ghq . [(20210606 2047) ((emacs (26 1)) (consult (0 8)) (affe (0 1))) "Ghq interface using consult" single ((:commit . "c8619d66bd8f8728e43ed15096078b89eb4d2083") (:authors ("Tomoya Otake" . "tomoya.ton@gmail.com")) (:maintainer "Tomoya Otake" . "tomoya.ton@gmail.com") (:keywords "convenience" "usability" "consult" "ghq") (:url . "https://github.com/tomoya/consult-ghq"))]) + (consult-lsp . [(20210428 1515) ((emacs (27 1)) (lsp-mode (5 0)) (consult (0 6)) (f (0 20 0))) "LSP-mode Consult integration" single ((:commit . "12989949cc21a1173206f688d56a1e798073a4c3") (:authors ("Gerry Agbobada")) (:maintainer "Gerry Agbobada") (:keywords "tools" "completion" "lsp") (:url . "https://github.com/gagbo/consult-lsp"))]) + (consult-notmuch . [(20210519 57) ((emacs (26 1)) (consult (0 5)) (notmuch (0 21))) "Notmuch search using consult" single ((:commit . "71aa3b8ee6cd3cd07313b74353ac29fdfde0e7b0") (:authors ("Jose A Ortega Ruiz" . "jao@gnu.org")) (:maintainer "Jose A Ortega Ruiz") (:keywords "mail") (:url . "https://codeberg.org/jao/consult-notmuch"))]) + (consult-recoll . [(20210411 1300) ((emacs (26 1)) (consult (0 5))) "Recoll queries using consult" single ((:commit . "9038cfa4222f428e28bdafa0aeb57362104a873d") (:authors ("Jose A Ortega Ruiz" . "jao@gnu.org")) (:maintainer "Jose A Ortega Ruiz") (:keywords "docs" "convenience") (:url . "https://codeberg.org/jao/consult-recoll"))]) + (consult-spotify . [(20210605 1502) ((emacs (26 1)) (consult (0 5)) (espotify (0 1))) "Spotify queries using consult" single ((:commit . "3d62a3319ab03a810030058d3fb368b28dfd82d5") (:authors ("Jose A Ortega Ruiz" . "jao@gnu.org")) (:maintainer "Jose A Ortega Ruiz") (:keywords "multimedia") (:url . "https://codeberg.org/jao/espotify"))]) + (contextual . [(20180726 800) ((emacs (24)) (dash (2 12 1)) (cl-lib (0 5))) "Contextual profile management system" single ((:commit . "e3c0de4a2e06757a0e8407c3c6e75930026191e3") (:authors ("Alexander Kahl" . "ak@sodosopa.io")) (:maintainer "Alexander Kahl" . "ak@sodosopa.io") (:keywords "convenience" "tools") (:url . "https://github.com/lshift-de/contextual"))]) + (contextual-menubar . [(20180205 709) nil "display the menubar only on a graphical display" single ((:commit . "f76f55232ac07df76ef9a334a0c527dfab97c40b") (:authors ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Aaron Jensen" . "aaronjensen@gmail.com") (:url . "https://github.com/aaronjensen/contextual-menubar"))]) + (contrast-color . [(20160903 1807) ((emacs (24 3)) (cl-lib (0 5))) "Pick best contrast color for you" single ((:commit . "c5fb77a211ebbef3185ada37bea7420534c33f94") (:authors ("Yuta Yamada <cokesboy[at]gmail.com>")) (:maintainer "Yuta Yamada <cokesboy[at]gmail.com>") (:keywords "color" "convenience") (:url . "https://github.com/yuutayamada/contrast-color-el"))]) + (control-mode . [(20160624 1710) nil "A \"control\" mode, similar to vim's \"normal\" mode" single ((:commit . "72d6179b60adc438aada74083b2bf4264b575de3") (:authors ("Stephen Marsh" . "stephen.david.marsh@gmail.com")) (:maintainer "Stephen Marsh" . "stephen.david.marsh@gmail.com") (:keywords "convenience" "emulations") (:url . "https://github.com/stephendavidmarsh/control-mode"))]) + (copy-as-format . [(20190523 258) ((cl-lib (0 5))) "Copy buffer locations as GitHub/Slack/JIRA etc... formatted code" single ((:commit . "a0962b670e26b723ce304b14e3397da453aef84e") (:authors ("Skye Shaw" . "skye.shaw@gmail.com")) (:maintainer "Skye Shaw" . "skye.shaw@gmail.com") (:keywords "github" "slack" "jira" "hipchat" "gitlab" "bitbucket" "org-mode" "pod" "rst" "asciidoc" "tools" "convenience") (:url . "https://github.com/sshaw/copy-as-format"))]) + (copy-file-on-save . [(20200616 518) ((emacs (24 3)) (cl-lib (0 5)) (f (0 17)) (s (1 7 0))) "Copy file on save, automatic deployment it." single ((:commit . "811c8fe638c5616b6471525421e61a4470be3b52") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "files" "comm" "deploy") (:url . "https://github.com/emacs-php/emacs-auto-deployment"))]) + (copyit . [(20190919 1258) ((emacs (24 3)) (s (1 9 0))) "Copy it, yank anything!" single ((:commit . "c4f2c28e5b6270e8e3364341619f1154bb4e682e") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "convenience" "yank" "clipboard") (:url . "https://github.com/zonuexe/emacs-copyit"))]) + (copyit-pandoc . [(20190919 1258) ((emacs (24 3)) (copyit (0 1 0)) (pandoc (0 0 1))) "Copy it, yank anything!" single ((:commit . "c4f2c28e5b6270e8e3364341619f1154bb4e682e") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "convenience" "yank" "clipboard") (:url . "https://github.com/zonuexe/emacs-copyit"))]) + (coq-commenter . [(20170822 2309) ((dash (2 13 0)) (s (1 11 0)) (cl-lib (0 5))) "Coq commenting minor mode for proof" single ((:commit . "7fe9a2cc0ebdb0b1e54a24eb7971d757fb588ac3") (:authors ("Junyoung Clare Jang" . "jjc9310@gmail.com")) (:maintainer "Junyoung Clare Jang" . "jjc9310@gmail.com") (:keywords "comment" "coq" "proof") (:url . "http://github.com/ailrun/coq-commenter"))]) + (corral . [(20160502 701) nil "Quickly surround text with delimiters" single ((:commit . "e7ab6aa118e46b93d4933d1364bc273f57cd6911") (:authors ("Kevin Liu" . "mail@nivekuil.com")) (:maintainer "Kevin Liu" . "mail@nivekuil.com") (:url . "http://github.com/nivekuil/corral"))]) + (cort . [(20200904 609) ((emacs (24 1)) (ansi (0 4)) (cl-lib (0 6))) "Simplify extended unit test framework" single ((:commit . "98532580e0425ac96f45f73ef7cebf80cb4101e2") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "test" "lisp") (:url . "https://github.com/conao3/cort.el"))]) + (cosmo . [(20170922 744) ((emacs (24 4))) "Cosmological Calculator" single ((:commit . "dd83b09a49a2843606b28279b674b2207040b36b") (:authors ("Francesco Montanari" . "fmnt@fmnt.info")) (:maintainer "Francesco Montanari" . "fmnt@fmnt.info") (:keywords "tools") (:url . "https://gitlab.com/montanari/cosmo-el"))]) + (counsel . [(20210509 830) ((emacs (24 5)) (ivy (0 13 4)) (swiper (0 13 4))) "Various completion functions using Ivy" single ((:commit . "040d458bce4a88f37359192061bcea5ebe87007c") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "convenience" "matching" "tools") (:url . "https://github.com/abo-abo/swiper"))]) + (counsel-ag-popup . [(20210121 805) ((emacs (26 1)) (counsel (0 13 0)) (transient (0 3 0))) "Interactive search with counsel-ag" single ((:commit . "41d85fe36edd72da68f5009ad9cf9013cd19960d") (:authors ("Eder Elorriaga" . "gexplorer8@gmail.com")) (:maintainer "Eder Elorriaga" . "gexplorer8@gmail.com") (:keywords "convenience" "matching" "tools") (:url . "https://github.com/gexplorer/counsel-ag-popup"))]) + (counsel-bbdb . [(20181128 1320) ((ivy (0 8 0)) (emacs (24 3))) "Quick search&input email from BBDB based on ivy" single ((:commit . "df2890deb73b09f8055243bd91942ea887d9b7a1") (:authors ("Chen Bin <chenbin.sh AT gmail>")) (:maintainer "Chen Bin <chenbin.sh AT gmail>") (:keywords "mail" "abbrev" "convenience" "matching") (:url . "https://github.com/redguard/counsel-bbdb"))]) + (counsel-codesearch . [(20180925 803) ((codesearch (1)) (counsel (0 10 0)) (emacs (24)) (ivy (0 10 0))) "Counsel interface for codesearch.el" single ((:commit . "b7989fad3e06f301c31d5e896c42b6cc549a0e0c") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:keywords "tools") (:url . "https://github.com/abingham/emacs-counsel-codesearch"))]) + (counsel-css . [(20210310 452) ((emacs (24 4)) (counsel (0 7 0)) (cl-lib (0 5))) "stylesheet-selector-aware swiper" single ((:commit . "f7647b4195b9b4e97f1ee1acede6054ae38df630") (:authors ("Henrik Lissner <http://github/hlissner>")) (:maintainer "Henrik Lissner" . "henrik@lissner.net") (:keywords "convenience" "tools" "counsel" "swiper" "selector" "css" "less" "scss") (:url . "https://github.com/hlissner/emacs-counsel-css"))]) + (counsel-dash . [(20200103 1411) ((emacs (24 4)) (dash-docs (1 4 0)) (counsel (0 8 0)) (cl-lib (0 5))) "Browse dash docsets using Ivy" single ((:commit . "370d5f6f14b5294d0eb717f7b2a6a8e93df1ed24") (:authors ("Nathan Kot" . "nk@nathankot.com")) (:maintainer "Nathan Kot" . "nk@nathankot.com") (:keywords "dash" "ivy" "counsel") (:url . "https://github.com/nathankot/counsel-dash"))]) + (counsel-edit-mode . [(20210103 1508) ((emacs (26 1)) (ht (2 3)) (s (1 12 0)) (counsel (0 10 0))) "Edit results of counsel commands in-place" single ((:commit . "82234306562f47ec50db212888dbcf21ef0b70f8") (:authors ("Tyler Dodge")) (:maintainer "Tyler Dodge") (:keywords "convenience" "matching") (:url . "https://github.com/tyler-dodge/counsel-edit-mode"))]) + (counsel-etags . [(20210608 206) ((emacs (25 1)) (counsel (0 13 4))) "Fast and complete Ctags/Etags solution using ivy" single ((:commit . "e3c34a0ae2401d1dbc99e00906c93b2edc928e1d") (:authors ("Chen Bin <chenbin dot sh AT gmail dot com>")) (:maintainer "Chen Bin <chenbin dot sh AT gmail dot com>") (:keywords "tools" "convenience") (:url . "http://github.com/redguardtoo/counsel-etags"))]) + (counsel-fd . [(20210606 1724) ((counsel (0 12 0))) "counsel interface for fd" single ((:commit . "e9513a3c7f6cdbdf038f951e828e631c0455e7d4") (:keywords "tools") (:url . "https://github.com/CsBigDataHub/counsel-fd"))]) + (counsel-ffdata . [(20191017 1237) ((emacs (25 1)) (counsel (0 11 0)) (emacsql (3 0 0))) "Use ivy to access firefox data" single ((:commit . "88c2348c4039d9e562bd3d9a364708b01037c283") (:authors ("Zhu Zihao" . "all_but_last@163.com")) (:maintainer "Zhu Zihao" . "all_but_last@163.com") (:keywords "convenience" "tools" "matching") (:url . "https://github.com/cireu/counsel-ffdata"))]) + (counsel-gtags . [(20210222 1803) ((emacs (25 1)) (counsel (0 8 0)) (seq (1 0))) "ivy for GNU global" single ((:commit . "1d52eaeffeb60266434d4f7416a108ca058fde91") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com") ("Felipe Lema" . "felipelema@mortemale.org") ("Jimmy Aguilar Mena" . "spacibba@aol.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/FelipeLema/emacs-counsel-gtags"))]) + (counsel-jq . [(20210329 749) ((swiper (0 12 0)) (ivy (0 12 0)) (emacs (24 1))) "Live preview of \"jq\" queries using counsel" single ((:commit . "8cadd2e96470402ede4881b4e955872976443689") (:authors ("Alain M. Lafon" . "alain@200ok.ch")) (:maintainer "Alain M. Lafon" . "alain@200ok.ch") (:keywords "convenience" "data" "matching") (:url . "https://github.com/200ok-ch/counsel-jq"))]) + (counsel-mairix . [(20210422 649) ((emacs (26 3)) (ivy (0 13 1))) "Counsel interface for Mairix" single ((:commit . "39fa2ad10a5f899cb3f3275f9a6ebd166c51216a") (:authors ("Antoine Kalmbach" . "ane@iki.fi")) (:maintainer "Antoine Kalmbach" . "ane@iki.fi") (:keywords "mail") (:url . "https://sr.ht/~ane/counsel-mairix"))]) + (counsel-notmuch . [(20181203 935) ((emacs (24)) (ivy (0 10 0)) (notmuch (0 21)) (s (1 12 0))) "Search emails in Notmuch asynchronously with Ivy" single ((:commit . "a4a1562935e4180c42524c51609d1283e9be0688") (:authors ("Alexander Fu Xi" . "fuxialexander@gmail.com")) (:maintainer "Alexander Fu Xi" . "fuxialexander@gmail.com") (:keywords "mail") (:url . "https://github.com/fuxialexander/counsel-notmuch"))]) + (counsel-org-capture-string . [(20200810 1114) ((emacs (25 1)) (ivy (0 13))) "Counsel for org-capture-string" single ((:commit . "dbb7d95f99d7910d76ffc2d024580088a34ec444") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:keywords "outlines") (:url . "https://github.com/akirak/counsel-org-capture-string"))]) + (counsel-org-clock . [(20200810 1109) ((emacs (25 1)) (ivy (0 10 0)) (dash (2 0))) "Counsel commands for org-clock" single ((:commit . "6ba0f2ac7e4e5b8c1baec90296d9f24407d8d632") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:url . "https://github.com/akirak/counsel-org-clock"))]) + (counsel-osx-app . [(20160821 809) ((ivy (0 8 0)) (emacs (24 3))) "launch osx applications via ivy interface" single ((:commit . "b1c54cbc033c4939966910d85ce035503079e108") (:authors ("Boris Buliga" . "d12frosted@gmail.com")) (:maintainer "Boris Buliga" . "d12frosted@gmail.com") (:url . "https://github.com/d12frosted/counsel-osx-app"))]) + (counsel-projectile . [(20201015 1109) ((counsel (0 13 0)) (projectile (2 0 0))) "Ivy integration for Projectile" single ((:commit . "06b03c1080d3ccc3fa9b9c41b1ccbcf13f058e4b") (:authors ("Eric Danan")) (:maintainer "Eric Danan") (:keywords "project" "convenience") (:url . "https://github.com/ericdanan/counsel-projectile"))]) + (counsel-pydoc . [(20171018 2042) ((emacs (24 3)) (ivy (0 9 1))) "run pydoc with counsel" single ((:commit . "1d8ff8ca3b9d69453cde423b1887fbb490a95c9e") (:authors (nil . "Hao Deng(denghao8888@gmail.com)")) (:maintainer nil . "Hao Deng(denghao8888@gmail.com)") (:keywords "completion" "matching") (:url . "https://github.com/co-dh/pydoc_utils"))]) + (counsel-spotify . [(20200818 2055) ((emacs (25 1)) (ivy (0 13 0))) "Control Spotify search and select music with Ivy" tar ((:commit . "2743ad52a9def53534fd505397fbe1ac49e53015") (:authors ("Lautaro García <https://github.com/Lautaro-Garcia>")) (:maintainer "Lautaro García <https://github.com/Lautaro-Garcia>") (:url . "https://github.com/Lautaro-Garcia/counsel-spotify"))]) + (counsel-test . [(20190819 1920) ((emacs (25 1)) (ivy (0 11 0)) (s (1 12 0))) "Browse and execute tests with ivy" tar ((:commit . "7fc4e5d0d65c53edbcb4c25917bcf7faaea36ec7") (:keywords "tools" "ivy" "counsel" "testing" "ctest" "pytest") (:url . "http://github.com/xmagpie/counsel-test"))]) + (counsel-tramp . [(20210518 1153) ((emacs (24 3)) (counsel (0 10))) "Tramp ivy interface for ssh, docker, vagrant" single ((:commit . "76719eebb791920272c69e75e234f05a815bb5c2") (:authors ("Masashı Mıyaura")) (:maintainer "Masashı Mıyaura") (:url . "https://github.com/masasam/emacs-counsel-tramp"))]) + (counsel-web . [(20210609 2156) ((emacs (25 1)) (counsel (0 13 0)) (request (0 3 0))) "Search the Web using Ivy" single ((:commit . "1359b3b204fcdac7a3d6664c7d540a88b5acecfd") (:authors ("Matthew Sojourner Newton" . "matt@mnewton.com")) (:maintainer "Matthew Sojourner Newton" . "matt@mnewton.com") (:keywords "convenience" "hypermedia") (:url . "https://github.com/mnewt/counsel-web"))]) + (counsel-world-clock . [(20190709 2211) ((ivy (0 9 0)) (s (1 12 0))) "Display world clock using Ivy." single ((:commit . "674e4c6b82a92ea765af97cc5f017b357284c7dc") (:authors ("Kuang Chen <http://github.com/kchenphy>")) (:maintainer "Kuang Chen <http://github.com/kchenphy>") (:url . "https://github.com/kchenphy/counsel-world-clock"))]) + (countdown . [(20190626 244) ((emacs (25 1)) (stream (2 2 4))) "Countdown using big LCD-like digits" single ((:commit . "139dea91fc818d65944aca5f16c9626abbdfbf04") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:keywords "tools") (:url . "https://github.com/xuchunyang/countdown.el"))]) + (cov . [(20210330 44) ((emacs (24 4)) (f (0 18 2)) (s (1 11 0)) (elquery (0))) "Show coverage stats in the fringe." single ((:commit . "62a4650f97eddebf6cd04b662a69b15ba72472c1") (:authors ("Adam Niederer")) (:maintainer "Adam Niederer") (:keywords "coverage" "gcov" "c") (:url . "https://github.com/AdamNiederer/cov"))]) + (coverage . [(20191113 1958) ((ov (1 0)) (cl-lib (0 5))) "Code coverage line highlighting" single ((:commit . "6e3c6f2dcb759a76086adeeb1fdfe83e4f082482") (:authors ("Kieran Trezona-le Comte" . "trezona.lecomte@gmail.com")) (:maintainer "Kieran Trezona-le Comte" . "trezona.lecomte@gmail.com") (:keywords "coverage" "metrics" "simplecov" "ruby" "rspec") (:url . "https://github.com/trezona-lecomte/coverage"))]) + (coverlay . [(20190414 940) ((emacs (24 1)) (cl-lib (0 5))) "Test coverage overlays" single ((:commit . "0beae208d0e7d746a94385428bd61aa5cd7ea828") (:authors ("Takuto Wada <takuto.wada at gmail com>")) (:maintainer "Takuto Wada <takuto.wada at gmail com>") (:keywords "coverage" "overlay") (:url . "https://github.com/twada/coverlay.el"))]) + (cowsay . [(20210510 1540) ((emacs (24 5))) "Poorly drawn ASCII cartoons saying things" single ((:commit . "d8a72a311c6875f1aef6a30b3d23a1b02df75941") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "games") (:url . "https://github.com/lassik/emacs-cowsay"))]) + (cp5022x . [(20120323 2335) nil "cp50220, cp50221, cp50222 coding system" single ((:commit . "ea7327dd75e54539576916f592ae1be98179ae35") (:authors ("ARISAWA Akihiro" . "ari@mbf.ocn.ne.jp")) (:maintainer "ARISAWA Akihiro" . "ari@mbf.ocn.ne.jp") (:keywords "languages" "cp50220" "cp50221" "cp50222" "cp51932" "cp932"))]) + (cpanfile-mode . [(20161001 710) ((emacs (24 4))) "Major mode for cpanfiles" single ((:commit . "eda675703525198df1f76ddf250bffa40217ec5d") (:authors ("Zak B. Elep" . "zakame@zakame.net")) (:maintainer "Zak B. Elep" . "zakame@zakame.net") (:keywords "perl") (:url . "https://github.com/zakame/cpanfile-mode"))]) + (cpp-auto-include . [(20210318 2217) ((cl-lib (0 5))) "Insert and delete C++ header files automatically" single ((:commit . "0ce829f27d466c083e78b9fe210dcfa61fb417f4") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/emacsorphanage/cpp-auto-include"))]) + (cpputils-cmake . [(20181006 328) nil "Easy realtime C++ syntax check and IntelliSense with CMake." single ((:commit . "64b2b05eff5398b4cd522e66efaf14553ab18ff4") (:authors ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com") (:keywords "cmake" "intellisense" "flymake" "flycheck") (:url . "http://github.com/redguardtoo/cpputils-cmake"))]) + (cpu-sos . [(20200409 2356) ((emacs (25 1))) "S.O.S. from a CPU in distress" single ((:commit . "1594b76d4ad3a6e3c471d82da366226d156e6226") (:authors ("Bruno Félix Rezende Ribeiro" . "oitofelix@gnu.org")) (:maintainer "Bruno Félix Rezende Ribeiro" . "oitofelix@gnu.org") (:keywords "processes") (:url . "https://github.com/oitofelix/cpu-sos"))]) + (cql-mode . [(20190315 225) ((emacs (24))) "Major mode for editting CQLs" single ((:commit . "d400c046850d3cf404778b2c47d6be4ff84ca04b") (:authors ("Yuki Inoue <inouetakahiroki at gmail.com>")) (:maintainer "Yuki Inoue <inouetakahiroki at gmail.com>") (:keywords "cql" "cassandra") (:url . "https://github.com/Yuki-Inoue/cql-mode"))]) + (cquery . [(20190118 542) ((emacs (25 1)) (lsp-mode (3 4)) (dash (0 13))) "cquery client for lsp-mode" tar ((:commit . "555e50984ebda177421fdcdc8c76cb29235d9694") (:authors ("Tobias Pisani")) (:maintainer "Tobias Pisani") (:keywords "languages" "lsp" "c++") (:url . "https://github.com/jacobdufault/cquery"))]) + (crappy-jsp-mode . [(20140311 931) nil "A pretty crappy major-mode for jsp." single ((:commit . "6c45ab92b452411cc0fab9bcee2f456276b4fc40") (:keywords "jsp" "major" "mode"))]) + (creamsody-theme . [(20170222 1058) ((autothemer (0 2))) "Straight from the soda fountain." single ((:commit . "32fa3f4e461da92700523b1b20e7b28974c19a26") (:url . "http://github.com/emacsfodder/emacs-theme-creamsody"))]) + (create-link . [(20210601 1327) ((emacs (25 1))) "Smart format link generator" single ((:commit . "b2c24f42f2fae63433787150f77b397d69ce0e5b") (:authors ("Kijima Daigo" . "norimaking777@gmail.com")) (:maintainer "Kijima Daigo" . "norimaking777@gmail.com") (:keywords "link" "format" "browser" "convenience") (:url . "https://github.com/kijimaD/create-link"))]) + (creds . [(20140510 1706) ((s (1 9 0)) (dash (2 5 0))) "A parser credentials file library (not limited to credentials entries)" tar ((:commit . "b059397a7d59481f05fbb1bb9c8d3c2c69226482") (:authors ("Antoine R. Dumont <eniotna.t AT gmail.com>")) (:maintainer "Antoine R. Dumont <eniotna.t AT gmail.com>") (:keywords "credentials") (:url . "https://github.com/ardumont/emacs-creds"))]) + (creole . [(20140924 1500) ((noflet (0 0 3)) (kv (0 0 17))) "A parser for the Creole Wiki language" single ((:commit . "7d5cffe93857f6c75ca09ac79c0e47b8d4410e53") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:keywords "lisp" "creole" "wiki"))]) + (creole-mode . [(20130722 50) nil "a markup mode for creole" single ((:commit . "b5e79b2ec5f19fb5aacf689b5febc3e0b61515c4") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:keywords "hypermedia" "wp") (:url . "https://github.com/nicferrier/creole-mode"))]) + (cricbuzz . [(20180804 2254) ((enlive (0 0 1)) (f (0 19 0)) (dash (2 13 0)) (s (1 11 0))) "Cricket scores from cricbuzz in emacs" single ((:commit . "0b95d45991bbcd2fa58d96ce921f6a57ba42c153") (:authors ("Abhinav Tushar" . "abhinav.tushar.vs@gmail.com")) (:maintainer "Abhinav Tushar" . "abhinav.tushar.vs@gmail.com") (:keywords "cricket" "score") (:url . "https://github.com/lepisma/cricbuzz.el"))]) + (crm-custom . [(20160117 6) ((cl-lib (0 5))) "Alternate `completing-read-multiple' that uses `completing-read'" single ((:commit . "f1aaccf64306a5f99d9bf7ba815d7ea41c15518d") (:authors ("Ryan C. Thompson" . "rct@thompsonclan.org")) (:maintainer "Ryan C. Thompson" . "rct@thompsonclan.org") (:keywords "completion" "minibuffer" "multiple elements") (:url . "https://github.com/DarwinAwardWinner/crm-custom"))]) + (crontab-mode . [(20200330 920) ((emacs (24))) "Major mode for crontab(5)" single ((:commit . "9625228cbfce29ac3b443c6eff893ff828268f7d") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:keywords "languages") (:url . "https://github.com/emacs-pe/crontab-mode"))]) + (crossword . [(20210216 1703) ((emacs (26 1))) "Download and play crossword puzzles" single ((:commit . "cb2e2a435ea9f4fa8c7517b4909af8b62bca8a3e") (:keywords "games") (:url . "https://github.com/Boruch-Baum/emacs-crossword"))]) + (crux . [(20210309 838) ((seq (1 11))) "A Collection of Ridiculously Useful eXtensions" single ((:commit . "20c07848049716a0e1aa2560e23b5f4149f2a74f") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.com")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.com") (:keywords "convenience") (:url . "https://github.com/bbatsov/crux"))]) + (cryptol-mode . [(20190531 2051) nil "Cryptol major mode for Emacs" single ((:commit . "81ebbde83f7cb75b2dfaefc09de6a1703068c769") (:authors (nil . "Austin Seipp <aseipp [@at] pobox [dot] com>")) (:maintainer nil . "Austin Seipp <aseipp [@at] pobox [dot] com>") (:keywords "cryptol" "cryptography") (:url . "http://github.com/thoughtpolice/cryptol-mode"))]) + (crystal-mode . [(20201228 1539) ((emacs (24 4))) "Major mode for editing Crystal files" single ((:commit . "15998140b0a4172cd4b4d14d0377fba96a8917fc") (:keywords "languages" "crystal") (:url . "https://github.com/crystal-lang-tools/emacs-crystal-mode"))]) + (crystal-playground . [(20180830 501) ((emacs (25)) (crystal-mode (0 1 2))) "Local crystal playground for short code snippets." single ((:commit . "fb3691b1281207b459c5be50015a626f356dc40d") (:authors ("Jason Howell")) (:maintainer "Jason Howell") (:keywords "tools" "crystal") (:url . "https://github.com/jasonrobot/crystal-playground"))]) + (csgo-conf-mode . [(20161209 1619) nil "CS:GO Configuration files syntax highlighting" single ((:commit . "57e7224f87a3ccc76b5564cc95fa0ff43bb6807c") (:authors ("Guillermo Robles" . "guillerobles1995@gmail.com")) (:maintainer "Guillermo Robles" . "guillerobles1995@gmail.com") (:keywords "languages") (:url . "https://github.com/wynro/emacs-csgo-conf-mode"))]) + (csharp-mode . [(20210328 2004) ((emacs (26 1)) (tree-sitter (0 15 1)) (tree-sitter-indent (0 1)) (tree-sitter-langs (0 10 0))) "C# mode derived mode" tar ((:commit . "33e3042535e70a284389f8da1c495958fed8a826") (:authors ("Theodor Thornhill" . "theo@thornhill.no")) (:maintainer "Jostein Kjønigsen" . "jostein@gmail.com") (:keywords "c#" "languages" "oop" "mode") (:url . "https://github.com/emacs-csharp/csharp-mode"))]) + (csound-mode . [(20200518 1546) ((emacs (25)) (shut-up (0 3 2)) (multi (2 0 1)) (dash (2 16 0)) (highlight (0))) "A major mode for interacting and coding Csound" tar ((:commit . "b6e8167c927c400c291daaa46a8aea132834b07c") (:authors ("Hlöðver Sigurðsson" . "hlolli@gmail.com")) (:maintainer "Hlöðver Sigurðsson" . "hlolli@gmail.com") (:url . "https://github.com/hlolli/csound-mode"))]) + (csproj-mode . [(20200801 1732) ((emacs (24))) "Work with .NET project files (csproj, vbproj)" tar ((:commit . "a7f0f4610c976a28c41b9b8299892f88b5d0336c") (:authors ("Omair Majid" . "omair.majid@gmail.com")) (:maintainer "Omair Majid" . "omair.majid@gmail.com") (:keywords "languages" "tools") (:url . "https://github.com/omajid/csproj-mode"))]) + (css-autoprefixer . [(20180311 1600) ((emacs (24))) "Adds autoprefix to CSS" single ((:commit . "386a5defc8543a3b87820f1761c075c7d1d93b38") (:authors (nil . "Kyung Mo Kweon<kkweon@gmail.com> and contributors")) (:maintainer nil . "Kyung Mo Kweon<kkweon@gmail.com> and contributors") (:keywords "convenience" "usability" "css") (:url . "https://github.com/kkweon/emacs-css-autoprefixer"))]) + (css-comb . [(20160416 559) nil "Sort CSS properties in a particular order using CSS Comb" single ((:commit . "6fa45e5af8a8bd3af6c1154cde3540e32c4206ee") (:authors ("Charanjit Singh" . "ckhabra@gmail.com")) (:maintainer "Charanjit Singh" . "ckhabra@gmail.com") (:url . "https://github.com/channikhabra/css-comb.el"))]) + (css-eldoc . [(20150125 323) nil "an eldoc-mode plugin for CSS source code" tar ((:commit . "c558ac4c470742c98a37290e6b409db28183df30") (:authors ("Zeno Zeng" . "zenoes@qq.com")) (:maintainer "Zeno Zeng" . "zenoes@qq.com"))]) + (cssh . [(20150810 1709) nil "clusterssh implementation for emacs" single ((:commit . "2fe2754235225a59b63f08b130cfd4352e2e1c3f") (:authors ("Dimitri Fontaine" . "dim@tapoueh.org")) (:maintainer "Dimitri Fontaine" . "dim@tapoueh.org") (:keywords "clusterssh" "ssh" "cssh") (:url . "http://tapoueh.org/emacs/cssh.html"))]) + (csv . [(20161113 1510) nil "Functions for reading and parsing CSV files." single ((:commit . "aa1dfa1263565d5fac3879c21d8ddf5f8915e411") (:authors ("Ulf Jasper" . "ulf.jasper@web.de")) (:maintainer "Ulf Jasper" . "ulf.jasper@web.de") (:keywords "extensions" "data" "csv"))]) + (ct . [(20210219 1344) ((emacs (26 1)) (dash (2 18 0)) (hsluv (1 0 0))) "Color Tools - a color api" single ((:commit . "c302ee94feee0c5efc511e8f9fd8cb2f6dfe3490") (:authors ("neeasade")) (:maintainer "neeasade") (:keywords "convenience" "color" "theming" "rgb" "hsv" "hsl" "cie-lab" "background") (:url . "https://github.com/neeasade/ct.el"))]) + (ctable . [(20210128 629) ((emacs (24 3)) (cl-lib (0 5))) "Table component for Emacs Lisp" single ((:commit . "48b73742757a3ae5736d825fe49e00034cc453b5") (:authors ("SAKURAI Masashi <m.sakurai at kiwanami.net>")) (:maintainer "SAKURAI Masashi <m.sakurai at kiwanami.net>") (:keywords "table") (:url . "https://github.com/kiwanami/emacs-ctable"))]) + (ctags-update . [(20190609 613) nil "(auto) update TAGS in parent directory using exuberant-ctags" single ((:commit . "67faf248b92388442958a069263c62a345425a1b") (:authors (nil . "Joseph(纪秀峰) jixiuf@gmail.com")) (:maintainer nil . "Joseph(纪秀峰) jixiuf@gmail.com") (:keywords "exuberant-ctags" "etags") (:url . "https://github.com/jixiuf/ctags-update"))]) + (ctl-mode . [(20151202 1006) nil "Major mode for editing GrADS script files" single ((:commit . "1a13051db21b999c7682a015b33a03096ff9d891") (:authors ("Joe Wielgosz" . "joew@cola.iges.org")) (:maintainer "Joe Wielgosz" . "joew@cola.iges.org") (:keywords "grads" "script" "major-mode"))]) + (ctrlf . [(20210418 2044) ((emacs (25 1))) "Emacs finally learns how to ctrl+F" single ((:commit . "dbe83710d06bc39315f1455f6f21479f3747c0aa") (:authors ("Radon Rosborough" . "radon.neon@gmail.com")) (:maintainer "Radon Rosborough" . "radon.neon@gmail.com") (:keywords "extensions") (:url . "https://github.com/raxod502/ctrlf"))]) + (ctrlxo . [(20201021 701) ((emacs (25 1))) "Switch to the most recently used window" single ((:commit . "8ad95a81bd1ece06ebe40e2a83490775db64b419") (:authors ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainer "Andrii Kolomoiets" . "andreyk.mad@gmail.com") (:keywords "frames") (:url . "https://github.com/muffinmad/emacs-ctrlxo"))]) + (ctune . [(20210205 1428) ((emacs (26 1))) "Tune out CC Mode Noise Macros" tar ((:commit . "3f7abc6e74d4e5954b476ba9a1dc652f96b10c05") (:authors ("Mauro Aranda" . "maurooaranda@gmail.com")) (:maintainer "Mauro Aranda" . "maurooaranda@gmail.com") (:keywords "c" "convenience") (:url . "https://github.com/maurooaranda/ctune"))]) + (ctxmenu . [(20140303 2142) ((popup (20140205 103)) (log4e (0 2 0)) (yaxception (0 1))) "Provide a context menu like right-click." tar ((:commit . "5c2376859562b98c07c985d2b483658e4c0e888e") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "popup") (:url . "https://github.com/aki2o/emacs-ctxmenu"))]) + (cubicaltt . [(20171108 1402) ((emacs (24 1)) (cl-lib (0 5))) "Mode for cubical type theory" single ((:commit . "a5c6f94bfc0da84e214641e0b87aa9649ea114ea") (:keywords "languages") (:url . "https://github.com/mortberg/cubicaltt"))]) + (cubicle-mode . [(20171009 1957) nil "Major mode for the Cubicle model checker" single ((:commit . "00f09bb2d4bb496549775e770d7ada08bc1e4866") (:authors ("Alain Mebsout")) (:maintainer "Alain Mebsout"))]) + (cucumber-goto-step . [(20131210 519) ((pcre2el (1 5))) "Jump to cucumber step definition" single ((:commit . "f2713ffb26ebe1b757d1f2ea80e900b55e5895aa") (:authors ("Glen Stampoultzis" . "gstamp@gmail.com")) (:maintainer "Glen Stampoultzis" . "gstamp@gmail.com") (:url . "http://orthogonal.me"))]) + (cuda-mode . [(20201013 2230) nil "NVIDIA CUDA Major Mode" single ((:commit . "7f593518fd135fc6af994024bcb47986dfa502d2") (:authors ("Jack Morrison" . "jackmorrison1@gmail.com")) (:maintainer "Jack Morrison" . "jackmorrison1@gmail.com") (:keywords "c" "languages"))]) + (curl-to-elisp . [(20201124 1012) ((emacs (25 1))) "Convert cURL command to Emacs Lisp code" single ((:commit . "63d8d9c6d5efb8af8aa88042bfc0690ba699ef64") (:authors ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:keywords "lisp") (:url . "https://github.com/xuchunyang/curl-to-elisp"))]) + (currency-convert . [(20210427 2032) ((emacs (24 4))) "Currency converter" single ((:commit . "12805ea66aa8421de5eedda39d23f709de634460") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "comm" "convenience" "i18n") (:url . "https://github.com/lassik/emacs-currency-convert"))]) + (current-word-highlight . [(20210323 1401) nil "Highlight the current word minor mode" single ((:commit . "d860f4e170ffa4cef840da93647f458cc409d554") (:authors ("Kijima Daigo" . "norimaking777@gmail.com")) (:maintainer "Kijima Daigo" . "norimaking777@gmail.com") (:keywords "highlight" "face" "convenience" "word") (:url . "https://github.com/kijimaD/current-word-highlight"))]) + (curry-on-theme . [(20210322 1717) ((emacs (24 1))) "A low contrast color theme" single ((:commit . "b53a61d443cc75906d9f97e19f19be71f1e19bc4") (:authors ("Martín Varela" . "martin@varela.fi")) (:maintainer "Martín Varela" . "martin@varela.fi") (:url . "https://github.com/mvarela/Curry-On-Theme"))]) + (cursor-test . [(20131207 1732) ((emacs (24))) "testing library for cursor position in emacs." single ((:commit . "e09956e048b88fd2ee8dd90b5678baed8b04d31b") (:authors ("ainame")) (:maintainer "ainame") (:url . "https://github.com/ainame/cursor-test.el"))]) + (cwl-mode . [(20210510 1150) ((yaml-mode (0 0 13)) (emacs (24 4))) "A major mode for editing CWL" single ((:commit . "23a333119efaac78453cba95d316109805bd6aec") (:authors ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainer "Tomoya Tanjo" . "ttanjo@gmail.com") (:keywords "languages" "cwl" "common workflow language") (:url . "https://github.com/tom-tan/cwl-mode"))]) + (cyberpunk-2019-theme . [(20191008 1133) ((emacs (24 1))) "A retina-scorching cyberpunk theme" single ((:commit . "7e40c37210c363b2819fd9bb98a73101d7a3c206") (:authors ("Alex Lynham" . "alex@lynh.am")) (:maintainer "Alex Lynham" . "alex@lynh.am") (:keywords "cyberpunk" "theme" "themes") (:url . "https://github.com/the-frey/cyberpunk-2019"))]) + (cyberpunk-theme . [(20200601 1632) nil "Cyberpunk Color Theme" single ((:commit . "cbd0d7193e69ff9e98262eb06aee3d27667ff5f5") (:authors ("Nicholas M. Van Horn" . "nvanhorn@protonmail.com")) (:maintainer "Nicholas M. Van Horn" . "nvanhorn@protonmail.com") (:keywords "color" "theme" "cyberpunk") (:url . "https://github.com/n3mo/cyberpunk-theme.el"))]) + (cycbuf . [(20131203 2037) nil "Cycle buffers, inspired by swbuff.el, swbuff-x.el, and bs.el" single ((:commit . "1079b41c3eb27d65b66d4399959bb6253f84858e") (:authors ("Martin Pohlack martinp (at) gmx.de")) (:maintainer "Martin Pohlack martinp (at) gmx.de") (:keywords "files" "convenience" "buffer switching") (:url . "https://github.com/martinp26/cycbuf"))]) + (cycle-resize . [(20160521 1557) nil "Cycle resize the current window horizontally or vertically" single ((:commit . "7d255d6fe85f12c967a0f7fcfcf18633be194c88") (:authors ("Pierre Lecocq")) (:maintainer "Pierre Lecocq") (:url . "https://github.com/pierre-lecocq/cycle-resize"))]) + (cycle-themes . [(20150403 309) ((cl-lib (0 5))) "A global minor mode to make switching themes easier" single ((:commit . "6e125d11fdbc6b78fc9f219eb2609a5e29815898") (:keywords "themes" "utility" "global minor mode") (:url . "http://github.com/toroidal-code/cycle-themes.el"))]) + (cyphejor . [(20210319 1423) ((emacs (24 4))) "Shorten major mode names using user-defined rules" single ((:commit . "cf580995f891e339a9485ba91d6cb81a2abd61e4") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:keywords "mode-line" "major-mode") (:url . "https://github.com/mrkkrp/cyphejor"))]) + (cypher-mode . [(20151110 1142) nil "major mode for editing cypher scripts" single ((:commit . "ce8543d7877c736c574a17b49874c9dcdc7a06d6") (:authors ("François-Xavier Bois <fxbois AT Google Mail Service>")) (:maintainer "François-Xavier Bois") (:keywords "cypher" "graph") (:url . "http://github.com/fxbois/cypher-mode"))]) + (cython-mode . [(20190111 2150) nil "Major mode for editing Cython files" single ((:commit . "3e7aa76b8957e2347f3cb9dfc077897b65c5d194"))]) + (czech-holidays . [(20160113 1752) nil "Adds a list of Czech public holidays to Emacs calendar" single ((:commit . "d136fa09a152b3cd80db6d55c7b4ddfe07b90fbf") (:authors ("David Chkhikvadze" . "david.chk@outlook.com")) (:maintainer "David Chkhikvadze" . "david.chk@outlook.com") (:keywords "calendar"))]) + (d-mode . [(20210119 1853) ((emacs (25 1))) "D Programming Language major mode for (X)Emacs" single ((:commit . "199743df55c6bfce3cdb08405bd8519768c8dfa9") (:authors ("William Baxter")) (:maintainer "Russel Winder" . "russel@winder.org.uk") (:keywords "d" "programming" "language" "emacs" "cc-mode"))]) + (dactyl-mode . [(20140906 1725) nil "Major mode for editing Pentadactyl config files" single ((:commit . "cc55fe6b987271d9647492b8df4c812d884f661f") (:keywords "languages" "vim") (:url . "https://github.com/luxbock/dactyl-mode"))]) + (dad-joke . [(20170928 658) ((emacs (24))) "Get/display dad jokes" single ((:commit . "bee47e7b746b403228fa7d7361cb095de19ac9ba") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "games") (:url . "https://github.com/davep/dad-joke.el"))]) + (daemons . [(20200421 912) ((emacs (25 1))) "UI for managing init system daemons (services)" tar ((:commit . "a26155d04cec399ffe25b88f71cbfa4ada784569") (:authors ("Chris Bowdon")) (:maintainer "Chris Bowdon") (:keywords "unix" "convenience") (:url . "https://github.com/cbowdon/daemons.el"))]) + (dakrone-light-theme . [(20170808 2140) nil "dakrone's custom light theme" single ((:commit . "06f198dc8b4ca7421990b30a23d89c8e0b8c5de4") (:authors ("Lee Hinman <lee _AT_ writequit.org>")) (:maintainer "Lee Hinman <lee _AT_ writequit.org>") (:keywords "color" "themes" "faces") (:url . "https://github.com/dakrone/dakrone-light-theme"))]) + (dakrone-theme . [(20170801 1933) nil "dakrone's custom dark theme" single ((:commit . "232ad1be5f3572dcbdf528f1655109aa355a6937") (:authors ("Lee Hinman <lee _AT_ writequit.org>")) (:maintainer "Lee Hinman <lee _AT_ writequit.org>") (:keywords "color" "themes") (:url . "https://github.com/dakrone/dakrone-theme"))]) + (danneskjold-theme . [(20210429 657) nil "Beautiful high-contrast Emacs theme." tar ((:commit . "e4d1f2c76245fe9d0d07133a841e789d139df28d") (:authors ("Dmitry Akatov" . "akatovda@yandex.com")) (:maintainer "Dmitry Akatov" . "akatovda@yandex.com") (:url . "https://github.com/rails-to-cosmos/"))]) + (dante . [(20210301 1738) ((dash (2 12 0)) (emacs (25 1)) (f (0 19 0)) (flycheck (0 30)) (company (0 9)) (haskell-mode (13 14)) (s (1 11 0)) (lcr (1 0))) "Development mode for Haskell" single ((:commit . "8741419333fb85ed2c1d71f5902688f5201b0a40") (:authors ("Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com")) (:maintainer "Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com") (:keywords "haskell" "tools") (:url . "https://github.com/jyp/dante"))]) + (dap-mode . [(20210519 1554) ((emacs (26 1)) (dash (2 18 0)) (lsp-mode (6 0)) (bui (1 1 0)) (f (0 20 0)) (s (1 12 0)) (lsp-treemacs (0 1)) (posframe (0 7 0)) (ht (2 3))) "Debug Adapter Protocol mode" tar ((:commit . "cc395e066755c7513d4862f5639f3d162b3bd30f") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainer "Ivan Yonchovski" . "yyoncho@gmail.com") (:keywords "languages" "debug") (:url . "https://github.com/emacs-lsp/dap-mode"))]) + (darcsum . [(20190316 2215) nil "a pcl-cvs like interface for managing darcs patches" single ((:commit . "6a8b690539d133c5e3d17cb23fe4365fbb6fb493") (:authors ("John Wiegley" . "johnw@gnu.org")) (:maintainer "John Wiegley" . "johnw@gnu.org") (:keywords "completion" "convenience" "tools" "vc"))]) + (darcula-theme . [(20171227 1845) nil "Inspired by IntelliJ's Darcula theme" single ((:commit . "d9b82b58ded9014985be6658f4ab17e26ed9e93e") (:authors ("Sam Halliday" . "Sam.Halliday@gmail.com")) (:maintainer "Sam Halliday" . "Sam.Halliday@gmail.com") (:keywords "faces") (:url . "https://gitlab.com/fommil/emacs-darcula-theme"))]) + (dark-krystal-theme . [(20170808 1300) ((emacs (24 0))) "an Emacs 24 theme based on Dark Krystal (tmTheme)" single ((:commit . "79084b99665dc9ffb0ec62cc092349a5ecebebbc") (:authors ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))]) + (dark-mint-theme . [(20160302 642) nil "dark & minty fresh theme" single ((:commit . "95c30a26de31549cd341184ba9ab2be8fdc67eba"))]) + (dark-souls . [(20140314 1128) nil "Prepare to die" single ((:commit . "94122b1215423e58dcf18584a2bd022029d54d4b") (:authors ("Tom Jakubowski" . "tom@crystae.net")) (:maintainer "Tom Jakubowski" . "tom@crystae.net") (:keywords "games") (:url . "http://github.com/tomjakubowski/dark-souls.el"))]) + (darkburn-theme . [(20170423 1652) nil "A not-so-low contrast color theme for Emacs." single ((:commit . "0af794ff7fac19778ac8a7efb92455c6f6c2158f") (:authors ("Jonas Gorauskas" . "jgorauskas@gmail.com")) (:maintainer "Jonas Gorauskas" . "jgorauskas@gmail.com") (:url . "http://github.com/gorauskas/darkburn-theme"))]) + (darkmine-theme . [(20160406 624) nil "Yet another emacs dark color theme." single ((:commit . "7f7e82ca03bcad52911fa41fb3e204e32d6ee63e") (:authors ("Pierre Lecocq" . "pierre.lecocq@gmail.com")) (:maintainer "Pierre Lecocq" . "pierre.lecocq@gmail.com") (:url . "https://github.com/pierre-lecocq/darkmine-theme"))]) + (darkokai-theme . [(20200614 1452) nil "A darker variant on Monokai." single ((:commit . "5820aeddfc8c869ba840cc534eba776936656a66") (:url . "http://github.com/sjrmanning/darkokai"))]) + (darktooth-theme . [(20201215 822) ((autothemer (0 2))) "From the darkness... it watches" single ((:commit . "ec03b30ee7f43f89ca4c382bb3fe4ee560c028a8") (:url . "http://github.com/emacsfodder/emacs-theme-darktooth"))]) + (dart-mode . [(20210301 0) ((emacs (24 3))) "Major mode for editing Dart files" single ((:commit . "43975c92080e307c4bc14a4773a61195d2062fd9") (:authors ("Brady Trainor" . "mail@bradyt.net")) (:maintainer "Brady Trainor" . "mail@bradyt.net") (:keywords "languages") (:url . "https://github.com/bradyt/dart-mode"))]) + (dart-server . [(20210501 1445) ((emacs (24 5)) (cl-lib (0 5)) (dash (2 10 0)) (flycheck (0 23)) (s (1 10))) "Minor mode for editing Dart files" single ((:commit . "75562baf9a89b7e314bc2f795f6ecdc5d1f2cc8c") (:authors ("Natalie Weizenbaum") ("Brady Trainor" . "mail@bradyt.com")) (:maintainer "Brady Trainor" . "mail@bradyt.com") (:keywords "languages") (:url . "https://github.com/bradyt/dart-server"))]) + (dash . [(20210609 1330) ((emacs (24))) "A modern list library for Emacs" tar ((:commit . "88d799595e8f1b4154637ce8a3f81b97b0520c1a") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "extensions" "lisp") (:url . "https://github.com/magnars/dash.el"))]) + (dash-alfred . [(20191024 450) ((emacs (25 1))) "Search Dash documentation via Dash-Alfred-Workflow" single ((:commit . "fcd21bd6c7eb5cd31377be970406ff3d2454bd5c") (:authors ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:keywords "docs") (:url . "https://github.com/xuchunyang/dash-alfred.el"))]) + (dash-at-point . [(20180710 1356) nil "Search the word at point with Dash" single ((:commit . "4d795a23a8428c421d5107f1b005c9d8e0d1816c") (:authors ("Shinji Tanaka" . "shinji.tanaka@gmail.com")) (:maintainer "Shinji Tanaka" . "shinji.tanaka@gmail.com") (:url . "https://github.com/stanaka/dash-at-point"))]) + (dash-docs . [(20200516 1943) ((emacs (24 4)) (cl-lib (0 5)) (async (1 9 3))) "Offline documentation browser using Dash docsets." single ((:commit . "dafc8fc9f1ddb2e4e39e0b8d066c42d5d7ce8d06") (:authors ("Raimon Grau" . "raimonster@gmail.com") ("Toni Reina " . "areina0@gmail.com") ("Bryan Gilbert" . "bryan@bryan.sh")) (:maintainer "Raimon Grau" . "raimonster@gmail.com") (:keywords "docs") (:url . "http://github.com/areina/helm-dash"))]) + (dash-functional . [(20210210 1449) ((dash (2 18 0))) "Collection of useful combinators for Emacs Lisp" single ((:commit . "88d799595e8f1b4154637ce8a3f81b97b0520c1a") (:authors ("Matus Goljer" . "matus.goljer@gmail.com") ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:keywords "extensions" "lisp") (:url . "https://github.com/magnars/dash.el"))]) + (dashboard . [(20210427 705) ((emacs (25 3)) (page-break-lines (0 11))) "A startup screen extracted from Spacemacs" tar ((:commit . "9983aa0838ce5a2219ef4b674e6b37de41b5b585") (:authors ("Rakan Al-Hneiti")) (:maintainer "Rakan Al-Hneiti") (:keywords "startup" "screen" "tools" "dashboard") (:url . "https://github.com/emacs-dashboard/emacs-dashboard"))]) + (dashboard-hackernews . [(20190109 205) ((emacs (24)) (dashboard (1 2 5)) (request (0 3 0))) "Display Hacker News on dashboard" single ((:commit . "b71814716d8f78181b9d1990f06072460de0797e") (:authors ("Hayato KAJIYAMA" . "kaji1216@gmail.com")) (:maintainer "Hayato KAJIYAMA" . "kaji1216@gmail.com") (:url . "https://github.com/hyakt/emacs-dashboard-hackernews"))]) + (dashboard-ls . [(20210108 1857) ((emacs (24 3)) (dashboard (1 2 5)) (f (0 20 0)) (s (1 12 0))) "Display files/directories in current directory on Dashboard" single ((:commit . "91b3c79aa3af3842f1477825f967370414dc77b2") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/emacs-dashboard/dashboard-ls"))]) + (dashboard-project-status . [(20190202 1354) ((emacs (24)) (git (0 1 1)) (dashboard (1 2 5))) "Display a git project status in a dashboard widget." single ((:commit . "7675c138e9df8fe2c626e7ba9bbb8b6717671a41") (:authors ("Jason Duncan" . "jasond496@msn.com")) (:maintainer "Jason Duncan" . "jasond496@msn.com") (:url . "https://github.com/functionreturnfunction/dashboard-project-status"))]) + (date-at-point . [(20150308 1243) nil "Add `date' to `thing-at-point' function" single ((:commit . "38df823d05df08ec0748a4185113fae5f99090e9") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "convenience") (:url . "https://github.com/alezost/date-at-point.el"))]) + (date-field . [(20141129 105) ((dash (2 9 0)) (log4e (0 2 0)) (yaxception (0 3 2))) "Date widget" single ((:commit . "11c9170d1f7b343233f7716d4c0a62be024c1654") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "widgets") (:url . "https://github.com/aki2o/emacs-date-field"))]) + (date2name . [(20190630 933) ((emacs (24 4))) "Package to prepend ISO Timestamps to files" single ((:commit . "386dbe73678705d6107cd5c9bdeb4f7c97632360") (:authors ("Max Beutelspacher")) (:maintainer "Max Beutelspacher") (:keywords "files" "convenience") (:url . "https://github.com/DerBeutlin/date2name.el"))]) + (datetime . [(20210307 2203) ((emacs (24 4)) (extmap (1 1 1))) "Parsing, formatting and matching timestamps" tar ((:commit . "276f9d4304180301edabc160d5d17f46532489a1") (:authors ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com") (:keywords "lisp" "i18n") (:url . "https://github.com/doublep/datetime"))]) + (datetime-format . [(20160612 1715) nil "Datetime functions" single ((:commit . "e6427538b547cbe02e1bd6ed4b765c73620bdae8") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "datetime" "calendar") (:url . "https://github.com/zonuexe/emacs-datetime"))]) + (datomic-snippets . [(20180817 1045) ((s (1 4 0)) (dash (1 2 0)) (yasnippet (0 6 1))) "Yasnippets for Datomic" tar ((:commit . "4a14228840d5252e13d2bf6209670f26345bbb84") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "snippets"))]) + (dayone . [(20160105 1240) ((uuid (0 0 3)) (mustache (0 22)) (ht (1 5))) "Utility script for Day One" tar ((:commit . "ab628274f0806451f23bce16f62a6a11cbf91a2b") (:authors ("mori-dev" . "mori.dev.asdf@gmail.com")) (:maintainer "mori-dev" . "mori.dev.asdf@gmail.com") (:keywords "day one" "tools" "convenience") (:url . "https://github.com/mori-dev/emacs-dayone"))]) + (db . [(20140421 2111) ((kv (0 0 11))) "A database for EmacsLisp" single ((:commit . "b3a423fb8e72f9013009cbe033d654df2ce31438") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:keywords "data" "lisp"))]) + (db-pg . [(20130131 1902) ((pg (0 12)) (db (0 0 6))) "A PostgreSQL adapter for emacs-db" single ((:commit . "7d5ab86b74b05fe003b3b434d4835f37f3f3eded") (:authors ("Nic Ferrier" . "nic@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nic@ferrier.me.uk") (:keywords "data" "comm" "database" "postgresql"))]) + (dbc . [(20201001 1452) ((emacs (24 4)) (cl-lib (0 5)) (ht (2 3))) "Control how to open buffers" single ((:commit . "6728e72f72347d098b7d75ac4c29a7d687cc9ed3") (:authors ("Matsievskiy S.V.")) (:maintainer "Matsievskiy S.V.") (:keywords "convenience") (:url . "https://gitlab.com/matsievskiysv/display-buffer-control"))]) + (ddskk . [(20210522 348) ((ccc (1 43)) (cdb (20141201 754))) "Simple Kana to Kanji conversion program." tar ((:commit . "ce0517127586e26f95f94f45d22a832f40a28321"))]) + (ddskk-posframe . [(20200812 917) ((emacs (26 1)) (posframe (0 4 3)) (ddskk (16 2 50))) "Show Henkan tooltip for ddskk via posframe" single ((:commit . "299493dd951e5a0b43b8213321e3dc0bac10f762") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "tooltip" "convenience" "posframe") (:url . "https://github.com/conao3/ddskk-posframe.el"))]) + (deadgrep . [(20210510 416) ((emacs (25 1)) (dash (2 12 0)) (s (1 11 0)) (spinner (1 7 3))) "fast, friendly searching with ripgrep" single ((:commit . "83e7812cda2673884b3d4d218757c7489f817fbb") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:keywords "tools") (:url . "https://github.com/Wilfred/deadgrep"))]) + (debian-el . [(20201011 1543) nil "Emacs helpers specific to Debian users" tar ((:commit . "4fd5547a54ee931f4a16adde1d3b52bf01ce045a"))]) + (debpaste . [(20160113 2347) ((xml-rpc (1 6 7))) "Interface for getting/posting/deleting pastes from paste.debian.net" single ((:commit . "6f2a400665062468ebd03a2ce1de2a73d9084958") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "paste") (:url . "http://github.com/alezost/debpaste.el"))]) + (debug-print . [(20140126 19) ((emacs (24))) "A nice printf debugging environment by the way Gauche do" single ((:commit . "d817fd9ea2d3f8d2c1ace4d8af155684f3a99dc5") (:authors ("Ken Okada" . "keno.ss57@gmail.com")) (:maintainer "Ken Okada" . "keno.ss57@gmail.com") (:keywords "extensions" "lisp" "tools" "maint") (:url . "https://github.com/kenoss/debug-print"))]) + (decide . [(20190201 2137) nil "rolling dice and other random things" single ((:commit . "4bfcc826dd5b1c30caec455d8baa4f363159eac6") (:authors ("Pelle Nilsson" . "perni@lysator.liu.se")) (:maintainer "Pelle Nilsson" . "perni@lysator.liu.se"))]) + (decl . [(20171212 1458) ((dash (2 5 0)) (emacs (24 3)) (cl-lib (0 3))) "Library for organizing code declaratively" single ((:commit . "ff7f8a4f1225cbdf141c86172104e67a4cf58c86") (:authors ("Preetpal S. Sohal")) (:maintainer "Preetpal S. Sohal") (:url . "https://github.com/preetpalS/decl.el"))]) + (dedicated . [(20151202 110) nil "A very simple minor mode for dedicated buffers" single ((:commit . "f47b504c0c56fa5ab9d1028417ca1f65a713a2f0") (:authors ("Eric Crampton" . "eric@atdesk.com")) (:maintainer "Eric Crampton" . "eric@atdesk.com") (:keywords "dedicated" "buffer"))]) + (dedukti-mode . [(20171103 1212) nil "Major mode for Dedukti files" single ((:commit . "d7c3505a1046187de3c3aeb144455078d514594e") (:authors ("Raphaël Cauderlier")) (:maintainer "Raphaël Cauderlier") (:keywords "languages" "dedukti") (:url . "https://github.com/rafoo/dedukti-mode"))]) + (default-font-presets . [(20210418 924) ((emacs (26 1))) "Support selecting fonts from a list of presets" single ((:commit . "81ef9d54000617ce98c40b4627eca64e076ff11d") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-default-font-presets"))]) + (default-text-scale . [(20191226 2234) ((emacs (24))) "Easily adjust the font size in all frames" single ((:commit . "bfc0987c37e93742255d3b23d86c17096fda8e7e") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "frames" "faces") (:url . "https://github.com/purcell/default-text-scale"))]) + (deferred . [(20170901 1330) ((emacs (24 4))) "Simple asynchronous functions for emacs lisp" single ((:commit . "2239671d94b38d92e9b28d4e12fd79814cfb9c16") (:authors ("SAKURAI Masashi <m.sakurai at kiwanami.net>")) (:maintainer "SAKURAI Masashi <m.sakurai at kiwanami.net>") (:keywords "deferred" "async") (:url . "https://github.com/kiwanami/emacs-deferred"))]) + (define-it . [(20201005 1731) ((emacs (25 1)) (s (1 12 0)) (request (0 3 0)) (popup (0 5 3)) (pos-tip (0 4 6)) (google-translate (0 11 18)) (wiki-summary (0 1))) "Define, translate, wiki the word" single ((:commit . "8df0505babf930bafe3fd28d472cc325637f886b") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/define-it"))]) + (define-word . [(20210103 1812) ((emacs (24 3))) "display the definition of word at point." single ((:commit . "6e4a427503aef096484f88332962c346cdd10847") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "dictionary" "convenience") (:url . "https://github.com/abo-abo/define-word"))]) + (defproject . [(20151201 2219) ((emacs (24))) "Manager dir-locals and project specific variables" single ((:commit . "674d48a5e34cb4bba76faa38ee901322ec649086") (:authors (nil . "<kotfic@gmail.com>")) (:maintainer nil . "<kotfic@gmail.com>") (:keywords "convenience") (:url . "https://github.com/kotfic/defproject"))]) + (defrepeater . [(20180830 410) ((emacs (25 2)) (s (1 12 0))) "Easily make commands repeatable" single ((:commit . "9c027a2561fe141dcfb79f75fcaee36cd0386ec1") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "convenience") (:url . "http://github.com/alphapapa/defrepeater.el"))]) + (deft . [(20210101 1519) nil "quickly browse, filter, and edit plain text notes" single ((:commit . "c4af44827f4257e7619e63abfd22094a29a9ab52") (:authors ("Jason R. Blevins" . "jrblevin@xbeta.org")) (:maintainer "Jason R. Blevins" . "jrblevin@xbeta.org") (:keywords "plain text" "notes" "simplenote" "notational velocity") (:url . "https://jblevins.org/projects/deft/"))]) + (delim-kill . [(20100517 620) nil "Kill text between delimiters." single ((:commit . "1dbe47344f2d2cbc8c54beedf0cf0bf10fd203c1") (:authors ("Thomas Kappler" . "tkappler@gmail.com")) (:maintainer "Thomas Kappler" . "tkappler@gmail.com") (:keywords "convenience" "languages") (:url . "http://github.com/thomas11/delim-kill/tree/master"))]) + (demangle-mode . [(20200926 2014) ((cl-lib (0 1)) (emacs (24 3))) "Automatically demangle C++ symbols" single ((:commit . "aaef0bd77a3ea9ce9132e9a53ac021b0f5d33e12") (:authors ("Ben Liblit" . "liblit@acm.org")) (:maintainer "Ben Liblit" . "liblit@acm.org") (:keywords "c" "tools") (:url . "https://github.com/liblit/demangle-mode"))]) + (demo-it . [(20190828 26) nil "Create demonstrations" tar ((:commit . "9cfa5c3f92a0dca7eebb1f1a2011643c9b009d26") (:authors ("Howard Abrams" . "howard.abrams@gmail.com")) (:maintainer "Howard Abrams" . "howard.abrams@gmail.com") (:keywords "demonstration" "presentation" "test"))]) + (deno-fmt . [(20200520 1838) ((emacs (24))) "Minor mode for using deno fmt on save" single ((:commit . "3b193eef576e2c14fdcf350495955e6e8546dddd") (:authors ("Russell Clarey <http://github/rclarey>")) (:maintainer "Russell Clarey <http://github/rclarey>") (:url . "https://github.com/russell/deno-emacs"))]) + (describe-hash . [(20200718 1556) nil "Help function for examining a hash map" single ((:commit . "18e69a932d5495c8439571ba8f2d2ee123d434b1") (:url . "https://github.com/Junker/describe-hash"))]) + (describe-number . [(20151101 55) ((yabin (1 1))) "Describe arbitrarily large number at point." single ((:commit . "40618345a37831804b29589849a785ef5aa5ac24") (:authors ("Morten Slot Kristensen <msk AT nullpointer DOT dk>")) (:maintainer "Morten Slot Kristensen <msk AT nullpointer DOT dk>") (:keywords "describe" "value" "help") (:url . "https://github.com/netromdk/describe-number"))]) + (desktop+ . [(20170107 2132) ((emacs (24 4)) (dash (2 11 0)) (f (0 17 2))) "Handle special buffers when saving & restoring sessions" single ((:commit . "88055cee526a000056201898499cebbd35e3ea76") (:authors ("François Févotte" . "fevotte@gmail.com")) (:maintainer "François Févotte" . "fevotte@gmail.com") (:url . "https://github.com/ffevotte/desktop-plus"))]) + (desktop-environment . [(20210129 2018) ((emacs (25 1))) "Helps you control your GNU/Linux computer" single ((:commit . "2c3e0750c11485931f447ea82f80bc90ae07aeba") (:authors ("Damien Cassou <damien@cassou.me>, Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Damien Cassou <damien@cassou.me>, Nicolas Petton" . "nicolas@petton.fr") (:url . "https://gitlab.petton.fr/DamienCassou/desktop-environment"))]) + (desktop-mail-user-agent . [(20210519 1008) ((emacs (24 3))) "Call OS default mail program to compose mail" single ((:commit . "caac672ef7e4ddced960fa31cef3a6ba5d7ab451") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "mail") (:url . "https://github.com/lassik/emacs-desktop-mail-user-agent"))]) + (desktop-registry . [(20140119 2143) nil "Keep a central registry of desktop files" single ((:commit . "244c2e7f9f0a1050aa8a47ad0b38f4e4584682dd") (:authors ("Tom Willemse" . "tom@ryuslash.org")) (:maintainer "Tom Willemse" . "tom@ryuslash.org") (:keywords "convenience") (:url . "http://projects.ryuslash.org/desktop-registry/"))]) + (detour . [(20181122 2138) ((emacs (24 4))) "Take a quick detour and return" single ((:commit . "1ff23c236e18971ed1077840daf047cde79a45ee") (:authors ("Stefan Kamphausen <www.skamphausen.de>")) (:maintainer "Stefan Kamphausen <www.skamphausen.de>") (:keywords "convenience" "abbrev") (:url . "https://github.com/ska2342/detour/"))]) + (devdocs . [(20210608 1625) ((emacs (27 1))) "Emacs viewer for DevDocs" single ((:commit . "1886e7a0bf2462c8ba910a2330c17bf4cc100e4f") (:authors ("Augusto Stoffel" . "arstoffel@gmail.com")) (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com") (:keywords "help") (:url . "https://github.com/astoff/devdocs.el"))]) + (devdocs-browser . [(20210601 1447) ((emacs (27 1))) "Browse devdocs.io documents using EWW" single ((:commit . "d3702670eb361715e41440eb699523b3f4c60bee") (:authors ("blahgeek" . "i@blahgeek.com")) (:maintainer "blahgeek" . "i@blahgeek.com") (:keywords "docs" "help" "tools") (:url . "https://github.com/blahgeek/emacs-devdocs-browser"))]) + (dfmt . [(20170728 1023) nil "Emacs Interface to D indenting/formatting tool dfmt." single ((:commit . "21b9094e907b7ac53f5ecb4ff4539613a9d12434") (:authors ("Per Nordlöw")) (:maintainer "Kirill Babikhin <qsimpleq>") (:keywords "tools" "convenience" "languages" "dlang") (:url . "https://github.com/qsimpleq/elisp-dfmt"))]) + (dhall-mode . [(20200822 258) ((emacs (24 4)) (reformatter (0 3))) "Major mode for the dhall configuration language" single ((:commit . "ad259c8a2292fb398dff1ce7d25c686edb02945d") (:authors ("Sibi Prabakaran" . "sibi@psibi.in")) (:maintainer "Sibi Prabakaran" . "sibi@psibi.in") (:keywords "languages") (:url . "https://github.com/psibi/dhall-mode"))]) + (dianyou . [(20210525 1517) ((emacs (24 4))) "Search and analyze mails in Gnus" single ((:commit . "f77d9e76be5d8022fa6ee5426144f13f38dd09f2") (:authors ("Chen Bin <chenbin DOT sh AT gmail DOT com>")) (:maintainer "Chen Bin <chenbin DOT sh AT gmail DOT com>") (:keywords "mail") (:url . "http://github.com/redguardtoo/dianyou"))]) + (diary-manager . [(20210404 1821) ((emacs (25))) "Simple personal diary" single ((:commit . "0fa122be62dd296cefe23bcf5074cc6159bd9868") (:authors ("Radon Rosborough" . "radon.neon@gmail.com")) (:maintainer "Radon Rosborough" . "radon.neon@gmail.com") (:keywords "extensions") (:url . "https://github.com/raxod502/diary-manager"))]) + (dic-lookup-w3m . [(20180526 1621) ((w3m (20120723 324)) (stem (20120826))) "look up dictionaries on the Internet" tar ((:commit . "3254ab10cbf0078c7162557dd1f68dac28459cf9") (:authors ("mcprvmec")) (:maintainer "mcprvmec") (:keywords "emacs-w3m" "w3m" "dictionary"))]) + (dictcc . [(20200421 1422) ((emacs (24 4)) (cl-lib (0 5)) (ivy (0 10 0))) "Look up translations on dict.cc" single ((:commit . "3950011197ba81f27cc82b4e6075c9100945f936") (:authors ("Marten Lienen" . "marten.lienen@gmail.com")) (:maintainer "Marten Lienen" . "marten.lienen@gmail.com") (:keywords "convenience"))]) + (dictionary . [(20201001 1727) ((connection (1 11)) (link (1 11))) "Client for rfc2229 dictionary servers" single ((:commit . "bdf0aa7761d1c1a3bc0652b2fdc4a54b3acdb06a") (:authors ("Torsten Hilbrich" . "torsten.hilbrich@gmx.net")) (:maintainer "Torsten Hilbrich" . "torsten.hilbrich@gmx.net") (:keywords "interface" "dictionary"))]) + (didyoumean . [(20200905 1843) ((emacs (24 4))) "Did you mean to open another file?" single ((:commit . "ce5edcce160b86e7f6480f0381be785d43f97e19") (:keywords "convenience") (:url . "https://gitlab.com/kisaragi-hiu/didyoumean.el"))]) + (diff-at-point . [(20201006 1436) ((emacs (26 2))) "Diff navigation" single ((:commit . "3fcf861f1f8b91d97000bda32345bc92df8e2d37") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-diff-at-point"))]) + (diff-hl . [(20210523 11) ((cl-lib (0 2)) (emacs (25 1))) "Highlight uncommitted changes using VC" tar ((:commit . "d4340608c2d6d8b81aad8e690d0265799aba16f3") (:authors ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru") (:keywords "vc" "diff") (:url . "https://github.com/dgutov/diff-hl"))]) + (difflib . [(20210224 2242) ((emacs (24 4)) (cl-generic (0 3)) (ht (2 2)) (s (1 12 0))) "Helpers for computing deltas between sequences." single ((:commit . "646fc4388274fe765bbf4661e17a24e4d081250c") (:authors ("Diego A. Mundo" . "dieggsy@pm.me")) (:maintainer "Diego A. Mundo" . "dieggsy@pm.me") (:keywords "matching" "tools" "string") (:url . "http://github.com/dieggsy/difflib.el"))]) + (diffpdf . [(20210307 932) ((emacs (25 1)) (transient (0 3 0))) "Transient diffpdf" single ((:commit . "96861493f95fe88118942bbe64954142250d6c24") (:authors ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainer "Shuguang Sun" . "shuguang79@qq.com") (:keywords "tools") (:url . "https://github.com/ShuguangSun/diffpdf.el"))]) + (diffscuss-mode . [(20141014 2357) nil "Major mode for diffscuss files." single ((:commit . "e0aacd8b3d9f886f27222c1397f0655e849e0af7") (:authors ("Edmund Jorgensen" . "edmund@hut8labs.com")) (:maintainer "Edmund Jorgensen" . "edmund@hut8labs.com") (:keywords "tools"))]) + (diffview . [(20150929 511) nil "View diffs in side-by-side format" single ((:commit . "031b70913e755c5e55222680f80185032a7d1728") (:authors ("Mitchel Humpherys" . "mitch.special@gmail.com")) (:maintainer "Mitchel Humpherys" . "mitch.special@gmail.com") (:keywords "convenience" "diff") (:url . "https://github.com/mgalgs/diffview-mode"))]) + (digistar-mode . [(20210129 1719) nil "major mode for Digistar scripts" single ((:commit . "e12b128023b7696a23545f812877e8c6531d261c") (:authors ("John Foerch" . "jjfoerch@gmail.com")) (:maintainer "John Foerch" . "jjfoerch@gmail.com") (:keywords "languages"))]) + (digit-groups . [(20200506 37) ((dash (2 11 0))) "Highlight place-value positions in numbers" single ((:commit . "7b81930cad19b8b7913b7eedbcb498964bfdcbdb") (:authors ("Michael D. Adams <http://michaeldadams.org>")) (:maintainer "Michael D. Adams <http://michaeldadams.org>") (:url . "https://github.com/adamsmd/digit-groups/"))]) + (digitalocean . [(20190607 726) ((request (2 5)) (emacs (24 4))) "Create and manipulate digitalocean droplets" single ((:commit . "6c32d3593286e2a62d9afab0057c829407b0d1e8") (:authors ("Oliver Marks" . "oly@digitaloctave.com")) (:maintainer "Oliver Marks" . "oly@digitaloctave.com") (:keywords "processes" "tools") (:url . "https://github.com/olymk2/emacs-digitalocean"))]) + (digitalocean-helm . [(20180610 746) ((emacs (24 3)) (helm (2 5)) (digitalocean (0 1))) "Create and manipulate digitalocean droplets" single ((:commit . "b125c9882eded7d73ec109d152b26625f333440b") (:authors ("Oliver Marks" . "oly@digitaloctave.com")) (:maintainer "Oliver Marks" . "oly@digitaloctave.com") (:keywords "processes" "tools") (:url . "https://gitlab.com/olymk2/digitalocean-api"))]) + (dim . [(20160818 949) ((emacs (24 4))) "Change mode-line names of major/minor modes" single ((:commit . "5515f2e8657ef14adcc34aa5b05383a2684328ae") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "convenience") (:url . "https://github.com/alezost/dim.el"))]) + (dim-autoload . [(20200103 1239) nil "dim or hide autoload cookie lines" single ((:commit . "c8dc02259d6c1aa25fb58742ae8b181f83b39a13") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "https://github.com/tarsius/dim-autoload"))]) + (dime . [(20210329 604) ((emacs (25 1)) (dylan (3 0))) "Dylan interaction mode" tar ((:commit . "040c8ebc884305fd4ff980d21c68946fa74b095a") (:url . "https://opendylan.org/"))]) + (diminish . [(20191127 1326) ((emacs (24 3))) "Diminished modes are minor modes with no modeline display" single ((:commit . "6ec6ebc391371418efc6c98d70b013f34af5a2ee") (:authors ("Will Mengarini" . "seldon@eskimo.com")) (:maintainer "Martin Yrjölä" . "martin.yrjola@gmail.com") (:keywords "extensions" "diminish" "minor" "codeprose") (:url . "https://github.com/myrjola/diminish.el"))]) + (diminish-buffer . [(20201206 1238) ((emacs (24 4))) "Diminish (hide) buffers from buffer-menu" single ((:commit . "387858aaa23d5d1145c98dfa70bbd39bb8c3fa5f") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/diminish-buffer"))]) + (dimmer . [(20210109 1932) ((emacs (25 1))) "Visually highlight the selected buffer" single ((:commit . "8559fb73a2c96755cb30f560be82191164014b43") (:authors ("Neil Okamoto")) (:maintainer "Neil Okamoto") (:keywords "faces" "editing") (:url . "https://github.com/gonewest818/dimmer.el"))]) + (dionysos . [(20160810 1056) ((libmpdee (2 1 0)) (alert (1 2)) (s (1 11 0)) (dash (2 12 1)) (pkg-info (0 5 0)) (cl-lib (0 5))) "Dionysos, a music player for Emacs" tar ((:commit . "0aac21caadabc5a7f09e18a9dcb02f3dec26588b") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "music") (:url . "https://github.com/nlamirault/dionysos"))]) + (dir-treeview . [(20201003 2206) ((emacs (24 4)) (treeview (1 0 0))) "A directory tree browser and simple file manager" tar ((:commit . "53dc9dae71d1be3a7a925332a53e72d2bd05366b") (:authors ("Tilman Rassy" . "tilman.rassy@googlemail.com")) (:maintainer "Tilman Rassy" . "tilman.rassy@googlemail.com") (:keywords "tools" "convenience" "files") (:url . "https://github.com/tilmanrassy/emacs-dir-treeview"))]) + (dircmp . [(20141204 1756) nil "Compare and sync directories." tar ((:commit . "558ee0b601c2de9d247612085aafe2926f56a09f") (:authors ("Matt McClure -- http://matthewlmcclure.com")) (:maintainer "Matt McClure -- http://matthewlmcclure.com") (:keywords "unix" "tools") (:url . "https://github.com/matthewlmcclure/dircmp-mode"))]) + (dired-atool . [(20181228 1422) ((emacs (24))) "Pack/unpack files with atool on dired." single ((:commit . "52ce4ac88fa39a0ebdf732435fd831ea9a8d0764") (:authors ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainer "Hiroki YAMAKAWA" . "s06139@gmail.com") (:keywords "files") (:url . "https://github.com/HKey/dired-atool"))]) + (dired-avfs . [(20161012 1104) ((dash (2 5 0)) (dired-hacks-utils (0 0 1))) "AVFS support for dired" single ((:commit . "7c0ef09d57a80068a11edc74c3568e5ead5cc15a") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:keywords "files"))]) + (dired-collapse . [(20210403 1230) ((dash (2 10 0)) (f (0 19 0)) (dired-hacks-utils (0 0 1))) "Collapse unique nested paths in dired listing" single ((:commit . "7c0ef09d57a80068a11edc74c3568e5ead5cc15a") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "files"))]) + (dired-dups . [(20130527 2125) nil "Find duplicate files and display them in a dired buffer" single ((:commit . "694ad128c822c59348ced16c4a0c1356d43da47a") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:keywords "unix") (:url . "https://github.com/vapniks/dired-dups"))]) + (dired-efap . [(20140122 1656) nil "Edit Filename At Point in a dired buffer" single ((:commit . "624757b2e54d9a13e2183118d6c113e37684b90c") (:authors ("Juan-Leon Lahoz" . "juanleon1@gmail.com")) (:maintainer "Juan-Leon Lahoz" . "juanleon1@gmail.com") (:keywords "dired" "environment" "files" "renaming") (:url . "https://github.com/juan-leon/dired-efap"))]) + (dired-explorer . [(20180607 221) ((cl-lib (0 5))) "minor-mode provides Explorer like select file at dired." single ((:commit . "3ade0a31b5340271d05e9bf443f2504960f6c6dd") (:maintainer "jidaikobo-shibata") (:keywords "dired" "explorer"))]) + (dired-fdclone . [(20210226 532) nil "dired functions and settings to mimic FDclone" single ((:commit . "3ba369f5fc48a8fdf06d1c6ee1167b5a6eb7c1b3") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:keywords "unix" "directories" "dired") (:url . "https://github.com/knu/dired-fdclone.el"))]) + (dired-filetype-face . [(20180907 1339) nil "Set different faces for different filetypes in dired" single ((:commit . "7ade7f7e8c2d7518c65f3f0343a10c272da0f47e") (:authors ("纪秀峰 <jixiuf at gmail dot com>")) (:maintainer "纪秀峰 <jixiuf at gmail dot com>") (:keywords "dired" "filetype" "face") (:url . "https://github.com/jixiuf/dired-filetype-face"))]) + (dired-filter . [(20191105 1404) ((dash (2 10 0)) (dired-hacks-utils (0 0 1)) (f (0 17 0)) (cl-lib (0 3))) "Ibuffer-like filtering for dired" single ((:commit . "7c0ef09d57a80068a11edc74c3568e5ead5cc15a") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "files"))]) + (dired-git . [(20200527 732) ((emacs (26 1)) (async-await (1 0)) (async (1 9 4)) (all-the-icons (2 2 0)) (ppp (1 0 0))) "Git integration for dired" single ((:commit . "82c93bdb2fe392b122f79d2e425c632f1c69ede3") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "tools") (:url . "https://github.com/conao3/dired-git.el"))]) + (dired-hacks-utils . [(20201005 2318) ((dash (2 5 0))) "Utilities and helpers for dired-hacks collection" single ((:commit . "7c0ef09d57a80068a11edc74c3568e5ead5cc15a") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "files"))]) + (dired-hide-dotfiles . [(20210222 1919) ((emacs (25 1))) "Hide dotfiles in dired" single ((:commit . "6a379f23f64045f5950d229254ce6f32dbbf5364") (:authors ("Mattias Bengtsson" . "mattias.jc.bengtsson@gmail.com")) (:maintainer "Mattias Bengtsson" . "mattias.jc.bengtsson@gmail.com") (:keywords "files") (:url . "https://github.com/mattiasb/dired-hide-dotfiles"))]) + (dired-icon . [(20170223 526) ((emacs (24 3))) "A minor mode to display a list of associated icons in dired buffers." tar ((:commit . "f60e10757a5011235b519231ad35974ff25963ed") (:authors ("Hong Xu" . "hong@topbug.net")) (:maintainer "Hong Xu" . "hong@topbug.net") (:keywords "dired" "files") (:url . "https://gitlab.com/xuhdev/dired-icon"))]) + (dired-imenu . [(20140109 1610) nil "imenu binding for dired mode" single ((:commit . "610e21fe0988c85931d34894d3eee2442c79ab0a") (:authors ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainer "Damien Cassou" . "damien.cassou@gmail.com") (:keywords "dired" "imenu") (:url . "https://github.com/DamienCassou/dired-imenu"))]) + (dired-k . [(20200322 2035) ((emacs (24 3))) "Highlight dired by size, date, git status" tar ((:commit . "0ddf0adb3a642c2f0694d8c1c12f263f2bf27375") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com") (:url . "https://github.com/emacsorphanage/dired-k"))]) + (dired-launch . [(20210510 2137) nil "Use dired as a launcher" single ((:commit . "757c82e888d80e5746ccb8654ba58389fa7dc0eb") (:authors ("David Thompson")) (:maintainer "David Thompson") (:keywords "dired" "launch") (:url . "https://github.com/thomp/dired-launch"))]) + (dired-lsi . [(20200812 929) ((emacs (26 1))) "Add memo to directory and show it in dired" single ((:commit . "0f4038c8b47f6cfc70f82062800700c14c9912c2") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "convenience") (:url . "https://github.com/conao3/dired-lsi.el"))]) + (dired-narrow . [(20181114 1723) ((dash (2 7 0)) (dired-hacks-utils (0 0 1))) "Live-narrowing of search results for dired" single ((:commit . "7c0ef09d57a80068a11edc74c3568e5ead5cc15a") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "files"))]) + (dired-open . [(20180922 1113) ((dash (2 5 0)) (dired-hacks-utils (0 0 1))) "Open files from dired using using custom actions" single ((:commit . "7c0ef09d57a80068a11edc74c3568e5ead5cc15a") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "files"))]) + (dired-posframe . [(20200817 420) ((emacs (26 1)) (posframe (0 7))) "Peep dired items using posframe" single ((:commit . "1a21eb9ad956a0371dd3c9e1bec53407d685f705") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "convenience") (:url . "https://github.com/conao3/dired-posframe.el"))]) + (dired-quick-sort . [(20201221 403) ((hydra (0 13 0)) (emacs (24))) "Persistent quick sorting of dired buffers in various ways." single ((:commit . "69b06f306a5fc2b38e707bae3ff1e35db2b39b6b") (:authors ("Hong Xu" . "hong@topbug.net")) (:maintainer "Hong Xu" . "hong@topbug.net") (:keywords "convenience" "files") (:url . "https://gitlab.com/xuhdev/dired-quick-sort#dired-quick-sort"))]) + (dired-rainbow . [(20190722 1109) ((dash (2 5 0)) (dired-hacks-utils (0 0 1))) "Extended file highlighting according to its type" single ((:commit . "7c0ef09d57a80068a11edc74c3568e5ead5cc15a") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:keywords "files"))]) + (dired-ranger . [(20180401 2206) ((dash (2 7 0)) (dired-hacks-utils (0 0 1))) "Implementation of useful ranger features for dired" single ((:commit . "7c0ef09d57a80068a11edc74c3568e5ead5cc15a") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "files"))]) + (dired-recent . [(20201004 2201) ((emacs (24))) "Dired visited paths history" single ((:commit . "d62ace45cc72d49d77862ecf00f52d794ecc5677") (:authors ("Wojciech Siewierski <wojciech dot siewierski at onet dot pl>")) (:maintainer "Wojciech Siewierski <wojciech dot siewierski at onet dot pl>") (:keywords "files") (:url . "https://github.com/vifon/dired-recent.el"))]) + (dired-rifle . [(20210316 1452) nil "Call rifle(1) from dired" single ((:commit . "cc1af692bbac651f5e5111d9ab1c0805989d65e5") (:authors ("Wojciech Siewierski <wojciech dot siewierski at onet dot pl>")) (:maintainer "Wojciech Siewierski <wojciech dot siewierski at onet dot pl>") (:keywords "files" "convenience") (:url . "https://github.com/vifon/dired-rifle.el"))]) + (dired-rmjunk . [(20191007 1232) nil "A home directory cleanup utility for Dired." single ((:commit . "92af5fcc2bd0bc3826f4ce238a850e9a362533a4") (:authors ("Jakob L. Kreuze" . "zerodaysfordays@sdf.lonestar.org")) (:maintainer "Jakob L. Kreuze" . "zerodaysfordays@sdf.lonestar.org") (:keywords "files" "matching") (:url . "https://git.sr.ht/~jakob/dired-rmjunk"))]) + (dired-rsync . [(20201224 2214) ((s (1 12 0)) (dash (2 0 0)) (emacs (24))) "Allow rsync from dired buffers" tar ((:commit . "fb0f161ac3cce1b224f52547f5bc7e1dcd283191") (:authors ("Alex Bennée" . "alex@bennee.com")) (:maintainer "Alex Bennée" . "alex@bennee.com") (:url . "https://github.com/stsquad/dired-rsync"))]) + (dired-sidebar . [(20210608 2340) ((emacs (25 1)) (dired-subtree (0 0 1))) "Tree browser leveraging dired" single ((:commit . "6be2dad2782e28dae2f50c0cbfd82042b2b6ba8d") (:authors ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com") (:keywords "dired" "files" "tools") (:url . "https://github.com/jojojames/dired-sidebar"))]) + (dired-single . [(20200824 708) nil "Reuse the current dired buffer to visit a directory" single ((:commit . "98c2102429fcac6fbfdba9198c126eb1b3dcc4e5") (:authors ("Joe Casadonte" . "emacs@northbound-train.com")) (:maintainer "crocket" . "crockabiscuit@gmail.com") (:keywords "dired" "reuse" "buffer"))]) + (dired-subtree . [(20210105 1127) ((dash (2 5 0)) (dired-hacks-utils (0 0 1))) "Insert subdirectories in a tree-like fashion" single ((:commit . "7c0ef09d57a80068a11edc74c3568e5ead5cc15a") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "files"))]) + (dired-toggle . [(20190616 303) nil "Show dired as sidebar and will not create new buffers when changing dir" single ((:commit . "7fe5fe35c63d1b0da14d6d6d52bdf6b2a5410ba7") (:authors ("Xu FaSheng <fasheng[AT]fasheng.info>")) (:maintainer "Xu FaSheng") (:keywords "dired" "sidebar") (:url . "https://github.com/fasheng/dired-toggle"))]) + (dired-toggle-sudo . [(20200401 1353) nil "Browse directory with sudo privileges." single ((:commit . "13bbe52c54893f5aa3e56228450ffdd0c9e1d169") (:authors ("Sebastien Gross <seb•ɑƬ•chezwam•ɖɵʈ•org>")) (:maintainer "Sebastien Gross <seb•ɑƬ•chezwam•ɖɵʈ•org>") (:keywords "emacs" "dired"))]) + (dired-view-data . [(20210529 600) ((emacs (26 1)) (ess (18 10 1)) (ess-view-data (1 0))) "View data from dired via ESS and R" single ((:commit . "c865c34536d9c3140ce647f03c8b7498b46e935c") (:authors ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainer "Shuguang Sun" . "shuguang79@qq.com") (:keywords "tools") (:url . "https://github.com/ShuguangSun/dired-view-data"))]) + (diredc . [(20210609 1558) ((emacs (26 1)) (key-assist (1 0))) "Extensions for dired" single ((:commit . "e93c0caf0c0bd249628930ebf5b02e57fb8cb0f1") (:keywords "files") (:url . "https://github.com/Boruch-Baum/emacs-diredc"))]) + (diredfl . [(20191227 2028) ((emacs (24))) "Extra font lock rules for a more colourful dired" single ((:commit . "4ca32658aebaf2335f0368a0fd08f52eb1aee960") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "faces") (:url . "https://github.com/purcell/diredfl"))]) + (diredful . [(20160529 2017) nil "colorful file names in dired buffers" single ((:commit . "c08e163d9d6c62f7b07e94d54c96c2e364e67e0e") (:authors ("Thamer Mahmoud" . "thamer.mahmoud@gmail.com")) (:maintainer "Thamer Mahmoud" . "thamer.mahmoud@gmail.com") (:keywords "dired" "colors" "extension" "widget") (:url . "https://github.com/thamer/diredful"))]) + (direnv . [(20210419 1851) ((emacs (25 1)) (dash (2 12 0))) "Support for direnv" single ((:commit . "4b94393a9adf677c7c037215e233eef5fbca553d") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee") (:keywords "direnv" "environment" "processes" "unix" "tools") (:url . "https://github.com/wbolster/emacs-direnv"))]) + (direx . [(20170422 1327) nil "Simple Directory Explorer" tar ((:commit . "a79bfdb5980cf6ed7bfb3b41ddc471a7b6c0ede4") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainer "Tomohiro Matsuyama" . "m2ym.pub@gmail.com") (:keywords "convenience"))]) + (direx-grep . [(20140515 1506) ((direx (0 1 -3))) "Grep node of direx.el using incremental search like anything.el/helm.el" single ((:commit . "1109a512a80b2673a70b18b8568514049017faad") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "convenience") (:url . "https://github.com/aki2o/direx-grep"))]) + (dirtree . [(20140129 832) ((tree-mode (1 1 1 1)) (windata (0))) "Directory tree views" single ((:commit . "ba55f1e716e386fdd37cb8e7f48616e405dc7251") (:authors ("Ye Wenbin" . "wenbinye@gmail.com")) (:maintainer "Ye Wenbin" . "wenbinye@gmail.com"))]) + (dirtree-prosjekt . [(20140129 904) ((prosjekt (0 3)) (dirtree (0 1))) "dirtree integration for prosjekt." single ((:commit . "a864a8be5842223043702395f311e3350c28e9db") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/prosjekt"))]) + (disable-mouse . [(20210512 2114) ((emacs (24 1))) "Disable mouse commands globally" single ((:commit . "cae3be9dd012727b40ad3b511731191f79cebe42") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "mouse") (:url . "https://github.com/purcell/disable-mouse"))]) + (disaster . [(20171016 2152) nil "Disassemble C/C++ code under cursor in Emacs" single ((:commit . "10a785facc60d89d78e0d5177985ab1af1741bb4") (:authors ("Justine Tunney" . "jtunney@gmail.com")) (:maintainer "Justine Tunney" . "jtunney@gmail.com") (:keywords "tools") (:url . "https://github.com/jart/disaster"))]) + (discourse . [(20160911 819) ((cl-lib (0 5)) (request (0 2)) (s (1 11 0))) "discourse api" single ((:commit . "a86c7e608851e186fe12e892a573994f08c8e65e") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "lisp" "discourse") (:url . "https://github.com/lujun9972/discourse-api"))]) + (discover . [(20140103 2139) ((makey (0 3))) "discover more of Emacs" single ((:commit . "7b0044bbb3b3bd5d811fdfb0f5ac6ec8de1239df") (:authors ("Mickey Petersen" . "mickey@fyeah.org")) (:maintainer "Mickey Petersen" . "mickey@fyeah.org"))]) + (discover-clj-refactor . [(20150328 1459) ((clj-refactor (0 14 0)) (discover (0 3))) "Adds discover context menu for clj-refactor" single ((:commit . "3fbd5c1162739e606d7cf5d4f5d7426547d99647") (:authors ("Marian Schubert" . "marian.schubert@gmail.com")) (:maintainer "Marian Schubert" . "marian.schubert@gmail.com") (:keywords "clj-refactor" "discover" "convenience"))]) + (discover-js2-refactor . [(20140129 1552) ((js2-refactor (20131221 501)) (discover (20140103 1339))) "Adds discover context menu for js2-refactor" single ((:commit . "3812abf61f39f3e73a9f3daefa6fed4f21a429ba") (:authors ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainer "Nicolas Petton" . "petton.nicolas@gmail.com") (:keywords "js2-refactor" "discover"))]) + (discover-my-major . [(20180606 511) ((makey (0 2))) "Discover key bindings and their meaning for the current Emacs major mode" single ((:commit . "c592e5e67454f0d1b68669ac0c270073164b16b3") (:authors ("steckerhalter")) (:maintainer "steckerhalter") (:keywords "discover" "help" "major-mode" "keys") (:url . "https://framagit.org/steckerhalter/discover-my-major"))]) + (disk . [(20171116 731) nil "simplified find-file, revert-file, save-buffer interface" single ((:commit . "283e54e3be7d08f959076240b2ab324e25632137") (:authors ("Alex Schroeder" . "alex@gnu.org") ("Peter Barabas" . "peter.barabas+disk@gmail.com")) (:maintainer "Alex Schroeder" . "alex@gnu.org") (:keywords "convenience") (:url . "http://www.emacswiki.org/emacs/DiskKey"))]) + (dispass . [(20140202 1531) ((dash (1 0 0))) "Emacs wrapper for DisPass" single ((:commit . "b6e8f89040ebaaf0e7609b04bc27a8979f0ae861") (:authors ("Tom Willemsen" . "tom@ryuslash.org")) (:maintainer "Tom Willemsen" . "tom@ryuslash.org") (:keywords "processes") (:url . "http://projects.ryuslash.org/dispass.el/"))]) + (display-theme . [(20140115 1556) ((emacs (24))) "display current theme(s) at mode-line" single ((:commit . "b180b3be7a74ae4799a14e7e4bc2fe10e3ff7a15") (:authors ("KAWABATA, Taichi <kawabata.taichi_at_gmail.com>")) (:maintainer "KAWABATA, Taichi <kawabata.taichi_at_gmail.com>") (:keywords "tools") (:url . "https://github.com/kawabata/emacs-display-theme/"))]) + (dispwatch . [(20210305 342) ((emacs (24 4))) "Watch displays for configuration changes" single ((:commit . "03abbac89a9f625aaa1a808dd49ae4906f466421") (:authors ("Mitchell Perilstein" . "mitchell.perilstein@gmail.com")) (:maintainer "Mitchell Perilstein" . "mitchell.perilstein@gmail.com") (:keywords "frames") (:url . "https://github.com/mnp/dispwatch"))]) + (dist-file-mode . [(20180830 418) ((emacs (24)) (cl-lib (0 5)) (s (1 9 0))) "Dispatch major mode for *.dist files" single ((:commit . "e1ce8f592bc5d4d86d2f09e334728ac0d524c761") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "files" "convenience") (:url . "https://github.com/emacs-php/dist-file-mode.el"))]) + (distel-completion-lib . [(20180827 1344) nil "Completion library for Erlang/Distel" single ((:commit . "acc4c0a5521904203d797fe96b08e5fae4233c7e") (:authors ("Sebastian Weddmark Olsson")) (:maintainer "Sebastian Weddmark Olsson") (:keywords "erlang" "distel" "completion") (:url . "github.com/sebastiw/distel-completion"))]) + (distinguished-theme . [(20151216 2015) nil "A dark and elegant theme for emacs." single ((:commit . "9b1d25ac59465a5016d187ea84b7614c95a29b3b") (:authors ("Kim Silkebækken" . "kim.silkebaekken@gmail.com")) (:maintainer "Kim Silkebækken" . "kim.silkebaekken@gmail.com") (:url . "https://github.com/Lokaltog/distinguished-theme"))]) + (ditz-mode . [(20150729 940) nil "Emacs interface to Ditz issue tracking system" single ((:commit . "74b6b93b097d595a001c019e3b762abfc60f821a") (:authors ("Glenn Hutchings" . "zondo42@gmail.com")) (:maintainer "Glenn Hutchings" . "zondo42@gmail.com") (:keywords "tools"))]) + (dix . [(20210312 1850) ((cl-lib (0 5)) (emacs (26 2))) "Apertium XML editing minor mode" tar ((:commit . "17f33f9a8bb50156261e10c045d54eb866ea84fa") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org") (:keywords "languages") (:url . "http://wiki.apertium.org/wiki/Emacs"))]) + (dix-evil . [(20170105 1423) ((dix (0 3 0)) (evil (1 0 7))) "optional evil-integration with dix.el" single ((:commit . "17f33f9a8bb50156261e10c045d54eb866ea84fa") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org") (:keywords "languages") (:url . "http://wiki.apertium.org/wiki/Emacs"))]) + (dizzee . [(20171201 916) nil "A more pleasant way to manage your project's subprocesses in Emacs." tar ((:commit . "e3cf1c2ea5d0fc00747524b6f3c5b905d0a8c8e1") (:authors ("David Miller" . "david@deadpansincerity.com")) (:maintainer "David Miller" . "david@deadpansincerity.com") (:keywords "emacs" "processes") (:url . "https://github.com/davidmiller/dizzee"))]) + (django-commands . [(20191107 1830) ((emacs (25 1))) "Run django commands" single ((:commit . "bef7ca848d6d1721ebb22b181c50dcfbef16e434") (:authors ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainer "Andrii Kolomoiets" . "andreyk.mad@gmail.com") (:keywords "tools") (:url . "https://github.com/muffinmad/emacs-django-commands"))]) + (django-manage . [(20160819 212) ((hydra (0 13 2))) "Django minor mode for commanding manage.py" single ((:commit . "876fb2cb627d465adfdc905841279784bcdd7ee8") (:authors ("Daniel Gopar" . "gopardaniel@yahoo.com")) (:maintainer "Daniel Gopar" . "gopardaniel@yahoo.com") (:keywords "languages"))]) + (django-mode . [(20170522 714) ((projectile (0)) (s (0)) (helm-make (0))) "Major mode for Django web framework." tar ((:commit . "a71b8dd984e7f724b8321246e5c353a4ae5c986e") (:authors ("Greg V" . "floatboth@me.com")) (:maintainer "Greg V" . "floatboth@me.com") (:keywords "languages"))]) + (django-snippets . [(20131229 1611) ((yasnippet (0 8 0))) "Yasnippets for django" tar ((:commit . "a71b8dd984e7f724b8321246e5c353a4ae5c986e") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com") (:url . "https://github.com/myfreeweb/django-mode"))]) + (django-theme . [(20131022 902) nil "Custom face theme for Emacs" single ((:commit . "86c8142b3eb1addd94a43aa6f1d98dab06401af0") (:authors ("Andrzej Sliwa")) (:maintainer "Andrzej Sliwa") (:url . "http://github/anrzejsliwa/django-theme"))]) + (djangonaut . [(20200503 921) ((emacs (25 2)) (magit-popup (2 6 0)) (pythonic (0 1 0)) (f (0 20 0)) (s (1 12 0))) "Minor mode to interact with Django projects" single ((:commit . "75f642114e3997308a1e7e67c3025738cecee0fe") (:authors ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainer "Artem Malyshev" . "proofit404@gmail.com") (:url . "https://github.com/proofit404/djangonaut"))]) + (djinni-mode . [(20190303 139) ((emacs (24 4))) "Major-mode for editing Djinni files." single ((:commit . "6f84bc60d078725cc8b922a259ec5f4c7de83681") (:authors ("Daniel Martín" . "mardani29@yahoo.es")) (:maintainer "Daniel Martín" . "mardani29@yahoo.es") (:keywords "languages") (:url . "https://github.com/danielmartin/djinni-mode"))]) + (dkdo . [(20131110 1119) ((dkmisc (0 50)) (emacs (24 1))) "Do List major mode based on org-mode." tar ((:commit . "fd6bb105e8331fafb6385c5238c988c4c5bbe2da") (:authors ("David Keegan" . "dksw@eircom.net")) (:maintainer "David Keegan" . "dksw@eircom.net") (:keywords "dolist" "task" "productivity") (:url . "https://github.com/davidkeegan/dkdo"))]) + (dkl . [(20161005 7) nil "Display keyboard layout." tar ((:commit . "6b4584f86037bda3383960c678d51f340229fb91") (:authors ("Alexis" . "flexibeast@gmail.com")) (:maintainer "Alexis" . "flexibeast@gmail.com") (:keywords "input" "keyboard" "layout") (:url . "https://github.com/flexibeast/dkl"))]) + (dklrt . [(20131110 1341) ((dkmisc (0 50)) (ledger-mode (20130908 1357)) (emacs (24 1))) "Ledger Recurring Transactions." tar ((:commit . "5d6c99f8018335256ab934b4c1049708ae2d48ba") (:authors ("David Keegan" . "dksw@eircom.net")) (:maintainer "David Keegan" . "dksw@eircom.net") (:keywords "ledger" "ledger-cli" "recurring" "periodic" "automatic") (:url . "https://github.com/davidkeegan/dklrt"))]) + (dkmisc . [(20131110 1115) ((emacs (24 1))) "Miscellaneous functions required by dk* packages." tar ((:commit . "fe3d49c6f8322b6f89466361acd97585bdfe0608") (:authors ("David Keegan" . "dksw@eircom.net")) (:maintainer "David Keegan" . "dksw@eircom.net") (:keywords "utility" "time" "date" "file") (:url . "https://github.com/davidkeegan/dkmisc"))]) + (dmacro . [(20200803 633) ((emacs (24 1)) (cl-lib (0 6))) "Repeated detection and execution of key operation" single ((:commit . "3480b97aaad9e65fa03c6a9d1a0a8111be1179f8") (:authors ("Toshiyuki Masui" . "masui@ptiecan.com") ("Makoto Owada") ("Eiji Obata") ("Nobuyuki Mine")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "convenience") (:url . "https://github.com/emacs-jp/dmacro"))]) + (dmenu . [(20190908 44) ((cl-lib (0 5))) "simulate the dmenu command line program" single ((:commit . "e8cc9b27c79d3ecc252267c082ab8e9c82eab264") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "convenience" "usability"))]) + (dna-mode . [(20191001 2108) nil "a major mode for editing dna sequences" tar ((:commit . "7a48393fcf0015eed2368fcb89b3091c9d029dc4") (:authors ("Harley Gorrell" . "harley@panix.com")) (:maintainer "Harley Gorrell" . "harley@panix.com") (:keywords "dna" "emacs" "editing") (:url . "http://www.mahalito.net/~harley/elisp/dna-mode.el"))]) + (docbook-snippets . [(20150714 1625) ((yasnippet (0 8 0))) "Yasnippets for DocBook" tar ((:commit . "b06297fdec039a541aaa6312cb328a11062cfab4") (:authors ("Jaromir Hradilek" . "jhradilek@gmail.com")) (:maintainer "Jaromir Hradilek" . "jhradilek@gmail.com") (:keywords "snippets" "docbook") (:url . "https://github.com/jhradilek/emacs-docbook-snippets"))]) + (docean . [(20180605 1744) ((emacs (24)) (cl-lib (0 5)) (request (0 2 0))) "Interact with DigitalOcean from Emacs." single ((:commit . "bbe2298fd21f7876fc2d5c52a69b931ff59df979") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:keywords "convenience") (:url . "https://github.com/emacs-pe/docean.el"))]) + (docker . [(20210516 1958) ((dash (2 14 1)) (docker-tramp (0 1)) (emacs (24 5)) (json-mode (1 7 0)) (s (1 12 0)) (tablist (0 70)) (transient (0 2 0))) "Emacs interface to Docker" tar ((:commit . "bc2dc09edea167d4fdf022aa263bad71932bb0c4") (:authors ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainer "Philippe Vaucher" . "philippe.vaucher@gmail.com") (:keywords "filename" "convenience") (:url . "https://github.com/Silex/docker.el"))]) + (docker-api . [(20160525 720) ((dash (2 12 1)) (request (0 2 0)) (s (1 11 0))) "Emacs interface to the Docker API" tar ((:commit . "206144346b7fa4165223349cfeb64a75d47ddd1b") (:authors ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainer "Philippe Vaucher" . "philippe.vaucher@gmail.com") (:url . "https://github.com/Silex/docker-api.el"))]) + (docker-cli . [(20190524 1624) nil "Running various commands in docker containers" single ((:commit . "c4b02894466d8642ad3d49df4c4a80e023a672aa") (:authors ("Boško Ivanišević" . "bosko.ivanisevic@gmail.com")) (:maintainer "Boško Ivanišević" . "bosko.ivanisevic@gmail.com") (:keywords "processes") (:url . "https://github.com/bosko/docker-cli"))]) + (docker-compose-mode . [(20200830 1336) ((emacs (24 3)) (dash (2 12 0)) (yaml-mode (0 0 12))) "Major mode for editing docker-compose files" single ((:commit . "abaa4f3aeb5c62d7d16e186dd7d77f4e846e126a") (:authors ("Ricardo Martins")) (:maintainer "Ricardo Martins") (:keywords "convenience") (:url . "https://github.com/meqif/docker-compose-mode"))]) + (docker-tramp . [(20210526 748) ((emacs (24)) (cl-lib (0 5))) "TRAMP integration for docker containers" tar ((:commit . "aaee11cedf7b4c31700f24a1fd88dcef9c2a7c3d") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:keywords "docker" "convenience") (:url . "https://github.com/emacs-pe/docker-tramp.el"))]) + (dockerfile-mode . [(20210404 2224) ((emacs (24))) "Major mode for editing Docker's Dockerfiles" single ((:commit . "ad06a41259ff2961d603bf23a3a8fbd22dde2161") (:url . "https://github.com/spotify/dockerfile-mode"))]) + (docopt . [(20201211 1008) ((emacs (26 3)) (dash (2 17 0)) (emacs (26 1)) (f (0 20 0)) (parsec (0 1 3)) (s (1 12 0)) (transient (0 3 0))) "A Docopt implementation in Elisp" tar ((:commit . "6e1105347decbf9b4b848d952858455f9b145c56") (:authors ("r0man" . "roman@burningswell.com")) (:maintainer "r0man" . "roman@burningswell.com") (:keywords "docopt" "tools" "processes") (:url . "https://github.com/r0man/docopt.el"))]) + (docstr . [(20210417 1315) ((emacs (24 4)) (s (1 9 0))) "A document string minor mode" tar ((:commit . "f6dcb378bb69c23d58978d5bc1e37c4ae160d278") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/docstr"))]) + (doct . [(20210329 2337) ((emacs (25 1))) "DOCT: Declarative Org capture templates" single ((:commit . "67fc46c8a68989b932bce879fbaa62c6a2456a1f") (:authors ("Nicholas Vollmer" . "progfolio@protonmail.com")) (:maintainer "Nicholas Vollmer" . "progfolio@protonmail.com") (:keywords "org" "convenience") (:url . "https://github.com/progfolio/doct"))]) + (dokuwiki . [(20180102 59) ((emacs (24 3)) (xml-rpc (1 6 8))) "Edit Remote DokuWiki Pages Using XML-RPC" single ((:commit . "594c4d4904dcc2796bbbd2c0845d9e7c09ccf6f7") (:authors ("Juan Karlo Licudine" . "accidentalrebel@gmail.com")) (:maintainer "Juan Karlo Licudine" . "accidentalrebel@gmail.com") (:keywords "convenience") (:url . "http://www.github.com/accidentalrebel/emacs-dokuwiki"))]) + (dokuwiki-mode . [(20170223 1301) nil "Major mode for DokuWiki document" single ((:commit . "e4e116f6fcc373e3f5937c1a7daa5c2c9c6d3fa1") (:authors ("Tsunenobu Kai" . "kai2nenobu@gmail.com")) (:maintainer "Tsunenobu Kai" . "kai2nenobu@gmail.com") (:keywords "hypermedia" "text" "dokuwiki") (:url . "https://github.com/kai2nenobu/emacs-dokuwiki-mode"))]) + (dollaro . [(20151123 1302) ((s (1 6 0))) "simple text templates" single ((:commit . "500127f0172ac7a1eec627e026b59136580a74ac") (:authors ("Alessandro Piras" . "laynor@gmail.com")) (:maintainer "Alessandro Piras" . "laynor@gmail.com") (:keywords "tools" "convenience"))]) + (doneburn-theme . [(20181110 1857) nil "A light theme based on Bozhidar Batsov's Zenburn" single ((:commit . "da4fa915a2a659001eea04498d790cdd8cac1fce") (:authors ("Manuel Uberti" . "manuel.uberti@inventati.org")) (:maintainer "Manuel Uberti" . "manuel.uberti@inventati.org") (:keywords "faces" "themes") (:url . "http://github.com/manuel-uberti/doneburn-emacs"))]) + (doom . [(20180301 2308) ((cl-lib (0 5))) "DOM implementation and manipulation library" single ((:commit . "e59040aefc92dd9b3134eb623624307fb9e4327b") (:authors ("Alex Schroeder" . "alex@gnu.org") ("Henrik.Motakef" . "elisp@henrik-motakef.de") ("Katherine Whitlock" . "toroidal-code@gmail.com") ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Alex Schroeder") (:keywords "xml" "dom") (:url . "http://www.github.com/kensanata/doom.el/"))]) + (doom-modeline . [(20210608 516) ((emacs (25 1)) (all-the-icons (2 2 0)) (shrink-path (0 2 0)) (dash (2 11 0))) "A minimal and modern mode-line" tar ((:commit . "d514f43679513819b37333a64a44523f239150b6") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Vincent Zhang" . "seagle0128@gmail.com") (:keywords "faces" "mode-line") (:url . "https://github.com/seagle0128/doom-modeline"))]) + (doom-modeline-now-playing . [(20210202 1948) ((emacs (24 4)) (doom-modeline (3 0 0)) (async (1 9 3))) "Segment for Doom Modeline to show playerctl information" single ((:commit . "bed9e4da626ede148c7d362188b2e7729e2a8a4f") (:authors ("Ellis Kenyő" . "me@elken.dev")) (:maintainer "Ellis Kenyő" . "me@elken.dev") (:url . "https://github.com/elken/doom-modeline-now-playing"))]) + (doom-themes . [(20210604 1922) ((emacs (25 1)) (cl-lib (0 5))) "an opinionated pack of modern color-themes" tar ((:commit . "b2c0ea0f0778a6ea85b87e1b87916572e98e1fe7") (:authors ("Henrik Lissner <https://github.com/hlissner>")) (:maintainer "Henrik Lissner" . "henrik@lissner.net") (:keywords "custom themes" "faces") (:url . "https://github.com/hlissner/emacs-doom-themes"))]) + (dot-mode . [(20180312 2300) ((emacs (24 3))) "minor mode to repeat typing or commands" single ((:commit . "6ca22b73bcdae2363ee9641b822a60685df16a3e") (:authors ("Robert Wyrick" . "rob@wyrick.org")) (:maintainer "Robert Wyrick" . "rob@wyrick.org") (:keywords "convenience") (:url . "https://github.com/wyrickre/dot-mode"))]) + (dotenv-mode . [(20191027 2129) ((emacs (24 3))) "Major mode for .env files" single ((:commit . "e3701bf739bde44f6484eb7753deadaf691b73fb") (:authors ("Preetpal S. Sohal")) (:maintainer "Preetpal S. Sohal") (:url . "https://github.com/preetpalS/emacs-dotenv-mode"))]) + (dotnet . [(20200803 1032) nil "Interact with dotnet CLI tool" single ((:commit . "83ba1305d7895b03f3dffb2d3458b7ec75e6909f") (:authors ("Julien BLANCHARD" . "julien@sideburns.eu")) (:maintainer "Julien BLANCHARD" . "julien@sideburns.eu") (:keywords ".net" "tools") (:url . "https://github.com/julienXX/dotnet.el"))]) + (double-saber . [(20190325 1917) ((emacs (24 4))) "Narrow and delete in search buffers." single ((:commit . "93d9b1ec833a871bde2fd0f78abc269872808048") (:authors ("Daniel Ting" . "deep.paren.12@gmail.com")) (:maintainer "Daniel Ting" . "deep.paren.12@gmail.com") (:keywords "double-saber" "narrow" "delete" "sort" "tools" "convenience" "matching") (:url . "https://github.com/dp12/double-saber.git"))]) + (download-region . [(20210306 415) ((cl-lib (0 3))) "Simple in-buffer download manager" single ((:commit . "e0a721858a22896fa1d7f1d5689dd0878dbc58fa") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://zk-phi.github.io/"))]) + (downplay-mode . [(20151125 2009) nil "focus attention on a region of the buffer" single ((:commit . "4a2c3addc73c8ca3816345c3c11c08af265baedb") (:authors ("Toby Crawley" . "toby@tcrawley.org")) (:maintainer "Toby Crawley" . "toby@tcrawley.org") (:url . "https://github.com/tobias/downplay-mode/"))]) + (doxy-graph-mode . [(20210604 723) ((emacs (26 3))) "Links source code editing with doxygen call graphs" single ((:commit . "88af6ef4bc9c8918b66c7774f0a115b2addc310e") (:authors ("Gustavo Puche" . "gustavo.puche@gmail.com")) (:maintainer "Gustavo Puche" . "gustavo.puche@gmail.com") (:keywords "languages" "all") (:url . "https://github.com/gustavopuche/doxy-graph-mode"))]) + (dpaste . [(20160303 2112) nil "Emacs integration for dpaste.com" single ((:commit . "5ebabb466a6ae70882549855b6b2194fc32189f8") (:authors ("Greg Newman" . "greg@gregnewman.org") ("Guilherme Gondim" . "semente@taurinus.org")) (:maintainer "Greg Newman" . "greg@gregnewman.org") (:keywords "paste" "pastie" "pastebin" "dpaste" "python"))]) + (dpaste_de . [(20131015 1225) ((web (0 3 7))) "Emacs mode to paste to dpaste.de" single ((:commit . "f0c39e8864299f735642f7d9fa490689398ce39d") (:authors ("Thejaswi Puthraya" . "thejaswi.puthraya@gmail.com")) (:maintainer "Thejaswi Puthraya" . "thejaswi.puthraya@gmail.com") (:keywords "pastebin"))]) + (dpkg-dev-el . [(20190824 2314) ((debian-el (37))) "Emacs modes for debian packaging" tar ((:commit . "0f2a8257788a2f99e87326e52402f69e3f534903") (:authors ("Peter S Galbraith" . "psg@debian.org")) (:maintainer "Peter S Galbraith" . "psg@debian.org"))]) + (dr-racket-like-unicode . [(20200513 1642) ((emacs (24 1))) "DrRacket-style unicode input" single ((:commit . "70bc1caea6b277e49e1cb29e1926a7b0c83c5ebc") (:authors ("David Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Christiansen" . "david@davidchristiansen.dk") (:keywords "i18n" "tools"))]) + (dracula-theme . [(20210518 657) ((emacs (24 3))) "Dracula Theme" tar ((:commit . "aa72f3d5c4d49cc0fb581d2f4eac528cf0278a11") (:authors ("film42")) (:maintainer "film42") (:url . "https://github.com/dracula/emacs"))]) + (draft-mode . [(20140609 1456) nil "Rough drafting for Emacs." single ((:commit . "4779fb32daf53746459da2def7e08004492d4f18") (:authors ("Eeli Reilin" . "gaudecker@fea.st")) (:maintainer "Eeli Reilin" . "gaudecker@fea.st") (:keywords "draft" "drafting") (:url . "https://github.com/gaudecker/draft-mode"))]) + (drag-stuff . [(20161108 749) nil "Drag stuff (lines, words, region, etc...) around" tar ((:commit . "6d06d846cd37c052d79acd0f372c13006aa7e7c8") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "speed" "convenience") (:url . "http://github.com/rejeep/drag-stuff"))]) + (drawille . [(20160418 1838) ((cl-lib (0 5))) "Drawille implementation in elisp" tar ((:commit . "d914845725719d8293e2f0dea3c9c7e0a1e0e62a") (:authors ("Josuah Demangeon" . "josuah.demangeon@gmail.com")) (:maintainer "Josuah Demangeon" . "josuah.demangeon@gmail.com") (:keywords "graphics") (:url . "https://github.com/sshbio/elisp-drawille"))]) + (dream-theme . [(20210419 605) ((emacs (26 1))) "Maximalist Nordic/Zenburn-inspired color theme" single ((:commit . "0c27f05544b90e41338f79ea923044b358a323c6") (:authors ("Dirk-Jan C. Binnema" . "djcb@djcbsoftware.nl")) (:maintainer "Dirk-Jan C. Binnema" . "djcb@djcbsoftware.nl") (:keywords "faces" "theme") (:url . "https://github.com/djcb/dream-theme"))]) + (drill-instructor-AZIK-force . [(20151123 514) ((popup (0 5))) "Support AZIK input" tar ((:commit . "008cea202dc31d7d6fb1e7d8e6334d516403b7a5") (:authors ("Yuhei Maeda <yuhei.maeda_at_gmail.com>")) (:maintainer "Yuhei Maeda") (:keywords "convenience") (:url . "https://github.com/myuhe/drill-instructor-AZIK-force.el"))]) + (drone . [(20161106 918) nil "Launch your drone test suite if drone.yml is present" single ((:commit . "1d4ee037ad3208847a4235426edf0c4a3e7b1899") (:authors ("Oliver Marks" . "oly@digitaloctave.com")) (:maintainer "Oliver Marks" . "oly@digitaloctave.com") (:keywords "drone" "tests" "ci") (:url . "https://github.com/olymk2/emacs-drone"))]) + (dropbox . [(20190918 1629) ((request (0 3 0)) (json (1 2)) (oauth (1 0 3))) "Emacs backend for dropbox" single ((:commit . "5e0c954a6b819fd3a22b463cce3825984f9ef691") (:authors ("Pavel Panchekha" . "me@pavpanchekha.com")) (:maintainer "Pavel Panchekha" . "me@pavpanchekha.com") (:keywords "dropbox"))]) + (drupal-mode . [(20200210 2222) ((php-mode (1 5 0))) "Advanced minor mode for Drupal development" tar ((:commit . "4f3cffa76d8359449bf0e960f884320130f24b85") (:authors ("Arne Jørgensen" . "arne@arnested.dk")) (:maintainer "Arne Jørgensen" . "arne@arnested.dk") (:keywords "programming" "php" "drupal") (:url . "https://github.com/arnested/drupal-mode"))]) + (drupal-spell . [(20130520 1655) nil "Aspell extra dictionary for Drupal" tar ((:commit . "4087c28c89a884ee050961c57166e6b09085f59d") (:authors ("Arne Jørgensen" . "arne@arnested.dk")) (:maintainer "Arne Jørgensen" . "arne@arnested.dk") (:keywords "wp") (:url . "https://github.com/arnested/drupal-spell"))]) + (dsvn . [(20190316 2201) nil "Subversion interface" single ((:commit . "c37d2412ba92aad647bcf5aeb151e620e8069f8d") (:authors ("David Kågedal" . "davidk@lysator.liu.se") (" Mattias Engdegård" . "mattiase@acm.org")) (:maintainer "Mattias Engdegård" . "mattiase@acm.org") (:keywords "docs"))]) + (dtb-mode . [(20210105 1132) ((emacs (25))) "Show device tree souce in dtbs" single ((:commit . "7f66de945a0be2be5a26b4619cae097288fb55cd") (:authors ("Schspa Shi" . "schspa@gmail.com")) (:maintainer "Schspa Shi" . "schspa@gmail.com") (:keywords "dtb" "dts" "convenience") (:url . "https://github.com/schspa/dtb-mode"))]) + (dtk . [(20210227 2121) ((emacs (24 4)) (cl-lib (0 6 1)) (dash (2 12 0)) (seq (1 9)) (s (1 9))) "access SWORD content via diatheke" single ((:commit . "2a2a635e2b1d8243a41df0450e45fc8c75c6674b") (:authors ("David Thompson")) (:maintainer "David Thompson") (:keywords "hypermedia") (:url . "https://github.com/dtk01/dtk.el"))]) + (dtrace-script-mode . [(20150214 623) nil "DTrace code editing commands for Emacs" single ((:commit . "801af1ef16075d31a19830ebb8404bbf3a322f10"))]) + (dtrt-indent . [(20210423 745) nil "Adapt to foreign indentation offsets" tar ((:commit . "9714f2c5f1c9b7c21e732df8c15a870a88caba84") (:authors ("Julian Scheid" . "julians37@googlemail.com")) (:maintainer "Reuben Thomas" . "rrt@sc3d.org") (:keywords "convenience" "files" "languages" "c"))]) + (dts-mode . [(20161103 1223) nil "Major mode for Devicetree source code" single ((:commit . "9ee0854446dcc6c53d2b8d2941051768dba50344") (:authors ("Ben Gamari" . "ben@smart-cactus.org")) (:maintainer "Ben Gamari" . "ben@smart-cactus.org") (:keywords "languages"))]) + (ducpel . [(20140702 1154) ((cl-lib (0 5))) "Logic game with sokoban elements" tar ((:commit . "b53b935ab95c02b82ccf38f63c89e39e99477a55") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "games") (:url . "https://github.com/alezost/ducpel"))]) + (dumb-diff . [(20171211 2122) ((emacs (24 3))) "fast arbitrary diffs" single ((:commit . "1a2331d283049b71a07c1b06b1e0627a950d55f4") (:authors ("jack angers")) (:maintainer "jack angers") (:keywords "programming" "diff"))]) + (dumb-jump . [(20210303 1714) ((emacs (24 3)) (s (1 11 0)) (dash (2 9 0)) (popup (0 5 3))) "Jump to definition for 50+ languages without configuration" single ((:commit . "8f70acbe164553b225476fed55019ecddcf0bbd6") (:authors ("jack angers and contributors")) (:maintainer "jack angers and contributors") (:keywords "programming") (:url . "https://github.com/jacktasia/dumb-jump"))]) + (dummyparens . [(20141009 1024) nil "parenthesis auto-pairing and wrapping" single ((:commit . "9798ef1d0eaa24e4fe66f8aa6022a8c62714cc89") (:authors ("Sergei Nosov <sergei.nosov [at] gmail.com>")) (:maintainer "Sergei Nosov <sergei.nosov [at] gmail.com>") (:keywords "dummyparens" "auto-pair" "wrapping") (:url . "https://github.com/snosov1/dummyparens"))]) + (dune . [(20210213 757) nil "Integration with the dune build system" tar ((:commit . "2a40bc927ba42794b4780d576ce0868f7bdbce2f") (:url . "https://github.com/ocaml/dune"))]) + (dune-format . [(20210505 108) ((reformatter (0 6)) (emacs (24 1))) "Reformat OCaml's dune files automatically" single ((:commit . "eda7a16ae378e7c482c11228c43ef32b893a1520") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "languages") (:url . "https://github.com/purcell/emacs-dune-format"))]) + (duplicate-thing . [(20181031 1500) nil "Duplicate current line & selection" single ((:commit . "9d8fd05e3e5caa35d3f2a0c0032c92f0c0908e21") (:authors ("ongaeshi")) (:maintainer "ongaeshi") (:keywords "convenience" "command" "duplicate" "line" "selection") (:url . "https://github.com/ongaeshi/duplicate-thing"))]) + (dut-mode . [(20170729 2111) ((emacs (24))) "Major mode for the Dut programming language" single ((:commit . "9235c7acaa6690942e9de8b7acd1e4be0c859dc1") (:authors ("The dut-mode Authors")) (:maintainer "The dut-mode Authors") (:keywords "languages" "gut") (:url . "https://github.com/dut-lang/dut-mode"))]) + (dw . [(20210331 2246) ((emacs (25 1))) "Diceware passphrase generation commands" single ((:commit . "61c5718ba64ace4c9e29de18aa2690ecc3f0f258") (:authors ("D. Williams" . "d.williams@posteo.net")) (:maintainer "D. Williams" . "d.williams@posteo.net") (:keywords "convenience" "games") (:url . "https://github.com/integral-dw/dw-passphrase-generator"))]) + (dyalog-mode . [(20210413 810) ((cl-lib (0 2)) (emacs (24 3))) "Major mode for editing Dyalog APL source code" tar ((:commit . "697a84194766708d2607e8ba48a552e383c6523e") (:authors ("Joakim Hårsman" . "joakim.harsman@gmail.com")) (:maintainer "Joakim Hårsman" . "joakim.harsman@gmail.com") (:keywords "languages") (:url . "https://github.com/harsman/dyalog-mode.git"))]) + (dylan . [(20210329 604) ((emacs (25 1))) "Dylan editing modes" tar ((:commit . "040c8ebc884305fd4ff980d21c68946fa74b095a") (:url . "https://opendylan.org/"))]) + (dynamic-fonts . [(20140731 1226) ((font-utils (0 7 0)) (persistent-soft (0 8 8)) (pcache (0 2 3))) "Set faces based on available fonts" single ((:commit . "ab0c65accbdb59acaed5b263327e22ec019b3e82") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "faces" "frames") (:url . "http://github.com/rolandwalker/dynamic-fonts"))]) + (dynamic-graphs . [(20210430 352) ((emacs (26 1))) "Manipulation with graphviz graphs" single ((:commit . "f7239e381de56af5d6ff8e0d6ab31a78d3e3da58") (:authors ("Tomas Zellerin" . "tomas@zellerin.cz")) (:maintainer "Tomas Zellerin" . "tomas@zellerin.cz") (:keywords "tools") (:url . "https://github.com/zellerin/dynamic-graphs"))]) + (dynamic-ruler . [(20160602 808) nil "Displays a dynamic ruler at point." single ((:commit . "c9c0de6fe5721f06b50e01d9b4684b519c71b367") (:authors ("Francesc Rocher" . "francesc.rocher@gmail.com")) (:maintainer "Francesc Rocher" . "francesc.rocher@gmail.com") (:keywords "ruler" "tools" "convenience") (:url . "http://rocher.github.io/dynamic-ruler"))]) + (dynamic-spaces . [(20171027 1851) nil "When editing, don't move text separated by spaces" single ((:commit . "97ae8480c257ba573ca3d06dbf602f9b23c41d38") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "convenience") (:url . "https://github.com/Lindydancer/dynamic-spaces"))]) + (dynaring . [(20210603 2331) ((emacs (25 1))) "A dynamically sized ring structure" single ((:commit . "d3cc361b70b5dc4542624ced9c326523939ca021") (:authors ("Mike Mattie" . "codermattie@gmail.com") ("Sid Kasivajhula" . "sid@countvajhula.com")) (:maintainer "Sid Kasivajhula" . "sid@countvajhula.com") (:url . "https://github.com/countvajhula/dynaring"))]) + (dyncloze . [(20210405 212) ((emacs (25 1)) (dash (2 18))) "Language alternatives self-testing" single ((:commit . "38aac1a38017a707b4c539a7932cc8f6cd8f1a77") (:authors ("Andrew Hyatt" . "ahyatt@gmail.com")) (:maintainer "Andrew Hyatt" . "ahyatt@gmail.com") (:url . "https://github.com/ahyatt/dyncloze"))]) + (e2ansi . [(20190517 1902) ((face-explorer (0 0 4))) "Syntax highlighting support for `less', powered by Emacs." tar ((:commit . "6e1bb4e4e27885d1786db08b091cfa13b184fb54") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "faces" "languages") (:url . "https://github.com/Lindydancer/e2ansi"))]) + (e2wm . [(20170215 36) ((window-layout (1 4))) "simple window manager for emacs" tar ((:commit . "4353d3394c77a49f8f0291c239858c8c5e877549") (:authors ("SAKURAI Masashi <m.sakurai atmark kiwanami.net>")) (:maintainer "SAKURAI Masashi <m.sakurai atmark kiwanami.net>") (:keywords "tools" "window manager"))]) + (e2wm-R . [(20151230 926) ((e2wm (1 3)) (inlineR (1 0)) (ess (15 3))) "some e2wm plugin and perspective for GNU R" single ((:commit . "4350601ee1a96bf89777b3f09f1b79b88e2e6e4d") (:authors ("myuhe <yuhei.maeda_at_gmail.com>")) (:maintainer "myuhe") (:keywords "convenience" "e2wm") (:url . "https://github.com/myuhe/e2wm-R.el"))]) + (e2wm-bookmark . [(20151123 521) ((e2wm (1 2))) "Bookmark plugin for e2wm.el" single ((:commit . "bad816b6d8049984d69bcd277b7d325fb84d55eb") (:authors ("Yuhei Maeda <yuhei.maeda_at_gmail.com>")) (:maintainer "Yuhei Maeda <yuhei.maeda_at_gmail.com>") (:keywords "convenience"))]) + (e2wm-direx . [(20200805 1414) ((e2wm (1 2)) (direx (0 1 -3))) "Plugin of e2wm.el for direx.el" single ((:commit . "5672bc44d8e5cea6bc3b84c3b58e522050ffae0e") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "tools" "window manager" "convenience") (:url . "https://github.com/aki2o/e2wm-direx"))]) + (e2wm-pkgex4pl . [(20140525 1047) ((e2wm (1 2)) (plsense-direx (0 2 0))) "Plugin of e2wm.el for package explorer of Perl" single ((:commit . "7ea994450727190c4f3cb46cb429ba41b692ecc0") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "tools" "window manager" "perl") (:url . "https://github.com/aki2o/e2wm-pkgex4pl"))]) + (e2wm-svg-clock . [(20150106 1306) ((e2wm (20130225 1602)) (svg-clock (0 4))) "e2wm plugin for svg-clock" single ((:commit . "d425925e3afffcbe2ff74edc80b714e4319d4c94") (:authors ("Yuhei Maeda <yuhei.maeda_at_gmail.com>")) (:maintainer "Yuhei Maeda") (:keywords "convenience" "e2wm") (:url . "https://github.com/myuhe/e2wm-svg-clock.el"))]) + (e2wm-sww . [(20200805 1339) ((e2wm (1 2))) "Plugin of e2wm.el to switch plugin quickly" single ((:commit . "8926d0c70be05c7b4ef821e22e411e8813973687") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "tools" "window manager") (:url . "https://github.com/aki2o/e2wm-sww"))]) + (e2wm-term . [(20200322 729) ((e2wm (1 2)) (log4e (0 2 0)) (yaxception (0 3 2))) "Perspective of e2wm.el for work in terminal" single ((:commit . "74362d6271e736272df32ea807c5a22e4df54a50") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "tools" "window manager") (:url . "https://github.com/aki2o/e2wm-term"))]) + (eacl . [(20201112 820) ((emacs (24 4))) "Auto-complete lines by grepping project" single ((:commit . "5f3cfac22a7e2508be47079860ab573f397c3cfa") (:authors ("Chen Bin <chenbin DOT sh AT gmail DOT com>")) (:maintainer "Chen Bin <chenbin DOT sh AT gmail DOT com>") (:keywords "abbrev" "convenience" "matching") (:url . "http://github.com/redguardtoo/eacl"))]) + (easy-after-load . [(20170817 1231) nil "eval-after-load for all files in a directory" single ((:commit . "29e20145da49ac9ea40463c552130777408040de") (:authors ("Kyle Hargraves")) (:maintainer "Kyle Hargraves") (:url . "https://github.com/pd/easy-after-load"))]) + (easy-escape . [(20161209 1544) nil "Improve readability of escape characters in regular expressions" single ((:commit . "a6449f22cb97160ee1c90121968de89e193268df") (:authors ("Clément Pit--Claudel" . "clement.pitclaudel@live.com")) (:maintainer "Clément Pit--Claudel" . "clement.pitclaudel@live.com") (:keywords "convenience" "lisp" "tools") (:url . "https://github.com/cpitclaudel/easy-escape"))]) + (easy-hugo . [(20210303 2352) ((emacs (25 1)) (popup (0 5 3)) (request (0 3 0))) "Write blogs made with hugo by markdown or org-mode" single ((:commit . "b3c9ca2a4e1d90013a7d990056d56cdf2bdf8e40") (:authors ("Masashi Miyaura")) (:maintainer "Masashi Miyaura") (:url . "https://github.com/masasam/emacs-easy-hugo"))]) + (easy-jekyll . [(20201205 1918) ((emacs (25 1)) (request (0 3 0))) "Major mode managing jekyll blogs" single ((:commit . "b79176c6c4a8d5914e2c6e2bb53f61633ff5e023") (:authors ("Masashi Miyaura")) (:maintainer "Masashi Miyaura") (:url . "https://github.com/masasam/emacs-easy-jekyll"))]) + (easy-kill . [(20181114 2330) ((emacs (24)) (cl-lib (0 5))) "kill & mark things easily" single ((:commit . "2a6309d98aa6b71df6bbbcdf15cab3187c521a6b") (:authors ("Leo Liu" . "sdl.web@gmail.com")) (:maintainer "Leo Liu" . "sdl.web@gmail.com") (:keywords "killing" "convenience") (:url . "https://github.com/leoliu/easy-kill"))]) + (easy-kill-extras . [(20210529 945) ((easy-kill (0 9 4))) "Extra functions for easy-kill." tar ((:commit . "74e9d0fcafc38d5f24e6209671a552bc1ba5a867") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:keywords "killing" "convenience") (:url . "https://github.com/knu/easy-kill-extras.el"))]) + (easy-repeat . [(20150516 848) ((emacs (24 4))) "Repeat easily" single ((:commit . "060f0e6801c82c40c06961dc0528a00e18947a8c") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:keywords "repeat" "convenience") (:url . "https://github.com/xuchunyang/easy-repeat.el"))]) + (ebf . [(20210225 1211) ((dash (2 18 0)) (cl-lib (0 5))) "brainfuck language transpiler to Emacs Lisp" tar ((:commit . "6cbeb4d62416f4cfd5be8906667342af8ecc44a6") (:authors ("Alexey Kutepov" . "reximkut@gmail.com")) (:maintainer "Alexey Kutepov" . "reximkut@gmail.com") (:url . "http://github.com/rexim/ebf"))]) + (ebib . [(20210607 2206) ((parsebib (2 3)) (emacs (25 1))) "a BibTeX database manager" tar ((:commit . "7e49d7e1eaeca755c0086a81967673eb5b45d175") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm") (:keywords "text" "bibtex") (:url . "http://joostkremers.github.io/ebib/"))]) + (ebuku . [(20200427 1143) ((emacs (25 1))) "Interface to the buku Web bookmark manager" single ((:commit . "9e1878810eaaaa55885d4cbcd6968566e4e3f7a8") (:authors ("Alexis <flexibeast@gmail.com>, Erik Sjöstrand" . "sjostrand.erik@gmail.com")) (:maintainer "Alexis" . "flexibeast@gmail.com") (:keywords "bookmarks" "buku" "data" "web" "www") (:url . "https://github.com/flexibeast/ebuku"))]) + (ecb . [(20170728 1921) nil "a code browser for Emacs" tar ((:commit . "1330a44cf3c171781083b0b926ab7622f64e6e81") (:authors ("Jesper Nordenberg" . "mayhem@home.se") ("Klaus Berndl" . "klaus.berndl@sdm.de") ("Kevin A. Burton" . "burton@openprivacy.org")) (:maintainer "Klaus Berndl" . "klaus.berndl@sdm.de") (:keywords "browser" "code" "programming" "tools"))]) + (eclim . [(20181108 1134) ((dash (2 11 0)) (json (1 2)) (popup (0 5 2)) (s (1 9 0)) (cl-lib (0 5)) (yasnippet (0 10 0))) "An interface to the Eclipse IDE." tar ((:commit . "222ddd48fcf0ee01592dec77c58e0cf3f2ea1100"))]) + (eclipse-theme . [(20191113 1518) nil "Theme based on Eclipse circa 2010" single ((:commit . "dcf97865512ed450f9d5137c1a05e12edb5b7f80") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "themes") (:url . "https://github.com/abo-abo/eclipse-theme"))]) + (ecukes . [(20210202 1241) ((commander (0 6 1)) (espuds (0 2 2)) (ansi (0 3 0)) (dash (2 2 0)) (s (1 8 0)) (f (0 11 0))) "Cucumber for Emacs." tar ((:commit . "d173cdf487bc2c62305e2232db96290bc021950f"))]) + (edbi . [(20160225 141) ((concurrent (0 3 1)) (ctable (0 1 2)) (epc (0 1 1))) "Emacs Database Interface" tar ((:commit . "6f50aaf4bde75255221f2292c7a4ad3fa9d918c0") (:authors ("SAKURAI Masashi <m.sakurai at kiwanami.net>")) (:maintainer "SAKURAI Masashi <m.sakurai at kiwanami.net>") (:keywords "database" "epc") (:url . "https://github.com/kiwanami/emacs-edbi"))]) + (ede-compdb . [(20150920 2033) ((ede (1 2)) (semantic (2 2)) (cl-lib (0 4))) "Support for compilation database projects in EDE" single ((:commit . "d6d8466cd62876fc90adeff5875a1a584fd846cd") (:authors ("Alastair Rankine" . "alastair@girtby.net")) (:maintainer "Alastair Rankine" . "alastair@girtby.net") (:keywords "development" "ninja" "build" "cedet" "ede"))]) + (ede-php-autoload . [(20180901 1255) nil "Simple EDE PHP Project" tar ((:commit . "8a4eeeaa93b8d87b65a107c4ebcbeb14528d9449") (:authors ("Steven Rémot" . "steven.remot@gmail.com") ("original code for C++ by Eric M. Ludlam" . "eric@siege-engine.com")) (:maintainer "Steven Rémot" . "steven.remot@gmail.com") (:keywords "php" "project" "ede") (:url . "https://github.com/emacs-php/ede-php-autoload"))]) + (ede-php-autoload-composer-installers . [(20170221 2026) ((ede-php-autoload (1 0 0)) (f (0 19 0)) (s (1 7 0))) "Composer installers support for ede-php-autoload" single ((:commit . "7840439802c7d11ee086bbf465657f3da12f9f66") (:authors ("Thomas Fini Hansen" . "xen@xen.dk")) (:maintainer "Thomas Fini Hansen" . "xen@xen.dk") (:keywords "programming" "php") (:url . "https://github.com/xendk/ede-php-autoload-composer-installers"))]) + (ede-php-autoload-drupal . [(20170316 2158) ((ede-php-autoload (1 0 0)) (f (0 19 0)) (s (1 7 0))) "Drupal support for ede-php-autoload" single ((:commit . "54a04241d94fabc4f4d16ae4dc8ba4f0c6e3b435") (:authors ("Thomas Fini Hansen" . "xen@xen.dk")) (:maintainer "Thomas Fini Hansen" . "xen@xen.dk") (:keywords "programming" "php" "drupal"))]) + (edebug-inline-result . [(20210213 25) ((emacs (25 1))) "Show Edebug result inline" single ((:commit . "86a9ed9e4f58c2e9870b8918dc898ccd78d2d3f8") (:keywords "extensions" "lisp" "tools") (:url . "https://www.github.com/stardiviner/edebug-inline-result"))]) + (edebug-x . [(20130616 625) nil "Extensions for Edebug" single ((:commit . "a2c2c42553d3bcbd5ac11898554865acbed1bc46") (:authors ("Scott Barnett" . "scott.n.barnett@gmail.com")) (:maintainer "Scott Barnett" . "scott.n.barnett@gmail.com") (:keywords "extensions") (:url . "https://github.com/ScottyB/edebug-x"))]) + (edit-at-point . [(20191013 1218) nil "edit(copy,cut..) current things(word,symbol..) under cursor" single ((:commit . "28c85a65c9c61f2aff50bc5e93f61cde26a5d9c0") (:authors (nil . "<e.enoson@gmail.com>")) (:maintainer nil . "<e.enoson@gmail.com>") (:url . "http://github.com/enoson/edit-at-point.el"))]) + (edit-chrome-textarea . [(20200324 1513) ((emacs (25 1)) (websocket (1 4))) "Edit Chrome Textarea" single ((:commit . "e9ef6a72bdc6b58f932c51aa161869cee11b4bc9") (:authors ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:keywords "tools") (:url . "https://github.com/xuchunyang/edit-chrome-textarea.el"))]) + (edit-color-stamp . [(20130529 1733) ((es-lib (0 2)) (cl-lib (1 0))) "Edit a hex color stamp, using a QT or the internal color picker" tar ((:commit . "32dc1ca5bcf3dcf83fad5e39b55dc5b77becb3d3") (:authors ("sabof")) (:maintainer "sabof") (:url . "https://github.com/sabof/edit-color-stamp"))]) + (edit-indirect . [(20200805 1840) ((emacs (24 3))) "Edit regions in separate buffers" single ((:commit . "bdc8f542fe8430ba55f9a24a7910639d4c434422") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/edit-indirect"))]) + (edit-indirect-region-latex . [(20161129 645) ((emacs (24 3)) (ht (2 2)) (edit-indirect (0 1 4))) "Edit LaTeX regions in separate buffers, e.g. for English grammar checks" single ((:commit . "05043f2c0c9838947d3ca4b51b695deb7c47612e") (:authors ("Hirotaka Niitsuma" . "hirotaka.niitsuma@gmail.com")) (:maintainer "Hirotaka Niitsuma" . "hirotaka.niitsuma@gmail.com") (:url . "https://github.com/niitsuma/edit-indirect-region-latex"))]) + (edit-list . [(20100930 1443) nil "edit a single list" single ((:commit . "f460d3f9e208a4e606fe6ded307f1b011916ca71") (:authors ("Michael Olson" . "mwolson@gnu.org")) (:maintainer "Michael Olson" . "mwolson@gnu.org") (:url . "http://mwolson.org/static/dist/elisp/edit-list.el"))]) + (edit-server . [(20181016 1125) nil "server that responds to edit requests from Chrome" single ((:commit . "1632acab5624637031326bd902e2ad7ccb6b4c90") (:authors ("Alex Bennée" . "alex@bennee.com")) (:maintainer "Alex Bennée" . "alex@bennee.com") (:url . "https://github.com/stsquad/emacs_chrome"))]) + (edit-server-htmlize . [(20130329 2248) ((edit-server (1 9))) "(de)HTMLization hooks for edit-server.el" single ((:commit . "e7f8dadfabe869c77ca241cd6fbd4c52bd908392") (:authors ("Roland McGrath" . "roland@hack.frob.com")) (:maintainer "Roland McGrath" . "roland@hack.frob.com") (:url . "https://github.com/frobtech/edit-server-htmlize"))]) + (editorconfig . [(20210407 407) ((cl-lib (0 5)) (nadvice (0 3)) (emacs (24))) "EditorConfig Emacs Plugin" tar ((:commit . "e10fa22b1304c5801b026c10cc5d65a97ccc0a48") (:authors ("EditorConfig Team" . "editorconfig@googlegroups.com")) (:maintainer "EditorConfig Team" . "editorconfig@googlegroups.com") (:url . "https://github.com/editorconfig/editorconfig-emacs#readme"))]) + (editorconfig-charset-extras . [(20180223 457) ((editorconfig (0 6 0))) "Extra EditorConfig Charset Support" single ((:commit . "4f75e175ad15ce2038f926fe4f0e5a0c1d0cbc46") (:authors ("10sr" . "8.slashes@gmail.com")) (:maintainer "10sr" . "8.slashes@gmail.com") (:keywords "tools") (:url . "https://github.com/10sr/editorconfig-charset-extras-el"))]) + (editorconfig-custom-majormode . [(20180816 244) ((editorconfig (0 6 0))) "Decide major-mode and mmm-mode from EditorConfig" single ((:commit . "13ad1c83f847bedd4b3a19f9df7fd925853b19de") (:authors ("10sr <8slashes+el [at] gmail [dot] com>")) (:maintainer "10sr <8slashes+el [at] gmail [dot] com>") (:keywords "editorconfig" "util") (:url . "https://github.com/10sr/editorconfig-custom-majormode-el"))]) + (editorconfig-domain-specific . [(20180505 924) ((cl-lib (0 5)) (editorconfig (0 6 0))) "Apply brace style and other \"domain-specific\" EditorConfig properties" single ((:commit . "e9824160fb2e466afa755240ee3ab7cc5657fb04") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "editorconfig" "util") (:url . "https://github.com/lassik/editorconfig-emacs-domain-specific"))]) + (editorconfig-generate . [(20190513 433) ((emacs (24))) "Generate .editorconfig" single ((:commit . "47a31f928f46d2a0188db8e2cffa5d6354a81573") (:authors ("10sr" . "8.slashes@gmail.com")) (:maintainer "10sr" . "8.slashes@gmail.com") (:keywords "tools") (:url . "https://github.com/10sr/editorconfig-generate-el"))]) + (edn . [(20160215 1219) ((cl-lib (0 3)) (emacs (24 1)) (peg (0 6))) "Support for reading and writing the edn data format from elisp" single ((:commit . "21e120a6914ee9a694be0a051f9f2af34ef055e4") (:authors ("Lars Andersen" . "expez@expez.com")) (:maintainer "Lars Andersen" . "expez@expez.com") (:keywords "edn" "clojure") (:url . "https://www.github.com/expez/edn.el"))]) + (ednc . [(20201122 25) ((emacs (26 1))) "Emacs Desktop Notification Center" single ((:commit . "537e2e165984b53b45cf760ea9e4b86794b8a09d") (:authors ("Simon Nicolussi" . "sinic@sinic.name")) (:maintainer "Simon Nicolussi" . "sinic@sinic.name") (:keywords "unix") (:url . "https://github.com/sinic/ednc"))]) + (edts . [(20201110 1827) ((auto-complete (20170125 245)) (auto-highlight-symbol (20130313 943)) (dash (20190814 2006)) (erlang (20190404 928)) (f (20190109 906)) (popup (20160709 1429)) (s (20180406 808))) "Erlang Development Tool Suite" tar ((:commit . "648e8ac632bee8eaa92fc4e09a674ae453bae0a9"))]) + (edwina . [(20200113 1714) ((emacs (25))) "Dynamic window manager" tar ((:commit . "c5368716a504c93407fd8cb4ef925a8d8eb62698") (:authors ("Alex Griffin" . "a@ajgrf.com")) (:maintainer "Alex Griffin" . "a@ajgrf.com") (:keywords "convenience") (:url . "https://github.com/ajgrf/edwina"))]) + (efire . [(20151009 2031) ((circe (1 2))) "Use campfire from Emacs" single ((:commit . "91a644662afb352475efad0b377713656f131e5c") (:authors ("João Távora" . "joaotavora@gmail.com")) (:maintainer "João Távora" . "joaotavora@gmail.com") (:keywords "convenience" "tools") (:url . "https://github.com/capitaomorte/efire"))]) + (eg . [(20170830 815) ((cl-lib (0 5)) (emacs (24 3))) "Norton Guide reader" single ((:commit . "1c7f1613d2aaae728ef540305f6ba030616f86bd") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "docs") (:url . "https://github.com/davep/eg.el"))]) + (egalgo . [(20190706 1611) ((dash (2 14)) (emacs (24))) "Genetic algorithm for Emacs" single ((:commit . "e683b16ed4265ddb46efcc8cbf9503301cc39e22") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com") (:keywords "data") (:url . "https://github.com/ROCKTAKEY/egalgo"))]) + (egg . [(20181126 500) nil "Emacs Got Git - Emacs interface to Git" tar ((:commit . "00e768a78ac3d25f457eed667d02cac568480bf9") (:authors ("Bogolisk" . "bogolisk@gmail.com")) (:maintainer "Bogolisk" . "bogolisk@gmail.com") (:keywords "git" "version control" "release management"))]) + (egg-timer . [(20200217 1650) ((emacs (25 1))) "Commonly used intervals for setting timers while working" single ((:commit . "e3542aeb80905956b94373a222a9cbac04e6497e") (:authors ("William Carroll" . "wpcarro@gmail.com")) (:maintainer "William Carroll" . "wpcarro@gmail.com") (:url . "https://github.com/wpcarro/egg-timer.el"))]) + (egison-mode . [(20200107 2333) nil "Egison editing mode" tar ((:commit . "df4e47f7c8adfe90d9bf408459772a6cb4e71b70") (:authors ("Satoshi Egi" . "egisatoshi@gmail.com")) (:maintainer "Satoshi Egi" . "egisatoshi@gmail.com") (:url . "https://github.com/egisatoshi/egison3/blob/master/elisp/egison-mode.el"))]) + (eglot . [(20210611 2249) ((emacs (26 1)) (jsonrpc (1 0 14)) (flymake (1 0 9)) (project (0 3 0)) (xref (1 0 1)) (eldoc (1 11 0))) "Client for Language Server Protocol (LSP) servers" single ((:commit . "5cc8df63d86a6c43134dd6e4e3ae26cfae14e66a") (:authors ("João Távora" . "joaotavora@gmail.com")) (:maintainer "João Távora" . "joaotavora@gmail.com") (:keywords "convenience" "languages") (:url . "https://github.com/joaotavora/eglot"))]) + (eglot-fsharp . [(20210330 1442) ((emacs (26 3)) (eglot (1 4)) (fsharp-mode (1 10)) (jsonrpc (1 0 14))) "fsharp-mode eglot integration" single ((:commit . "93b1fbc31d73286a18640a36fc2be87d1736e0f2") (:authors ("Jürgen Hötzel" . "juergen@archlinux.org")) (:maintainer "Jürgen Hötzel" . "juergen@archlinux.org") (:keywords "languages") (:url . "https://github.com/fsharp/emacs-fsharp-mode"))]) + (eglot-jl . [(20210415 1207) ((emacs (25 1)) (eglot (1 4)) (julia-mode (0 3))) "Julia support for eglot" tar ((:commit . "49f170e01c5a107c2cb662c00544d827eaa2c4d8") (:authors ("Adam Beckmeyer" . "adam_git@thebeckmeyers.xyz")) (:maintainer "Adam Beckmeyer" . "adam_git@thebeckmeyers.xyz") (:keywords "convenience" "languages") (:url . "https://github.com/non-Jedi/eglot-jl"))]) + (ego . [(20200803 1101) ((emacs (24 5)) (ht (1 5)) (mustache (0 22)) (htmlize (1 47)) (org (8 0)) (dash (2 0 0))) "a static site generator based on org mode, forked from org-page." tar ((:commit . "211c4cb2af2582849d9df984fb2346deecaf79be") (:authors ("Feng Shu <tumashu AT 163.com>") ("Kelvin Hu <ini DOT kelvin AT gmail DOT com>") ("Kuangdash <kuangdash AT 163.com>")) (:maintainer "Feng Shu <tumashu AT 163.com>") (:keywords "org-mode" "convenience" "beautify") (:url . "https://github.com/emacs-china/EGO"))]) + (eide . [(20200702 2009) nil "IDE interface" tar ((:commit . "b1dfdaf06b00409250135cb1000beac60c7f659b") (:authors ("Cédric Marie" . "cedric@hjuvi.fr.eu.org")) (:maintainer "Cédric Marie" . "cedric@hjuvi.fr.eu.org") (:url . "https://eide.hjuvi.fr.eu.org/"))]) + (eimp . [(20120826 2039) nil "Emacs Image Manipulation Package" single ((:commit . "2e7536fe6d8f7faf1bad7a8ae37faba0162c3b4f") (:authors ("Matthew P. Hodges" . "MPHodges@member.fsf.org")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:keywords "files" "frames"))]) + (ein . [(20210522 1036) ((emacs (25)) (websocket (1 12)) (anaphora (1 0 4)) (request (0 3 3)) (deferred (0 5)) (polymode (0 2 2)) (dash (2 13 0)) (with-editor (0 -1))) "Emacs IPython Notebook" tar ((:commit . "09af85821e4fce64675d5287fe9f3a6847d1c5d2") (:keywords "jupyter" "literate programming" "reproducible research") (:url . "https://github.com/dickmao/emacs-ipython-notebook"))]) + (ein-mumamo . [(20150302 28) ((ein (0 4))) "Multiple major mode support for Emacs IPython Notebook" single ((:commit . "028fefec499598add1a87b92ed991891f38f0c7b") (:authors ("Takafumi Arakaki <aka.tkf at gmail.com>") (": John Miller <millejoh at mac.com>")) (:maintainer "Takafumi Arakaki <aka.tkf at gmail.com>"))]) + (eink-theme . [(20190219 858) nil "E Ink color theme" single ((:commit . "326b07523dcb076d6209cdbc7fdbb73df296dbdb") (:authors ("Marian Schubert" . "marian.schubert@gmail.com")) (:maintainer "Marian Schubert" . "marian.schubert@gmail.com") (:url . "http://github.com/maio/eink-emacs"))]) + (ejc-sql . [(20201129 2043) ((emacs (26 3)) (clomacs (0 0 5)) (dash (2 16 0)) (spinner (1 7 3)) (direx (1 0 0))) "Emacs SQL client uses Clojure JDBC." tar ((:commit . "c24519e5b7fc1051257b0ec67fc6dec84d6b996e") (:authors ("Kostafey" . "kostafey@gmail.com")) (:maintainer "Kostafey" . "kostafey@gmail.com") (:keywords "sql" "jdbc") (:url . "https://github.com/kostafey/ejc-sql"))]) + (ejson-mode . [(20190720 2138) ((emacs (25))) "Major mode for editing ejson files." single ((:commit . "9630dfac9549779711dbe89e621f516bb4b3a354") (:authors ("Dante Catalfamo")) (:maintainer "Dante Catalfamo") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/dantecatalfamo/ejson-mode"))]) + (el-autoyas . [(20120918 1317) nil "Automatically create Emacs-Lisp Yasnippets" tar ((:commit . "bde0251ecb504f585dfa27c205c8e312655310cc") (:authors ("Matthew L. Fidler")) (:maintainer "Matthew L. Fidler") (:keywords "emacs" "lisp" "mode" "yasnippet") (:url . "https://github.com/mlf176f2/el-autoyas.el"))]) + (el-fly-indent-mode . [(20180422 243) ((emacs (25))) "Indent Emacs Lisp on the fly" single ((:commit . "39738c88c01a3a035edffe63400d434edb1e3003") (:authors ("Jiahao Li" . "jiahaowork@gmail.com")) (:maintainer "Jiahao Li" . "jiahaowork@gmail.com") (:keywords "lisp" "languages") (:url . "https://github.com/jiahaowork/el-fly-indent-mode.el"))]) + (el-get . [(20210606 911) nil "Manage the external elisp bits and pieces you depend upon" tar ((:commit . "52df810e538243d07f2a317ad36e351b440a75e0") (:authors ("Dimitri Fontaine" . "dim@tapoueh.org")) (:maintainer "Dimitri Fontaine" . "dim@tapoueh.org") (:keywords "emacs" "package" "elisp" "install" "elpa" "git" "git-svn" "bzr" "cvs" "svn" "darcs" "hg" "apt-get" "fink" "pacman" "http" "http-tar" "emacswiki") (:url . "http://www.emacswiki.org/emacs/el-get"))]) + (el-init . [(20150728 920) ((emacs (24)) (cl-lib (0 5)) (anaphora (1 0 0))) "A loader inspired by init-loader" single ((:commit . "7538e1511ff7ceea2ba65ed4783c57e2f9176ee6") (:authors ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainer "Hiroki YAMAKAWA" . "s06139@gmail.com") (:url . "https://github.com/HKey/el-init"))]) + (el-init-viewer . [(20150303 828) ((emacs (24)) (cl-lib (0 5)) (ctable (0 1 2)) (dash (2 10 0)) (anaphora (1 0 0)) (el-init (0 1 4))) "Record viewer for el-init" single ((:commit . "7c0169d356d6c007317e253e5776e1e48a60d6ad") (:authors ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainer "Hiroki YAMAKAWA" . "s06139@gmail.com") (:url . "https://github.com/HKey/el-init-viewer"))]) + (el-mock . [(20170824 1954) nil "Tiny Mock and Stub framework in Emacs Lisp" single ((:commit . "5df1d3a956544f1d3ad0bcd81daf47fff33ab8cc") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "lisp" "testing" "unittest") (:url . "http://github.com/rejeep/el-mock.el"))]) + (el-patch . [(20210411 1954) ((emacs (25))) "Future-proof your Elisp" tar ((:commit . "14c35cee52b415fe9892440014c4b8dc045103df") (:authors ("Radon Rosborough" . "radon.neon@gmail.com")) (:maintainer "Radon Rosborough" . "radon.neon@gmail.com") (:keywords "extensions") (:url . "https://github.com/raxod502/el-patch"))]) + (el-spec . [(20121018 704) nil "ruby's rspec like syntax test frame work" single ((:commit . "1dbc465401d4aea5560318c4f13ff30920a0718d") (:authors ("Yuuki Arisawa" . "yuuki.ari@gmail.com")) (:maintainer "Yuuki Arisawa" . "yuuki.ari@gmail.com") (:keywords "test") (:url . "https://github.com/uk-ar/el-spec"))]) + (el-spice . [(20201013 1729) nil "Extra spice for emacs lisp programming" tar ((:commit . "a1adde201ee10881b522e67aa2c605378943a28d") (:authors ("Vedang Manerikar" . "vedang.manerikar@gmail.com")) (:maintainer "Vedang Manerikar" . "vedang.manerikar@gmail.com") (:keywords "languages" "extensions") (:url . "https://github.com/vedang/el-spice"))]) + (el-sprunge . [(20200312 1212) ((web-server (20140105 2246)) (htmlize (20130207 1202)) (emacs (24 3))) "Command line paste server with Emacs highlighting" tar ((:commit . "e4365ea0bdf60969817619376bdcc98003fec33d") (:authors ("Eric Schulte" . "schulte.eric@gmail.com")) (:maintainer "Eric Schulte" . "schulte.eric@gmail.com") (:keywords "http" "html" "server" "sprunge" "paste"))]) + (el-spy . [(20131226 2008) nil "Mocking framework for Emacs lisp. It also support spy, proxy." single ((:commit . "b1dead9d1877660856ada22d906ac4e54695aec7") (:authors ("Yuuki Arisawa" . "yuuki.ari@gmail.com")) (:maintainer "Yuuki Arisawa" . "yuuki.ari@gmail.com") (:keywords "test") (:url . "https://github.com/uk-ar/el-spy"))]) + (el2markdown . [(20170630 1858) nil "Convert commentary section of elisp files to markdown." single ((:commit . "368d99313683cd943c99feaffca356be60bdb636") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:url . "https://github.com/Lindydancer/el2markdown"))]) + (el2org . [(20200408 146) ((emacs (25 1))) "Convert elisp file to org file" single ((:commit . "7db77fdd73f378d4e60e34c11bbdf00677adc32c") (:authors ("Feng Shu " . "tumashu@163.com")) (:maintainer "Feng Shu " . "tumashu@163.com") (:keywords "convenience") (:url . "https://github.com/tumashu/el2org"))]) + (elbank . [(20180316 1343) ((emacs (25)) (seq (2 16))) "Personal finances reporting application" tar ((:commit . "fa9bc7dec0a8fd489e90b9f178719344cc8d315a") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr") (:keywords "tools" "personal-finances"))]) + (elcontext . [(20210109 1238) ((ht (2 3)) (hydra (0 14 0)) (emacs (24 3)) (f (0 20 0)) (osx-location (0 4)) (uuidgen (0 3))) "Create context specific actions" tar ((:commit . "2efd3dd8c5176c4f071bb048be6cb069b05d6e9e") (:authors ("Thomas Sojka")) (:maintainer "Thomas Sojka") (:keywords "calendar" "convenience") (:url . "https://github.com/rollacaster/elcontext"))]) + (elcord . [(20210524 1611) ((emacs (25 1))) "Allows you to integrate Rich Presence from Discord" tar ((:commit . "afe8f31e2b9f78d13b22a695b7cf9c373656b85e") (:authors ("heatingdevice") ("Wilfredo Velázquez-Rodríguez" . "zulu.inuoe@gmail.com")) (:maintainer "heatingdevice") (:keywords "games") (:url . "https://github.com/Mstrodl/elcord"))]) + (elcouch . [(20201108 955) ((emacs (25 1)) (json-mode (1 0 0)) (libelcouch (0 11 0)) (navigel (0 3 0))) "View and manipulate CouchDB databases" single ((:commit . "3d162dda14411349e12509029d2b621c5d1edea2") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:keywords "data" "tools") (:url . "https://gitlab.petton.fr/DamienCassou/elcouch"))]) + (eldev . [(20210530 1641) ((emacs (24 4))) "Elisp Development Tool" tar ((:commit . "e9af76aa8fd9ce5b7010b7322a73341828cfe690") (:authors ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com") (:keywords "maint" "tools") (:url . "https://github.com/doublep/eldev"))]) + (eldoc-box . [(20210608 2202) ((emacs (26 1))) "Display documentation in childframe" single ((:commit . "13d207d40863a041b84c34f075668c7931db5a78") (:authors ("Sebastien Chapuis" . "sebastien@chapu.is")) (:maintainer "Yuan Fu" . "casouri@gmail.com") (:url . "https://github.com/casouri/eldoc-box"))]) + (eldoc-cmake . [(20190419 2244) ((emacs (25 1))) "Eldoc support for CMake" single ((:commit . "4453c03b5c95ff32842f13db2fc317fb0fe2f79e") (:authors ("Kirill Ignatiev")) (:maintainer "Kirill Ignatiev") (:url . "https://github.com/ikirill/eldoc-cmake"))]) + (eldoc-eval . [(20200902 1339) nil "Enable eldoc support when minibuffer is in use." single ((:commit . "f6e639047d9b3695877e63dd3de8f24e704d6d23") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com"))]) + (eldoc-overlay . [(20200715 1214) ((emacs (24 3)) (inline-docs (1 0 1)) (quick-peek (1 0))) "Display eldoc with contextual documentation overlay." single ((:commit . "563ca285a510d1cbd5129cc3a8f8a3cdded065de") (:authors ("stardiviner" . "numbchild@gmail.com")) (:maintainer "stardiviner" . "numbchild@gmail.com") (:keywords "documentation" "eldoc" "overlay") (:url . "https://github.com/stardiviner/eldoc-overlay"))]) + (eldoc-stan . [(20210130 1325) ((emacs (25)) (stan-mode (10 2 1))) "Eldoc support for stan functions" tar ((:commit . "9bb858b9f1314dcf1a5df23e39f9af522098276b") (:authors ("Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu")) (:maintainer "Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu") (:keywords "help" "tools") (:url . "https://github.com/stan-dev/stan-mode/tree/master/eldoc-stan"))]) + (electric-case . [(20150417 1112) nil "insert camelCase, snake_case words without \"Shift\"ing" single ((:commit . "bac64e772107e3dc721a9819f63b9ebdc28a81f7") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))]) + (electric-cursor . [(20210501 2107) ((emacs (24 1))) "Change cursor automatically" single ((:commit . "e20c6f6e85c020e472ef05b12af7a12bbae65dbf") (:authors ("Case Duckworth" . "acdw@acdw.net")) (:maintainer "Case Duckworth" . "acdw@acdw.net") (:keywords "cursor" "files") (:url . "https://github.com/duckwork/electric-cursor"))]) + (electric-operator . [(20210320 1511) ((dash (2 10 0)) (emacs (24 4))) "Automatically add spaces around operators" tar ((:commit . "ecc59d313dd9ddfc4d6a2a3c7a9374aaf214e653") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com") (:keywords "electric") (:url . "https://github.com/davidshepherd7/electric-operator"))]) + (electric-spacing . [(20210430 1714) nil "Insert operators with surrounding spaces smartly" tar ((:commit . "800e09af7b0cd5d78d22f857dbce10fb080637df") (:authors ("William Xu" . "william.xwl@gmail.com")) (:maintainer "William Xu" . "william.xwl@gmail.com"))]) + (elegant-agenda-mode . [(20210115 353) ((emacs (26 1))) "An elegant theme for your org-agenda" single ((:commit . "5cbc688584ba103ea3be7d7b30e5d94e52f59eb6") (:authors ("Justin Barclay" . "justinbarclay@gmail.com")) (:maintainer "Justin Barclay" . "justinbarclay@gmail.com") (:keywords "faces") (:url . "https://github.com/justinbarclay/elegant-agenda-mode"))]) + (elein . [(20120120 1116) nil "running leiningen commands from emacs" single ((:commit . "d4c0c0491dbb7c90e953d7a16172107c37103605") (:authors ("R.W. van 't Veer")) (:maintainer "R.W. van 't Veer") (:keywords "tools" "processes") (:url . "https://github.com/remvee/elein"))]) + (elescope . [(20210312 1147) ((emacs (25 1)) (ivy (0 10)) (request (0 3)) (seq (2 0))) "Seach and clone projects from the minibuffer" single ((:commit . "36566c8c1f5f993f67eadc85d18539ff375c0f98") (:authors ("Stéphane Maniaci" . "stephane.maniaci@gmail.com")) (:maintainer "Stéphane Maniaci" . "stephane.maniaci@gmail.com") (:keywords "vc") (:url . "https://github.com/freesteph/elescope"))]) + (elf-mode . [(20161009 748) ((emacs (24 3))) "Show symbols in binaries" single ((:commit . "cd280d683cd3341d8bb31af6db7e3b74a133e6ab") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "matching") (:url . "https://github.com/abo-abo/elf-mode"))]) + (elfeed . [(20210606 1130) ((emacs (24 3))) "an Emacs Atom/RSS feed reader" tar ((:commit . "243add9e74003cd5718f33482b7bb8b4fe140fb5") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/elfeed"))]) + (elfeed-dashboard . [(20201218 347) ((emacs (25 1)) (elfeed (3 3 0))) "An extensible frontend for elfeed using org-mode" single ((:commit . "9e8e212da9ea471bdc58bc0a1f5932833029bb38") (:authors ("Manoj Kumar Manikchand" . "manojm321@protonmail.com")) (:maintainer "Manoj Kumar Manikchand" . "manojm321@protonmail.com") (:keywords "convenience") (:url . "https://github.com/Manoj321/elfeed-dashboard"))]) + (elfeed-goodies . [(20190128 1631) ((popwin (1 0 0)) (powerline (2 2)) (elfeed (2 0 0)) (cl-lib (0 5)) (noflet (0 0 10)) (ace-jump-mode (2 0))) "Elfeed goodies" tar ((:commit . "95b4ea632fbd5960927952ec8f3394eb88da4752") (:authors ("Gergely Nagy")) (:maintainer "Gergely Nagy") (:url . "https://github.com/algernon/elfeed-goodies"))]) + (elfeed-org . [(20210510 1219) ((elfeed (1 1 1)) (org (8 2 7)) (dash (2 10 0)) (s (1 9 0)) (cl-lib (0 5))) "Configure elfeed with one or more org-mode files" single ((:commit . "268efdd0121fa61f63b722c30e0951c5d31224a4") (:authors ("Remy Honig" . "remyhonig@gmail.com")) (:maintainer "Remy Honig" . "remyhonig@gmail.com") (:keywords "news") (:url . "https://github.com/remyhonig/elfeed-org"))]) + (elfeed-protocol . [(20210430 846) ((emacs (24 4)) (elfeed (2 1 1)) (cl-lib (0 5))) "Provide fever/newsblur/owncloud/ttrss protocols for elfeed" tar ((:commit . "5e17d4280f5f8019c3f8962a710c9b3e633f41ff") (:authors ("Xu Fasheng <fasheng[AT]fasheng.info>")) (:maintainer "Xu Fasheng <fasheng[AT]fasheng.info>") (:keywords "news") (:url . "https://github.com/fasheng/elfeed-protocol"))]) + (elfeed-score . [(20210605 2212) ((emacs (26 1)) (elfeed (3 3 0))) "Gnus-style scoring for Elfeed" tar ((:commit . "dd4a0ceded6200fe2367a2de7b0e45d7fb5b4909") (:authors ("Michael Herstine" . "sp1ff@pobox.com")) (:maintainer "Michael Herstine" . "sp1ff@pobox.com") (:keywords "news") (:url . "https://github.com/sp1ff/elfeed-score"))]) + (elfeed-web . [(20210226 258) ((simple-httpd (1 5 1)) (elfeed (3 2 0)) (emacs (24 3))) "web interface to Elfeed" tar ((:commit . "243add9e74003cd5718f33482b7bb8b4fe140fb5") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/elfeed"))]) + (elforth . [(20210522 928) ((emacs (26 1))) "Do you have what it takes to hack Emacs Lisp in Forth?" single ((:commit . "2d8540434a28e7edaa04a992c3c362832b2fd61e") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "games") (:url . "https://github.com/lassik/elforth"))]) + (elgrep . [(20210205 733) ((emacs (26 2)) (async (1 5))) "Searching files for regular expressions" single ((:commit . "b627cc0f307161e580e9450ad5334687b9406a16") (:authors ("Tobias Zawada" . "i@tn-home.de")) (:maintainer "Tobias Zawada" . "i@tn-home.de") (:keywords "tools" "matching" "files" "unix") (:url . "https://github.com/TobiasZawada/elgrep"))]) + (elhome . [(20161025 2042) ((initsplit (20120630))) "A framework for a \"home\" Emacs configuration" tar ((:commit . "e789e806469af3e9705f72298683c21f6c3a516d") (:authors ("Dave Abrahams" . "dave@boostpro.com")) (:maintainer "Demyan Rogozhin" . "demyan.rogozhin@gmail.com") (:keywords "lisp") (:url . "http://github.com/demyanrogozhin/elhome"))]) + (elisp-def . [(20210126 750) ((dash (2 12 0)) (f (0 19 0)) (s (1 11 0)) (emacs (24 3))) "macro-aware go-to-definition for elisp" single ((:commit . "dfca043ec0cbead67bd9c526cb009daf771d0fa2") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:keywords "lisp"))]) + (elisp-demos . [(20210312 542) ((emacs (24 4))) "Elisp API Demos" tar ((:commit . "924b07d28e4f5b82f0e1377bcde800068f0a6d9d") (:authors ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:keywords "lisp" "docs") (:url . "https://github.com/xuchunyang/elisp-demos"))]) + (elisp-depend . [(20190325 1114) nil "Parse depend libraries of elisp file." single ((:commit . "6679da9a6be5a845bb4804224c8394a9bc62168f"))]) + (elisp-depmap . [(20200714 1630) ((emacs (26 1)) (dash (2 17 0))) "Generate an elisp dependency map in graphviz" tar ((:commit . "98676e6ffcc4efb70cc991e659c79cb599b01bc7") (:authors ("Mehmet Tekman")) (:maintainer "Mehmet Tekman") (:keywords "outlines") (:url . "https://github.com/mtekman/elisp-depmap.el"))]) + (elisp-docstring-mode . [(20170304 1615) nil "Major mode for editing elisp docstrings." single ((:commit . "f512e509dd690f65133e55563ebbfd2dede5034f") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "languages"))]) + (elisp-format . [(20160508 952) nil "Format elisp code" single ((:commit . "03cc293eb2f78ec58fc1d84279af06816a04b979") (:authors (nil . "Andy Stewart lazycat.manatee@gmail.com")) (:maintainer "Yuki Inoue inouetakahiroki _at_ gmail.com") (:url . "https://github.com/Yuki-Inoue/elisp-format"))]) + (elisp-lint . [(20200324 2217) ((emacs (24 4)) (dash (2 15 0)) (package-lint (0 11))) "Basic linting for Emacs Lisp" single ((:commit . "a4de033c260389c0d483f93e715fd3395c6e4145") (:authors ("Nikolaj Schumacher <bugs * nschum de>,")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com") (:keywords "lisp" "maint" "tools") (:url . "http://github.com/gonewest818/elisp-lint/"))]) + (elisp-refs . [(20200815 2357) ((dash (2 12 0)) (s (1 11 0))) "find callers of elisp functions or macros" single ((:commit . "b3634a4567c655a1cda51b217629849cba0ac6a7") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:keywords "lisp"))]) + (elisp-sandbox . [(20131116 1842) nil "Evaluate EmacsLisp expressions in a sandbox" single ((:commit . "d894d68934ef09c42f72ac4e1173a0bedc23f139") (:authors ("Joel McCracken <mccracken.joel@gmail.com>, D. Goel" . "deego@gnufans.org")) (:maintainer "Joel McCracken <mccracken.joel@gmail.com>, D. Goel" . "deego@gnufans.org") (:keywords "lisp") (:url . "https://github.com/joelmccracken/elisp-sandbox"))]) + (elisp-slime-nav . [(20210510 528) ((emacs (24 1)) (cl-lib (0 2))) "Make M-. and M-, work in elisp like they do in slime" single ((:commit . "8588d80d414aee1fafce5b9da0e913612ee0bcdd") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "languages" "navigation" "slime" "elisp" "emacs-lisp") (:url . "https://github.com/purcell/elisp-slime-nav"))]) + (elixir-mode . [(20210509 2353) ((emacs (25)) (pkg-info (0 6))) "Major mode for editing Elixir files" tar ((:commit . "6bbc1e5ac46064613c982cedc60566ed077e7a58") (:keywords "languages" "elixir") (:url . "https://github.com/elixir-editors/emacs-elixir"))]) + (elixir-yasnippets . [(20150417 1239) ((yasnippet (0 8 0))) "Yasnippets for Elixir" tar ((:commit . "980ca7626c14ef0573bec0035ec7942796062783") (:authors ("Yinghai Zhao" . "zyinghai@gmail.com")) (:maintainer "Yinghai Zhao" . "zyinghai@gmail.com") (:keywords "snippets"))]) + (ellocate . [(20200112 1931) ((emacs (25 1)) (s (1 12 0)) (f (0 20 0))) "The locate command reimplemented in Emacs Lisp" single ((:commit . "81405082f68f0577c9f176d3d4f034a7142aba59") (:authors ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainer "Sebastian Wålinder" . "s.walinder@gmail.com") (:keywords "matching") (:url . "https://github.com/walseb/ellocate"))]) + (elm-mode . [(20210525 152) ((f (0 17)) (s (1 7 0)) (emacs (25 1)) (dash (2 13 0)) (reformatter (0 3))) "Major mode for Elm" tar ((:commit . "f2e2d0053f3272d9fc0c2e16c8d17d97724cf524") (:authors ("Joseph Collard")) (:maintainer "Joseph Collard") (:url . "https://github.com/jcollard/elm-mode"))]) + (elm-test-runner . [(20190105 1923) ((emacs (24 4))) "Enhanced support for running elm-test" single ((:commit . "a31d567a64d86d36e3675347abd696824a731e0c") (:authors ("Juan Edi")) (:maintainer "Juan Edi") (:url . "https://github.com/juanedi/elm-test-runner"))]) + (elm-yasnippets . [(20160401 524) ((yasnippet (0 8 0))) "Yasnippets for Elm" tar ((:commit . "45a11a0cef0c36633fb3477d3dc4167e82779ba4") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:keywords "snippets"))]) + (elmacro . [(20200905 2130) ((s (1 11 0)) (dash (2 13 0))) "Convert keyboard macros to emacs lisp" single ((:commit . "4888d1baa8b943adf0bab94419357c55b7e6e697") (:authors ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainer "Philippe Vaucher" . "philippe.vaucher@gmail.com") (:keywords "macro" "elisp" "convenience") (:url . "https://github.com/Silex/elmacro"))]) + (elmine . [(20200520 1237) ((s (1 10 0))) "Redmine API access via elisp." single ((:commit . "c78cc8705c2dffbf649b858f02b5028225943482") (:authors ("Arthur Andersen" . "leoc.git@gmail.com")) (:maintainer "Arthur Andersen" . "leoc.git@gmail.com") (:keywords "tools") (:url . "http://github.com/leoc/elmine"))]) + (elmpd . [(20201107 428) ((emacs (25 1))) "A tight, ergonomic, async client library for mpd" single ((:commit . "0d0456f2b9bfffbe452b6d94b9cd8798c52fc80e") (:authors ("Michael Herstine" . "sp1ff@pobox.com")) (:maintainer "Michael Herstine" . "sp1ff@pobox.com") (:keywords "comm") (:url . "https://github.com/sp1ff/elmpd"))]) + (elnode . [(20190702 1509) ((web (0 1 4)) (dash (1 1 0)) (noflet (0 0 7)) (s (1 5 0)) (creole (0 8 14)) (fakir (0 1 6)) (db (0 0 5)) (kv (0 0 17))) "The Emacs webserver." tar ((:commit . "29ef0f51a65a24fca7fdcdb4140d2e4556e4bb29") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "GitHub user \"Jcaw\"") (:keywords "lisp" "http" "hypermedia"))]) + (elog . [(20160724 2255) ((eieio (1 3))) "logging library extended from logito" single ((:commit . "a67237d9813c7591614d95e2ef31cc5e5ed3f31b") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "lisp" "tool" "log"))]) + (elogcat . [(20151121 41) ((s (1 9 0)) (dash (2 10 0))) "logcat interface" single ((:commit . "4f311b7a07565b0d060334bc68edb36f2bff703f") (:authors ("Youngjoo Lee" . "youngker@gmail.com")) (:maintainer "Youngjoo Lee" . "youngker@gmail.com") (:keywords "tools"))]) + (eloud . [(20190706 1707) ((emacs (24 4))) "A lightweight, interactive screen reader" single ((:commit . "b8f4af1f652268d73281de91fb333b5984970847") (:authors ("Patrick Smyth" . "patricksmyth01@gmail.com")) (:maintainer "Patrick Smyth" . "patricksmyth01@gmail.com") (:keywords "extensions") (:url . "https://github.com/smythp/eloud"))]) + (elpa-audit . [(20141023 1331) nil "Handy functions for inspecting and comparing package archives" single ((:commit . "727da50e626977351aff2675b6540a36818bbbe6") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "maint") (:url . "https://github.com/purcell/elpa-audit"))]) + (elpa-clone . [(20191006 1953) ((emacs (24 4)) (cl-lib (0))) "Clone ELPA archive" single ((:commit . "827e2723b123618aaa32642d78c447cf2979a00a") (:authors ("ZHANG Weiyi" . "dochang@gmail.com")) (:maintainer "ZHANG Weiyi" . "dochang@gmail.com") (:keywords "comm" "elpa" "clone" "mirror") (:url . "https://github.com/dochang/elpa-clone"))]) + (elpa-deploy . [(20191022 718) ((emacs (24 4)) (f (0 0))) "ELPA deployment library" single ((:commit . "f5126a2da1e0e52981fad9c12028814be80328c2") (:authors ("Bruno Félix Rezende Ribeiro" . "oitofelix@gnu.org")) (:maintainer "Bruno Félix Rezende Ribeiro" . "oitofelix@gnu.org") (:keywords "tools") (:url . "https://github.com/oitofelix/elpa-deploy"))]) + (elpa-mirror . [(20210509 439) ((emacs (25 1))) "Create local package repository from installed packages" single ((:commit . "193dd942cd74f71d94067f48249427676ba7dec8") (:authors ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com") (:keywords "tools") (:url . "http://github.com/redguardtoo/elpa-mirror"))]) + (elpher . [(20200919 1025) ((emacs (26 2))) "A friendly gopher and gemini client" tar ((:commit . "3561c2815bc6bc896fc7a6da8f094edca48c55b8") (:authors ("Tim Vaughan" . "plugd@thelambdalab.xyz")) (:maintainer "Tim Vaughan" . "plugd@thelambdalab.xyz") (:keywords "comm" "gopher") (:url . "http://thelambdalab.xyz/elpher"))]) + (elpl . [(20200821 1052) ((emacs (24 4))) "Emacs Lisp REPL" single ((:commit . "ca6a6237681c641d5137d58e52f884dec0da6349") (:authors ("Gong Qijian" . "gongqijian@gmail.com")) (:maintainer "Gong Qijian" . "gongqijian@gmail.com") (:keywords "lisp" "tool") (:url . "https://github.com/twlz0ne/elpl"))]) + (elpy . [(20210328 1852) ((company (0 9 2)) (emacs (24 4)) (highlight-indentation (0 5 0)) (pyvenv (1 3)) (yasnippet (0 8 0)) (s (1 11 0))) "Emacs Python Development Environment" tar ((:commit . "2203597e1254eba345d6873daa40c7b9d144931c") (:authors ("Jorgen Schaefer <contact@jorgenschaefer.de>, Gaby Launay" . "gaby.launay@protonmail.com")) (:maintainer "Jorgen Schaefer <contact@jorgenschaefer.de>, Gaby Launay" . "gaby.launay@protonmail.com") (:keywords "python" "ide" "languages" "tools") (:url . "https://github.com/jorgenschaefer/elpy"))]) + (elpygen . [(20171225 1736) ((emacs (25)) (yasnippet (0 8 0))) "Generate a Python function/method using a symbol under point" single ((:commit . "21929c997a05968f9eefe52b85a76ceaab3b0d81") (:authors ("Vladimir Kazanov" . "vkazanov@inbox.ru")) (:maintainer "Vladimir Kazanov" . "vkazanov@inbox.ru") (:keywords "python" "languages" "tools") (:url . "https://github.com/vkazanov/elpygen"))]) + (elquery . [(20200628 1756) ((emacs (25 1)) (s (1 11 0)) (dash (2 13 0))) "The HTML library for elisp." single ((:commit . "cba7629ad886c4e51d66f8b509aad48bdfe100cc") (:authors ("Adam Niederer")) (:maintainer "Adam Niederer") (:keywords "html" "hypermedia" "tools" "webscale") (:url . "https://github.com/AdamNiederer/elquery"))]) + (elsa . [(20201011 1950) ((trinary (1 0 0)) (emacs (25 1)) (f (0)) (dash (2 14)) (cl-lib (0 3))) "Emacs Lisp Static Analyser" tar ((:commit . "ac0ab88abca1215cac60f8a986dadf3011b444bb") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "languages" "lisp"))]) + (elscreen . [(20181009 451) ((emacs (24))) "Emacs window session manager" tar ((:commit . "cc58337faf5ba1eae7e87f75f6ff3758675688f2") (:authors ("Naoto Morishima" . "naoto@morishima.net")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:keywords "window" "convenience") (:url . "https://github.com/knu/elscreen"))]) + (elscreen-buffer-group . [(20200109 2338) ((emacs (24 4)) (elscreen (0)) (cl-lib (0 5))) "elscreen buffer group" single ((:commit . "b48e71d4782adfeb2958f227d78c04164d26e4bd") (:authors ("Jeff Gran" . "jeff@jeffgran.com") ("Author: Ryan C. Thompson")) (:maintainer "Jeff Gran" . "jeff@jeffgran.com") (:keywords "buffer") (:url . "https://github.com/jeffgran/elscreen-buffer-group"))]) + (elscreen-fr . [(20160920 953) ((elscreen (0)) (seq (1 11))) "Use frame title as screen tab" single ((:commit . "6dc77e1d3f17b3f76da5ccf92b715572aa55fb85") (:authors ("Francesc Rocher" . "francesc.rocher@gmail.com")) (:maintainer "Francesc Rocher" . "francesc.rocher@gmail.com") (:url . "http://github.com/rocher/elscreen-fr"))]) + (elscreen-mew . [(20160504 1835) ((elscreen (20120413 807))) "ElScreen Add-On for Mew" single ((:commit . "c90a23441d836da14a1cb12788432308ba58e2b6") (:authors ("Takashi Masuda" . "masutaka.net@gmail.com")) (:maintainer "Takashi Masuda" . "masutaka.net@gmail.com") (:url . "https://github.com/masutaka/elscreen-mew"))]) + (elscreen-multi-term . [(20200417 821) ((emacs (24 4)) (elscreen (1 4 6)) (multi-term (1 3))) "Multi term for elscreen" single ((:commit . "4ea89bae0444d9d4377515929f76cb3e98140f1f") (:authors ("wamei" . "wamei.cho@gmail.com")) (:maintainer "wamei" . "wamei.cho@gmail.com") (:keywords "elscreen" "multi term"))]) + (elscreen-separate-buffer-list . [(20200807 1324) ((emacs (24 4)) (elscreen (1 4 6))) "Separate buffer list manager for elscreen" single ((:commit . "88d8850108947949431425a2d938a09d941454e8") (:authors ("wamei" . "wamei.cho@gmail.com")) (:maintainer "wamei" . "wamei.cho@gmail.com") (:keywords "elscreen"))]) + (elscreen-tab . [(20201229 1428) ((emacs (26)) (elscreen (20180321)) (dash (2 14 1))) "minor mode to display tabs of elscreen in a dedicated buffer" tar ((:commit . "5d7a740e47a56365413d75f4f0553de74f5ca198") (:authors ("Aki Syunsuke" . "sunny.day.dev@gmail.com")) (:maintainer "Aki Syunsuke" . "sunny.day.dev@gmail.com") (:keywords "tools" "extensions") (:url . "https://github.com/aki-s/elscreen-tab"))]) + (elvish-mode . [(20180809 1612) ((emacs (24 3))) "Defines a major mode for Elvish" single ((:commit . "a13fcaf209d803e2e450ca2bf80dea94b40a0141") (:authors ("Adam Schwalm" . "adamschwalm@gmail.com")) (:maintainer "Adam Schwalm" . "adamschwalm@gmail.com") (:url . "https://github.com/ALSchwalm/elvish-mode"))]) + (elwm . [(20150817 1007) ((dash (1 1 0))) "Minimalistic window manager for emacs" single ((:commit . "c33b183f006ad476c3a44dab316f580f8b369930") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:keywords "docs") (:url . "https://github.com/Fuco1/elwm"))]) + (elx . [(20210504 1306) ((emacs (25 1))) "extract information from Emacs Lisp libraries" single ((:commit . "53d257db92fb72ade8ea1b91dc6839c21563119e") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "docs" "libraries" "packages") (:url . "https://github.com/emacscollective/elx"))]) + (emacs-everywhere . [(20210422 1053) ((emacs (26 3)) (cl-lib (0 5))) "System-wide popup windows for quick edits" single ((:commit . "64ba2e3f3096f48928f7be06ed690069b96add22") (:authors ("TEC <https://github.com/tecosaur>")) (:maintainer "TEC" . "tec@tecosaur.com") (:keywords "conenience" "frames") (:url . "https://github.com/tecosaur/emacs-everywhere"))]) + (emacsc . [(20210302 806) nil "helper for emacsc(1)" tar ((:commit . "409fc548bb650c6e832b459c756b13de68147117") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:keywords "tools") (:url . "https://github.com/knu/emacsc"))]) + (emacsist-view . [(20160426 1223) nil "Mode for viewing emacsist.com" single ((:commit . "f67761259ed779a9bc95c9a4e0474522990c5c6b") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "convenience" "usability") (:url . "https://github.com/lujun9972/emacsist-view"))]) + (emacsql . [(20200714 28) ((emacs (25 1))) "high-level SQL database front-end" tar ((:commit . "6d8cd9366284b5a27268ff4b783e2c34573d5b60") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/emacsql"))]) + (emacsql-mysql . [(20171219 227) ((emacs (25 1)) (emacsql (2 0 0))) "EmacSQL back-end for MySQL" single ((:commit . "6d8cd9366284b5a27268ff4b783e2c34573d5b60") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/emacsql"))]) + (emacsql-psql . [(20171219 227) ((emacs (25 1)) (emacsql (2 0 0))) "EmacSQL back-end for PostgreSQL via psql" tar ((:commit . "6d8cd9366284b5a27268ff4b783e2c34573d5b60") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/emacsql"))]) + (emacsql-sqlite . [(20190727 1710) ((emacs (25 1)) (emacsql (2 0 0))) "EmacSQL back-end for SQLite" tar ((:commit . "6d8cd9366284b5a27268ff4b783e2c34573d5b60") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/emacsql"))]) + (emacsql-sqlite3 . [(20200914 508) ((emacs (26 1)) (emacsql (3 0 0))) "Yet another EmacSQL backend for SQLite" single ((:commit . "50aa9bdd76b0d18bf80526cff13a69fe306ee29c") (:authors ("Zhu Zihao" . "all_but_last@163.com")) (:maintainer "Zhu Zihao" . "all_but_last@163.com") (:keywords "extensions") (:url . "https://github.com/cireu/emacsql-sqlite3"))]) + (emacsshot . [(20191206 944) ((emacs (24 4))) "Snapshot a frame or window from within" tar ((:commit . "fe958b11056f3c671ebdd604d5aa574323284ca5") (:authors ("Marco Wahl" . "marcowahlsoft@gmail.com")) (:maintainer "Marco Wahl") (:keywords "convenience") (:url . "https://gitlab.com/marcowahl/emacsshot"))]) + (emamux . [(20200315 1220) ((emacs (24 3))) "Interact with tmux" single ((:commit . "6172131d78038f0b1490e24bac60534bf4ad3b30") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-emamux"))]) + (emamux-ruby-test . [(20130812 1639) ((emamux (0 1)) (projectile (0 9 1))) "Ruby test with emamux" single ((:commit . "23b73c650573b340351a919da3da416acfc2ac84") (:url . "https://github.com/syohex/emamux-ruby-test"))]) + (emaps . [(20200508 1759) ((dash (2 17 0)) (emacs (24))) "Utilities for working with keymaps" single ((:commit . "7c561f3ded2015ed3774e5784059d6601082743e") (:authors ("Ben Moon" . "software@guiltydolphin.com")) (:maintainer "Ben Moon" . "software@guiltydolphin.com") (:keywords "convenience" "keyboard" "keymap" "utility") (:url . "https://github.com/GuiltyDolphin/emaps"))]) + (embark . [(20210607 1506) ((emacs (26 1))) "Conveniently act on minibuffer completions" tar ((:commit . "ef609bf15368a68c4eb3c46fd8cc1bb623b6b83e") (:authors ("Omar Antolín Camarena" . "omar@matem.unam.mx")) (:maintainer "Omar Antolín Camarena" . "omar@matem.unam.mx") (:keywords "convenience") (:url . "https://github.com/oantolin/embark"))]) + (embark-consult . [(20210525 1515) ((emacs (25 1)) (embark (0 9)) (consult (0 1))) "Consult integration for Embark" single ((:commit . "ef609bf15368a68c4eb3c46fd8cc1bb623b6b83e") (:authors ("Omar Antolín Camarena" . "omar@matem.unam.mx")) (:maintainer "Omar Antolín Camarena" . "omar@matem.unam.mx") (:keywords "convenience") (:url . "https://github.com/oantolin/embark"))]) + (ember-mode . [(20200208 1423) ((cl-lib (0 5))) "Ember navigation mode for emacs" single ((:commit . "a587c423041b2fcb065fd5b6a03b2899b764e462") (:authors ("Aad Versteden" . "madnificent@gmail.com")) (:maintainer "Aad Versteden" . "madnificent@gmail.com") (:keywords "ember" "ember.js" "emberjs"))]) + (ember-yasnippets . [(20160526 1658) ((yasnippet (0 8 0))) "Snippets for Ember.js development" tar ((:commit . "3b5bd01569646237bf1b540d097e12f9118b67f4") (:authors ("Ron White" . "ronco@costite.com")) (:maintainer "Ron White" . "ronco@costite.com") (:keywords "tools" "abbrev" "languages"))]) + (embrace . [(20171031 1833) ((cl-lib (0 5)) (expand-region (0 10 0))) "Add/Change/Delete pairs based on `expand-region'" single ((:commit . "dd5da196e5bcc5e6d87e1937eca0c21da4334ef2") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions"))]) + (emidje . [(20190209 1726) ((emacs (25)) (cider (0 17 0)) (seq (2 16)) (magit-popup (2 4 0))) "Test runner and report viewer for Midje" single ((:commit . "7e92f053964d925c97dc8cca8d4d70a3030021db") (:authors ("Alan Ghelardi" . "alan.ghelardi@nubank.com.br")) (:maintainer "Alan Ghelardi" . "alan.ghelardi@nubank.com.br") (:keywords "tools") (:url . "https://github.com/nubank/emidje"))]) + (emlib . [(20161126 1523) ((dash (2 13 0)) (cl-lib (0 5))) "A Machine Learning library for Emacs" tar ((:commit . "dea2af00f551ea580c641d86dd69219f7d4f3685") (:authors ("Narendra Joshi" . "narendraj9@gmail.com")) (:maintainer "Narendra Joshi" . "narendraj9@gmail.com") (:keywords "data" "ai" "neural networks" "ml") (:url . "https://github.com/narendraj9/emlib.git"))]) + (emmet-mode . [(20180613 341) nil "Unofficial Emmet's support for emacs" single ((:commit . "1acb821e0142136344ccf40c1e5fb664d7db2e70") (:authors ("Shin Aoyama" . "smihica@gmail.com")) (:maintainer "Shin Aoyama" . "smihica@gmail.com") (:keywords "convenience") (:url . "https://github.com/smihica/emmet-mode"))]) + (emms . [(20210611 2224) ((cl-lib (0 5)) (nadvice (0 3)) (seq (0))) "The Emacs Multimedia System" tar ((:commit . "d4d9171ce1076ba2ca9d022cf8228aeb3d31fb64") (:authors ("Jorgen Schäfer" . "forcer@forcix.cx")) (:maintainer "Yoni Rabkin" . "yrk@gnu.org") (:keywords "emms" "mp3" "ogg" "flac" "music" "mpeg" "video" "multimedia") (:url . "https://www.gnu.org/software/emms/"))]) + (emms-bilibili . [(20180103 418) ((emacs (25)) (cl-lib (0 5))) "Play Bilibili in EMMS." single ((:commit . "294bca3dfc42fe3a55fb326ab39bc0fcfc8c5090") (:keywords "emms" "bilibili") (:url . "https://github.com/stardiviner/emms-bilibili"))]) + (emms-info-mediainfo . [(20131223 1300) ((emms (0))) "Info-method for EMMS using medianfo" single ((:commit . "bce16eae9eacd38719fea62a9755225a888da59d") (:authors ("Fabián Ezequiel Gallina" . "fgallina@gnu.org")) (:maintainer "Fabián Ezequiel Gallina" . "fgallina@gnu.org") (:keywords "multimedia" "processes"))]) + (emms-mark-ext . [(20130529 327) ((emms (3 0))) "Extra functions for emms-mark-mode and emms-tag-edit-mode" single ((:commit . "ec68129e3e9e469e5bf160c6a1b7030e322f3541") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:keywords "convenience" "multimedia") (:url . "https://github.com/vapniks/emms-mark-ext"))]) + (emms-mode-line-cycle . [(20160221 1120) ((emacs (24)) (emms (4 0))) "Display the emms mode line as a ticker" single ((:commit . "2c2f395e484a1d345050ddd61ff5fab71a92a6bc") (:authors ("momomo5717")) (:maintainer "momomo5717") (:keywords "emms" "mode-line") (:url . "https://github.com/momomo5717/emms-mode-line-cycle"))]) + (emms-player-mpv-jp-radios . [(20180325 1117) ((emacs (24)) (cl-lib (0 5)) (emms (4 0)) (emms-player-simple-mpv (0 1 7))) "EMMS players and stream lists of Japan radio stations" tar ((:commit . "f6b37f5878c741124d5fca43c5b80af873541edd") (:keywords "emms" "mpv" "radio") (:url . "https://github.com/momomo5717/emms-player-mpv-jp-radios"))]) + (emms-player-simple-mpv . [(20180316 1549) ((emacs (24)) (cl-lib (0 5)) (emms (4 0))) "An extension of emms-player-simple.el for mpv JSON IPC" tar ((:commit . "101d120ccdee1c2c213fd2f0423c858b21649c00") (:authors ("momomo5717")) (:maintainer "momomo5717") (:keywords "emms" "mpv") (:url . "https://github.com/momomo5717/emms-player-simple-mpv"))]) + (emms-soundcloud . [(20131221 1145) ((emms (20131016)) (json (1 2))) "EMMS source for Soundcloud audio sharing platform" single ((:commit . "87e5cbf9609d1f26c24dc834fdeb78b33d453c2b") (:authors ("Ozan Sener" . "ozan@ozansener.com")) (:maintainer "Ozan Sener" . "ozan@ozansener.com") (:keywords "emms" "soundcloud") (:url . "http://github.com/osener/emms-soundcloud"))]) + (emms-state . [(20160504 805) ((emms (0))) "Display track description and playing time in the mode line" single ((:commit . "77930300222333b71eafd495cc1fee3a3585eb23") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "emms") (:url . "https://github.com/alezost/emms-state.el"))]) + (emoji-cheat-sheet-plus . [(20200202 1404) ((emacs (24)) (helm (1 6 4))) "emoji-cheat-sheet for emacs" tar ((:commit . "ffcc84d7060dfa000148e7f8be4fd6701593a74f") (:authors ("Sylvain Benner (based on the work of Shingo Fukuyama)")) (:maintainer "Sylvain Benner (based on the work of Shingo Fukuyama)") (:keywords "emacs" "emoji") (:url . "https://github.com/syl20bnr/emacs-emoji-cheat-sheet-plus"))]) + (emoji-display . [(20140117 1013) nil "emoji displaying module" single ((:commit . "bb4217f6400151a9cfa6d4524b8427f01feb5193") (:authors ("Kazuhiro Ito" . "kzhr@d1.dion.ne.jp")) (:maintainer "Kazuhiro Ito" . "kzhr@d1.dion.ne.jp") (:keywords "emoji") (:url . "https://github.com/ikazuhiro/emoji-display"))]) + (emoji-fontset . [(20160726 1924) nil "Set font face for Emoji." single ((:commit . "8f159e8073b9b57a07a54b549df687424eeb98ee") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "emoji" "font" "config"))]) + (emoji-github . [(20200825 425) ((emacs (24 4)) (emojify (1 0)) (request (0 3 0))) "Display list of GitHub's emoji. (cheat sheet)" single ((:commit . "d512c2babb412820945444c6daf309b470e2eb12") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/emoji-github"))]) + (emoji-recall . [(20160723 2208) ((emacs (24))) "How many emoji can you recall from memory?" tar ((:commit . "d9122f8fb1467309260109a1985cd14f18fdf631") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "game") (:url . "https://github.com/lujun9972/emoji-recall.el"))]) + (emojify . [(20210108 1111) ((seq (1 11)) (ht (2 0)) (emacs (24 3))) "Display emojis in Emacs" tar ((:commit . "1b726412f19896abf5e4857d4c32220e33400b55") (:authors ("Iqbal Ansari" . "iqbalansari02@yahoo.com")) (:maintainer "Iqbal Ansari" . "iqbalansari02@yahoo.com") (:keywords "multimedia" "convenience") (:url . "https://github.com/iqbalansari/emacs-emojify"))]) + (emojify-logos . [(20180814 917) ((emojify (0 4))) "Add logos to emojify" tar ((:commit . "a3e78bcbdf863092d4c9b026ac08bf7d1c7c0e8b") (:authors ("mxgoldstein" . "m_goldstein@gmx.net")) (:maintainer "mxgoldstein" . "m_goldstein@gmx.net") (:url . "https://github.com/mxgoldstein/emojify-logos"))]) + (empos . [(20151011 1916) nil "Locate bibtex citations from within emacs" single ((:commit . "7b99ad30e56937adb7e6349777e5a2045597d564") (:authors ("Dimitris Alikaniotis <da352 [at] cam.ac.uk>")) (:maintainer "Dimitris Alikaniotis <da352 [at] cam.ac.uk>") (:keywords "citations" "reference" "bibtex" "reftex") (:url . "http://github.com/dimalik/empos/"))]) + (emr . [(20210301 213) ((s (1 3 1)) (dash (1 2 0)) (cl-lib (0 2)) (popup (0 5 0)) (emacs (24 1)) (list-utils (0 3 0)) (paredit (24 0 0)) (projectile (0 9 1)) (clang-format (0 0 1)) (iedit (0 97))) "Emacs refactoring system." tar ((:commit . "648c2e87516fac37b84fd9bc34a6362d2a9001e2") (:authors ("Chris Barrett" . "chris.d.barrett@me.com")) (:maintainer "Chris Barrett" . "chris.d.barrett@me.com") (:keywords "tools" "convenience" "refactoring") (:url . "https://github.com/Wilfred/emacs-refactor"))]) + (enclose . [(20121008 1614) nil "Enclose cursor within punctuation pairs." tar ((:commit . "2747653e84af39017f503064bc66ed1812a77259") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "speed" "convenience") (:url . "http://github.com/rejeep/enclose"))]) + (encourage-mode . [(20151128 905) ((emacs (24 4))) "Encourages you in your work. :D" single ((:commit . "99edacf2d94d168d3da0609860dc7253db7c9815") (:authors ("Patrick Mosby" . "patrick@schreiblogade.de")) (:maintainer "Patrick Mosby" . "patrick@schreiblogade.de") (:keywords "fun") (:url . "https://github.com/halbtuerke/encourage-mode.el"))]) + (engine-mode . [(20200611 1825) ((cl-lib (0 5))) "Define and query search engines from within Emacs." single ((:commit . "e0910f141f2d37c28936c51c3c8bb8a9ca0c01d1") (:authors ("Harry R. Schwartz" . "hello@harryrschwartz.com")) (:maintainer "Harry R. Schwartz" . "hello@harryrschwartz.com") (:url . "https://github.com/hrs/engine-mode"))]) + (enh-ruby-mode . [(20210120 201) ((emacs (24 3))) "Major mode for editing Ruby files" tar ((:commit . "e960bf941d9fa9d92eabf7c03a8bbb51ba1ac453") (:authors ("Geoff Jacobsen")) (:maintainer "Ryan Davis") (:keywords "languages" "elisp" "ruby") (:url . "http://github.com/zenspider/Enhanced-Ruby-Mode"))]) + (enlightened-theme . [(20210220 2327) nil "A theme based on enlightened" single ((:commit . "1bfebd8f47e8a8357c9e557cf6e95d7027861e6d") (:url . "https://hg.sr.ht/~slondr/enlightened"))]) + (enlive . [(20170725 1417) nil "query html document with css selectors" single ((:commit . "604a8ca272b6889f114e2b5a13adb5b1dc4bae86") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainer "ZHOU Feng" . "zf.pascal@gmail.com") (:keywords "css" "selector" "query") (:url . "http://github.com/zweifisch/enlive"))]) + (eno . [(20191013 1239) ((dash (2 12 1)) (edit-at-point (1 0))) "Goto/copy/cut any word/symbol/line in view, similar to ace-jump/easymotion" single ((:commit . "c5c6193687c0bede1ddf507c430cf8b0a6d272d9") (:authors (nil . "<e.enoson@gmail.com>")) (:maintainer nil . "<e.enoson@gmail.com>") (:url . "http://github.com/enoson/eno.el"))]) + (enotify . [(20130407 1348) nil "A networked notification system for emacs" tar ((:commit . "7fd2f48ef4ff32c8f013c634ea2dd6b1d1409f80") (:authors ("Alessandro Piras" . "laynor@gmail.com")) (:maintainer "Alessandro Piras" . "laynor@gmail.com") (:keywords "tools"))]) + (envrc . [(20210516 2143) ((seq (2)) (emacs (24 4)) (inheritenv (0 1))) "Support for `direnv' that operates buffer-locally" single ((:commit . "8a9a142cf9d35e62a70d9d100a946f78fe0b066a") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "processes" "tools") (:url . "https://github.com/purcell/envrc"))]) + (eopengrok . [(20200205 624) ((s (1 9 0)) (dash (2 10 0)) (magit (2 1 0)) (cl-lib (0 5))) "opengrok interface for emacs" single ((:commit . "6fa16c4ccaaebaef64dca0d3d29904c45fd6597d") (:authors ("Youngjoo Lee" . "youngker@gmail.com")) (:maintainer "Youngjoo Lee" . "youngker@gmail.com") (:keywords "tools"))]) + (epc . [(20140610 534) ((concurrent (0 3 1)) (ctable (0 1 2))) "A RPC stack for the Emacs Lisp" tar ((:commit . "e1bfa5ca163273859336e3cc89b4b6460f7f8cda") (:authors ("SAKURAI Masashi <m.sakurai at kiwanami.net>")) (:maintainer "SAKURAI Masashi <m.sakurai at kiwanami.net>") (:keywords "lisp" "rpc") (:url . "https://github.com/kiwanami/emacs-epc"))]) + (epic . [(20170210 23) ((htmlize (1 47))) "Evernote Picker for Cocoa Emacs" single ((:commit . "a41826c330eb0ea061d58a08cc861b0c4ac8ec4e") (:authors ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainer "Yoshinari Nomura" . "nom@quickhack.net") (:keywords "evernote" "applescript") (:url . "https://github.com/yoshinari-nomura/epic"))]) + (eping . [(20201027 2149) ((emacs (25 1))) "Ping websites to check internet connectivity" tar ((:commit . "99d3a4b6973d5b09864e0af7425a61f99c19b90a") (:authors ("Sean Hutchings" . "seanhut@yandex.com")) (:maintainer "Sean Hutchings" . "seanhut@yandex.com") (:keywords "comm" "processes" "terminals" "unix") (:url . "https://github.com/sean-hut/eping"))]) + (epkg . [(20210530 1147) ((closql (1 0 5)) (emacs (25 1))) "browse the Emacsmirror package database" tar ((:commit . "8ee60b65bff02ef606d489b83e2def9922e9623d") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "tools") (:url . "https://github.com/emacscollective/epkg"))]) + (epl . [(20180205 2049) ((cl-lib (0 3))) "Emacs Package Library" single ((:commit . "78ab7a85c08222cd15582a298a364774e3282ce6") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "convenience") (:url . "http://github.com/cask/epl"))]) + (epm . [(20190509 443) ((emacs (24 3)) (epl (0 8))) "Emacs Package Manager" tar ((:commit . "6375ddbf93c5f25647f6ebb25b54045b3c93a5be") (:authors ("Chunyang Xu" . "xuchunyang.me@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang.me@gmail.com") (:url . "https://github.com/xuchunyang/epm"))]) + (epresent . [(20160411 201) ((org (8)) (cl-lib (0 5))) "Simple presentation mode for Emacs Org-mode" single ((:commit . "6c8abedcf46ff08091fa2bba52eb905c6290057d") (:keywords "gui") (:url . "https://github.com/dakrone/epresent"))]) + (eprime-mode . [(20140513 1816) nil "An E-prime checking mode for Emacs" single ((:commit . "17a481af26496be91c07139a9bfc05cfe722506f") (:authors ("Andrew Hynes" . "andrewhynes@openmailbox.org")) (:maintainer "Andrew Hynes" . "andrewhynes@openmailbox.org") (:keywords "e-prime" "english" "grammar") (:url . "https://github.com/AndrewHynes/eprime-mode"))]) + (eproject . [(20180312 1642) ((helm (1 6 4))) "assign files to projects, programatically" tar ((:commit . "068218d2cf2138cb2e8fc29b57e773a0097a7e8b") (:authors ("Jonathan Rockway" . "jon@jrock.us")) (:maintainer "Jonathan Rockway" . "jon@jrock.us") (:keywords "programming" "projects"))]) + (equake . [(20200824 1549) ((emacs (26 1)) (dash (2 14 1))) "Drop-down console for (e)shell & terminal emulation" single ((:commit . "b0a5e334a7ccf69b837656c8a91c2e9e254e4c76") (:authors ("Benjamin Slade" . "slade@jnanam.net")) (:maintainer "Benjamin Slade" . "slade@jnanam.net") (:keywords "convenience" "frames" "terminals" "tools" "window-system") (:url . "https://gitlab.com/emacsomancer/equake"))]) + (eradio . [(20210327 1000) ((emacs (24 1))) "A simple Internet radio player" single ((:commit . "47769986c79def84307921f0277e9bb2714756c2") (:authors ("Olav Fosse" . "mail@olavfosse.no")) (:maintainer "Olav Fosse" . "mail@olavfosse.no") (:url . "https://github.com/fossegrim/eradio"))]) + (erblint . [(20200622 5) ((emacs (24))) "An interface for checking HTML ERB files using Erblint" single ((:commit . "89af42f776d8dc656104322edaace2ede7499932") (:authors ("Leonardo Santos")) (:maintainer "Leonardo Santos") (:keywords "project" "convenience") (:url . "https://github.com/leodcs/erblint-emacs"))]) + (erc-colorize . [(20170107 1339) nil "Per user colorization of whole message" single ((:commit . "d026a016dcb9d63d9ac66d30627a92a8f1681bbd") (:authors ("Sylvain Rousseau <thisirs at gmail dot com>")) (:maintainer "Sylvain Rousseau <thisirs at gmail dot com>") (:keywords "erc" "convenience") (:url . "https://github.com/thisirs/erc-colorize.git"))]) + (erc-crypt . [(20200516 2054) ((cl-lib (0 5))) "Symmetric Encryption for ERC" single ((:commit . "be87248435509f83c56a7f08ac9bcbbd3b20d780") (:authors ("xristos" . "xristos@sdf.org")) (:maintainer "xristos" . "xristos@sdf.org") (:keywords "comm") (:url . "https://github.com/atomontage/erc-crypt"))]) + (erc-hl-nicks . [(20200317 16) nil "ERC nick highlighter that ignores uniquifying chars when colorizing" single ((:commit . "a67fe361c8f2aa20fc235447fbb898f424b51439") (:authors ("David Leatherman" . "leathekd@gmail.com")) (:maintainer "David Leatherman" . "leathekd@gmail.com") (:url . "http://www.github.com/leathekd/erc-hl-nicks"))]) + (erc-image . [(20210604 753) nil "Show received image urls in the ERC buffer" single ((:commit . "883084f0801d46a5ccf183e51ae9a734755bbb97") (:authors ("Jon de Andrés Frías" . "jondeandres@gmail.com") ("Raimon Grau Cuscó" . "raimonster@gmail.com")) (:maintainer "Jon de Andrés Frías" . "jondeandres@gmail.com") (:keywords "multimedia"))]) + (erc-matterircd . [(20201029 2321) ((emacs (27 1))) "Integrate matterircd with ERC" single ((:commit . "d46f55909f1c229fd84f409ef992a7a463719893") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/erc-matterircd"))]) + (erc-scrolltoplace . [(20180608 606) ((emacs (24 0)) (switch-buffer-functions (0 0 1))) "An Erc module to scrolltobottom better with keep-place" single ((:commit . "38cfd0c2e2f5f6533b217189c3afaf6640b5602e") (:authors ("Jay Kamat" . "jaygkamat@gmail.com")) (:maintainer "Jay Kamat" . "jaygkamat@gmail.com") (:keywords "erc" "module" "comm" "scrolltobottom" "keep-place") (:url . "http://gitlab.com/jgkamat/erc-scrolltoplace"))]) + (erc-social-graph . [(20150508 1204) nil "A social network graph module for ERC." single ((:commit . "e6ef3416a1c5064054bf054d9f0c1c7bf54a9cd0") (:authors ("Vibhav Pant" . "vibhavp@gmail.com")) (:maintainer "Vibhav Pant" . "vibhavp@gmail.com") (:keywords "erc" "graph") (:url . "https://github.com/vibhavp/erc-social-graph"))]) + (erc-terminal-notifier . [(20140115 1024) nil "OSX notifications via the terminal-notifier gem for Emacs ERC." single ((:commit . "a3dacb935845e4a20031212bbd82b2170f68d2a8") (:authors ("Julien Blanchard" . "julien@sideburns.eu")) (:maintainer "Julien Blanchard" . "julien@sideburns.eu") (:keywords "erc" "terminal-notifier" "nick") (:url . "http://github.com/julienXX/"))]) + (erc-track-score . [(20130328 1215) nil "Add score support to tracked channel buffers" single ((:commit . "5b27531ea6b1a4c4b703b270dfa9128cb5bfdaa3") (:authors ("Julien Danjou" . "julien@danjou.info")) (:maintainer "Julien Danjou" . "julien@danjou.info") (:url . "http://julien.danjou.info/erc-track-score.html"))]) + (erc-tweet . [(20150920 1258) nil "shows text of a tweet when an url is posted in erc buffers" single ((:commit . "91fed61e139fa788d66a7358f0d50acc896414b8") (:authors ("Raimon Grau" . "raimonster@gmail.com")) (:maintainer "Raimon Grau" . "raimonster@gmail.com") (:keywords "extensions"))]) + (erc-twitch . [(20170427 606) ((json (1 3)) (erc (5 0))) "Support for Twitch emotes for ERC." single ((:commit . "53c6af0cb72e56d897d30a40e7e5066668d6b5ec") (:authors ("Vibhav Pant" . "vibhavp@gmail.com")) (:maintainer "Vibhav Pant" . "vibhavp@gmail.com") (:keywords "twitch" "erc" "emotes") (:url . "https://github.com/vibhavp/erc-twitch"))]) + (erc-view-log . [(20140227 2039) nil "Major mode for viewing ERC logs" single ((:commit . "c5a25f0cbca84ed2e4f72068c02b66bd0ea3b266") (:authors ("Antoine Levitt") ("Thomas Riccardi" . "riccardi.thomas@gmail.com")) (:maintainer "Antoine Levitt") (:keywords "erc" "viewer" "logs" "colors") (:url . "http://github.com/Niluge-KiWi/erc-view-log/raw/master/erc-view-log.el"))]) + (erc-yank . [(20210220 1815) nil "Automagically create a Gist if pasting more than 5 lines" single ((:commit . "55d96f18c5df9d8fce51fa073d7a12c47a46ac80") (:authors ("John Wiegley" . "jwiegley@gmail.com")) (:maintainer "John Wiegley" . "jwiegley@gmail.com") (:keywords "comm" "erc" "chat" "irc" "yank" "gist") (:url . "https://github.com/jwiegley/erc-yank"))]) + (erc-youtube . [(20150603 2136) nil "Show info about a YouTube URL in an ERC buffer." single ((:commit . "97054ba8475b442e2aa81e5a291f668b7f28697f") (:authors ("Raimon Grau Cuscó" . "raimonster@gmail.com")) (:maintainer "Raimon Grau Cuscó" . "raimonster@gmail.com") (:keywords "multimedia"))]) + (erc-yt . [(20150426 1249) ((dash (2 10 0))) "An erc module to display youtube links nicely" single ((:commit . "43e7d49325b17a3217a6ffb4a9daf75c5ff4e6f8") (:authors ("William Stevenson" . "yhvh2000@gmail.com")) (:maintainer "William Stevenson" . "yhvh2000@gmail.com") (:keywords "multimedia"))]) + (ercn . [(20150523 1503) nil "Flexible ERC notifications" single ((:commit . "79a4df5609046ae2e2e3375998287be6dda80615") (:authors ("David Leatherman" . "leathekd@gmail.com")) (:maintainer "David Leatherman" . "leathekd@gmail.com") (:url . "http://www.github.com/leathekd/ercn"))]) + (ereader . [(20170810 501) ((emacs (24 4)) (dash (2 12 1)) (s (1 10 0)) (xml+ (0 0 0))) "Major mode for reading ebooks with org-mode integration" tar ((:commit . "f3bbd3f13195f8fba3e3c880aab0e4c60430dcf3") (:authors ("Ben Dean" . "bendean837@gmail.com")) (:maintainer "Ben Dean" . "bendean837@gmail.com") (:keywords "epub" "ebook") (:url . "https://github.com/bddean/emacs-ereader"))]) + (eredis . [(20181119 131) ((dash (0))) "eredis, a Redis client in emacs lisp" single ((:commit . "bc86b9f63a3e7a5eb263875030d0e15d6f5f6e37") (:authors ("Justin Heyes-Jones" . "justinhj@gmail.com")) (:maintainer "Justin Heyes-Jones" . "justinhj@gmail.com") (:keywords "redis" "api" "tools" "org") (:url . "http://github.com/justinhj/eredis/"))]) + (erefactor . [(20200513 1252) ((cl-lib (0 3))) "Emacs-Lisp refactoring utilities" single ((:commit . "bfe27a1b8c7cac0fe054e76113e941efa3775fe8") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "extensions" "tools" "maint") (:url . "https://github.com/mhayashi1120/Emacs-erefactor"))]) + (ergoemacs-mode . [(20210402 1642) ((emacs (24 1)) (undo-tree (0 6 5)) (cl-lib (0 5))) "Emacs mode based on common modern interface and ergonomics." tar ((:commit . "f9d6e3f7d99b877a63fa6f5ab61e6ba05a7075c8") (:authors ("Xah Lee" . "xah@xahlee.org") ("David Capello" . "davidcapello@gmail.com") ("Matthew L. Fidler" . "matthew.fidler@gmail.com")) (:maintainer "Matthew L. Fidler" . "matthew.fidler@gmail.com") (:keywords "convenience") (:url . "https://github.com/ergoemacs/ergoemacs-mode"))]) + (ergoemacs-status . [(20160318 538) ((powerline (2 3)) (mode-icons (0 1 0))) "Adaptive Status Bar / Mode Line" single ((:commit . "d952cc2361adf6eb4d6af60950ad4ab699c81320") (:authors ("Matthew Fidler")) (:maintainer "Matthew Fidler"))]) + (eri . [(20200914 644) nil "Enhanced relative indentation (eri)" single ((:commit . "044843c5281a7bdb9479317793a75c8c0fcfadd9") (:url . "https://github.com/agda/agda"))]) + (erlang . [(20210315 1640) ((emacs (24 1))) "Erlang major mode" tar ((:commit . "90f96056086b4a2051dd85a4dda116fcbb498470") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "erlang" "languages" "processes"))]) + (erlstack-mode . [(20210419 1917) ((emacs (25 1)) (dash (2 12 0))) "Minor mode for analysing Erlang stacktraces" single ((:commit . "ca264bca24cdaa8b2bac57882716f03f633e42b0") (:authors ("k32")) (:maintainer "k32") (:keywords "tools" "erlang") (:url . "https://github.com/k32/erlstack-mode"))]) + (eros . [(20180415 618) ((emacs (24 4))) "Evaluation Result OverlayS for Emacs Lisp" single ((:commit . "dd8910279226259e100dab798b073a52f9b4233a") (:authors ("Tianxiang Xiong" . "tianxiang.xiong@gmail.com")) (:maintainer "Tianxiang Xiong" . "tianxiang.xiong@gmail.com") (:keywords "convenience" "lisp") (:url . "https://github.com/xiongtx/eros"))]) + (ert-async . [(20200105 1031) ((emacs (24 1))) "Async support for ERT" single ((:commit . "948cf2faa10e085bda3739034ca5ea1912893433") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "lisp" "test") (:url . "http://github.com/rejeep/ert-async.el"))]) + (ert-expectations . [(20121009 734) nil "The simplest unit test framework in the world" single ((:commit . "aed70e002c4305b66aed7f6d0d48e9addd2dc1e6") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "test" "unittest" "ert" "expectations") (:url . "http://www.emacswiki.org/emacs/download/ert-expectations.el"))]) + (ert-junit . [(20190802 2232) ((ert (0)) (emacs (23 4))) "JUnit XML reports from ert results" single ((:commit . "65f91c35b088b87943dbbbe7e1ce354bc9bc0992") (:authors ("Ola Nilsson" . "ola.nilsson@gmail.com")) (:maintainer "Ola Nilsson" . "ola.nilsson@gmail.com") (:keywords "tools" "test" "unittest" "ert") (:url . "http://bitbucket.org/olanilsson/ert-junit"))]) + (ert-modeline . [(20140115 1015) ((s (1 3 1)) (dash (1 2 0)) (emacs (24 1)) (projectile (0 9 1))) "displays ert test results in the modeline." single ((:commit . "e7be2b81191afb437b70368a819770f8f750e4af") (:authors ("Chris Barrett" . "chris.d.barrett@me.com")) (:maintainer "Chris Barrett" . "chris.d.barrett@me.com") (:keywords "tools" "tests" "convenience"))]) + (ert-runner . [(20201005 2336) ((s (1 6 1)) (dash (1 8 0)) (f (0 10 0)) (commander (0 2 0)) (ansi (0 1 0)) (shut-up (0 1 0))) "Opinionated Ert testing workflow" tar ((:commit . "c3969c86b5b00087d8b2fcb7147481d5be56f2f7") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "test") (:url . "http://github.com/rejeep/ert-runner.el"))]) + (es-lib . [(20141111 1830) ((cl-lib (0 3))) "A collection of emacs utilities" tar ((:commit . "753b27363e39c10edc9e4e452bdbbbe4d190df4a") (:authors ("sabof")) (:maintainer "sabof") (:url . "https://github.com/sabof/es-lib"))]) + (es-mode . [(20201125 2059) ((dash (2 11 0)) (cl-lib (0 5)) (spark (1 0)) (s (1 11 0)) (request (0 3 0))) "A major mode for editing and executing Elasticsearch queries" tar ((:commit . "cde5cafcbbbd57db6d38ae7452de626305bba68d") (:authors ("Lee Hinman" . "lee@writequit.org")) (:maintainer "Lee Hinman" . "lee@writequit.org") (:keywords "elasticsearch") (:url . "http://www.github.com/dakrone/es-mode"))]) + (es-windows . [(20140211 904) ((cl-lib (0 3)) (emacs (24))) "Window-management utilities" single ((:commit . "239e30408cb1adb4bc8bd63e2df34711fa910b4f") (:authors ("sabof")) (:maintainer "sabof") (:url . "https://github.com/sabof/es-windows"))]) + (esa . [(20180403 1525) ((cl-lib (0 5))) "Interface to esa.io" single ((:commit . "417e0ac55abe9b17e0b7165d0df26bc018aff42e") (:authors ("Nab Inno" . "nab@blahfe.com")) (:maintainer "Nab Inno" . "nab@blahfe.com") (:keywords "tools" "esa") (:url . "https://github.com/nabinno/esa.el"))]) + (esh-autosuggest . [(20210224 2242) ((emacs (24 4)) (company (0 9 4))) "History autosuggestions for eshell" single ((:commit . "30203fc7b8b63a489f34f74ca8b041bf61f4358f") (:authors ("Diego A. Mundo" . "dieggsy@pm.me")) (:maintainer "Diego A. Mundo" . "dieggsy@pm.me") (:keywords "completion" "company" "matching" "convenience" "abbrev") (:url . "http://github.com/dieggsy/esh-autosuggest"))]) + (esh-buf-stack . [(20140107 1018) nil "Add a buffer stack feature to Eshell" single ((:commit . "ce0ea5aadca3150eaa9d2e6ec20296add4e99176") (:authors ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainer "Tomoya Tanjo" . "ttanjo@gmail.com") (:keywords "eshell" "extensions"))]) + (esh-help . [(20190905 22) ((dash (1 4 0))) "Add some help functions and support for Eshell" single ((:commit . "417673ed18a983930a66a6692dbfb288a995cb80") (:authors ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainer "Tomoya Tanjo" . "ttanjo@gmail.com") (:keywords "eshell" "extensions") (:url . "https://github.com/tom-tan/esh-help/"))]) + (eshell-autojump . [(20201117 235) nil "autojump command for Eshell" single ((:commit . "c1056bfc6b46646ae1e606247689fef9aee621af") (:authors ("Alex Schroeder")) (:maintainer "Yen-Chin, Lee" . "coldnew.tw@gmail.com") (:url . "http://github.com/coldnew/eshell-autojump"))]) + (eshell-bookmark . [(20170922 1514) ((emacs (24 3))) "Integrate bookmarks with eshell." single ((:commit . "99a491c77e27ecc4626bdd4ad453ac71aa2654d4") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "convenience" "files") (:url . "https://github.com/Fuco1/eshell-bookmark"))]) + (eshell-did-you-mean . [(20150915 1952) ((emacs (24 1)) (cl-lib (0 5))) "command not found (\"did you mean…\" feature) in Eshell" single ((:commit . "7cb6ef8e2274d0a50a9e114d412307a6543533d5") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:keywords "eshell") (:url . "https://github.com/xuchunyang/eshell-did-you-mean"))]) + (eshell-fixed-prompt . [(20190111 2235) ((emacs (25)) (s (1 11 0))) "Restrict eshell to a single fixed prompt" single ((:commit . "2c860029354bf1f69edc1f12e4a0d9aeb9054f5d") (:authors ("Tijs Mallaerts" . "tijs.mallaerts@gmail.com")) (:maintainer "Tijs Mallaerts" . "tijs.mallaerts@gmail.com"))]) + (eshell-fringe-status . [(20170117 2316) nil "Show last status in fringe" single ((:commit . "adc6997c68e39c0d52a2af1b2fd5cf2057783797") (:authors ("Tom Willemse" . "tom@ryuslash.org")) (:maintainer "Tom Willemse" . "tom@ryuslash.org") (:url . "http://projects.ryuslash.org/eshell-fringe-status/"))]) + (eshell-git-prompt . [(20200109 2250) ((emacs (24 1)) (cl-lib (0 5)) (dash (2 11 0))) "Some Eshell prompt for Git users" single ((:commit . "48ee35774c9b8d0e2d96110e3ae84bac60f43dfd") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:keywords "eshell" "git") (:url . "https://github.com/xuchunyang/eshell-git-prompt"))]) + (eshell-outline . [(20201121 620) ((emacs (25 1))) "Enhanced outline-mode for Eshell" single ((:commit . "6f917afa5b3d36764d76d7864589094647d8c3b4") (:authors ("Jamie Beardslee" . "jdb@jamzattack.xyz")) (:maintainer "Jamie Beardslee" . "jdb@jamzattack.xyz") (:keywords "unix" "eshell" "outline" "convenience") (:url . "https://git.jamzattack.xyz/eshell-outline"))]) + (eshell-prompt-extras . [(20201115 440) ((emacs (25))) "Display extra information for your eshell prompt." single ((:commit . "d7d874ce3da3ae55a42f669aca723a8774c8292c") (:authors ("zwild" . "judezhao@outlook.com")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:keywords "eshell" "prompt") (:url . "https://github.com/zwild/eshell-prompt-extras"))]) + (eshell-syntax-highlighting . [(20210429 413) ((emacs (25 1))) "Highlight eshell commands" single ((:commit . "32d2568ebeb42553a30dda77e03c0e2ec8854199") (:authors ("Alex Kreisher" . "akreisher18@gmail.com")) (:maintainer "Alex Kreisher" . "akreisher18@gmail.com") (:keywords "convenience") (:url . "https://github.com/akreisher/eshell-syntax-highlighting"))]) + (eshell-toggle . [(20210407 2039) ((emacs (25 1)) (dash (2 11 0))) "Show/hide eshell under active window." single ((:commit . "7160518ca56444fead841b8acff59aeffc7cebb3") (:authors ("Dmitry Cherkassov" . "dcherkassov@gmail.com")) (:maintainer "Dmitry Cherkassov" . "dcherkassov@gmail.com") (:keywords "processes") (:url . "https://github.com/4da/eshell-toggle"))]) + (eshell-up . [(20170425 1737) ((emacs (24))) "Quickly go to a specific parent directory in eshell" single ((:commit . "ff84e6069b98f2ed00857a0f78bff19d96e4955c") (:authors ("Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com")) (:maintainer "Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com") (:keywords "eshell") (:url . "https://github.com/peterwvj/eshell-up"))]) + (eshell-z . [(20191116 333) ((cl-lib (0 5))) "cd to frequent directory in eshell" single ((:commit . "337cb241e17bd472bd3677ff166a0800f684213c") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:keywords "convenience") (:url . "https://github.com/xuchunyang/eshell-z"))]) + (eslint-fix . [(20180514 700) nil "Fix JavaScript files using ESLint" single ((:commit . "f81f3b47a47460611fbdbdae1d23275ec78f2f8d") (:authors ("Neri Marschik" . "marschik_neri@cyberagent.co.jp")) (:maintainer "Neri Marschik" . "marschik_neri@cyberagent.co.jp") (:keywords "tools" "javascript" "eslint" "lint" "formatting" "style") (:url . "https://github.com/codesuki/eslint-fix"))]) + (eslintd-fix . [(20210513 425) ((dash (2 12 0)) (emacs (26 3))) "use eslint_d to automatically fix js files" single ((:commit . "5488db4436fc312386fdb123289d7fc5f099702b") (:authors ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Aaron Jensen" . "aaronjensen@gmail.com") (:url . "https://github.com/aaronjensen/eslintd-fix"))]) + (esonify . [(20190110 1621) ((deferred (0 3 1)) (cl-lib (0 5))) "Sonify your code" tar ((:commit . "bdc79d4ab2e3c449b5bef46e5cabc552beeed5c6") (:authors ("Oliver Flatt" . "oflatt@gmail.com")) (:maintainer "Oliver Flatt" . "oflatt@gmail.com") (:url . "https://github.com/oflatt/esonify"))]) + (espotify . [(20210405 1808) ((emacs (26 1))) "Spotify access library" single ((:commit . "3d62a3319ab03a810030058d3fb368b28dfd82d5") (:authors ("Jose A Ortega Ruiz" . "jao@gnu.org")) (:maintainer "Jose A Ortega Ruiz") (:keywords "multimedia") (:url . "https://codeberg.org/jao/espotify"))]) + (espresso-theme . [(20210505 1957) nil "Espresso Tutti Colori port for Emacs" single ((:commit . "580f673729f02aa07070c5300bedf24733d56e74") (:authors ("Martin Kühl <purl.org/net/mkhl>")) (:maintainer "Martin Kühl <purl.org/net/mkhl>") (:url . "https://github.com/dgutov/espresso-theme"))]) + (espuds . [(20160905 1300) ((s (1 7 0)) (dash (2 2 0)) (f (0 12 1))) "Ecukes step definitions" single ((:commit . "78fc53feaf77a98d63894cd410faee2a18107b00") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "test") (:url . "http://github.com/ecukes/espuds"))]) + (espy . [(20200317 2333) ((emacs (24))) "Emacs Simple Password Yielder" single ((:commit . "2c01be937a5e5bde62921684a0b27300705fb4e0") (:authors ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainer "Sebastian Wålinder" . "s.walinder@gmail.com") (:keywords "convenience") (:url . "https://github.com/walseb/espy"))]) + (esqlite . [(20151206 1206) ((pcsv (1 3 3))) "Manipulate sqlite file from Emacs" single ((:commit . "08a779a821f8d32c1a1985d8d9eb6cf21646ce2e") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "data") (:url . "https://github.com/mhayashi1120/Emacs-esqlite"))]) + (esqlite-helm . [(20151116 850) ((esqlite (0 2 0)) (helm (20131207 845))) "Define helm source for sqlite database" single ((:commit . "08a779a821f8d32c1a1985d8d9eb6cf21646ce2e") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "data") (:url . "https://github.com/mhayashi1120/Emacs-esqlite"))]) + (ess . [(20210520 2146) ((emacs (25 1))) "Emacs Speaks Statistics" tar ((:commit . "f62f460e3c55e5e7ad5941225e7884b0e1656131") (:authors ("David Smith" . "dsmith@stats.adelaide.edu.au") ("A.J. Rossini" . "blindglobe@gmail.com") ("Richard M. Heiberger" . "rmh@temple.edu") ("Kurt Hornik" . "Kurt.Hornik@R-project.org") ("Martin Maechler" . "maechler@stat.math.ethz.ch") ("Rodney A. Sparapani" . "rsparapa@mcw.edu") ("Stephen Eglen" . "stephen@gnu.org") ("Sebastian P. Luque" . "spluque@gmail.com") ("Henning Redestig" . "henning.red@googlemail.com") ("Vitalie Spinu" . "spinuvit@gmail.com") ("Lionel Henry" . "lionel.hry@gmail.com") ("J. Alexander Branham" . "alex.branham@gmail.com")) (:maintainer "ESS Core Team" . "ESS-core@r-project.org") (:url . "https://ess.r-project.org/"))]) + (ess-R-data-view . [(20130509 1158) ((ctable (20130313 1743)) (popup (20130324 1305)) (ess (20130225 1754))) "Data viewer for GNU R" single ((:commit . "d6e98d3ae1e2a2ea39a56eebcdb73e99d29562e9") (:authors ("myuhe <yuhei.maeda_at_gmail.com>")) (:maintainer "myuhe") (:keywords "convenience") (:url . "https://github.com/myuhe/ess-R-data-view.el"))]) + (ess-r-insert-obj . [(20200916 843) ((emacs (26 1)) (ess (18 10 1))) "Insert objects in ESS-R" single ((:commit . "f6731eb26dc0fc5b7ca1fa881a5f9100f8fcf494") (:authors ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainer "Shuguang Sun" . "shuguang79@qq.com") (:keywords "tools") (:url . "https://github.com/ShuguangSun/ess-r-insert-obj"))]) + (ess-smart-equals . [(20210411 1333) ((emacs (25 1)) (ess (18 10))) "flexible, context-sensitive assignment key for R/S" single ((:commit . "fea9eea4b59c3e9559b379508e3500076ca99ef1") (:authors ("Christopher R. Genovese" . "genovese@cmu.edu")) (:maintainer "Christopher R. Genovese" . "genovese@cmu.edu") (:keywords "r" "s" "ess" "convenience") (:url . "https://github.com/genovese/ess-smart-equals"))]) + (ess-smart-underscore . [(20190309 101) ((ess (0))) "Ess Smart Underscore" tar ((:commit . "aa871c5b0448515db439ea9bed6a8574e82ddb47") (:authors ("Matthew L. Fidler")) (:maintainer "Matthew Fidler") (:keywords "ess" "underscore") (:url . "http://github.com/mlf176f2/ess-smart-underscore.el"))]) + (ess-view . [(20181001 1730) ((ess (15)) (s (1 8 0)) (f (0 16 0))) "View R dataframes in a spreadsheet software" single ((:commit . "925cafd876e2cc37bc756bb7fcf3f34534b457e2") (:authors ("Bocci Gionata" . "boccigionata@gmail.com")) (:maintainer "Bocci Gionata" . "boccigionata@gmail.com") (:keywords "extensions" "ess") (:url . "https://github.com/GioBo/ess-view"))]) + (ess-view-data . [(20210603 1412) ((emacs (26 1)) (ess (18 10 1)) (csv-mode (1 12))) "View Data" single ((:commit . "845412ba57efab1a28fbaf0dcdbe76bdab03f828") (:authors ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainer "Shuguang Sun" . "shuguang79@qq.com") (:keywords "tools") (:url . "https://github.com/ShuguangSun/ess-view-data"))]) + (esup . [(20200814 1400) ((cl-lib (0 5)) (s (1 2)) (emacs (25 1))) "The Emacs StartUp Profiler (ESUP)" tar ((:commit . "5169dd7fc8765a7377b0ab93aa63b7f0f934689a") (:authors ("Joe Schafer" . "joe@jschaf.com")) (:maintainer "Serghei Iakovlev" . "egrep@protonmail.ch") (:keywords "convenience" "processes") (:url . "https://github.com/jschaf/esup"))]) + (esxml . [(20210323 1102) ((kv (0 0 5)) (cl-lib (0 5))) "Library for working with xml via esxml and sxml" tar ((:commit . "9f96449f6059cb75491dc812ddeb1b6200ec6740") (:authors ("Evan Izaksonas-Smith <izak0002 at umn dot edu>")) (:maintainer "Evan Izaksonas-Smith") (:keywords "tools" "lisp" "comm"))]) + (eta . [(20210115 1655) ((emacs (25 1)) (ht (2 2)) (dash (2 17))) "standard and multi dispatch key bind" single ((:commit . "c7540ac50163f368fec1918dfc334304d9b36c51") (:authors ("Chris Zheng")) (:maintainer "Chris Zheng") (:keywords "convenience" "usability") (:url . "https://www.github.com/zcaudate/eta"))]) + (etable . [(20161028 2009) ((dash (2 9 0)) (interval-list (0 1)) (emacs (24 4))) "Implementation of javax.swing.JTable for Emacs." tar ((:commit . "d502141f0c69bf95256ba5cb9cd15350c7e942d2") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:keywords "convenience") (:url . "https://github.com/Fuco1/ETable"))]) + (etc-sudoers-mode . [(20201102 1707) ((sudo-edit (0)) (with-editor (0))) "Edit Sudo security policies" single ((:commit . "74c66c58c9578a0d841206d5dec04d81e7b3d741") (:authors ("Peter Oliver" . "git@mavit.org.uk")) (:maintainer "Peter Oliver" . "git@mavit.org.uk") (:keywords "languages") (:url . "https://gitlab.com/mavit/etc-sudoers-mode/"))]) + (eterm-256color . [(20210224 2241) ((emacs (24 4)) (xterm-color (1 7)) (f (0 19 0))) "Customizable 256 colors for term." tar ((:commit . "c9cfccef03e730f7ab2b407aada3df15ace1fe32") (:authors ("Diego A. Mundo" . "dieggsy@pm.me")) (:maintainer "Diego A. Mundo" . "dieggsy@pm.me") (:keywords "faces") (:url . "http://github.com/dieggsy/eterm-256color"))]) + (eterm-fn . [(20191010 2331) ((term (0))) "Function keys (F1--F12) for term." tar ((:commit . "66f3b2f6308fa2ac4d8a32be5a7e35a96e08a9ee") (:authors ("Bruno Félix Rezende Ribeiro" . "oitofelix@gnu.org")) (:maintainer "Bruno Félix Rezende Ribeiro" . "oitofelix@gnu.org") (:keywords "terminals") (:url . "https://github.com/oitofelix/eterm-fn"))]) + (ethan-wspace . [(20201106 2059) nil "whitespace customizations for emacs" single ((:commit . "035c7d698c99e3891a522d6e6f8fde23c6267c15") (:authors ("Ethan Glasser-Camp" . "ethan@betacantrips.com")) (:maintainer "Ethan Glasser-Camp" . "ethan@betacantrips.com") (:keywords "whitespace" "tab" "newline" "trailing" "clean"))]) + (etherpad . [(20210401 1213) ((emacs (26 3)) (request (0 3)) (let-alist (0 0)) (websocket (1 12)) (parsec (0 1)) (0xc (0 1))) "Interface to the Etherpad API" tar ((:commit . "fc7de212b34c34d93f5f0f19af846924404e38ae") (:authors ("nik gaffney" . "nik@fo.am")) (:maintainer "nik gaffney" . "nik@fo.am") (:keywords "comm" "etherpad" "collaborative editing") (:url . "https://github.com/zzkt/ethermacs"))]) + (euslisp-mode . [(20170830 1929) ((emacs (24 3)) (s (1 9)) (exec-path-from-shell (0)) (helm-ag (0 58))) "Major mode for Euslisp-formatted text" single ((:commit . "db62a2d148482317794727982576494596365a55") (:authors ("iory" . "ab.ioryz@gmail.com")) (:maintainer "iory" . "ab.ioryz@gmail.com") (:keywords "euslisp" "euslisp" "github") (:url . "https://github.com/iory/euslisp-mode"))]) + (eval-expr . [(20120619 647) nil "enhanced eval-expression command" single ((:commit . "a0e69e83de41df8dbccefc1962ab4f02206a3328") (:authors ("Noah Friedman" . "friedman@splode.com")) (:maintainer nil . "friedman@splode.com") (:keywords "lisp" "extensions"))]) + (eval-in-repl . [(20201121 1341) ((dash (0 0 0)) (paredit (0 0 0)) (ace-window (0 0 0))) "Consistent ESS-like eval interface for various REPLs" tar ((:commit . "2abb9ccf6f08ae3a5ab504f0b3fd81ce0345b766") (:authors ("Kazuki YOSHIDA" . "kazukiyoshida@mail.harvard.edu")) (:maintainer "Kazuki YOSHIDA" . "kazukiyoshida@mail.harvard.edu") (:keywords "tools" "convenience") (:url . "https://github.com/kaz-yos/eval-in-repl"))]) + (eval-sexp-fu . [(20191128 825) ((cl-lib (0))) "Tiny functionality enhancements for evaluating sexps." single ((:commit . "36d2fe3bcf602e15ca10a7f487da103515ef391a") (:authors ("Takeshi Banse" . "takebi@laafc.net")) (:maintainer "Takeshi Banse" . "takebi@laafc.net") (:keywords "lisp" "highlight" "convenience"))]) + (evalator . [(20160213 128) ((helm-core (1 9 1))) "Package for interactive transformation of data with helm" tar ((:commit . "f30da4da48c0b3f3cfa1fc1c7cfdb53ffe79df36") (:authors ("Sean Irby")) (:maintainer "Sean Irby" . "sean.t.irby@gmail.com") (:keywords "languages" "elisp" "helm") (:url . "http://www.github.com/seanirby/evalator"))]) + (evalator-clojure . [(20160208 2148) ((cider (0 10 0)) (evalator (1 0 0))) "Clojure evaluation context for evalator via CIDER." tar ((:commit . "caa4e0a137bdfada86593128a654e16aa617ad50") (:authors ("Sean Irby")) (:maintainer "Sean Irby" . "sean.t.irby@gmail.com") (:keywords "languages" "clojure" "cider" "helm") (:url . "http://www.github.com/seanirby/evalator-clojure"))]) + (eve-mode . [(20170822 2231) ((emacs (25)) (polymode (1 0)) (markdown-mode (2 0))) "Major mode for editing Eve documents." single ((:commit . "a4661114d9c18725691b76321d72167ca5a9070a") (:authors ("Joshua Cole" . "joshuafcole@gmail.com")) (:maintainer "Joshua Cole" . "joshuafcole@gmail.com") (:keywords "languages" "wp" "tools") (:url . "https://github.com/witheve/emacs-eve-mode"))]) + (evil . [(20210527 2107) ((emacs (24 1)) (goto-chg (1 6)) (cl-lib (0 5))) "Extensible Vi layer for Emacs." tar ((:commit . "ad47644eea5e351269f5bead18e713768d96f207") (:keywords "emulation" "vim") (:url . "https://github.com/emacs-evil/evil"))]) + (evil-anzu . [(20200514 1902) ((evil (1 0 0)) (anzu (0 46))) "anzu for evil-mode" single ((:commit . "d3f6ed4773b48767bd5f4708c7f083336a8a8a86") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com") ("Fredrik Bergroth" . "fbergroth@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-evil-anzu"))]) + (evil-args . [(20180908 2157) ((evil (1 0 8))) "Motions and text objects for delimited arguments in Evil." single ((:commit . "758ad5ae54ad34202064fec192c88151c08cb387") (:authors ("Connor Smith" . "wconnorsmith@gmail.com")) (:maintainer "Connor Smith" . "wconnorsmith@gmail.com") (:keywords "evil" "vim-emulation") (:url . "http://github.com/wcsmith/evil-args"))]) + (evil-avy . [(20150908 748) ((emacs (24 1)) (cl-lib (0 5)) (avy (0 3 0)) (evil (1 2 3))) "set-based completion" single ((:commit . "2dd955cc3ecaa7ddeb67b295298abdc6d16dd3a5") (:authors ("Yufan Lou" . "loganlyf@gmail.com")) (:maintainer "Yufan Lou" . "loganlyf@gmail.com") (:keywords "point" "location" "evil" "vim") (:url . "https://github.com/louy2/evil-avy"))]) + (evil-better-visual-line . [(20200123 2045) ((evil (1 2 13))) "gj and gk visual line mode fix" single ((:commit . "4373f930ab1a8d3a2a90e68540967702313b2ce9") (:authors ("<nuckollsp at gmail.com>")) (:maintainer "<nuckollsp at gmail.com>") (:keywords "evil" "vim" "motion") (:url . "https://github.com/yourfin/evil-better-visual-line"))]) + (evil-cleverparens . [(20170718 413) ((evil (1 0)) (paredit (1)) (smartparens (1 6 1)) (emacs (24 4)) (dash (2 12 0))) "Evil friendly minor-mode for editing lisp." tar ((:commit . "8c45879d49bfa6d4e414b6c1df700a4a51cbb869") (:authors ("Olli Piepponen" . "opieppo@gmail.com")) (:maintainer "Olli Piepponen" . "opieppo@gmail.com") (:keywords "cleverparens" "parentheses" "evil" "paredit" "smartparens") (:url . "https://github.com/luxbock/evil-cleverparens"))]) + (evil-colemak-basics . [(20200630 1936) ((emacs (24 3)) (evil (1 2 12)) (evil-snipe (2 0 3))) "Basic Colemak key bindings for evil-mode" single ((:commit . "584f8f9496bf5250a439c9c9fee1d94f3b4883f0") (:authors ("Wouter Bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "Wouter Bolsterlee" . "wouter@bolsterl.ee") (:keywords "convenience" "emulations" "colemak" "evil") (:url . "https://github.com/wbolster/evil-colemak-basics"))]) + (evil-colemak-minimal . [(20171006 1317) ((emacs (24)) (evil (1 2 12))) "Minimal Colemak key bindings for evil-mode" single ((:commit . "6d98b6da60f414524a0d718f76024c26dce742b3") (:authors ("Bryan Allred" . "bryan@revolvingcow.com")) (:maintainer "Bryan Allred" . "bryan@revolvingcow.com") (:keywords "colemak" "evil") (:url . "https://github.com/bmallred/evil-colemak-minimal"))]) + (evil-collection . [(20210609 1647) ((emacs (25 1)) (evil (1 2 13)) (annalist (1 0))) "A set of keybindings for Evil mode" tar ((:commit . "eaded9d762fd49f962eeb6b8e15d6a33f79f4f26") (:authors ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com") (:keywords "evil" "tools") (:url . "https://github.com/emacs-evil/evil-collection"))]) + (evil-commentary . [(20210210 1702) ((evil (1 0 0))) "Comment stuff out. A port of vim-commentary." tar ((:commit . "2dab6ac34d1617971768ad219d73af48f7473fec") (:authors ("Quang Linh LE" . "linktohack@gmail.com")) (:maintainer "Quang Linh LE" . "linktohack@gmail.com") (:keywords "evil" "comment" "commentary" "evil-commentary") (:url . "http://github.com/linktohack/evil-commentary"))]) + (evil-dvorak . [(20160416 1841) ((evil (1 0 8))) "evil keybindings for that work with dvorak mode" tar ((:commit . "824f7c56980d72a0ff04c662223540cd66f13754") (:authors ("Joshua Branson")) (:maintainer "Joshua Branson") (:keywords "dvorak" "evil" "vim"))]) + (evil-easymotion . [(20200424 135) ((emacs (24)) (avy (0 3 0)) (cl-lib (0 5))) "A port of vim's easymotion to emacs" single ((:commit . "f96c2ed38ddc07908db7c3c11bcd6285a3e8c2e9") (:authors ("PythonNut" . "pythonnut@pythonnut.com")) (:maintainer "PythonNut" . "pythonnut@pythonnut.com") (:keywords "convenience" "evil") (:url . "https://github.com/pythonnut/evil-easymotion"))]) + (evil-ediff . [(20170724 1923) ((evil (1 2 3))) "Make ediff a little evil" single ((:commit . "50d26cb0654fca8f8fd7227410e5cbf0b8f681cf") (:authors ("Justin Burkett" . "justin@burkett.cc")) (:maintainer "Justin Burkett" . "justin@burkett.cc") (:url . "https://github.com/justbur/evil-ediff"))]) + (evil-embrace . [(20210418 2038) ((emacs (24 4)) (embrace (0 1 0)) (evil-surround (0))) "Evil integration of embrace.el" single ((:commit . "464e8ec52ff78edf3c9060143fc375f6ce5f275f") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions"))]) + (evil-escape . [(20180910 1234) ((emacs (24)) (evil (1 0 9)) (cl-lib (0 5))) "No description available." single ((:commit . "f4e9116bfbaac8c9d210c17ad488e0982291245f") (:authors ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com") (:keywords "convenience" "editing" "evil") (:url . "https://github.com/syl20bnr/evil-escape"))]) + (evil-ex-fasd . [(20180903 612) ((emacs (24 4)) (evil (1 1 0)) (fasd (0))) "using fasd right from evil-ex" single ((:commit . "ed8fbbe23a8a268d9dcbf1a6132e928ba2c655c5") (:authors ("Rashawn Zhang" . "namy.19@gmail.com")) (:maintainer "Rashawn Zhang" . "namy.19@gmail.com") (:keywords "tools" "fasd" "evil" "navigation") (:url . "https://github.com/yqrashawn/evil-ex-fasd"))]) + (evil-ex-shell-command . [(20181226 226) ((emacs (24 4)) (evil (1 1 0))) "invoke shell-command right from evil-ex" single ((:commit . "a6ca6d27c07f6a0807abfb5b8f8865f1d17f54aa") (:authors ("Rashawn Zhang" . "namy.19@gmail.com")) (:maintainer "Rashawn Zhang" . "namy.19@gmail.com") (:keywords "tools" "shell-command" "evil") (:url . "https://github.com/yqrashawn/evil-ex-shell-command"))]) + (evil-exchange . [(20200118 252) ((evil (1 2 8)) (cl-lib (0 3))) "Exchange text more easily within Evil" single ((:commit . "ac50f21b29b6e3a111e10a9e88ae61c907ac5ee8") (:authors ("Dewdrops" . "v_v_4474@126.com")) (:maintainer "Dewdrops" . "v_v_4474@126.com") (:keywords "evil" "plugin") (:url . "http://github.com/Dewdrops/evil-exchange"))]) + (evil-expat . [(20190521 714) ((emacs (24 3)) (evil (1 0 0))) "Evil ex commands" single ((:commit . "f4fcd0aa3edc359adb5c986b5dd9188d220d84e2") (:authors ("edkolev" . "evgenysw@gmail.com")) (:maintainer "edkolev" . "evgenysw@gmail.com") (:keywords "emulations" "evil" "vim") (:url . "http://github.com/edkolev/evil-expat"))]) + (evil-extra-operator . [(20210225 1239) ((evil (1 0 7))) "Evil operator for evaluating codes, taking notes, searching via google, etc." single ((:commit . "fb249889acacc3e28869491195391fa6f617ae56") (:authors ("Dewdrops" . "v_v_4474@126.com")) (:maintainer "Dewdrops" . "v_v_4474@126.com") (:keywords "evil" "plugin") (:url . "http://github.com/Dewdrops/evil-extra-operator"))]) + (evil-find-char-pinyin . [(20160514 2041) ((evil (1 2 12)) (pinyinlib (0 1 0))) "Evil's f/F/t/T/evil-snipe commands with Pinyin support" single ((:commit . "04e277946d658f1a73c68dcbbadea9c21097a31c") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions"))]) + (evil-fringe-mark . [(20190320 453) ((emacs (24 3)) (evil (1 0 0)) (fringe-helper (0 1 1)) (goto-chg (1 6))) "Display evil-mode marks in the fringe" tar ((:commit . "a1689fddb7ee79aaa720a77aada1208b8afd5c20") (:authors ("Andrew Smith" . "andy.bill.smith@gmail.com")) (:maintainer "Andrew Smith" . "andy.bill.smith@gmail.com") (:url . "https://github.com/Andrew-William-Smith/evil-fringe-mark"))]) + (evil-god-state . [(20141117 255) ((evil (1 0 8)) (god-mode (2 12 0))) "use god-mode keybindings in evil-mode" single ((:commit . "3d44197dc0a1fb40e7b7ff8717f8a8c339ce1d40") (:authors ("Eric Seidel")) (:maintainer "Eric Seidel") (:keywords "evil" "leader" "god-mode") (:url . "https://github.com/gridaphobe/evil-god-state"))]) + (evil-goggles . [(20200101 1935) ((emacs (24 4)) (evil (1 0 0))) "Add a visual hint to evil operations" single ((:commit . "08a22058fd6a167f9f1b684c649008caef571459") (:authors ("edkolev" . "evgenysw@gmail.com")) (:maintainer "edkolev" . "evgenysw@gmail.com") (:keywords "emulations" "evil" "vim" "visual") (:url . "http://github.com/edkolev/evil-goggles"))]) + (evil-iedit-state . [(20200830 617) ((evil (1 0 9)) (iedit (0 9 9 9))) "Evil states to interface iedit mode." single ((:commit . "30fcfa96ceebed0191337c493f5c2efc8ae090ad") (:authors ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com") (:keywords "convenience" "editing" "evil" "iedit" "mnemonic") (:url . "https://github.com/syl20bnr/evil-iedit-state"))]) + (evil-indent-plus . [(20151109 1906) ((evil (0)) (cl-lib (0 5))) "Evil textobjects based on indentation" single ((:commit . "0c7501e6efed661242c3a20e0a6c79a6455c2c40") (:authors ("Eivind Fonn" . "evfonn@gmail.com")) (:maintainer "Eivind Fonn" . "evfonn@gmail.com") (:keywords "convenience" "evil") (:url . "http://github.com/TheBB/evil-indent-plus"))]) + (evil-indent-textobject . [(20130831 2219) ((evil (0))) "evil textobjects based on indentation" single ((:commit . "70a1154a531b7cfdbb9a31d6922482791e20a3a7") (:authors ("Michael Markert" . "markert.michael@gmail.com")) (:maintainer "Michael Markert" . "markert.michael@gmail.com") (:keywords "convenience" "evil") (:url . "http://github.com/cofi/evil-indent-textobject"))]) + (evil-leader . [(20140606 1243) ((evil (0))) "let there be <leader>" single ((:commit . "39f7014bcf8b36463e0c7512c638bda4bac6c2cf") (:authors ("Michael Markert" . "markert.michael@googlemail.com")) (:maintainer "Michael Markert" . "markert.michael@googlemail.com") (:keywords "evil" "vim-emulation" "leader") (:url . "http://github.com/cofi/evil-leader"))]) + (evil-ledger . [(20180802 1612) ((emacs (24 4)) (evil (1 2 12)) (ledger-mode (0))) "Make `ledger-mode' more `evil'." single ((:commit . "7a9f9f5d39c42fffdba8004f8982642351f2b233") (:authors ("Aaron Jacobs" . "atheriel@gmail.com")) (:maintainer "Aaron Jacobs" . "atheriel@gmail.com") (:keywords "convenience" "evil" "languages" "ledger" "vim-emulation") (:url . "https://github.com/atheriel/evil-ledger"))]) + (evil-lion . [(20170811 614) ((emacs (24 3)) (evil (1 0 0))) "Evil align operator, port of vim-lion" single ((:commit . "6b03593f5dd6e7c9ca02207f9a73615cf94c93ab") (:authors ("edkolev" . "evgenysw@gmail.com")) (:maintainer "edkolev" . "evgenysw@gmail.com") (:keywords "emulations" "evil" "vim") (:url . "http://github.com/edkolev/evil-lion"))]) + (evil-lisp-state . [(20160404 248) ((evil (1 0 9)) (bind-map (0)) (smartparens (1 6 1))) "An evil state to edit Lisp code" single ((:commit . "3c65fecd9917a41eaf6460f22187e2323821f3ce") (:authors ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com") (:keywords "convenience" "editing" "evil" "smartparens" "lisp" "mnemonic") (:url . "https://github.com/syl20bnr/evil-lisp-state"))]) + (evil-lispy . [(20190502 739) ((lispy (0 26 0)) (evil (1 2 12)) (hydra (0 13 5))) "precision Lisp editing with Evil and Lispy" tar ((:commit . "ed317f7fccbdbeea8aa04a91b1b1f48a0e2ddc4e") (:authors ("Brandon Carrell <brandoncarrell@gmail.com>, Mika Vilpas" . "mika.vilpas@gmail.com")) (:maintainer "Brandon Carrell <brandoncarrell@gmail.com>, Mika Vilpas" . "mika.vilpas@gmail.com") (:keywords "lisp") (:url . "https://github.com/sp3ctum/evil-lispy"))]) + (evil-mark-replace . [(20200630 940) ((evil (1 14 0))) "replace the thing in marked area" single ((:commit . "d4fec7b10e93cca149163324cd2b2b2dcc211047") (:authors ("Chen Bin <chenbin DOT sh AT gmail DOT com>")) (:maintainer "Chen Bin <chenbin DOT sh AT gmail DOT com>") (:keywords "convenience") (:url . "http://github.com/redguardtoo/evil-mark-replace"))]) + (evil-matchit . [(20210609 1311) ((evil (1 2 0)) (emacs (25 1))) "Vim matchit ported to Evil" tar ((:commit . "9cd0ddaacb3476221d37344715c759ed3cb538d7") (:authors ("Chen Bin <chenbin DOT sh AT gmail DOT com>")) (:maintainer "Chen Bin <chenbin DOT sh AT gmail DOT com>") (:keywords "matchit" "vim" "evil") (:url . "http://github.com/redguardtoo/evil-matchit"))]) + (evil-mc . [(20210206 1941) ((emacs (24 3)) (evil (1 2 14)) (cl-lib (0 5))) "Multiple cursors for evil-mode" tar ((:commit . "f04fb17f35f2722f2ac93c862b4450bb8e5b739a") (:authors ("Gabriel Adomnicai" . "gabesoft@gmail.com")) (:maintainer "Gabriel Adomnicai" . "gabesoft@gmail.com") (:keywords "evil" "editing" "multiple-cursors" "vim" "evil-multiple-cursors" "evil-mc" "evil-mc") (:url . "https://github.com/gabesoft/evil-mc"))]) + (evil-mc-extras . [(20170202 1649) ((emacs (24 3)) (evil (1 2 12)) (cl-lib (0 5)) (evil-mc (0 0 2)) (evil-numbers (0 4))) "Extra functionality for evil-mc" tar ((:commit . "8c1af3232dd1e15b2ea38360b8cd1e857e11c416") (:authors ("Gabriel Adomnicai" . "gabesoft@gmail.com")) (:maintainer "Gabriel Adomnicai" . "gabesoft@gmail.com") (:keywords "evil" "editing" "multiple-cursors" "vim" "evil-multiple-cursors" "evil-mc" "evil-mc-extras") (:url . "https://github.com/gabesoft/evil-mc-extras"))]) + (evil-mu4e . [(20180613 1039) ((emacs (24 4)) (evil (1 2 10))) "evil-based key bindings for mu4e" single ((:commit . "5b22c1e30246318f233264506272d770f63897ca") (:authors ("Joris Engbers" . "info@jorisengbers.nl")) (:maintainer "Joris Engbers" . "info@jorisengbers.nl") (:url . "https://github.com/JorisE/evil-mu4e"))]) + (evil-multiedit . [(20200229 528) ((emacs (24 4)) (evil (1 2 12)) (iedit (0 9)) (cl-lib (0 5))) "multiple cursors for evil-mode" single ((:commit . "9f271e0e6048297692f80ed6c5ae8994ac523abc") (:authors ("Henrik Lissner <http://github/hlissner>")) (:maintainer "Henrik Lissner" . "henrik@lissner.net") (:keywords "multiple cursors" "editing" "iedit") (:url . "https://github.com/hlissner/evil-multiedit"))]) + (evil-nerd-commenter . [(20210528 1009) ((emacs (24 4))) "Comment/uncomment lines efficiently. Like Nerd Commenter in Vim" tar ((:commit . "c0f49e4e87300720b8e8a8296d92b8386956c7a2") (:authors ("Chen Bin <chenbin DOT sh AT gmail.com>")) (:maintainer "Chen Bin <chenbin DOT sh AT gmail.com>") (:keywords "convenience" "evil") (:url . "http://github.com/redguardtoo/evil-nerd-commenter"))]) + (evil-nl-break-undo . [(20181125 2054) nil "Break evil's undo sequence on CR" single ((:commit . "4a8f2bf99c978a109eeb92965a72a17bedb68762") (:authors ("VanLaser" . "Gabriel.Lazar@com.utcluj.ro")) (:maintainer "VanLaser" . "Gabriel.Lazar@com.utcluj.ro") (:url . "https://github.com/VanLaser/evil-nl-break-undo"))]) + (evil-numbers . [(20210605 431) ((emacs (24 1)) (evil (1 2 0))) "Increment/decrement numbers like in VIM" single ((:commit . "cd23a7b458d73dc49434a3cf90d3d0caceb5811d") (:authors ("Michael Markert" . "markert.michael@googlemail.com")) (:maintainer "Julia Path" . "julia@jpath.de") (:keywords "convenience" "tools") (:url . "http://github.com/juliapath/evil-numbers"))]) + (evil-opener . [(20161207 1810) ((evil (1 2 12)) (opener (0 2 2))) "opening urls as buffers in evil" tar ((:commit . "c384f67278046fdcd220275fdd212ab85672cbeb") (:authors ("Tim Reddehase" . "tr@rightsrestricted.com")) (:maintainer "Tim Reddehase" . "tr@rightsrestricted.com") (:keywords "url" "http" "files") (:url . "https://github.com/0robustus1/opener.el"))]) + (evil-org . [(20201222 2023) ((emacs (24 4)) (evil (1 0))) "evil keybindings for org-mode" tar ((:commit . "80ef38fb378541937f6ddfe836809e76eda1e355") (:maintainer "Somelauw") (:keywords "evil" "vim-emulation" "org-mode" "key-bindings" "presets") (:url . "https://github.com/Somelauw/evil-org-mode.git"))]) + (evil-owl . [(20210416 1700) ((emacs (25 1)) (evil (1 2 13))) "Preview evil registers and marks before using them" single ((:commit . "a41a6d28e26052b25f3d21da37ccf1d8fde1e6aa") (:authors ("Daniel Phan" . "daniel.phan36@gmail.com")) (:maintainer "Daniel Phan" . "daniel.phan36@gmail.com") (:keywords "emulations" "evil" "visual") (:url . "https://github.com/mamapanda/evil-owl"))]) + (evil-paredit . [(20150413 2048) ((evil (1 0 9)) (paredit (25 -2))) "Paredit support for evil keybindings" single ((:commit . "e058fbdcf9dbf7ad6cc77f0172d7517ef233d55f") (:authors ("Roman Gonzalez" . "romanandreg@gmail.com")) (:maintainer "Roman Gonzalez" . "romanandreg@gmail.com") (:keywords "paredit" "evil") (:url . "https://github.com/roman/evil-paredit"))]) + (evil-pinyin . [(20200927 849) ((emacs (25)) (names (0 5)) (evil (1))) "Evil search Chinese characters by pinyin" tar ((:commit . "3e9e501ded86f88e01a4edec5d526ab0fab879d7") (:keywords "extensions") (:url . "https://github.com/laishulu/evil-pinyin"))]) + (evil-python-movement . [(20180724 1420) ((emacs (25 1)) (cl-lib (0 5)) (dash (2 13 0)) (evil (1 0)) (s (1 12 0))) "Port Neovim's python movement to Evil" single ((:commit . "9936b3b7f8d96415d517c1f3604637889484a637") (:authors ("Felipe Lema <felipelema en mortemale punto org>")) (:maintainer "Felipe Lema <felipelema en mortemale punto org>") (:url . "https://bitbucket.org/FelipeLema/evil-python-movement.el/"))]) + (evil-quickscope . [(20160202 1924) ((evil (0))) "Highlight unique characters in words for f,F,t,T navigation" single ((:commit . "37a20e4c56c6058abf186ad4013c155e695e876f") (:authors ("Michael Chen" . "blorbx@gmail.com")) (:maintainer "Michael Chen" . "blorbx@gmail.com") (:keywords "faces" "emulation" "vim" "evil") (:url . "http://github.com/blorbx/evil-quickscope"))]) + (evil-rails . [(20190512 1517) ((evil (1 0)) (projectile-rails (1 0))) "Rails support for Evil Mode" single ((:commit . "b0f1c5de6720714febeb76c4b569b71bb891938c") (:authors ("Antono Vasiljev" . "antono.vasiljev@gmail.com")) (:maintainer "Antono Vasiljev" . "antono.vasiljev@gmail.com") (:keywords "ruby" "rails" "vim" "project" "convenience" "web" "evil" "projectile") (:url . "https://github.com/antono/evil-rails"))]) + (evil-replace-with-char . [(20180324 2206) ((evil (1 2 13)) (emacs (24))) "replace chars of a text object with a char" single ((:commit . "ed4a12d5bff11163eb03ad2826c52fd30f51a8d3") (:authors ("Filipe Silva" . "filipe.silva@gmail.com")) (:maintainer "Filipe Silva" . "filipe.silva@gmail.com") (:url . "https://github.com/ninrod/evil-replace-with-char"))]) + (evil-replace-with-register . [(20170713 925) ((evil (1 0 8))) "Port of vim plugin ReplaceWithRegister" single ((:commit . "91cc7bf21a94703c441cc9212214075b226b7f67") (:authors ("Dewdrops" . "v_v_4474@126.com")) (:maintainer "Dewdrops" . "v_v_4474@126.com") (:keywords "evil" "plugin") (:url . "https://github.com/Dewdrops/evil-ReplaceWithRegister"))]) + (evil-rsi . [(20160221 2104) ((evil (1 0 0))) "Use emacs motion keys in evil, inspired by vim-rsi" single ((:commit . "65ae60866be494e4622fe383e23975e04d2a42a3") (:authors ("Quang Linh LE" . "linktohack@gmail.com")) (:maintainer "Quang Linh LE" . "linktohack@gmail.com") (:keywords "evil" "rsi" "evil-rsi") (:url . "http://github.com/linktohack/evil-rsi"))]) + (evil-ruby-text-objects . [(20200323 1552) ((emacs (25 1)) (evil (1 2 0))) "Evil text objects for Ruby code" single ((:commit . "32983d91be83ed903b6ef9655e00f69beed2572c") (:authors ("Sergio Gil" . "sgilperez@gmail.com")) (:maintainer "Sergio Gil" . "sgilperez@gmail.com") (:keywords "languages") (:url . "https://github.com/porras/evil-ruby-text-objects"))]) + (evil-search-highlight-persist . [(20170523 334) ((highlight (0))) "Persistent highlights after search" single ((:commit . "979d2dec58d3b9c5ca5fdf4bb802a0209913794e") (:authors ("Juanjo Alvarez" . "juanjo@juanjoalvarez.net")) (:maintainer "Juanjo Alvarez" . "juanjo@juanjoalvarez.net"))]) + (evil-smartparens . [(20171210 1513) ((evil (1 0)) (emacs (24 4)) (smartparens (1 10 1))) "Evil support for smartparens" single ((:commit . "026d4a3cfce415a4dfae1457f871b385386e61d3") (:authors ("Lars Andersen" . "expez@expez.com")) (:maintainer "Lars Andersen" . "expez@expez.com") (:keywords "evil" "smartparens") (:url . "https://www.github.com/expez/evil-smartparens"))]) + (evil-snipe . [(20210609 509) ((emacs (24 4)) (evil (1 2 12)) (cl-lib (0 5))) "emulate vim-sneak & vim-seek" single ((:commit . "a9b9b39a7915e66b7d5da9cecfaf002c72d08196") (:authors ("Henrik Lissner <http://github/hlissner>")) (:maintainer "Henrik Lissner" . "henrik@lissner.net") (:keywords "emulation" "vim" "evil" "sneak" "seek") (:url . "https://github.com/hlissner/evil-snipe"))]) + (evil-space . [(20151208 1228) ((evil (1 0 0))) "Repeat motion in Evil. Correct the behaviour of what SPC should do." single ((:commit . "a9c07284d308425deee134c9d88a2d538dd229e6") (:authors ("Quang Linh LE" . "linktohack@gmail.com")) (:maintainer "Quang Linh LE" . "linktohack@gmail.com") (:keywords "space" "repeat" "motion") (:url . "http://github.com/linktohack/evil-space"))]) + (evil-string-inflection . [(20180313 1755) ((emacs (24)) (evil (1 2 13)) (string-inflection (1 0 6))) "snake_case -> CamelCase -> etc. for text objects" single ((:commit . "d22a90ab807afa7f27f3815b5b5ea47d52d05218") (:authors ("Filipe Silva" . "filipe.silva@gmail.com")) (:maintainer "Filipe Silva" . "filipe.silva@gmail.com") (:url . "https://github.com/ninrod/evil-string-inflection"))]) + (evil-surround . [(20200603 2216) ((evil (1 2 12))) "emulate surround.vim from Vim" single ((:commit . "4706987bc01a552343848da49b4951bd54374643") (:authors ("Tim Harper <timcharper at gmail dot com>") ("Vegard Øye <vegard_oye at hotmail dot com>")) (:maintainer "Tim Harper <timcharper at gmail dot com>") (:keywords "emulation" "vi" "evil"))]) + (evil-swap-keys . [(20191105 1426) ((emacs (24 4))) "Intelligently swap keys on text input with evil" single ((:commit . "b5ef105499f998b5667da40da30c073229a213ea") (:authors ("Wouter Bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "Wouter Bolsterlee" . "wouter@bolsterl.ee") (:keywords "convenience" "data" "languages" "tools") (:url . "https://github.com/wbolster/evil-swap-keys"))]) + (evil-tabs . [(20160217 1520) ((evil (0 0 0)) (elscreen (0 0 0))) "Integrating Vim-style tabs for Evil mode users." single ((:commit . "53d3314a810017b6056ab6796aef671f5ea1c063") (:authors ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainer "Kris Jenkins" . "krisajenkins@gmail.com") (:keywords "evil" "tab" "tabs" "vim") (:url . "https://github.com/krisajenkins/evil-tabs"))]) + (evil-terminal-cursor-changer . [(20210130 1855) ((evil (1 0 8))) "Change cursor shape and color by evil state in terminal" single ((:commit . "a88c680c631676ff8f6c5156b529f86d6b9f0841") (:authors ("7696122")) (:maintainer "7696122") (:keywords "evil" "terminal" "cursor") (:url . "https://github.com/7696122/evil-terminal-cursor-changer"))]) + (evil-test-helpers . [(20201008 1515) ((evil (1 14 0))) "unit test helpers for Evil" single ((:commit . "ad47644eea5e351269f5bead18e713768d96f207") (:authors ("Vegard Øye <vegard_oye at hotmail.com>")) (:maintainer "Vegard Øye <vegard_oye at hotmail.com>"))]) + (evil-tex . [(20210510 1809) ((emacs (25 1)) (evil (1 0)) (auctex (11 88))) "Useful features for editing LaTeX in evil-mode" single ((:commit . "87445d4d2339436179e792609bfbff0eaf056a9c") (:keywords "tex" "emulation" "vi" "evil" "wp") (:url . "https://github.com/iyefrat/evil-tex"))]) + (evil-text-object-python . [(20191010 1328) ((emacs (25)) (evil (1 2 14)) (dash (2 16 0))) "Python specific evil text objects" single ((:commit . "39d22fc524f0413763f291267eaab7f4e7984318") (:authors ("Wouter Bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "Wouter Bolsterlee" . "wouter@bolsterl.ee") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/wbolster/evil-text-object-python"))]) + (evil-textobj-anyblock . [(20170905 1907) ((cl-lib (0 5)) (evil (1 1 0))) "Textobject for the closest user-defined blocks." single ((:commit . "ff00980f0634f95bf2ad9956b615a155ea8743be") (:authors ("Fox Kiester" . "noct@openmailbox.org")) (:maintainer "Fox Kiester" . "noct@openmailbox.org") (:keywords "evil") (:url . "https://github.com/noctuid/evil-textobj-anyblock"))]) + (evil-textobj-column . [(20170905 1905) ((names (0 5)) (emacs (24)) (evil (0))) "Provides column text objects." single ((:commit . "835d7036d0bc9a6e44fc9b7c54ccf2a7c01428cd") (:authors ("Fox Kiester" . "noct@openmailbox.org")) (:maintainer "Fox Kiester" . "noct@openmailbox.org") (:keywords "evil" "column" "text-object") (:url . "https://github.com/noctuid/evil-textobj-column"))]) + (evil-textobj-entire . [(20150422 1254) ((emacs (24)) (evil (1 0 0))) "text object for entire lines of buffer for evil" single ((:commit . "5b3a98f3a69edc3a788f539f6ffef4a0ef5e853d") (:authors ("supermomonga")) (:maintainer "supermomonga") (:keywords "convenience" "emulations") (:url . "https://github.com/supermomonga/evil-textobj-entire"))]) + (evil-textobj-line . [(20150729 1522) ((evil (1 0 0))) "evil textobj line" single ((:commit . "3d401b6831bdbeec967ec8e64177a8950251e812") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-evil-textobj-line"))]) + (evil-textobj-syntax . [(20181210 1213) ((names (0 5)) (emacs (24)) (evil (0))) "Provides syntax text objects." single ((:commit . "2d9ba8c75c754b409aea7469f46a5cfa52a872f3") (:keywords "evil" "syntax" "highlight" "text-object") (:url . "https://github.com/laishulu/evil-textobj-syntax"))]) + (evil-traces . [(20191214 558) ((emacs (25 1)) (evil (1 2 13))) "Visual hints for `evil-ex'" single ((:commit . "290b5323542c46af364ec485c8ec9000040acf90") (:authors ("Daniel Phan" . "daniel.phan36@gmail.com")) (:maintainer "Daniel Phan" . "daniel.phan36@gmail.com") (:keywords "emulations" "evil" "visual") (:url . "https://github.com/mamapanda/evil-traces"))]) + (evil-tutor . [(20150103 650) ((evil (1 0 9))) "Vimtutor adapted to Evil and wrapped in a major-mode" tar ((:commit . "4e124cd3911dc0d1b6817ad2c9e59b4753638f28") (:authors ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com") (:keywords "convenience" "editing" "evil") (:url . "https://github.com/syl20bnr/evil-tutor"))]) + (evil-tutor-ja . [(20160917 132) ((evil (1 0 9)) (evil-tutor (0 1))) "Japanese Vimtutor adapted to Evil and wrapped in a major-mode" tar ((:commit . "99af7d82e02ce3bcdfaff47c5c80b57327a7ea8d") (:authors ("Kenji Miyazaki" . "kenjizmyzk@gmail.com")) (:maintainer "Kenji Miyazaki" . "kenjizmyzk@gmail.com") (:keywords "convenience" "editing" "evil" "japanese") (:url . "https://github.com/kenjimyzk/evil-tutor-ja"))]) + (evil-vimish-fold . [(20200122 117) ((emacs (24 4)) (evil (1 0 0)) (vimish-fold (0 2 0))) "Integrate vimish-fold with evil" single ((:commit . "b6e0e6b91b8cd047e80debef1a536d9d49eef31a") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/evil-vimish-fold"))]) + (evil-visual-mark-mode . [(20190116 1557) ((evil (1 0 9)) (dash (2 10))) "Display evil marks on buffer" single ((:commit . "ac5997971972a9251f140b5542d82790ca4a43b4") (:authors ("Roman Gonzalez" . "romanandreg@gmail.com")) (:maintainer "Roman Gonzalez" . "romanandreg@gmail.com") (:keywords "evil"))]) + (evil-visual-replace . [(20171016 613) ((evil (1 0 0))) "search/replace commands for evil visual state, inc. blocks" single ((:commit . "163fc827a1ffc106475da470c37fb26f4cc9b008") (:authors ("Troy Pracy")) (:maintainer "Troy Pracy") (:keywords "evil" "search" "replace" "regexp" "block" "rectangular" "region" "visual") (:url . "https://github.com/troyp/evil-visual-replace"))]) + (evil-visualstar . [(20160223 48) ((evil (0))) "Starts a * or # search from the visual selection" single ((:commit . "06c053d8f7381f91c53311b1234872ca96ced752") (:authors ("Bailey Ling")) (:maintainer "Bailey Ling") (:keywords "evil" "vim" "visualstar") (:url . "https://github.com/bling/evil-visualstar"))]) + (evm . [(20141007 1156) ((dash (2 3 0)) (f (0 13 0))) "Emacs Version Manager" single ((:commit . "d0623b2355436a5fd9f7238b419782080c79196b") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:url . "http://github.com/rejeep/evm"))]) + (ewal . [(20200305 230) ((emacs (25 1))) "A pywal-based theme generator" tar ((:commit . "e2a04f5c97b7d5e087af26e646c0b45a24522e56") (:authors ("Uros Perisic")) (:maintainer "Uros Perisic") (:keywords "faces") (:url . "https://gitlab.com/jjzmajic/ewal"))]) + (ewal-doom-themes . [(20200922 325) ((emacs (25)) (ewal (0 1)) (doom-themes (0 1))) "Dread the colors of darkness" tar ((:commit . "e2a04f5c97b7d5e087af26e646c0b45a24522e56") (:authors ("Uros Perisic")) (:maintainer "Uros Perisic") (:keywords "faces") (:url . "https://gitlab.com/jjzmajic/ewal"))]) + (ewal-evil-cursors . [(20190911 1315) ((emacs (25)) (ewal (0 1))) "`ewal'-colored evil cursor for Emacs and Spacemacs" single ((:commit . "e2a04f5c97b7d5e087af26e646c0b45a24522e56") (:authors ("Uros Perisic")) (:maintainer "Uros Perisic") (:keywords "faces") (:url . "https://gitlab.com/jjzmajic/ewal"))]) + (ewal-spacemacs-themes . [(20190911 1305) ((emacs (25)) (ewal (0 1)) (spacemacs-theme (0 1))) "Ride the rainbow spaceship" tar ((:commit . "e2a04f5c97b7d5e087af26e646c0b45a24522e56") (:authors ("Uros Perisic")) (:maintainer "Uros Perisic") (:keywords "faces") (:url . "https://gitlab.com/jjzmajic/ewal"))]) + (ewmctrl . [(20170922 217) nil "Use `wmctrl' to manage desktop windows via EWMH/NetWM." single ((:commit . "3d0217c4d6cdb5c308b6cb4293574f470d4faacf") (:authors ("Alexis" . "flexibeast@gmail.com") ("Adam Plaice" . "plaice.adam@gmail.com")) (:maintainer "Alexis" . "flexibeast@gmail.com") (:keywords "desktop" "windows" "ewmh" "netwm") (:url . "https://github.com/flexibeast/ewmctrl"))]) + (eww-lnum . [(20150102 1512) nil "Conkeror-like functionality for eww" single ((:commit . "4b0ecec769919ecb05ca4fb15ec51911ba589929") (:authors ("Andrey Kotlarski" . "m00naticus@gmail.com")) (:maintainer "Andrey Kotlarski" . "m00naticus@gmail.com") (:keywords "eww" "browse" "conkeror") (:url . "https://github.com/m00natic/eww-lnum"))]) + (exato . [(20180305 1042) ((evil (1 2 13)) (emacs (24))) "EXATO: Evil XML/HTML Attributes Text Object" single ((:commit . "aee7af7b7a0e7551478f453d1de7d5b9cb2e06c4") (:authors ("Filipe Silva" . "filipe.silva@gmail.com")) (:maintainer "Filipe Silva" . "filipe.silva@gmail.com") (:url . "https://github.com/ninrod/exato"))]) + (exec-path-from-shell . [(20201215 33) ((emacs (24 1)) (cl-lib (0 6))) "Get environment variables such as $PATH from the shell" single ((:commit . "bf4bdc8b8911e7a2c04e624b9a343164c3878282") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "unix" "environment") (:url . "https://github.com/purcell/exec-path-from-shell"))]) + (execline . [(20190711 2010) ((emacs (26 1)) (s (1 6 0))) "Major mode for editing execline scripts" single ((:commit . "c75dd9b2c54d8e59fc35fd4bd98d8e213948a3f5") (:authors ("Dmitry Bogatov" . "KAction@debian.org")) (:maintainer "Dmitry Bogatov" . "KAction@debian.org") (:keywords "tools" "unix" "languages") (:url . "https://gitlab.com/KAction/emacs-execline"))]) + (exiftool . [(20190520 1106) ((emacs (25))) "Elisp wrapper around ExifTool" single ((:commit . "fc6713e753380f3034d8df55b7af3a737ea52ab4") (:authors ("Arun I" . "arunisaac@systemreboot.net")) (:maintainer "Arun I" . "arunisaac@systemreboot.net") (:keywords "data") (:url . "https://git.systemreboot.net/exiftool.el"))]) + (exotica-theme . [(20180212 2329) ((emacs (24))) "A dark theme with vibrant colors" single ((:commit . "ff3ef4f6fa38c93b99becad977c7810c990a4d2f") (:authors ("Bharat Joshi" . "jbharat@outlook.com")) (:maintainer "Bharat Joshi" . "jbharat@outlook.com") (:keywords "faces" "theme" "dark" "vibrant colors") (:url . "https://github.com/jbharat/exotica-theme"))]) + (expand-line . [(20151006 207) nil "Expand selection by line" single ((:commit . "75a5d0241f35dd0748ab8ecb4ff16891535be372") (:authors ("Kai Yu" . "yeannylam@gmail.com")) (:maintainer "Kai Yu" . "yeannylam@gmail.com"))]) + (expand-region . [(20200304 1839) nil "Increase selected region by semantic units." tar ((:commit . "4b8322774d9c1d8b64a0049d1dbbc1e7ce80c1a0") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "marking" "region"))]) + (express . [(20140508 2041) ((string-utils (0 3 2))) "Alternatives to `message'" single ((:commit . "93dae7377eace4a5413ba99aecb6f26f90798725") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "extensions" "message" "interface") (:url . "http://github.com/rolandwalker/express"))]) + (exsqlaim-mode . [(20170607 1003) ((s (1 10 0))) "Use variables inside sql queries" single ((:commit . "a2e0a62ec8b87193d8eaa695774bfd689324b06c") (:authors ("Ahmad Nazir Raja" . "ahmadnazir@gmail.com")) (:maintainer "Ahmad Nazir Raja" . "ahmadnazir@gmail.com") (:url . "https://github.com/ahmadnazir/exsqlaim-mode"))]) + (extempore-mode . [(20210512 2350) ((emacs (24 4))) "Emacs major mode for Extempore source files" single ((:commit . "eb2dee8860f3d761e949d7c2ee8e2e469ac1cf51") (:authors ("Ben Swift" . "ben@benswift.me")) (:maintainer "Ben Swift" . "ben@benswift.me") (:keywords "extempore") (:url . "http://github.com/extemporelang/extempore-emacs-mode"))]) + (extend-dnd . [(20151122 1850) nil "R drag and Drop" tar ((:commit . "80c966c93b82c9bb5c6225a432557c39144fc602") (:authors ("Matthew L. Fidler")) (:maintainer "Matthew L. Fidler") (:keywords "extend" "drag and drop") (:url . "https://github.com/mlf176f2/extend-dnd"))]) + (extmap . [(20200617 1905) ((emacs (24 1))) "Externally-stored constant mapping for Elisp" single ((:commit . "2a6373d4fad1a5ac95272cabb6f5e4af89233d67") (:authors ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com") (:keywords "lisp") (:url . "https://github.com/doublep/extmap"))]) + (exunit . [(20210222 1453) ((s (1 11 0)) (emacs (24 3)) (f (0 20 0))) "ExUnit test runner" single ((:commit . "5bb115f3270cfe29d36286da889f0ee5bba03cfd") (:authors ("Anantha kumaran" . "ananthakumaran@gmail.com")) (:maintainer "Anantha kumaran" . "ananthakumaran@gmail.com") (:keywords "processes" "elixir" "exunit") (:url . "http://github.com/ananthakumaran/exunit.el"))]) + (exwm-edit . [(20200728 8) ((emacs (25 1))) "Edit mode for EXWM" single ((:commit . "2fd9426922c8394ec8d21c50dcc20b7d03af21e4") (:authors ("Ag Ibragimov")) (:maintainer "Ag Ibragimov") (:keywords "convenience") (:url . "https://github.com/agzam/exwm-edit"))]) + (exwm-firefox-core . [(20190812 2110) ((emacs (24 4)) (exwm (0 16))) "Firefox hotkeys to functions" single ((:commit . "e2fe2a895e8f973307ef52f8c9976b26e701cbd0") (:authors ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainer "Sebastian Wålinder" . "s.walinder@gmail.com") (:keywords "extensions") (:url . "https://github.com/walseb/exwm-firefox-core"))]) + (exwm-firefox-evil . [(20200206 2212) ((emacs (24 4)) (exwm (0 16)) (evil (1 0 0)) (exwm-firefox-core (1 0))) "evil-mode implementation of exwm-firefox-core" single ((:commit . "14643ee53a506ddcb5d2e06cb9f1be7310cd00b1") (:authors ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainer "Sebastian Wålinder" . "s.walinder@gmail.com") (:keywords "extensions") (:url . "https://github.com/walseb/exwm-firefox-evil"))]) + (exwm-float . [(20210207 2035) ((emacs (25 1)) (xelb (0 18)) (exwm (0 24)) (popwin (1 0 2))) "Convenient modes and bindings for floating EXWM frames" single ((:commit . "eb1b60b4a65e1ca5e323ef68a284ec6af72e637a") (:authors ("Mehmet Tekman")) (:maintainer "Mehmet Tekman") (:keywords "outlines") (:url . "https://gitlab.com/mtekman/exwm-float.el"))]) + (exwm-mff . [(20210603 1723) ((emacs (25 1))) "Mouse Follows Focus" single ((:commit . "89206f2e3189f589c27c56bd2b6203e906ee7100") (:authors ("Ian Eure" . "public@lowbar.fyi")) (:maintainer "Ian Eure" . "public@lowbar.fyi") (:keywords "unix") (:url . "https://github.com/ieure/exwm-mff"))]) + (exwm-surf . [(20171204 1140) ((emacs (24 4)) (exwm (0 16))) "Interface for Surf (surf.suckless.org) under exwm" single ((:commit . "6c17e2c1597fe4b7b454a1dac23b9127ac951e94") (:authors ("Peter" . "craven@gmx.net")) (:maintainer "Peter" . "craven@gmx.net") (:keywords "extensions") (:url . "https://github.com/ecraven/exwm-surf"))]) + (exwm-x . [(20210419 950) ((cl-lib (0 5)) (async (1 6)) (exwm (0 22))) "A derivative wm based on EXWM (emacs x window manager)" tar ((:commit . "2ab026f407b011a8e8380c889990e85e69cb3a4e") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:keywords "window-manager" "exwm") (:url . "https://github.com/tumashu/exwm-x"))]) + (eyebrowse . [(20201107 955) ((dash (2 7 0)) (emacs (24 3 1))) "Easy window config switching" single ((:commit . "88c7b59aa7c5c93bc23812217213adfa238f977b") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:keywords "convenience") (:url . "https://depp.brause.cc/eyebrowse"))]) + (eyuml . [(20141028 2227) ((request (0 2 0)) (s (1 8 0))) "Write textual uml diagram from emacs using yuml.me" single ((:commit . "eb29c37316e44a14741f16e894fbcfcb7537dc80") (:authors ("Anthony HAMON" . "hamon.anth@gmail.com")) (:maintainer "Anthony HAMON" . "hamon.anth@gmail.com") (:keywords "uml") (:url . "http://github.com/antham/eyuml"))]) + (ez-query-replace . [(20210525 2222) ((dash (1 2 0)) (s (1 11 0))) "a smarter context-sensitive query-replace that can be reapplied" single ((:commit . "3202cf4644ed3b6549284c3816b90bb230970a5b") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) + (eziam-theme . [(20200327 1810) nil "A mostly monochrome theme, inspired by Tao and Leuven, with dark and light versions." tar ((:commit . "d7e517f8e626035df3b63ec6fc07b85d48a996c5"))]) + (f . [(20191110 1357) ((s (1 7 0)) (dash (2 2 0))) "Modern API for working with files and directories" single ((:commit . "c4dbf8c8e83df834f5d6f72cd5649b9d8a8812ec") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "files" "directories") (:url . "http://github.com/rejeep/f.el"))]) + (f3 . [(20180130 1158) ((emacs (24 3)) (helm (2 8 8)) (cl-lib (0 5))) "a helm interface to find" tar ((:commit . "000009ce4adf7a57eae80512f29c4ec2a1391ce5") (:authors ("Danny McClanahan")) (:maintainer "Danny McClanahan") (:keywords "find" "file" "files" "helm" "fast" "finder") (:url . "https://github.com/cosmicexplorer/f3"))]) + (fabric . [(20171116 656) nil "Launch Fabric using Emacs" tar ((:commit . "df79be341d0b34ed23850f9894136092fa5fea8c") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@chmouel.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@chmouel.com") (:keywords "python" "fabric") (:url . "https://github.com/nlamirault/fabric.el"))]) + (face-explorer . [(20190517 1857) nil "Library and tools for faces and text properties" single ((:commit . "ad1300e13e5643e4c246cabfd91f833d39113052") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "faces") (:url . "https://github.com/Lindydancer/face-explorer"))]) + (face-shift . [(20190818 1551) ((emacs (24 4)) (cl-lib (0 5))) "Shift the colour of certain faces" single ((:commit . "8dd6fb5f6277d3a594654aeb3e6a7b7b5581656a") (:authors ("Philip K." . "philip@warpmail.net")) (:maintainer "Philip K." . "philip@warpmail.net") (:keywords "faces") (:url . "https://git.sr.ht/~zge/face-shift"))]) + (faceup . [(20170925 1946) nil "Markup language for faces and font-lock regression testing" single ((:commit . "6c92dad56a133e14e7b27831e1bcf9b3a71ff154") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "faces" "languages") (:url . "https://github.com/Lindydancer/faceup"))]) + (factlog . [(20130210 140) ((deferred (0 3 1))) "File activity logger" single ((:commit . "6503d77ea882c995b051d22e72db336fb28770fc") (:authors ("Takafumi Arakaki <aka.tkf at gmail.com>")) (:maintainer "Takafumi Arakaki <aka.tkf at gmail.com>") (:url . "https://github.com/tkf/factlog"))]) + (faff-theme . [(20210602 1952) nil "Light Emacs color theme on cornsilk3 background" single ((:commit . "cb8803355e20812d84195b1b7c9b0578c3262e68") (:authors ("James Ferguson <(concat \"wjcferguson\" at-sign \"gmail.com\")>")) (:maintainer "James Ferguson <(concat \"wjcferguson\" at-sign \"gmail.com\")>") (:keywords "color" "theme") (:url . "https://github.com/WJCFerguson/emacs-faff-theme"))]) + (fakespace . [(20120818 6) nil "fake namespaces with defpackage" single ((:commit . "d1bd1f4b14b2690d7a67f9a52622ec51ed84813a") (:authors ("Christopher Wellons" . "mosquitopsu@gmail.com")) (:maintainer "Christopher Wellons" . "mosquitopsu@gmail.com") (:url . "https://github.com/skeeto/elisp-fakespace"))]) + (fakir . [(20140729 1652) ((noflet (0 0 8)) (dash (1 3 2)) (kv (0 0 19))) "fakeing bits of Emacs" single ((:commit . "1fca406ad7de80fece6319ff75d4230b648534b0") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:keywords "lisp" "tools") (:url . "http://github.com/nicferrier/emacs-fakir"))]) + (fancy-battery . [(20150101 1204) ((emacs (24 1))) "Fancy battery display" single ((:commit . "9b88ae77a01aa3edc529840338bcb2db7f445822") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com") (:keywords "convenience" "tools" "hardware") (:url . "https://github.com/lunaryorn/fancy-battery.el"))]) + (fancy-dabbrev . [(20200129 1933) ((emacs (24)) (popup (0 5 3))) "Like dabbrev-expand with preview and popup menu" single ((:commit . "158e1e54055cafe5da9122a59519e8b3ed1057cf") (:authors ("Joel Rosdahl" . "joel@rosdahl.net")) (:maintainer "Joel Rosdahl" . "joel@rosdahl.net") (:url . "https://github.com/jrosdahl/fancy-dabbrev"))]) + (fancy-narrow . [(20171031 16) nil "narrow-to-region with more eye candy." single ((:commit . "c9b3363752c09045b8ce7a2635afae42d2ae63c7") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com") (:keywords "faces" "convenience") (:url . "http://github.com/Bruce-Connor/fancy-narrow"))]) + (fantom-theme . [(20200328 604) ((emacs (24 1))) "Dark theme based on Phantom Code for VSCode" single ((:commit . "2c1c7fd53086c2ff86ee0961642c3b58e2343c08") (:authors ("Adam Svanberg")) (:maintainer "Adam Svanberg") (:url . "https://github.com/adsva/fantom-emacs-theme"))]) + (farmhouse-theme . [(20160713 2244) nil "Farmhouse Theme, Emacs edition" tar ((:commit . "7ddc1ff13b4a3d5466bd0d33ecb86100352e83a7"))]) + (fasd . [(20210104 738) nil "Emacs integration for the command-line productivity booster `fasd'" single ((:commit . "c1d92553f33ebb018135c698db1a6d7f86731a26") (:authors ("steckerhalter")) (:maintainer "steckerhalter") (:keywords "cli" "bash" "zsh" "autojump") (:url . "https://framagit.org/steckerhalter/emacs-fasd"))]) + (fast-scroll . [(20191016 327) ((emacs (25 1)) (cl-lib (0 6 1))) "Some utilities for faster scrolling over large buffers." single ((:commit . "3f6ca0d5556fe9795b74714304564f2295dcfa24") (:authors ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com") (:keywords "ahungry" "convenience" "fast" "scroll" "scrolling") (:url . "https://github.com/ahungry/fast-scroll"))]) + (fastdef . [(20160713 1329) ((ivy (0 7 0)) (w3m (0 0))) "Insert terminology from Google top search results" single ((:commit . "0696f41dc150d35ce31fe8d2ea74f4173818bb55") (:authors ("Chen Bin <chenin DOT sh AT gmail DOT com>")) (:maintainer "Chen Bin <chenin DOT sh AT gmail DOT com>") (:keywords "terminology" "org-mode" "markdown") (:url . "http://github.com/redguardtoo/fastdef"))]) + (fastnav . [(20120211 1457) nil "Fast navigation and editing routines." single ((:commit . "1019ba2b61d1a070204099b23da347278a61bc89") (:authors ("Zsolt Terek" . "zsolt@google.com")) (:maintainer "Zsolt Terek" . "zsolt@google.com") (:keywords "nav" "fast" "fastnav" "navigation"))]) + (faust-mode . [(20201004 1353) nil "Faust syntax colorizer for Emacs." single ((:commit . "2a56cda14b152d5471f21a5d82f23c141dc7134c") (:authors ("rukano" . "rukano@gmail.com")) (:maintainer "Yassin Philip" . "xaccrocheur@gmail.com") (:keywords "languages" "faust") (:url . "https://github.com/rukano/emacs-faust-mode"))]) + (faustine . [(20171122 1202) ((emacs (24 3)) (faust-mode (0 3))) "Edit, visualize, build and run Faust code" single ((:commit . "07a38963111518f86123802f9d477be0d4689a3f") (:authors ("Yassin Philip" . "xaccrocheur@gmail.com")) (:maintainer "Yassin Philip" . "xaccrocheur@gmail.com") (:keywords "languages" "faust") (:url . "https://bitbucket.org/yphil/faustine"))]) + (fcitx . [(20190806 1923) nil "Make fcitx better in Emacs" single ((:commit . "12dc2638ddd15c8f6cfaecb20e1f428ab2bb5624") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions") (:url . "https://github.com/cute-jumper/fcitx.el"))]) + (fcopy . [(20150304 1403) nil "Funny Copy, set past point HERE then search copy text" single ((:commit . "e355f6ec889d8ecbdb096019c2dc660b1cec4941") (:authors ("Masayuki Ataka" . "masayuki.ataka@gmail.com")) (:maintainer "Masayuki Ataka" . "masayuki.ataka@gmail.com") (:keywords "convenience") (:url . "https://github.com/ataka/fcopy"))]) + (fd-dired . [(20210605 1057) ((emacs (25))) "find-dired alternative using fd" single ((:commit . "c223aee30af7dc7f52fb20045226ed9f49f4ec49") (:authors ("Rashawn Zhang" . "namy.19@gmail.com")) (:maintainer "Rashawn Zhang" . "namy.19@gmail.com") (:keywords "tools" "fd" "find" "dired") (:url . "https://github.com/yqrashawn/fd-dired"))]) + (feather . [(20200321 1237) ((emacs (26 3)) (async (1 9)) (async-await (1 0)) (ppp (1 0)) (page-break-lines (0 1))) "Parallel thread modern package manager" tar ((:commit . "3f19293dada8bf368e9f86f783610e7ca0a51ecb") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "convenience" "package") (:url . "https://github.com/conao3/feather.el"))]) + (feature-mode . [(20200815 1617) nil "Major mode for editing Gherkin (i.e. Cucumber) user stories" tar ((:commit . "8e1464113b489b54067294cd988ff6a11a423fdb") (:authors ("Michael Klishin")) (:maintainer "Michael Klishin") (:url . "https://github.com/michaelklishin/cucumber.el"))]) + (feebleline . [(20190822 1401) nil "Replace modeline with a slimmer proxy" single ((:commit . "b2f2db25cac77817bf0c49ea2cea6383556faea0") (:authors ("Benjamin Lindqvist" . "benjamin.lindqvist@gmail.com")) (:maintainer "Benjamin Lindqvist" . "benjamin.lindqvist@gmail.com") (:url . "https://github.com/tautologyclub/feebleline"))]) + (feed-discovery . [(20200714 1118) ((emacs (25 1)) (dash (2 16 0))) "Discover feed url by RSS/Atom autodiscovery" single ((:commit . "12fcd1a28fe7c8c46c74e32f395ec631d45ec739") (:authors ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainer "Hiroki YAMAKAWA" . "s06139@gmail.com") (:url . "https://github.com/HKey/feed-discovery"))]) + (fennel-mode . [(20210410 1942) ((emacs (25 1))) "A major-mode for editing Fennel code" single ((:commit . "59ab02344f569069b9899a3a5ffdca4a30093df4") (:authors ("Phil Hagelberg")) (:maintainer "Phil Hagelberg") (:keywords "languages" "tools") (:url . "https://gitlab.com/technomancy/fennel-mode"))]) + (fetch . [(20131201 730) nil "Fetch and unpack resources" single ((:commit . "3f2793afcbbc32f320e572453166f9354ecc6d06") (:authors ("Christian 'crshd' Brassat" . "christian.brassat@gmail.com")) (:maintainer "Christian 'crshd' Brassat" . "christian.brassat@gmail.com") (:url . "https://github.com/crshd/fetch.el"))]) + (ffmpeg-player . [(20200720 1028) ((emacs (24 4)) (s (1 12 0)) (f (0 20 0))) "Play video using ffmpeg" single ((:commit . "164fb15d70adbc186eb2d987f5c5143aa7336659") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/ffmpeg-player"))]) + (fic-mode . [(20180603 2035) nil "Show FIXME/TODO/BUG(...) in special face only in comments and strings" single ((:commit . "a05fc36ed54ba0c6dc22ac216a6a72cf191ca13d") (:url . "https://github.com/lewang/fic-mode"))]) + (fifo-class . [(20160425 558) nil "First in first out abstract class" single ((:commit . "8fe4cf690727f4ac7b67f29c55f845df023c3f21") (:authors ("Mola-T" . "Mola@molamola.xyz")) (:maintainer "Mola-T" . "Mola@molamola.xyz") (:keywords "lisp") (:url . "https://github.com/mola-T/fifo-class"))]) + (figlet . [(20160218 2237) nil "Annoy people with big, ascii art text" single ((:commit . "19a38783a90e151faf047ff233a21a729db0cea9") (:authors ("Philip Jackson" . "phil@shellarchive.co.uk")) (:maintainer "Philip Jackson" . "phil@shellarchive.co.uk"))]) + (filelock . [(20180524 2215) ((emacs (24)) (cl-lib (0)) (f (0))) "Functions for manipulating file locks" single ((:commit . "17a5ca6e0dee14d2e7d92c84be91143bca9d9663") (:authors ("Ryan C. Thompson")) (:maintainer "Ryan C. Thompson") (:keywords "extensions" "files" "tools") (:url . "https://github.com/DarwinAwardWinner/emacs-filelock"))]) + (filetags . [(20190706 804) ((emacs (24 4))) "Package to manage filetags in filename" single ((:commit . "01e6a919507a832ee001a2a0fc257657f8b04b72") (:authors ("Max Beutelspacher")) (:maintainer "Max Beutelspacher") (:keywords "convenience" "files") (:url . "https://github.com/DerBeutlin/filetags.el"))]) + (filetree . [(20210514 1614) ((emacs (27 1)) (dash (2 12 0)) (helm (3 7 0))) "File tree view/manipulatation package" single ((:commit . "08c0ea22f304f9777cd96e9b86f7c6e5331e82d8") (:authors ("Ketan Patel" . "knpatel401@gmail.com")) (:maintainer "Ketan Patel" . "knpatel401@gmail.com") (:url . "https://github.com/knpatel401/filetree"))]) + (fill-column-indicator . [(20200806 2239) nil "Graphically indicate the fill column" single ((:commit . "c35f9de072c241699b57bcb46da84bed5af29cfe") (:authors ("Alp Aker" . "alp.tekin.aker@gmail.com")) (:maintainer "Alp Aker" . "alp.tekin.aker@gmail.com") (:keywords "convenience"))]) + (fill-function-arguments . [(20201223 819) ((emacs (24 4))) "Convert function arguments to/from single line" single ((:commit . "a0a2f8538c80ac08e497dea784fcb90c93ab465b") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com") (:keywords "convenience") (:url . "https://github.com/davidshepherd7/fill-function-arguments"))]) + (fill-page . [(20201105 452) ((emacs (24 4))) "Fill buffer so you don't see empty lines at the end" single ((:commit . "95f82f93848ca608d4c4d9ec7386d94745cbc691") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/fill-page"))]) + (fillcode . [(20200524 2226) nil "Fill (wrap) function calls and expressions in source code" single ((:commit . "501468082e46bd0975ef4d8765363fd564338099") (:authors ("Ryan Barrett" . "fillcode@ryanb.org")) (:maintainer "Ryan Barrett" . "fillcode@ryanb.org") (:url . "https://snarfed.org/fillcode"))]) + (finalize . [(20170418 1945) ((emacs (24 1)) (cl-generic (0 3)) (cl-lib (0 3)) (eieio (1 4))) "finalizers for Emacs Lisp" tar ((:commit . "846731531e7d1d80451787992e07bfe7dedbe9ff") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/elisp-finalize"))]) + (find-by-pinyin-dired . [(20180210 218) ((pinyinlib (0 1 0))) "Find file by first PinYin character of Chinese Hanzi" single ((:commit . "3b4781148dddc84a701ad76c0934ed991ecd59d5") (:authors ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com") (:keywords "hanzi" "chinese" "dired" "find" "file" "pinyin") (:url . "http://github.com/redguardtoo/find-by-pinyin-dired"))]) + (find-dupes-dired . [(20210426 835) ((emacs (26 1))) "Find dupes and handle in dired" single ((:commit . "904225a3f89bbd3b44ea097a282ec6ca7945f7f1") (:authors ("Shuguang Sun" . "shuguang79@qq.com")) (:maintainer "Shuguang Sun" . "shuguang79@qq.com") (:keywords "tools") (:url . "https://github.com/ShuguangSun/find-dupes-dired"))]) + (find-file-in-project . [(20210427 1205) ((emacs (25 1))) "Find file/directory and review Diff/Patch/Commit efficiently everywhere" single ((:commit . "3bf010d2be073d499de5ffdaa98f48bf8a3dd21e") (:authors ("Phil Hagelberg, Doug Alcorn, and Will Farrington")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com") (:keywords "project" "convenience") (:url . "https://github.com/technomancy/find-file-in-project"))]) + (find-file-in-repository . [(20210301 2202) nil "Quickly find files in a git, mercurial or other repository" single ((:commit . "10f5bd919ce35691addc5ce0d281597a46813a79") (:authors ("Samuel Hoffstaetter" . "samuel@hoffstaetter.com")) (:maintainer "Samuel Hoffstaetter" . "samuel@hoffstaetter.com") (:keywords "files" "convenience" "repository" "project" "source control") (:url . "https://github.com/hoffstaetter/find-file-in-repository"))]) + (find-file-rg . [(20200827 704) ((emacs (25 1))) "Find file in project using ripgrep" single ((:commit . "ed556e092a92e325f335554ab193cef2d8fec009") (:authors ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainer "Andrii Kolomoiets" . "andreyk.mad@gmail.com") (:keywords "tools") (:url . "https://github.com/muffinmad/emacs-find-file-rg"))]) + (find-temp-file . [(20200117 2254) nil "Open quickly a temporary file" single ((:commit . "2bfcdba0d6a8a0e6faa080cb04ff0f7ed06491ba") (:authors ("Sylvain Rousseau <thisirs at gmail dot com>")) (:maintainer "Sylvain Rousseau <thisirs at gmail dot com>") (:keywords "convenience") (:url . "https://github.com/thisirs/find-temp-file.git"))]) + (find-things-fast . [(20150519 2226) nil "Find things fast, leveraging the power of git" single ((:commit . "efc7c189019ed65430e2f9e910e8e0a5ca9d2d03") (:authors ("Elvio Toccalino and Elliot Glaysher and Phil Hagelberg and Doug Alcorn")) (:maintainer "Elvio Toccalino and Elliot Glaysher and Phil Hagelberg and Doug Alcorn") (:keywords "project" "convenience"))]) + (findr . [(20130127 2032) nil "Breadth-first file-finding facility for (X)Emacs" single ((:commit . "1ddbc0464bb05dcda392b62666ad17239a2152d3") (:authors ("David Bakhash" . "cadet@bu.edu")) (:maintainer "David Bakhash" . "cadet@bu.edu") (:keywords "files"))]) + (fingers . [(20160817 829) nil "Modal editing with universal text manipulation helpers." tar ((:commit . "fed0f742afb1d72eaef29d8da394467550a030fa") (:authors ("Felix Geller" . "fgeller@gmail.com")) (:maintainer "Felix Geller" . "fgeller@gmail.com") (:keywords "fingers" "modal" "editing" "workman") (:url . "http://github.com/fgeller/fingers.el"))]) + (fiplr . [(20140724 645) ((grizzl (0 1 0)) (cl-lib (0 1))) "Fuzzy Search for Files in Projects" tar ((:commit . "3f50159fd42125440d5b0eb9d6398560461f030b") (:authors ("Chris Corbyn" . "chris@w3style.co.uk")) (:maintainer "Chris Corbyn" . "chris@w3style.co.uk") (:keywords "convenience" "usability" "project") (:url . "https://github.com/d11wtq/fiplr"))]) + (fira-code-mode . [(20201005 1607) ((emacs (24 4))) "Minor mode for Fira Code ligatures using prettify-symbols" single ((:commit . "a3a7a75d2b8b15404c37de186162a5f89ba447bf") (:authors ("Jonathan Ming" . "jming422@gmail.com")) (:maintainer "Jonathan Ming" . "jming422@gmail.com") (:keywords "faces" "ligatures" "fonts" "programming-ligatures") (:url . "https://github.com/jming422/fira-code-mode"))]) + (firecode-theme . [(20170808 1311) ((emacs (24 0))) "an Emacs 24 theme based on FireCode (tmTheme)" single ((:commit . "8b7b03ecdd41e70dab145b98906017e1392eaef4") (:authors ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))]) + (firefox-controller . [(20160320 1847) ((moz (0)) (popwin (1 0 0)) (cl-lib (0 5))) "An improved Firefox controller" single ((:commit . "a8af8cbf70afaf6b89a26d6ac69af8e92afc181f") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions") (:url . "https://github.com/cute-jumper/emacs-firefox-controller"))]) + (fireplace . [(20200402 2206) nil "A cozy fireplace for emacs" single ((:commit . "f6c23e259349922aae25cf2898ba815a7d8f2527") (:authors ("Johan Sivertsen" . "johanvts@gmail.com")) (:maintainer "Johan Sivertsen" . "johanvts@gmail.com") (:keywords "games") (:url . "https://github.com/johanvts/emacs-fireplace"))]) + (firestarter . [(20210508 1626) ((emacs (24 1))) "Execute (shell) commands on save" single ((:commit . "76070c9074aa363350abe6ad06143e90b3e12ab1") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:keywords "convenience") (:url . "https://depp.brause.cc/firestarter"))]) + (firrtl-mode . [(20200329 2002) ((emacs (24 3))) "mode for working with FIRRTL files" single ((:commit . "fa40141411a876ce7a1a9d6d3fe47134bc1fa954") (:authors ("Schuyler Eldridge" . "schuyler.eldridge@ibm.com")) (:maintainer "Schuyler Eldridge" . "schuyler.eldridge@ibm.com") (:keywords "languages" "firrtl") (:url . "https://github.com/ibm/firrtl-mode"))]) + (fish-completion . [(20191103 1210) ((emacs (25 1))) "Fish completion for pcomplete (shell and Eshell)" single ((:commit . "10384881817b5ae38cf6197a077a663420090d2c") (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") (:url . "https://gitlab.com/Ambrevar/emacs-fish-completion"))]) + (fish-mode . [(20210215 1114) ((emacs (24))) "Major mode for fish shell scripts" single ((:commit . "a7c953b1491ac3a3e00a7b560f2c9f46b3cb5c04") (:authors ("Tony Wang" . "wwwjfy@gmail.com")) (:maintainer "Tony Wang" . "wwwjfy@gmail.com") (:keywords "fish" "shell"))]) + (fit-text-scale . [(20210112 2246) ((emacs (25 1))) "Fit text by scaling" single ((:commit . "3f93650a8e8899114ea48048b7962210f1024862") (:authors ("Marco Wahl" . "marcowahlsoft@gmail.com")) (:maintainer "Marco Wahl" . "marcowahlsoft@gmail.com") (:keywords "convenience") (:url . "https://gitlab.com/marcowahl/fit-text-scale"))]) + (fix-input . [(20210320 1244) ((emacs (24 4))) "Make input methods play nicely with alternative keyboard layout on OS level" single ((:commit . "10b3aebc3d4411e6889f3428e8f097c0fbf8585c") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:keywords "input" "method") (:url . "https://github.com/mrkkrp/fix-input"))]) + (fix-muscle-memory . [(20160823 439) nil "Simple hacks to fix muscle memory problems" single ((:commit . "a123e04f8a1d2982cbf930efb909cad9522ac884") (:authors ("Jonathan Arkell" . "jonnay@jonnay.net")) (:maintainer "Jonathan Arkell" . "jonnay@jonnay.net") (:keywords "spelling" "typing"))]) + (fix-word . [(20210319 1414) ((emacs (24 1)) (cl-lib (0 5))) "Convenient word transformation" single ((:commit . "80cf4529915c34d2d39b4d3410781a19ef264e9f") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:keywords "word" "convenience") (:url . "https://github.com/mrkkrp/fix-word"))]) + (fixmee . [(20150223 1355) ((button-lock (1 0 2)) (nav-flash (1 0 0)) (back-button (0 6 0)) (smartrep (0 0 3)) (string-utils (0 3 2)) (tabulated-list (0))) "Quickly navigate to FIXME notices in code" single ((:commit . "5cddb64e0d52635e9a1529d80cb5cefa6f829341") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "navigation" "convenience") (:url . "http://github.com/rolandwalker/fixmee"))]) + (flame . [(20180303 2016) ((emacs (24))) "automatic generation of flamage, as if we needed more." single ((:commit . "a749b2a77b87e505572d0f1f5d59fac76348bb73") (:authors ("Ian G. Batten" . "batten@uk.ac.bham.multics") ("Noah Friedman" . "friedman@splode.com")) (:maintainer "Noah Friedman" . "friedman@splode.com") (:keywords "games") (:url . "https://github.com/mschuldt/flame"))]) + (flames-of-freedom . [(20191202 1637) ((emacs (25 1))) "The flames of freedom" single ((:commit . "5e47ff27cfa2f7c06081be2ffefe91a731efd012") (:authors ("Stéphane Champailler" . "schampailler@skynet.be")) (:maintainer "Stéphane Champailler" . "schampailler@skynet.be") (:keywords "multimedia") (:url . "https://github.com/wiz21b/FlamesOfFreedom"))]) + (flappymacs . [(20171023 1004) nil "flappybird clone for emacs" single ((:commit . "27f3e21acb22f786606481e3f4e5dc1edbaaaed4") (:authors ("Takayuki Sato")) (:maintainer "Takayuki Sato") (:keywords "games") (:url . "https://github.com/taksatou/flappymacs"))]) + (flash-region . [(20130923 1817) nil "Flash a region" single ((:commit . "261b3597b23cdd40e5c14262a5687bcc6c1d0901") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:keywords "utility"))]) + (flatbuffers-mode . [(20200822 957) ((emacs (24 3))) "Major mode for editing flatbuffers" single ((:commit . "c0e9dc220db5f08410f40becf03531938484cb6c") (:authors ("Asal Mirzaieva" . "asalle.kim@gmail.com")) (:maintainer "Asal Mirzaieva" . "asalle.kim@gmail.com") (:keywords "flatbuffers" "languages") (:url . "https://github.com/Asalle/flatbuffers-mode"))]) + (flatfluc-theme . [(20200707 630) ((emacs (26 1))) "Custom merge of flucui and flatui themes" single ((:commit . "5a30b1cd344ac0d3c3bf9dab017805ab96897b54") (:authors ("Sébastien Le Maguer" . "lemagues@tcd.ie")) (:maintainer "Sébastien Le Maguer" . "lemagues@tcd.ie") (:keywords "lisp") (:url . "https://github.com/seblemaguer/flatfluc-theme"))]) + (flatland-black-theme . [(20170808 1312) ((emacs (24 0))) "an Emacs 24 theme based on Flatland Black (tmTheme)" single ((:commit . "348c5d5fe615e6ea13cadc17f046e506e789ce07") (:authors ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/flatland-black-theme"))]) + (flatland-theme . [(20171113 1521) nil "A simple theme for Emacs based on the Flatland theme for Sublime Text" single ((:commit . "a98a6f19ad4dff0fa3fad1ea487b7d0ef634a19a") (:authors ("Greg Chapple" . "info@gregchapple.com")) (:maintainer "Greg Chapple" . "info@gregchapple.com") (:url . "http://github.com/gregchapple/flatland-emacs"))]) + (flatui-dark-theme . [(20170513 1422) ((emacs (24))) "Dark color theme with colors from https://flatuicolors.com/" single ((:commit . "5b959a9f743f891e4660b1b432086417947872ea") (:authors ("Andrew Phillips" . "theasp@gmail.com")) (:maintainer "Andrew Phillips" . "theasp@gmail.com") (:keywords "color" "theme" "dark" "flatui" "faces") (:url . "https://github.com/theasp/flatui-dark-theme"))]) + (flatui-theme . [(20160619 127) nil "A color theme for Emacs based on flatuicolors.com" single ((:commit . "9c15db5526c15c8dba55023f5698372b19c2a780") (:authors ("John Louis Del Rosario" . "john2x@gmail.com")) (:maintainer "John Louis Del Rosario" . "john2x@gmail.com") (:url . "https://github.com/john2x/flatui-theme.el"))]) + (flex-autopair . [(20120809 1218) nil "Automatically insert pair braces and quotes, insertion conditions & actions are highly customizable." single ((:commit . "4bb757f2556a4a51828e2fed8fb81e31e83052cb") (:authors ("Yuuki Arisawa" . "yuuki.ari@gmail.com")) (:maintainer "Yuuki Arisawa" . "yuuki.ari@gmail.com") (:keywords "keyboard" "input") (:url . "https://github.com/uk-ar/flex-autopair.el"))]) + (flex-compile . [(20201218 1549) ((emacs (26 1)) (dash (2 17 0)) (buffer-manage (0 11))) "Run, evaluate and compile across many languages" tar ((:commit . "bc1f0804f089686260b64d5e4dde80c0c9f6df21") (:authors ("Paul Landes")) (:maintainer "Paul Landes") (:keywords "compilation" "integration" "processes") (:url . "https://github.com/plandes/flex-compile"))]) + (flex-isearch . [(20170308 2010) nil "Flex matching (like ido) in isearch." single ((:commit . "b1f7e04de762282c276343cc2709af9ff4abc9d2") (:authors ("Jonathan Kotta" . "jpkotta@gmail.com")) (:maintainer "Jonathan Kotta" . "jpkotta@gmail.com") (:keywords "convenience" "search") (:url . "https://bitbucket.org/jpkotta/flex-isearch"))]) + (flim . [(20210529 1253) ((emacs (24 5)) (apel (10 8)) (oauth2 (0 11))) "A library to provide basic features about message representation or encoding." tar ((:commit . "02735dede6603987e8309a76d0bc7a9ff9a5a227"))]) + (flimenu . [(20200810 1510) ((emacs (24 4))) "Flatten imenu automatically" single ((:commit . "4c0ff37cf3bd6c836bd136b5f6c450560a6c92b9") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:keywords "imenu" "browse" "structure" "hook" "mode" "matching" "tools" "convenience" "files") (:url . "https://github.com/IvanMalison/flimenu"))]) + (fliptext . [(20171124 2056) nil "Input method for flipping characters upside down" single ((:commit . "fd821f645ffebae6ae3894afa7ba7fc06f91afc6") (:authors ("André Riemann" . "andre.riemann@web.de")) (:maintainer "André Riemann" . "andre.riemann@web.de") (:keywords "games" "i18n"))]) + (floobits . [(20180801 524) ((json (1 2)) (highlight (0))) "Floobits plugin for real-time collaborative editing" tar ((:commit . "489b294a7f30ecd2af2edc0823dead8102f27af6") (:authors ("Matt Kaniaris") ("Geoff Greer")) (:maintainer "Matt Kaniaris") (:keywords "comm" "tools") (:url . "http://github.com/Floobits/floobits-emacs"))]) + (flow-js2-mode . [(20191213 1004) ((flow-minor-mode (0)) (js2-mode (0)) (emacs (25 1))) "Support for flow annotations in js2-mode" single ((:commit . "7520bdda70287e8d57b3f41033b1e0ca59a3be95") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "languages" "extensions"))]) + (flow-minor-mode . [(20200905 1730) ((emacs (25 1))) "Flow type mode based on web-mode." single ((:commit . "804217a15a28f6918fba93c91d495ed7d50b0495") (:url . "https://github.com/an-sh/flow-minor-mode"))]) + (flower . [(20201022 1904) ((emacs (24 4)) (clomacs (0 0 3))) "Emacs task tracker client." tar ((:commit . "0d5dd8b9b844adab1a1b7a9641daa9e98918712c") (:authors ("Sergey Sobko" . "SSobko@ptsecurity.com")) (:maintainer "Sergey Sobko" . "SSobko@ptsecurity.com") (:keywords "hypermedia" "outlines" "tools" "vc") (:url . "https://github.com/PositiveTechnologies/flower"))]) + (flucui-themes . [(20200815 2103) ((emacs (24))) "Custom theme inspired by the Flat UI palette" tar ((:commit . "6591b5093e6e8f0e720e3995a16a91835b2e7a48") (:authors ("MetroWind" . "chris.corsair@gmail.com")) (:maintainer "MetroWind" . "chris.corsair@gmail.com") (:keywords "lisp") (:url . "https://github.com/MetroWind/flucui-theme"))]) + (flutter . [(20210304 1341) ((emacs (24 4))) "Tools for working with Flutter SDK" tar ((:commit . "960b63576a13b7bd3495d0ad1883ed736873543b") (:authors ("Aaron Madlon-Kay")) (:maintainer "Aaron Madlon-Kay") (:keywords "languages") (:url . "https://github.com/amake/flutter.el"))]) + (flutter-l10n-flycheck . [(20200221 1415) ((emacs (24 4)) (flycheck (30)) (flutter (0 1 0))) "Flycheck checker for intl_translation" single ((:commit . "960b63576a13b7bd3495d0ad1883ed736873543b") (:authors ("Aaron Madlon-Kay")) (:maintainer "Aaron Madlon-Kay") (:keywords "languages") (:url . "https://github.com/amake/flutter.el"))]) + (fluxus-mode . [(20191001 1716) ((osc (0 1)) (emacs (24 4))) "Major mode for interfacing with Fluxus" single ((:commit . "3d05fa15f141ac3e936f908097bb7eb6295cc367") (:authors ("modula t." . "defaultxr@gmail.com")) (:maintainer "modula t." . "defaultxr@gmail.com") (:keywords "languages") (:url . "https://github.com/defaultxr/fluxus-mode"))]) + (flx . [(20191115 659) ((cl-lib (0 3))) "fuzzy matching with good sorting" single ((:commit . "647cb2f92f9936c62e277d7a74ad54a80502d255") (:authors ("Le Wang")) (:maintainer "Le Wang") (:url . "https://github.com/lewang/flx"))]) + (flx-ido . [(20180117 1519) ((flx (0 1)) (cl-lib (0 3))) "flx integration for ido" single ((:commit . "647cb2f92f9936c62e277d7a74ad54a80502d255") (:authors ("Le Wang")) (:maintainer "Le Wang") (:url . "https://github.com/lewang/flx"))]) + (flx-isearch . [(20191119 515) ((emacs (24)) (flx (20140821)) (cl-lib (0 5))) "Fuzzy incremental searching for emacs" single ((:commit . "a44097fb8f539a193c2f09a37ea52a68f2c51839") (:authors ("PythonNut" . "pythonnut@pythonnut.com")) (:maintainer "PythonNut" . "pythonnut@pythonnut.com") (:keywords "convenience" "search" "flx") (:url . "https://github.com/pythonnut/flx-isearch"))]) + (flycheck . [(20210321 852) ((dash (2 12 1)) (pkg-info (0 4)) (let-alist (1 0 4)) (seq (1 11)) (emacs (24 3))) "On-the-fly syntax checking" tar ((:commit . "f8c679fff349850c80541a31de50009c3c15d4c9") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com") (:keywords "convenience" "languages" "tools") (:url . "http://www.flycheck.org"))]) + (flycheck-ameba . [(20191226 1011) ((emacs (24 4)) (flycheck (30))) "Add support for Ameba to Flycheck" single ((:commit . "0c4925ae0e998818326adcb47ed27ddf9761c7dc") (:keywords "tools" "crystal" "ameba") (:url . "https://github.com/crystal-ameba/ameba.el"))]) + (flycheck-apertium . [(20181211 1038) ((flycheck (0 25))) "Apertium checkers in flycheck" tar ((:commit . "22b60a17836477ac1edd15dc85b14f88ca871ba9") (:authors ("Kevin Brubeck Unhammer" . "unhammer+apertium@mm.st")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer+apertium@mm.st") (:keywords "convenience" "tools" "xml") (:url . "http://wiki.apertium.org/wiki/Emacs"))]) + (flycheck-aspell . [(20210605 1713) ((flycheck (28 0)) (emacs (25 1))) "Aspell checker for flycheck" single ((:commit . "8c45988a12e7c149b17d7edb84e6dfc33bb7b288") (:authors ("Leo Gaskin" . "leo.gaskin@le0.gs")) (:maintainer "Leo Gaskin" . "leo.gaskin@le0.gs") (:keywords "wp" "flycheck" "spell" "aspell") (:url . "https://github.com/leotaku/flycheck-aspell"))]) + (flycheck-ats2 . [(20170225 1636) ((emacs (24 1)) (flycheck (0 22))) "Flycheck: ATS2 support" single ((:commit . "9f77add8408462af35bdddf87e37a661880255e3") (:authors ("Mark Laws" . "mdl@60hz.org")) (:maintainer "Mark Laws" . "mdl@60hz.org") (:keywords "convenience" "tools" "languages") (:url . "http://github.com/drvink/flycheck-ats2"))]) + (flycheck-bashate . [(20200625 642) ((flycheck (0 24)) (emacs (24 4))) "Integrate bashate with flycheck" single ((:commit . "5e673c591d017329d0a07a61dc1223fa98639ee2") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/flycheck-bashate"))]) + (flycheck-cask . [(20200926 1502) ((emacs (24 3)) (flycheck (0 14)) (dash (2 4 0))) "Cask support in Flycheck" single ((:commit . "4b2ede6362ded4a45678dfbef1876faa42edbd58") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com") (:keywords "tools" "convenience") (:url . "https://github.com/flycheck/flycheck-cask"))]) + (flycheck-cfn . [(20201120 2307) ((emacs (26 1)) (flycheck (31))) "Flycheck backend for AWS cloudformation" single ((:commit . "a4ca40978e680f9edc86c141e696e0ae57c63533") (:authors ("William Orr" . "will@worrbase.com")) (:maintainer "William Orr" . "will@worrbase.com") (:keywords "convenience") (:url . "https://gitlab.com/worr/cfn-mode"))]) + (flycheck-checkbashisms . [(20190403 218) ((emacs (24)) (flycheck (0 25))) "checkbashisms checker for flycheck" single ((:commit . "2e386775f1a0eb5d80e5d70e98474ee32ecafb24") (:authors ("Cuong Le" . "cuong.manhle.vn@gmail.com")) (:maintainer "Cuong Le" . "cuong.manhle.vn@gmail.com") (:keywords "convenience" "tools" "sh" "unix") (:url . "https://github.com/cuonglm/flycheck-checkbashisms"))]) + (flycheck-checkpatch . [(20170217 1025) ((emacs (25)) (flycheck (30))) "Flycheck support for checkpatch.pl tool" single ((:commit . "6461fc7b0d493eb9863814055f8bce5fa35739de") (:authors ("Alexander Yarygin" . "yarygin.alexander@gmail.com")) (:maintainer "Alexander Yarygin" . "yarygin.alexander@gmail.com") (:url . "https://github.com/zpp0/flycheck-checkpatch"))]) + (flycheck-clang-analyzer . [(20200429 238) ((flycheck (0 24)) (emacs (24 4))) "Integrate Clang Analyzer with flycheck" single ((:commit . "0c9b6e4626cd5376037464f8d6b8c64aa32768ee") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/flycheck-clang-analyzer"))]) + (flycheck-clang-tidy . [(20201115 1232) ((flycheck (0 30))) "Flycheck syntax checker using clang-tidy" single ((:commit . "f9ae7306bd6ca08b689b36c1e8f6f6b91d61db5f") (:authors (nil . "Sebastian Nagel<sebastian.nagel@ncoding.at>")) (:maintainer "tastytea" . "tastytea@tastytea.de") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/ch1bo/flycheck-clang-tidy"))]) + (flycheck-clangcheck . [(20150712 710) ((cl-lib (0 5)) (seq (1 7)) (flycheck (0 17))) "A Flycheck checker difinition for ClangCheck." single ((:commit . "24a9424c484420073a24443a829fd5779752362b") (:authors ("kumar8600" . "kumar8600@gmail.com")) (:maintainer "kumar8600" . "kumar8600@gmail.com") (:url . "https://github.com/kumar8600/flycheck-clangcheck"))]) + (flycheck-clj-kondo . [(20201102 1128) ((flycheck (0 18))) "Add clj-kondo linter to flycheck" single ((:commit . "a558bda44c4cb65b69fa53df233e8941ebd195c5") (:authors ("Michiel Borkent" . "michielborkent@gmail.com")) (:maintainer "Michiel Borkent" . "michielborkent@gmail.com") (:url . "https://github.com/borkdude/flycheck-clj-kondo"))]) + (flycheck-clojure . [(20191215 2227) ((cider (0 22 0)) (flycheck (32 -4)) (let-alist (1 0 1)) (emacs (25))) "Flycheck: Clojure support" single ((:commit . "592c4f89efb5112784cbf94c9ea6fdd045771b62") (:authors ("Peter Fraenkel" . "pnf@podsnap.com") ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Peter Fraenkel" . "pnf@podsnap.com") (:url . "https://github.com/clojure-emacs/squiggly-clojure"))]) + (flycheck-clolyze . [(20190422 2134) ((flycheck (0 25)) (emacs (24))) "Add Clolyze to to flycheck" single ((:commit . "c8b27602dd505aeae6486feb6f584754079baf51") (:authors ("Daniel Laps" . "daniel.laps@hhu.de")) (:maintainer "Daniel Laps" . "daniel.laps@hhu.de") (:url . "https://github.com/DLaps/flycheck-clolyze"))]) + (flycheck-color-mode-line . [(20200528 416) ((flycheck (0 15)) (dash (1 2)) (emacs (24 3))) "Change mode line color with Flycheck status" single ((:commit . "575b604cfe21f65fb07c134392c382c163c87739") (:authors ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com") (:keywords "convenience" "language" "tools") (:url . "https://github.com/flycheck/flycheck-color-mode-line"))]) + (flycheck-coverity . [(20170704 59) ((flycheck (0 24)) (dash (2 12 0)) (emacs (24 4))) "Integrate Coverity with flycheck" single ((:commit . "cb211e3dd50413a5042eb20175be518214591c9d") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/flycheck-coverity"))]) + (flycheck-credo . [(20170526 1545) ((flycheck (29))) "flycheck checker for elixir credo" single ((:commit . "e88f11ead53805c361ec7706e44c3dfee1daa19f") (:authors ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Aaron Jensen" . "aaronjensen@gmail.com") (:url . "https://github.com/aaronjensen/flycheck-credo"))]) + (flycheck-crystal . [(20200805 2344) ((flycheck (30))) "Add support for Crystal to Flycheck" single ((:commit . "15998140b0a4172cd4b4d14d0377fba96a8917fc") (:keywords "tools" "crystal") (:url . "https://github.com/crystal-lang-tools/emacs-crystal-mode"))]) + (flycheck-css-colorguard . [(20161031 1122) ((flycheck (0 22)) (emacs (24))) "Detect similar colors in CSS" single ((:commit . "ae94fa0396acd99f9ec36d9572459df793f37fe8") (:authors ("Saša Jovanić" . "info@simplify.ba")) (:maintainer "Saša Jovanić" . "info@simplify.ba") (:keywords "flycheck" "css" "colorguard") (:url . "https://github.com/Simplify/flycheck-css-colorguard/"))]) + (flycheck-cstyle . [(20160905 2341) ((flycheck (0 24)) (emacs (24 4))) "Integrate cstyle with flycheck" single ((:commit . "207285140a353d08cf1fc450cacab158bc98ba82") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/flycheck-cstyle"))]) + (flycheck-cython . [(20170724 958) ((flycheck (0 25))) "Support Cython in flycheck" single ((:commit . "ecc4454d35ab5317ab66a04406f36f0c1dbc0b76") (:authors ("Lorenzo Bolla" . "lbolla@gmail.com")) (:maintainer "Lorenzo Bolla" . "lbolla@gmail.com"))]) + (flycheck-d-unittest . [(20160522 417) ((flycheck (0 21 -4 1)) (dash (1 4 0))) "Add D unittest support to flycheck" single ((:commit . "3e614f23cb4a5566fd7988dbcaaf254af81c7718") (:authors ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainer "Tomoya Tanjo" . "ttanjo@gmail.com") (:keywords "flycheck" "d") (:url . "https://github.com/tom-tan/flycheck-d-unittest/"))]) + (flycheck-dedukti . [(20171103 1212) ((flycheck (0 19)) (dedukti-mode (0 1))) "Flycheck integration of Dedukti" single ((:commit . "3dbff5646355f39d57a3ec514f560a6b0082a1cd") (:authors ("Raphaël Cauderlier")) (:maintainer "Raphaël Cauderlier") (:keywords "convenience" "languages" "tools" "flycheck" "dedukti") (:url . "https://github.com/rafoo/flycheck-dedukti"))]) + (flycheck-dialyxir . [(20170515 1525) ((flycheck (29))) "flycheck checker for elixir dialyxir" single ((:commit . "adfb73374cb2bee75724822972f405f2ec371199") (:authors ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Aaron Jensen" . "aaronjensen@gmail.com") (:url . "https://github.com/aaronjensen/flycheck-dialyxir"))]) + (flycheck-dialyzer . [(20160326 1430) ((flycheck (0 18))) "Support dialyzer in flycheck" single ((:commit . "a5df0db95ac69f397b5f85d325a6d88cf8974f64") (:authors ("Lorenzo Bolla" . "lbolla@gmail.com")) (:maintainer "Lorenzo Bolla" . "lbolla@gmail.com"))]) + (flycheck-dmd-dub . [(20210412 1608) ((flycheck (0 24)) (f (0 18 2))) "Sets flycheck-dmd-include-paths from dub package information" single ((:commit . "818bfed45ac8597b6ad568c71eb9428138a125c8") (:authors ("Atila Neves" . "atila.neves@gmail.com")) (:maintainer "Atila Neves" . "atila.neves@gmail.com") (:keywords "languages") (:url . "http://github.com/atilaneves/flycheck-dmd-dub"))]) + (flycheck-dogma . [(20170125 721) ((flycheck (29))) "flycheck checker for elixir dogma" single ((:commit . "eea1844a81e87e2488b05e703a93272d0fc3bc74") (:authors ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Aaron Jensen" . "aaronjensen@gmail.com") (:url . "https://github.com/aaronjensen/flycheck-dogma"))]) + (flycheck-drstring . [(20200210 1903) ((emacs (25 1)) (flycheck (0 25)) (swift-mode (8 0))) "Doc linting for Swift using DrString" single ((:commit . "d8d5a560e792a6657ef5ac69934c74f1ed51372d") (:authors ("Daniel Martín" . "mardani29@yahoo.es")) (:maintainer "Daniel Martín" . "mardani29@yahoo.es") (:keywords "tools" "flycheck") (:url . "https://github.com/danielmartin/flycheck-drstring"))]) + (flycheck-dtrace . [(20180903 1630) ((emacs (25 1)) (flycheck (0 22))) "Flycheck: DTrace support" single ((:commit . "951fab3a15c11d92b9fac1ea4791a80dfe034a00") (:authors ("Jürgen Hötzel" . "juergen@hoetzel.info")) (:maintainer "Jürgen Hötzel" . "juergen@hoetzel.info") (:keywords "languages" "convenience" "tools"))]) + (flycheck-eldev . [(20210305 2231) ((flycheck (32)) (dash (2 17)) (emacs (24 4))) "Eldev support in Flycheck" single ((:commit . "2ed17db874da51fba3d2991a1e05cf375fca9619") (:authors ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com") (:keywords "tools" "convenience") (:url . "https://github.com/flycheck/flycheck-eldev"))]) + (flycheck-elixir . [(20210413 612) ((flycheck (0 25))) "Support Elixir in flycheck" single ((:commit . "b57a77a21d6cf9621b3387831cba34135c4fa35d") (:authors ("Lorenzo Bolla" . "lbolla@gmail.com")) (:maintainer "Lorenzo Bolla" . "lbolla@gmail.com"))]) + (flycheck-elm . [(20181107 146) ((flycheck (0 29 -4)) (emacs (24 4)) (let-alist (1 0 5)) (seq (2 20))) "Flycheck support for the elm language" single ((:commit . "1b60050efd4729bfba548f3e5adbcb58436667cb") (:authors ("Brian Sermons")) (:maintainer "Brian Sermons") (:url . "https://github.com/bsermons/flycheck-elm"))]) + (flycheck-elsa . [(20200203 1758) ((emacs (25)) (seq (2 0))) "Flycheck for Elsa." tar ((:commit . "6274e6d5391bcdca46164b3238b045ca21c353a2") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "convenience") (:url . "https://github.com/emacs-elsa/flycheck-elsa"))]) + (flycheck-flawfinder . [(20170116 327) ((flycheck (0 24)) (emacs (24 4))) "Integrate flawfinder with flycheck" single ((:commit . "7d964d38023b088adf3ffc2fddeead81f4491a45") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/flycheck-flawfinder"))]) + (flycheck-flow . [(20190304 1459) ((flycheck (0 18)) (json (1 4))) "Support Flow in flycheck" single ((:commit . "9e8e52cfc98af6a23fd906f9cb5d5d470d8cf82d") (:authors ("Lorenzo Bolla" . "lbolla@gmail.com")) (:maintainer "Lorenzo Bolla" . "lbolla@gmail.com"))]) + (flycheck-ghcmod . [(20150114 632) ((flycheck (0 21 -4 1)) (dash (2 0))) "A flycheck checker for Haskell using ghcmod" single ((:commit . "6bb7b7d879f05bbae54e99eb04806c877adf3ccc") (:authors ("Shen Chao" . "scturtle@gmail.com")) (:maintainer "Shen Chao" . "scturtle@gmail.com") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/scturtle/flycheck-ghcmod"))]) + (flycheck-golangci-lint . [(20190330 1412) ((emacs (24)) (flycheck (0 22))) "Flycheck checker for golangci-lint" single ((:commit . "8e446c68311048f0b87febf8ef0379e29d358851") (:authors ("Wei Jian Gan" . "weijiangan@outlook.com")) (:maintainer "Wei Jian Gan" . "weijiangan@outlook.com") (:keywords "convenience" "tools" "go") (:url . "https://github.com/weijiangan/flycheck-golangci-lint"))]) + (flycheck-gometalinter . [(20180424 941) ((emacs (24)) (flycheck (0 22))) "flycheck checker for gometalinter" single ((:commit . "1e3eede14da405b914a7d8b00300846e4393cb83") (:authors ("Diep Pham" . "me@favadi.com")) (:maintainer "Diep Pham" . "me@favadi.com") (:keywords "convenience" "tools" "go") (:url . "https://github.com/favadi/flycheck-gometalinter"))]) + (flycheck-google-cpplint . [(20210210 300) ((flycheck (0 20 -4 1))) "Help to comply with the Google C++ Style Guide" single ((:commit . "6e2bc77da6e2a8812246b4717d97b68675ed84f1") (:authors ("Akiha Senda" . "senda.akiha@gmail.com")) (:maintainer "Jen-Chieh Shen" . "jcs090218@gmail.com") (:keywords "flycheck" "c" "c++") (:url . "https://github.com/flycheck/flycheck-google-cpplint/"))]) + (flycheck-gradle . [(20190315 234) ((emacs (25 1)) (flycheck (0 25))) "Flycheck extension for Gradle." single ((:commit . "1ca08bbc343362a923cbdc2010f66e41655e92ab") (:maintainer "James Nguyen" . "james@jojojames.com") (:keywords "languages" "gradle") (:url . "https://github.com/jojojames/flycheck-gradle"))]) + (flycheck-grammalecte . [(20210504 1852) ((emacs (26 1)) (flycheck (26))) "Integrate Grammalecte with Flycheck" tar ((:commit . "f488739aea2ef5c8d39bd28083dd72fdfee46e02") (:authors ("Guilhem Doulcier" . "guilhem.doulcier@espci.fr") ("Étienne Deparis" . "etienne@depar.is")) (:maintainer "Guilhem Doulcier" . "guilhem.doulcier@espci.fr") (:keywords "i18n" "text") (:url . "https://git.umaneti.net/flycheck-grammalecte/"))]) + (flycheck-grammarly . [(20210405 1319) ((emacs (25 1)) (flycheck (0 14)) (grammarly (0 3 0))) "Grammarly support for Flycheck" single ((:commit . "8321fc98a0809cad17e37ca924d364423c37b8c0") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/emacs-grammarly/flycheck-grammarly"))]) + (flycheck-guile . [(20201202 509) ((emacs (24 1)) (flycheck (0 22)) (geiser (0 11))) "A Flycheck checker for GNU Guile" single ((:commit . "e46d6e5453dd7471309fae6549445c48e6d8f340") (:authors ("Ricardo Wurmus" . "rekado@elephly.net")) (:maintainer "Andrew Whatson" . "whatson@gmail.com") (:url . "https://github.com/flatwhatson/flycheck-guile"))]) + (flycheck-haskell . [(20200927 1603) ((emacs (24 3)) (flycheck (0 25)) (haskell-mode (13 7)) (dash (2 4 0)) (seq (1 11)) (let-alist (1 0 1))) "Flycheck: Automatic Haskell configuration" tar ((:commit . "f04842252babd37c0ac60e069272a3477b538332") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com") (:keywords "tools" "convenience") (:url . "https://github.com/flycheck/flycheck-haskell"))]) + (flycheck-hdevtools . [(20160926 702) ((flycheck (0 21 -4 1)) (dash (2 0))) "A flycheck checker for Haskell using hdevtools" single ((:commit . "8248ebaf8376ee5e37ff47c814a291550a7bdcf2") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/flycheck/flycheck-hdevtools"))]) + (flycheck-hledger . [(20210119 1000) ((emacs (27 1)) (flycheck (31))) "Flycheck module to check hledger journals" single ((:commit . "0eeaa707b74f96761404daa2f807fbd7af904b75") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://github.com/DamienCassou/flycheck-hledger/"))]) + (flycheck-indent . [(20200129 2046) ((emacs (25 1)) (indent-lint (1 0 0)) (flycheck (31))) "Indent-lint frontend for flycheck" single ((:commit . "c55f4ded11e8e50a96f43675a071354a8fb501c3") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "tools") (:url . "https://github.com/conao3/indent-lint.el"))]) + (flycheck-indicator . [(20200331 1142) ((flycheck (0 15))) "A fancy mode line indicator for `flycheck-mode'" single ((:commit . "e00d9a20cbc21d6814c27cc9206296da394478e8") (:authors ("Eder Elorriaga" . "gexplorer8@gmail.com")) (:maintainer "Eder Elorriaga" . "gexplorer8@gmail.com") (:keywords "convenience" "language" "tools") (:url . "https://github.com/gexplorer/flycheck-indicator"))]) + (flycheck-ini-pyinilint . [(20190312 1931) ((flycheck (31))) "Flycheck integration for PyINILint" single ((:commit . "7febbea9ed407eccc4bfd24ae0d3afd1c19394f7") (:authors ("Daniel J. R. May" . "daniel.may@danieljrmay.com")) (:maintainer "Daniel J. R. May" . "daniel.may@danieljrmay.com") (:keywords "convenience" "files" "tools") (:url . "https://gitlab.com/danieljrmay/flycheck-ini-pyinilint"))]) + (flycheck-inline . [(20200808 1019) ((emacs (25 1)) (flycheck (32))) "Display Flycheck errors inline" single ((:commit . "8e00b4c5951a9515a450a14aefe92e9f6ddcfbde") (:authors ("fmdkdd")) (:maintainer "fmdkdd") (:keywords "tools" "convenience") (:url . "https://github.com/flycheck/flycheck-inline"))]) + (flycheck-irony . [(20180604 2152) ((emacs (24 1)) (flycheck (0 22)) (irony (0 2 0))) "Flycheck: C/C++ support via Irony" single ((:commit . "42dbecd4a865cabeb301193bb4d660e26ae3befe") (:authors ("Guillaume Papin" . "guillaume.papin@epitech.eu")) (:maintainer "Guillaume Papin" . "guillaume.papin@epitech.eu") (:keywords "convenience" "tools" "c") (:url . "https://github.com/Sarcasm/flycheck-irony/"))]) + (flycheck-jest . [(20180411 328) ((emacs (25 1)) (flycheck (0 25))) "Flycheck extension for Jest." single ((:commit . "08f27c5ed97c83c445f99fab58f0b6c826f14449") (:maintainer "James Nguyen" . "james@jojojames.com") (:keywords "languages" "jest") (:url . "https://github.com/jojojames/flycheck-jest"))]) + (flycheck-joker . [(20200412 2346) ((flycheck (0 18))) "Add Clojure syntax checker (via Joker) to flycheck" single ((:commit . "93576295fef7a749bf779eeece5edd85e21868e2") (:authors ("Roman Bataev" . "roman.bataev@gmail.com")) (:maintainer "Roman Bataev" . "roman.bataev@gmail.com"))]) + (flycheck-julia . [(20170729 2141) ((emacs (24)) (flycheck (0 22))) "Julia support for Flycheck" single ((:commit . "213b60a5a9a1cb7887260e1d159b5bb27167cbb6") (:authors ("Guido Kraemer" . "guido.kraemer@gmx.de")) (:maintainer "Guido Kraemer" . "guido.kraemer@gmx.de") (:keywords "convenience" "tools" "languages") (:url . "https://github.com/gdkrmr/flycheck-julia"))]) + (flycheck-keg . [(20200726 218) ((emacs (24 3)) (keg (0 1)) (flycheck (0 1))) "Flycheck for Keg projects" single ((:commit . "e4c7d9d8f823fa717df5f0e7039d525758429fc9") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "convenience") (:url . "https://github.com/conao3/keg.el"))]) + (flycheck-kotlin . [(20210406 1148) ((flycheck (0 20))) "Support kotlin in flycheck" single ((:commit . "bf1b398bdde128806a0a7479ebbe369bbaa40dae") (:authors ("Elric Milon" . "whirm_REMOVETHIS__@gmx.com")) (:maintainer "Elric Milon" . "whirm_REMOVETHIS__@gmx.com"))]) + (flycheck-ledger . [(20200304 2204) ((emacs (24 1)) (flycheck (0 15))) "Flycheck integration for ledger files" single ((:commit . "628e25ba66604946085571652a94a54f4d1ad96f") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/purcell/flycheck-ledger"))]) + (flycheck-lilypond . [(20200614 2104) ((emacs (24 3)) (flycheck (0 22))) "LilyPond support in Flycheck" single ((:commit . "17133911b519be76365103dec8c10cb2f3729f1a") (:authors ("Hinrik Örn Sigurðsson" . "hinrik.sig@gmail.com")) (:maintainer "Hinrik Örn Sigurðsson" . "hinrik.sig@gmail.com") (:keywords "tools" "convenience") (:url . "https://github.com/hinrik/flycheck-lilypond"))]) + (flycheck-liquidhs . [(20170412 2326) ((flycheck (0 15))) "A flycheck checker for Haskell using liquid (i.e. liquidhaskell)" single ((:commit . "c27252ac24d77f4b6eec76a4ba9cd61761a3fba9") (:authors ("Ranjit Jhala" . "jhala@cs.ucsd.edu")) (:maintainer "Ranjit Jhala" . "jhala@cs.ucsd.edu") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/ucsd-progsys/liquidhaskell/flycheck-liquid.el"))]) + (flycheck-mercury . [(20181118 1952) ((flycheck (0 22)) (s (1 9 0)) (dash (2 4 0))) "Mercury support in Flycheck" single ((:commit . "b6807a8db70981e21a91a93324c31e49de85c89f") (:authors ("Matthias Güdemann" . "matthias.gudemann@gmail.com")) (:maintainer "Matthias Güdemann" . "matthias.gudemann@gmail.com") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/flycheck/flycheck-mercury"))]) + (flycheck-mmark . [(20190713 1323) ((emacs (24 4)) (flycheck (0 29))) "Flycheck checker for the MMark markdown processor" single ((:commit . "2f5f7502c1e422c1df5b347b8142d67d5cd5caa7") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:keywords "convenience" "text") (:url . "https://github.com/mmark-md/flycheck-mmark"))]) + (flycheck-mypy . [(20200113 1336) ((flycheck (0 18))) "Support mypy in flycheck" single ((:commit . "5b4e14ab0cbce2ff35fee7e69b5b95eafd609c80") (:authors ("Lorenzo Bolla" . "lbolla@gmail.com")) (:maintainer "Lorenzo Bolla" . "lbolla@gmail.com"))]) + (flycheck-nim . [(20190927 1514) ((dash (2 4 0)) (flycheck (0 20))) "Defines a flycheck syntax checker for nim" single ((:commit . "ddfade51001571c2399f78bcc509e0aa8eb752a4") (:authors ("Adam Schwalm" . "adamschwalm@gmail.com")) (:maintainer "Adam Schwalm" . "adamschwalm@gmail.com") (:url . "https://github.com/ALSchwalm/flycheck-nim"))]) + (flycheck-nimsuggest . [(20171027 2208) ((flycheck (0 23)) (emacs (24 3))) "flycheck backend for Nim using nimsuggest" single ((:commit . "dc9a5de1cb3ee05db5794d824610959a1f603bc9") (:authors ("Yuta Yamada <cokesboy\"at\"gmail.com>")) (:maintainer "Yuta Yamada <cokesboy\"at\"gmail.com>") (:url . "https://github.com/yuutayamada/flycheck-nimsuggest"))]) + (flycheck-objc-clang . [(20201003 1053) ((emacs (24 4)) (flycheck (26))) "Flycheck: Objective-C support using Clang" single ((:commit . "5e74a5a796e73fca7f3fd15986fefa56529b8e98") (:authors ("Goichi Hirakawa" . "gooichi@gyazsquare.com")) (:maintainer "Goichi Hirakawa" . "gooichi@gyazsquare.com") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/GyazSquare/flycheck-objc-clang"))]) + (flycheck-ocaml . [(20170730 2153) ((emacs (24 1)) (flycheck (0 22)) (merlin (3 0 1)) (let-alist (1 0 3))) "Flycheck: OCaml support" single ((:commit . "8707a7bf545a8639a6a5c600a98d9a2ea1487dc9") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com") (:keywords "convenience" "tools" "languages") (:url . "https://github.com/flycheck/flycheck-ocaml"))]) + (flycheck-package . [(20210509 2323) ((emacs (24 1)) (flycheck (0 22)) (package-lint (0 2))) "A Flycheck checker for elisp package authors" single ((:commit . "ecd03f83790611888d693c684d719e033f69cb40") (:authors ("Steve Purcell" . "steve@sanityinc.com") ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "lisp") (:url . "https://github.com/purcell/flycheck-package"))]) + (flycheck-pact . [(20180920 2052) ((emacs (24 3)) (flycheck (0 25)) (pact-mode (0 0 4))) "Flycheck support for pact-mode" single ((:commit . "0e10045064ef89ec8b6f5a473073d47b976a2ca3") (:authors ("Stuart Popejoy")) (:maintainer "Stuart Popejoy" . "stuart@kadena.io") (:keywords "pact" "lisp" "languages" "blockchain" "smartcontracts" "tools" "linting") (:url . "http://github.com/kadena-io/flycheck-pact"))]) + (flycheck-pest . [(20200317 1503) ((emacs (26 3)) (flycheck (31)) (pest-mode (0 1))) "Flycheck integration for Pest -" single ((:commit . "43447a2c70f98edd1139005e32f437d3f142442b") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "convenience" "flycheck") (:url . "https://github.com/ksqsf/pest-mode"))]) + (flycheck-phpstan . [(20201126 603) ((emacs (24 3)) (flycheck (26)) (phpstan (0 5 0))) "Flycheck integration for PHPStan" single ((:commit . "6863a5278fc656cddb604b0c6e165f05d0171d0a") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "tools" "php") (:url . "https://github.com/emacs-php/phpstan.el"))]) + (flycheck-pkg-config . [(20200409 501) ((dash (2 8 0)) (s (1 9 0)) (flycheck (29))) "configure flycheck using pkg-config" single ((:commit . "b76b24ea1f4800f5fb96ce9c6c4788e0e63133d3") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:keywords "flycheck"))]) + (flycheck-plantuml . [(20171018 111) ((flycheck (0 24)) (emacs (24 4)) (plantuml-mode (1 2 2))) "Integrate plantuml with flycheck" single ((:commit . "183be89e1dbba0b38237dd198dff600e0790309d") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/flycheck-plantuml"))]) + (flycheck-pony . [(20210118 1326) ((flycheck (0 25 1))) "Pony support in Flycheck" single ((:commit . "ca00e018ecb9ebea4dde7f17eadb95d755ea88ab") (:keywords "tools" "convenience") (:url . "https://github.com/seantallen/flycheck-pony"))]) + (flycheck-popup-tip . [(20170812 2351) ((flycheck (0 22)) (popup (0 5)) (emacs (24))) "Display Flycheck error messages using popup.el" single ((:commit . "ef86aad907f27ca076859d8d9416f4f7727619c6") (:authors ("Saša Jovanić" . "sasa@simplify.ba")) (:maintainer "Saša Jovanić" . "sasa@simplify.ba") (:keywords "convenience" "tools" "flycheck" "tooltip") (:url . "https://github.com/flycheck/flycheck-popup-tip/"))]) + (flycheck-pos-tip . [(20200516 1600) ((emacs (24 1)) (flycheck (0 22)) (pos-tip (0 4 6))) "Display Flycheck errors in GUI tooltips" single ((:commit . "dc57beac0e59669926ad720c7af38b27c3a30467") (:authors ("Akiha Senda" . "senda.akiha@gmail.com") ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com") (:keywords "tools" "convenience") (:url . "https://github.com/flycheck/flycheck-pos-tip"))]) + (flycheck-posframe . [(20210316 618) ((flycheck (0 24)) (emacs (26)) (posframe (0 7 0))) "Show flycheck error messages using posframe.el" single ((:commit . "8f60c9bf124ab9597d681504a73fdf116a0bde12") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/flycheck-posframe"))]) + (flycheck-projectile . [(20201031 1952) ((emacs (25 1)) (flycheck (31)) (projectile (2 2))) "Project-wide errors" single ((:commit . "ce6e9e8793a55dace13d5fa13badab2dca3b5ddb") (:authors ("Nikita Bloshchanevich" . "nikblos@outlook.com")) (:maintainer "Nikita Bloshchanevich" . "nikblos@outlook.com") (:url . "https://github.com/nbfalcon/flycheck-projectile"))]) + (flycheck-prospector . [(20180524 450) ((flycheck (0 22))) "Support prospector in flycheck" single ((:commit . "92f2680573290ba4a69a2d6e140f44680efce6a8") (:authors ("Carlos Coelho" . "carlospecter@gmail.com")) (:maintainer "Carlos Coelho" . "carlospecter@gmail.com") (:url . "https://github.com/chocoelho/flycheck-prospector"))]) + (flycheck-psalm . [(20200510 1540) ((emacs (24 3)) (flycheck (26)) (psalm (0 6 0))) "Flycheck integration for Psalm" single ((:commit . "b2a1e8a9524b0004e62996c70da5536f86e56182") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "tools" "php") (:url . "https://github.com/emacs-php/psalm.el"))]) + (flycheck-pycheckers . [(20210414 2023) ((flycheck (0 18))) "multiple syntax checker for Python, using Flycheck" tar ((:commit . "771fb9a66223287fcd4998b5f6d32d8c602bd91c") (:keywords "convenience" "tools" "languages") (:url . "https://github.com/msherry/flycheck-pycheckers"))]) + (flycheck-pyflakes . [(20170330 2311) ((flycheck (0 18))) "Support pyflakes in flycheck" single ((:commit . "61b045939e3743b2162b7e4e73249c66fc2b8f65") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) + (flycheck-pyre . [(20190215 1222) ((emacs (24)) (flycheck (29)) (cl-lib (0 6))) "Support Pyre in flycheck" tar ((:commit . "0560122caae207d99d8af1ac2b4e5d6f6a1ce444") (:authors ("Vyacheslav Linnik" . "vyacheslav.linnik@gmail.com")) (:maintainer "Vyacheslav Linnik" . "vyacheslav.linnik@gmail.com") (:url . "https://github.com/linnik/flycheck-pyre"))]) + (flycheck-raku . [(20210316 820) ((emacs (26 3)) (flycheck (0 22))) "Raku support in Flycheck" single ((:commit . "4163c0dcc1447bc98bb20b835eb23cb68a638ba9") (:authors ("Hinrik Örn Sigurðsson" . "hinrik.sig@gmail.com") ("Johnathon Weare" . "jrweare@gmail.com") ("Siavash Askari Nasr" . "siavash.askari.nasr@gmail.com")) (:maintainer "Hinrik Örn Sigurðsson" . "hinrik.sig@gmail.com") (:keywords "tools" "convenience") (:url . "https://github.com/Raku/flycheck-raku"))]) + (flycheck-relint . [(20200721 2217) ((emacs (26 1)) (flycheck (0 22)) (relint (1 15))) "A Flycheck checker for elisp regular expressions" single ((:commit . "4d112871b82d5ea6d0d3e4aaacc55a45536707b7") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "lisp") (:url . "https://github.com/purcell/flycheck-relint"))]) + (flycheck-rtags . [(20191222 920) ((emacs (24)) (flycheck (0 23)) (rtags (2 10))) "RTags Flycheck integration" single ((:commit . "63f18acb21e664fd92fbc19465f0b5df085b5e93") (:authors ("Christian Schwarzgruber" . "c.schwarzgruber.cs@gmail.com")) (:maintainer "Christian Schwarzgruber" . "c.schwarzgruber.cs@gmail.com") (:url . "https://github.com/Andersbakken/rtags"))]) + (flycheck-rust . [(20190319 1546) ((emacs (24 1)) (flycheck (28)) (dash (2 13 0)) (seq (2 3)) (let-alist (1 0 4))) "Flycheck: Rust additions and Cargo support" single ((:commit . "a139cd53c5062697e9ed94ad80b803c37d999600") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com") (:keywords "tools" "convenience") (:url . "https://github.com/flycheck/flycheck-rust"))]) + (flycheck-stan . [(20210130 1325) ((emacs (25 1)) (flycheck (0 16 0)) (stan-mode (10 2 1))) "Add Stan support for Flycheck" tar ((:commit . "9bb858b9f1314dcf1a5df23e39f9af522098276b") (:authors ("Jeffrey Arnold" . "jeffrey.arnold@gmail.com") ("Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu")) (:maintainer "Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu") (:keywords "c" "languages") (:url . "https://github.com/stan-dev/stan-mode/tree/master/flycheck-stan"))]) + (flycheck-status-emoji . [(20180330 2325) ((cl-lib (0 1)) (emacs (24)) (flycheck (0 20)) (let-alist (1 0))) "Show flycheck status using cute, compact emoji" single ((:commit . "4bd113ab42dec9544b66e0a27ed9008ce8148433") (:authors ("Ben Liblit" . "liblit@acm.org")) (:maintainer "Ben Liblit" . "liblit@acm.org") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/liblit/flycheck-status-emoji"))]) + (flycheck-swift . [(20170129 549) ((emacs (24 4)) (flycheck (0 25))) "Flycheck extension for Apple's Swift." single ((:commit . "4c5ad401252400a78da395fd56a71e67ff8c2761") (:keywords "languages" "swift"))]) + (flycheck-swift3 . [(20201003 916) ((emacs (24 4)) (flycheck (26))) "Flycheck: Swift support for Apple swift-mode" single ((:commit . "f83b2bb7086e54beb2bd2df406a498927a7b2fba") (:authors ("Goichi Hirakawa" . "gooichi@gyazsquare.com")) (:maintainer "Goichi Hirakawa" . "gooichi@gyazsquare.com") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/GyazSquare/flycheck-swift3"))]) + (flycheck-swiftlint . [(20180830 340) ((emacs (25 1)) (flycheck (0 25))) "Flycheck extension for Swiftlint." single ((:commit . "8861ddbd9c1c2a951630d9ea29162ad0916580cb") (:maintainer "James Nguyen" . "james@jojojames.com") (:keywords "languages" "swiftlint" "swift" "emacs") (:url . "https://github.com/jojojames/flycheck-swiftlint"))]) + (flycheck-swiftx . [(20200814 845) ((emacs (26 1)) (flycheck (26)) (xcode-project (1 0))) "Flycheck: Swift backend" single ((:commit . "84f42393dea362d3bdfc9253a205a17ec7a12a76") (:authors ("John Buckley" . "john@olivetoast.com")) (:maintainer "John Buckley" . "john@olivetoast.com") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/nhojb/flycheck-swiftx"))]) + (flycheck-tcl . [(20180327 1259) ((emacs (24 4)) (flycheck (0 22))) "A flycheck checker for Tcl using tclchecker" single ((:commit . "7ca23f4673e178b9f5dcc8a82b86cf05b15d7236") (:authors ("Niels Widger" . "niels.widger@gmail.com")) (:maintainer "Niels Widger" . "niels.widger@gmail.com") (:url . "https://github.com/nwidger/flycheck-tcl"))]) + (flycheck-tip . [(20171020 1048) ((flycheck (29)) (emacs (24 1)) (popup (0 5 0))) "Show flycheck/flymake errors by tooltip" tar ((:commit . "9b0072d92e6b4a52834bf5a34120a0f5e1c8c2fd") (:authors ("Yuta Yamada <cokesboy\"at\"gmail.com>")) (:maintainer "Yuta Yamada <cokesboy\"at\"gmail.com>") (:keywords "flycheck") (:url . "https://github.com/yuutayamada/flycheck-tip"))]) + (flycheck-title . [(20210321 558) ((flycheck (30)) (emacs (24))) "show flycheck errors in the frame title" single ((:commit . "74e4375f372f7b9ce0fdfa34dc74a048376679ae") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) + (flycheck-vale . [(20190609 1533) ((emacs (24 4)) (flycheck (0 22)) (let-alist (1 0 4))) "flycheck integration for vale" single ((:commit . "f08249535348d046d0974b9c20fe1b7dd3cd2660") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/flycheck-vale"))]) + (flycheck-vdm . [(20190304 839) ((emacs (24)) (flycheck (32 -4)) (vdm-mode (0 0 4))) "Syntax checking for vdm-mode" single ((:commit . "89e7db6ee1a89b8c1f7ce36ce6800c32b5c4ba2d") (:authors ("Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com")) (:maintainer "Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com") (:keywords "languages") (:url . "https://github.com/peterwvj/vdm-mode"))]) + (flycheck-xcode . [(20180122 651) ((emacs (25 1)) (flycheck (0 25))) "Flycheck extension for Apple's Xcode." single ((:commit . "b76f872c8985801951a095b8b3c1572b94189f9e") (:maintainer "James Nguyen" . "james@jojojames.com") (:keywords "languages" "xcode") (:url . "https://github.com/jojojames/flycheck-xcode"))]) + (flycheck-yamllint . [(20170325 1735) ((flycheck (30))) "Flycheck integration for YAMLLint" single ((:commit . "1e9fe3b2d3e42d551b94473816a8eeee637b446c") (:authors ("Krzysztof Magosa" . "krzysztof@magosa.pl")) (:maintainer "Krzysztof Magosa" . "krzysztof@magosa.pl") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/krzysztof-magosa/flycheck-yamllint"))]) + (flycheck-yang . [(20180312 1831) ((yang-mode (0 9 4)) (flycheck (0 18))) "YANG flycheck checker" single ((:commit . "47881fc42ef0163c47064b72b5d6dbef4f83d778") (:authors (nil . "Andrew Fort (@andaru)")) (:maintainer nil . "Andrew Fort (@andaru)"))]) + (flycheck-ycmd . [(20181016 618) ((emacs (24)) (dash (2 13 0)) (flycheck (0 22)) (ycmd (1 2)) (let-alist (1 0 5))) "flycheck integration for ycmd" single ((:commit . "c17ff9e0250a9b39d23af37015a2b300e2f36fed") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/emacs-ycmd"))]) + (flymake-aspell . [(20210411 2342) ((emacs (26 1))) "Aspell checker for flymake" single ((:commit . "8c45988a12e7c149b17d7edb84e6dfc33bb7b288") (:authors ("Leo Gaskin" . "leo.gaskin@le0.gs")) (:maintainer "Leo Gaskin" . "leo.gaskin@le0.gs") (:keywords "wp" "flymake" "spell" "aspell") (:url . "https://github.com/leotaku/flycheck-aspell"))]) + (flymake-coffee . [(20170723 146) ((flymake-easy (0 1))) "A flymake handler for coffee script" single ((:commit . "dee295acf30820ed15fe0de17137d50bc27fc80c") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-coffee"))]) + (flymake-css . [(20170723 146) ((flymake-easy (0 1))) "Flymake support for css using csslint" single ((:commit . "de090163ba289910ceeb61b13368ce42d0f2dfd8") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-css"))]) + (flymake-cursor . [(20210126 1733) ((flymake (0 3))) "Show flymake messages in the minibuffer after delay" single ((:commit . "afd458daf88f475cfacdd22375635e43a5017564") (:authors ("Unknown Original Author") ("Dino Chiesa" . "dpchiesa@hotmail.com") ("Sam Graham <libflymake-emacs BLAHBLAH illusori.co.uk>")) (:maintainer "Sam Graham <libflymake-emacs BLAHBLAH illusori.co.uk>") (:keywords "languages" "mode" "flymake") (:url . "https://github.com/flymake/emacs-flymake-cursor"))]) + (flymake-diagnostic-at-point . [(20180815 1004) ((emacs (26 1)) (popup (0 5 3))) "Display flymake diagnostics at point" single ((:commit . "379616b1c6f5ebeaf08fbe54ae765008a78b3be7") (:authors ("Ricardo Martins" . "ricardo@scarybox.net")) (:maintainer "Ricardo Martins" . "ricardo@scarybox.net") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/meqif/flymake-diagnostic-at-point"))]) + (flymake-easy . [(20140818 755) nil "Helpers for easily building flymake checkers" single ((:commit . "de41ea49503f71f997e5c359a2ad08df696c0147") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "convenience" "internal") (:url . "https://github.com/purcell/flymake-easy"))]) + (flymake-elixir . [(20130810 1417) nil "A flymake handler for elixir-mode .ex files." single ((:commit . "3810566cffe35d04cc3f01e27fe397d68d52f802") (:authors ("Sylvain Benner" . "syl20bnr@gmail.com")) (:maintainer "Sylvain Benner" . "syl20bnr@gmail.com"))]) + (flymake-eslint . [(20191129 1558) ((emacs (26 0))) "A Flymake backend for Javascript using eslint" single ((:commit . "6e2d376f84ddf9af593072954c97e9c82ab85331") (:authors ("Dan Orzechowski")) (:maintainer "Dan Orzechowski") (:url . "https://github.com/orzechowskid/flymake-eslint"))]) + (flymake-flycheck . [(20210404 2128) ((flycheck (31)) (emacs (26 1))) "Use flycheck checkers as flymake backends" single ((:commit . "fd5e801b49a0dd085bc23fd6ea32b0e3be9edea7") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/purcell/flymake-flycheck"))]) + (flymake-gjshint . [(20130327 1232) nil "A flymake handler for javascript using both jshint and gjslint" single ((:commit . "dc957c14cb060819585de8aedb330e24efa4b784") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com") (:keywords "flymake" "javascript" "jshint" "gjslint"))]) + (flymake-go . [(20150714 733) nil "A flymake handler for go-mode files" single ((:commit . "ae83761aa908c1a50ff34af04f00dcc46bca2ce9") (:authors ("Michael Fellinger" . "michael@iron.io") ("Robert Zaremba" . "robert.marek.zaremba@wp.eu")) (:maintainer "Michael Fellinger" . "michael@iron.io") (:keywords "go" "flymake") (:url . "https://github.com/robert-zaremba/flymake-go"))]) + (flymake-go-staticcheck . [(20190708 1325) ((emacs (25))) "Go staticcheck linter for flymake" single ((:commit . "130079fcd29c3e2a72f8325f3041042bcc6286f1") (:authors ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainer "Sergey Kostyaev" . "feo.me@ya.ru") (:keywords "languages" "tools") (:url . "https://github.com/s-kostyaev/flymake-go-staticcheck"))]) + (flymake-golangci . [(20191028 1927) ((flymake-easy (0 1)) (emacs (24))) "A flymake handler for go-mode files using Golang CI lint" single ((:commit . "dfc31a1a6ae3f087b49fe6f5f21b3866780aa91c") (:authors ("Jorge Javier Araya Navarro" . "jorgejavieran@yahoo.com.mx")) (:maintainer "Jorge Javier Araya Navarro" . "jorgejavieran@yahoo.com.mx") (:url . "https://gitlab.com/shackra/flymake-golangci"))]) + (flymake-gradle . [(20190315 233) ((emacs (26 1))) "Flymake extension for Gradle." single ((:commit . "dbedd29b78d4828ef57d4de20867be5df3eaab99") (:maintainer "James Nguyen" . "james@jojojames.com") (:keywords "languages" "gradle") (:url . "https://github.com/jojojames/flymake-gradle"))]) + (flymake-grammarly . [(20210403 1349) ((emacs (26 1)) (grammarly (0 3 0))) "Flymake support for Grammarly" single ((:commit . "bc7c7e74013816ea06463ff85627bdc08ad60d9a") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/emacs-grammarly/flymake-grammarly"))]) + (flymake-haml . [(20170723 146) ((flymake-easy (0 1))) "A flymake handler for haml files" single ((:commit . "22a81e8484734552d461e7ae7305664dc244447e") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-haml"))]) + (flymake-haskell-multi . [(20170723 146) ((flymake-easy (0 1))) "Syntax-check haskell-mode using both ghc and hlint" tar ((:commit . "b564a94312259885b1380272eb867bf52a164020") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-haskell-multi"))]) + (flymake-hlint . [(20170723 146) ((flymake-easy (0 1))) "A flymake handler for haskell-mode files using hlint" single ((:commit . "f910736b26784efc9a2fa29503f45c1f1dd0aa38") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-hlint"))]) + (flymake-joker . [(20200315 1429) ((emacs (26 1)) (flymake-quickdef (0 1 1))) "Add Clojure syntax checker (via Joker) to flymake" single ((:commit . "fc132beedac9e6f415b72e578e77318fd13af9ee") (:authors ("Mateusz Probachta" . "mateusz.probachta@gmail.com")) (:maintainer "Mateusz Probachta" . "mateusz.probachta@gmail.com") (:url . "https://github.com/beetleman/flymake-joker"))]) + (flymake-jshint . [(20140319 2200) ((flymake-easy (0 8))) "making flymake work with JSHint" single ((:commit . "79dd554c227883c487db38ac111306c8d5382c95") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:keywords "flymake" "jshint" "javascript"))]) + (flymake-jslint . [(20170723 146) ((flymake-easy (0 1))) "A flymake handler for javascript using jslint" single ((:commit . "8edb82be605542b0ef62d38d818adcdde335eecb") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-jslint"))]) + (flymake-json . [(20180511 911) ((flymake-easy (0 1))) "A flymake handler for json using jsonlint" single ((:commit . "03b4e5e7ad11938781257a783e717ab95fe65952") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-json"))]) + (flymake-kondor . [(20200925 1539) ((emacs (26 1)) (flymake-quickdef (1 0 0))) "Linter with clj-kondo" single ((:commit . "72052b5ba827faf357608cf720a70221192a8282") (:authors ("https://turbocafe.keybase.pub")) (:maintainer "https://turbocafe.keybase.pub") (:url . "https://github.com/turbo-cafe/flymake-kondor"))]) + (flymake-ktlint . [(20180831 346) ((emacs (26 1))) "Flymake extension for Ktlint." single ((:commit . "56aab6f2d22061999050783dbc3166cdb456d0bb") (:maintainer "James Nguyen" . "james@jojojames.com") (:keywords "languages" "ktlint") (:url . "https://github.com/jojojames/flymake-ktlint"))]) + (flymake-less . [(20151111 738) ((less-css-mode (0 15)) (flymake-easy (0 1))) "Flymake handler for LESS stylesheets (lesscss.org)" single ((:commit . "32d3c28a9a5c52b82d1741ff9d715013b6498421") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "languages"))]) + (flymake-lua . [(20170129 154) nil "Flymake for Lua" single ((:commit . "84589f20066921a5b79cf3a1f914a223a2552d2a") (:authors (nil . "Sébastien Roccaserra (format \"<%s%s@%s.%s>\" \"s\" \"roccaserra\" \"yahoo\" \"com\")")) (:maintainer nil . "Sébastien Roccaserra (format \"<%s%s@%s.%s>\" \"s\" \"roccaserra\" \"yahoo\" \"com\")") (:keywords "lua"))]) + (flymake-nasm . [(20210310 1540) ((flymake-quickdef (1 0 0)) (emacs (26 1))) "A flymake handler for asm-mode files using nasm" single ((:commit . "27e58d7f3a48ca6fc12238fe6c888a3fdffc3f75") (:authors ("Jürgen Hötzel" . "juergen@hoetzel.info")) (:maintainer "Jürgen Hötzel") (:keywords "tools" "languages") (:url . "http://github.com/juergenhoetzel/flymake-nasm"))]) + (flymake-perlcritic . [(20120328 814) ((flymake (0 3))) "Flymake handler for Perl to invoke Perl::Critic" tar ((:commit . "c70eb881d4fb27aeb72c0bf8de6707b9de49bd51") (:authors ("Sam Graham <libflymake-perlcritic-emacs BLAHBLAH illusori.co.uk>")) (:maintainer "Sam Graham <libflymake-perlcritic-emacs BLAHBLAH illusori.co.uk>") (:url . "https://github.com/illusori/emacs-flymake-perlcritic"))]) + (flymake-pest . [(20200317 1503) ((emacs (26 3)) (pest-mode (0 1))) "A flymake handler for Pest files" single ((:commit . "43447a2c70f98edd1139005e32f437d3f142442b") (:authors ("ksqsf" . "i@ksqsf.moe") ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "ksqsf" . "i@ksqsf.moe") (:keywords "languages" "flymake") (:url . "https://github.com/ksqsf/pest-mode"))]) + (flymake-php . [(20170723 146) ((flymake-easy (0 1))) "A flymake handler for php-mode files" single ((:commit . "c045d01e002ba5e09b05f40e25bf5068d02126bc") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-php"))]) + (flymake-phpcs . [(20140713 631) ((flymake-easy (0 9))) "making flymake work with PHP CodeSniffer" single ((:commit . "8e5ab5103c8f40a2ab6c86def6327e480ae93657") (:authors ("Akiha Senda")) (:maintainer "Akiha Senda") (:keywords "flymake" "phpcs" "php") (:url . "https://github.com/senda-akiha/flymake-phpcs/"))]) + (flymake-phpstan . [(20201122 950) ((emacs (26 1)) (phpstan (0 5 0))) "Flymake backend for PHP using PHPStan" single ((:commit . "6863a5278fc656cddb604b0c6e165f05d0171d0a") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "tools" "php") (:url . "https://github.com/emacs-php/phpstan.el"))]) + (flymake-proselint . [(20200927 640) ((emacs (26 1)) (flymake-quickdef (1 0 0))) "Flymake backend for proselint" single ((:commit . "b94950301139846002d2020bc630440ff834bf24") (:authors ("Manuel Uberti" . "manuel.uberti@inventati.org")) (:maintainer "Manuel Uberti" . "manuel.uberti@inventati.org") (:keywords "convenience") (:url . "https://github.com/manuel-uberti/flymake-proselint"))]) + (flymake-puppet . [(20170801 554) ((flymake-easy (0 9))) "Flymake handler using puppet-lint" single ((:commit . "8a772395f4ccc59d883712ab53a92a17c1d9a429") (:authors ("Ben Prew")) (:maintainer "Ben Prew") (:url . "https://github.com/benprew/flymake-puppet"))]) + (flymake-python-pyflakes . [(20170723 146) ((flymake-easy (0 8))) "A flymake handler for python-mode files using pyflakes (or flake8)" single ((:commit . "1d65c26bf65a5dcbd29fcd967e2feb90e1e7a33d") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-python-pyflakes"))]) + (flymake-quickdef . [(20200308 2342) ((emacs (26 1))) "Quickly define a new Flymake backend" single ((:commit . "150c5839768a3d32f988f9dc08052978a68f2ad7") (:authors ("Karl Otness")) (:maintainer "Karl Otness") (:keywords "languages" "tools" "convenience" "lisp") (:url . "https://github.com/karlotness/flymake-quickdef"))]) + (flymake-racket . [(20210105 606) ((emacs (26 1))) "Flymake extension for Racket." single ((:commit . "3d3e5f2a9ab696670f9e52baa4dde7b84b7542df") (:maintainer "James Nguyen" . "james@jojojames.com") (:keywords "languages" "racket" "scheme") (:url . "https://github.com/jojojames/flymake-racket"))]) + (flymake-ruby . [(20170723 146) ((flymake-easy (0 1))) "A flymake handler for ruby-mode files" single ((:commit . "6c320c6fb686c5223bf975cc35178ad6b195e073") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-ruby"))]) + (flymake-rust . [(20170729 2139) ((flymake-easy (0 1))) "A flymake handler for rust-mode files" single ((:commit . "2f42d1f2dad73ec9de460eda6176e3ab25c446f0") (:authors ("Joao Oliveira" . "joaoxsouls@gmail.com")) (:maintainer "Joao Oliveira" . "joaoxsouls@gmail.com") (:url . "https://github.com/joaoxsouls/flymake-rust"))]) + (flymake-sass . [(20170723 146) ((flymake-easy (0 1))) "Flymake handler for sass and scss files" single ((:commit . "2de28148e92deb93bff3d55fe14e7c67ac476056") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-sass"))]) + (flymake-shell . [(20170723 146) ((flymake-easy (0 1))) "A flymake syntax-checker for shell scripts" single ((:commit . "a16cf453056b9849cc7c912bb127fb0b08fc6dab") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/flymake-shell"))]) + (flymake-shellcheck . [(20210314 2048) ((emacs (26))) "A bash/sh Flymake backend powered by ShellCheck" single ((:commit . "ac534e9ef15c82ac86ae65fe5004d29dbc8c92c7") (:authors ("Federico Tedin" . "federicotedin@gmail.com")) (:maintainer "Federico Tedin" . "federicotedin@gmail.com") (:url . "https://github.com/federicotdn/flymake-shellcheck"))]) + (flymake-solidity . [(20170805 644) ((flymake-easy (0 10))) "A flymake handler for solidity using solc" single ((:commit . "48bfe9525f764d8a68cc0270905dbf45bfd00bb8") (:authors ("Pascal van Kooten" . "kootenpv@gmail.com")) (:maintainer "Pascal van Kooten" . "kootenpv@gmail.com") (:url . "https://github.com/kootenvp/flymake-solidity"))]) + (flymake-vala . [(20150326 531) ((flymake-easy (0 1))) "A flymake handler for vala-mode files" single ((:commit . "c3674f461fc84fb0300cd3a562fb903a59782745") (:authors ("Daniel Lawrence" . "dannyla@linux.com")) (:maintainer "Daniel Lawrence" . "dannyla@linux.com") (:keywords "convenience" "vala") (:url . "https://github.com/daniellawrence/flymake-vala"))]) + (flymake-vnu . [(20181128 216) ((emacs (26 1))) "Flymake extension for the v.Nu HTML validator." single ((:commit . "7c4ab9d12611756ad5a80d866890b2f9b73fb611") (:maintainer "Stefan Kuznetsov" . "skuznetsov@posteo.net") (:keywords "languages") (:url . "https://github.com/theneosloth/flymake-vnu"))]) + (flymake-yaml . [(20130423 1548) ((flymake-easy (0 1))) "A flymake handler for YAML" single ((:commit . "24cb5b744a1796e554e6dbfc6eeb237d06a00b10") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com") (:keywords "yaml") (:url . "https://github.com/yasuyk/flymake-yaml"))]) + (flymd . [(20160617 1214) ((cl-lib (0 5))) "On the fly markdown preview" tar ((:commit . "84d5a68bcfed4a295952c33ffcd11e880978d9d7") (:authors ("Mola-T" . "Mola@molamola.xyz")) (:maintainer "Mola-T" . "Mola@molamola.xyz") (:keywords "markdown" "convenience") (:url . "https://github.com/mola-T/flymd"))]) + (flyparens . [(20140723 1846) nil "Check for unbalanced parens on the fly" tar ((:commit . "af9b8cfd647d0e5f97684d613dc2eea7cfc19398") (:authors ("Jisang Yoo")) (:maintainer "Jisang Yoo") (:keywords "faces" "convenience" "lisp" "matching" "parentheses" "parens"))]) + (flyspell-correct . [(20210124 1143) ((emacs (24))) "Correcting words with flyspell via custom interface" tar ((:commit . "404233604439117301562deadc952fe82cb02120") (:authors ("Boris Buliga" . "boris@d12frosted.io")) (:maintainer "Boris Buliga" . "boris@d12frosted.io") (:url . "https://github.com/d12frosted/flyspell-correct"))]) + (flyspell-correct-avy-menu . [(20210124 1143) ((flyspell-correct (0 6 1)) (avy-menu (0 1 1)) (emacs (24))) "Correcting words with flyspell via avy-menu interface" single ((:commit . "404233604439117301562deadc952fe82cb02120") (:authors ("Boris Buliga" . "boris@d12frosted.io") ("Clemens Radermacher" . "clemera@posteo.net")) (:maintainer "Boris Buliga" . "boris@d12frosted.io") (:url . "https://github.com/d12frosted/flyspell-correct"))]) + (flyspell-correct-helm . [(20210124 1143) ((flyspell-correct (0 6 1)) (helm (1 9 0)) (emacs (24))) "Correcting words with flyspell via helm interface" single ((:commit . "404233604439117301562deadc952fe82cb02120") (:authors ("Boris Buliga" . "boris@d12frosted.io")) (:maintainer "Boris Buliga" . "boris@d12frosted.io") (:url . "https://github.com/d12frosted/flyspell-correct"))]) + (flyspell-correct-ivy . [(20210124 1143) ((flyspell-correct (0 6 1)) (ivy (0 8 0)) (emacs (24 4))) "Correcting words with flyspell via ivy interface" single ((:commit . "404233604439117301562deadc952fe82cb02120") (:authors ("Boris Buliga" . "boris@d12frosted.io")) (:maintainer "Boris Buliga" . "boris@d12frosted.io") (:url . "https://github.com/d12frosted/flyspell-correct"))]) + (flyspell-correct-popup . [(20210124 1143) ((flyspell-correct (0 6 1)) (popup (0 5 3)) (emacs (24))) "Correcting words with flyspell via popup interface" single ((:commit . "404233604439117301562deadc952fe82cb02120") (:authors ("Boris Buliga" . "boris@d12frosted.io")) (:maintainer "Boris Buliga" . "boris@d12frosted.io") (:url . "https://github.com/d12frosted/flyspell-correct"))]) + (flyspell-lazy . [(20210308 1253) nil "Improve flyspell responsiveness using idle timers" single ((:commit . "0fc5996bcee20b46cbd227ae948d343c3bef7339") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "spelling") (:url . "http://github.com/rolandwalker/flyspell-lazy"))]) + (flyspell-popup . [(20170529 815) ((popup (0 5 0))) "Correcting words with Flyspell in popup menus" single ((:commit . "29311849bfd253b9b689bf331860b4c4d3bd4dde") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:keywords "convenience") (:url . "https://github.com/xuchunyang/flyspell-popup"))]) + (fm-bookmarks . [(20170104 1716) ((emacs (24 3)) (cl-lib (0 5))) "Use file manager bookmarks (eg Dolphin, Nautilus, PCManFM) in Dired" single ((:commit . "11dacfd16a926bfecba96a94c6b13e162c7717f7") (:authors ("Ono Hiroko" . "azazabc123@gmail.com")) (:maintainer "Ono Hiroko" . "azazabc123@gmail.com") (:keywords "files" "convenience") (:url . "http://github.com/kuanyui/fm-bookmarks.el"))]) + (fn . [(20210304 1812) ((emacs (24)) (cl-lib (0 5)) (dash (2 18 0))) "Concise anonymous functions for Emacs Lisp" single ((:commit . "98e3fe1b4785e162d9aca978a2db106baa79260f") (:authors ("Troy Pracy")) (:maintainer "Troy Pracy") (:keywords "functional"))]) + (focus . [(20191209 2210) ((emacs (24 3)) (cl-lib (0 5))) "Dim the font color of text in surrounding sections" single ((:commit . "5f3f20e7f22fb9fd7c48abce8bd38061d97e4bc0") (:authors ("Lars Tveito" . "larstvei@ifi.uio.no")) (:maintainer "Lars Tveito" . "larstvei@ifi.uio.no") (:url . "http://github.com/larstvei/Focus"))]) + (focus-autosave-mode . [(20160519 2116) ((emacs (24 4))) "Automatically save files in focus-out-hook." single ((:commit . "2e0844fabb6f0dc9e0f31928e4785febf38b9e35") (:authors ("Wojciech Siewierski" . "wojciech.siewierski@onet.pl")) (:maintainer "Wojciech Siewierski" . "wojciech.siewierski@onet.pl") (:keywords "convenience" "files" "frames" "mouse"))]) + (foggy-night-theme . [(20190123 1614) ((emacs (24))) "Dark low contrast theme with soft and muted colors." single ((:commit . "14894e06ee5c6e14db36f2cb07387ee971c1736f") (:authors ("Martin Haesler")) (:maintainer "Martin Haesler"))]) + (fold-dwim . [(20140208 1637) nil "Unified user interface for Emacs folding modes" single ((:commit . "c46f4bb2ce91b4e307136320e72c28dd50b6cd8b") (:authors ("Peter Heslin" . "p.j.heslin@dur.ac.uk")) (:maintainer "Peter Heslin" . "p.j.heslin@dur.ac.uk") (:url . "http://www.dur.ac.uk/p.j.heslin/Software/Emacs"))]) + (fold-dwim-org . [(20131203 1351) ((fold-dwim (1 2))) "Fold DWIM bound to org key-strokes." single ((:commit . "c09bb2b46d65afbd1d0febc6fded7495be7a3037") (:authors ("Matthew L. Fidler & Shane Celis")) (:maintainer "Matthew L. Fidler") (:keywords "folding" "emacs" "org-mode") (:url . "https://github.com/mlf176f2/fold-dwim-org"))]) + (fold-this . [(20191107 1816) nil "Just fold this region please" single ((:commit . "c3912c738cf0515f65162479c55999e2992afce5") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "convenience") (:url . "https://github.com/magnars/fold-this.el"))]) + (folding . [(20200901 953) nil "A folding-editor-like minor mode." tar ((:commit . "8110b4137198aee816a6323d873b547864893da6") (:maintainer "Jari Aalto <jari aalto A T cante dt net>") (:keywords "tools"))]) + (font-lock-profiler . [(20170208 2008) ((emacs (24 3))) "Coverage and timing tool for font-lock keywords." single ((:commit . "6e096458416888a4f63cca0d6bc5965a052753c8") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "faces" "tools") (:url . "https://github.com/Lindydancer/font-lock-profiler"))]) + (font-lock-studio . [(20170127 2051) ((emacs (24 3))) "interactive debugger for Font Lock keywords." single ((:commit . "12c35967b31233e06946c70627aa3152dacfe261") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "faces" "tools") (:url . "https://github.com/Lindydancer/font-lock-studio"))]) + (font-utils . [(20210405 1149) ((persistent-soft (0 8 8)) (pcache (0 2 3))) "Utility functions for working with fonts" single ((:commit . "abc572eb0dc30a26584c0058c3fe6c7273a10003") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "extensions") (:url . "http://github.com/rolandwalker/font-utils"))]) + (fontawesome . [(20170305 1356) ((emacs (24 4))) "fontawesome utility" tar ((:commit . "a743f80bfd53767ca9ee32da34c5ca032172a480") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-fontawesome"))]) + (fontify-face . [(20210503 1956) ((emacs (24))) "Fontify symbols representing faces with that face." single ((:commit . "d1386c88ccc77ccfb40b888ff90d6181325d14f8") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "faces") (:url . "https://github.com/Fuco1/fontify-face"))]) + (forecast . [(20191004 1850) ((emacs (24 4))) "Weather forecasts" single ((:commit . "246120647e28a27506ca0894ba98e371086881fd") (:authors ("Göktuğ Kayaalp" . "self@gkayaalp.com")) (:maintainer "Göktuğ Kayaalp" . "self@gkayaalp.com") (:keywords "weather" "forecast") (:url . "https://dev.gkayaalp.com/elisp/index.html#forecast-el"))]) + (foreign-regexp . [(20200325 50) nil "search and replace by foreign regexp." tar ((:commit . "e2dd47f2160cadc194eb156e7c76c3c869e6706e") (:authors ("K-talo Miyazaki <Keitaro dot Miyazaki at gmail dot com>")) (:maintainer "K-talo Miyazaki <Keitaro dot Miyazaki at gmail dot com>") (:keywords "convenience" "emulations" "matching" "tools" "unix" "wp"))]) + (foreman-mode . [(20170725 1422) ((s (1 9 0)) (dash (2 10 0)) (dash-functional (1 2 0)) (f (0 17 2)) (emacs (24))) "View and manage Procfile-based applications" single ((:commit . "22b3bb13134b617870ed1e888af739f4818be929") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainer "ZHOU Feng" . "zf.pascal@gmail.com") (:keywords "foreman") (:url . "http://github.com/zweifisch/foreman-mode"))]) + (forest-blue-theme . [(20160627 842) ((emacs (24))) "Emacs theme with a dark background." single ((:commit . "58096ce1a25615d2bae806c3775bae3e2775019d") (:authors ("olkinn")) (:maintainer "olkinn"))]) + (forge . [(20210525 1345) ((emacs (25 1)) (closql (1 0 4)) (dash (2 18 1)) (emacsql-sqlite (3 0 0)) (ghub (3 5 2)) (let-alist (1 0 6)) (magit (3 0 0)) (markdown-mode (2 4)) (transient (0 3 3))) "Access Git forges from Magit." tar ((:commit . "551e51511e25505d14e05699a1707fd57e394a9a") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "git" "tools" "vc") (:url . "https://github.com/magit/forge"))]) + (form-feed . [(20210508 1627) ((emacs (24 1))) "Display ^L glyphs as horizontal lines" single ((:commit . "ac1f0ef30a11979f5dfe12d8c05a666739e486ff") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:keywords "faces") (:url . "https://depp.brause.cc/form-feed"))]) + (format-all . [(20210608 2033) ((emacs (24 3)) (inheritenv (0 1)) (language-id (0 12))) "Auto-format C, C++, JS, Python, Ruby and 50 other languages" single ((:commit . "3a15ba2e99c01a054560542d7350fb54da64fbb4") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "languages" "util") (:url . "https://github.com/lassik/emacs-format-all-the-code"))]) + (format-sql . [(20150422 1333) nil "Use format-sql to make your SQL readable in directly Emacs." single ((:commit . "97f475c245cd6c81a72a265678e2087cee66ac7b") (:authors ("Friedrich Paetzke" . "paetzke@fastmail.fm")) (:maintainer "Friedrich Paetzke" . "paetzke@fastmail.fm") (:url . "https://github.com/paetzke/format-sql.el"))]) + (format-table . [(20181223 1616) ((emacs (25)) (dash (2 14 1))) "Parse and reformat tabular data." single ((:commit . "dfcae3a867e574577fc09a43b045889ff155b58f") (:authors ("Jason Duncan" . "jasond496@msn.com")) (:maintainer "Jason Duncan" . "jasond496@msn.com") (:keywords "data") (:url . "https://github.com/functionreturnfunction/format-table"))]) + (forth-mode . [(20210123 900) nil "Programming language mode for Forth" tar ((:commit . "f44fa6481ffe2b4321d462c3fab78a858f2a8ae9") (:authors ("Lars Brinkhoff" . "lars@nocrew.org")) (:maintainer "Lars Brinkhoff" . "lars@nocrew.org") (:keywords "languages" "forth") (:url . "http://github.com/larsbrinkhoff/forth-mode"))]) + (fortpy . [(20150715 2032) ((epc (0 1 0)) (auto-complete (1 4)) (python-environment (0 0 2)) (pos-tip (0 4 5))) "a Fortran auto-completion for Emacs" tar ((:commit . "c614517e9396ef7a78be3b8786fbf303879cf43b") (:authors ("Conrad Rosenbrock <rosenbrockc at gmail.com>")) (:maintainer "Conrad Rosenbrock <rosenbrockc at gmail.com>"))]) + (fortune-cookie . [(20181223 842) nil "Print a fortune in your scratch buffer." single ((:commit . "6c1c08f5be83822c0b762872ab25e3dbee96f333") (:authors ("Andrew Schwartzmeyer" . "andrew@schwartzmeyer.com")) (:maintainer "Andrew Schwartzmeyer" . "andrew@schwartzmeyer.com") (:keywords "fortune" "cowsay" "scratch" "startup") (:url . "https://github.com/andschwa/fortune-cookie"))]) + (fountain-mode . [(20210611 1228) ((emacs (24 4)) (seq (2 20))) "Major mode for screenwriting in Fountain markup" tar ((:commit . "91f4ad083fa620e6e6202460decc3280bd8e4e71") (:authors ("Paul W. Rankin" . "pwr@bydasein.com")) (:maintainer "Paul W. Rankin" . "pwr@bydasein.com") (:keywords "wp" "text") (:url . "https://github.com/rnkn/fountain-mode"))]) + (fraktur-mode . [(20160815 227) ((cl-lib (0 5))) "Easily insert Unicode mathematical Fraktur characters" single ((:commit . "514baf5546aed12a0d9fa0fe66e87cdcc7843b08") (:authors ("Grant Rettke" . "gcr@wisdomandwonder.com")) (:maintainer nil . "<gcr@wisdomandwonder.com>") (:keywords "unicode" "fraktur" "math" "mathematical") (:url . "https://github.com/grettke/fraktur-mode"))]) + (frame-local . [(20180330 940) ((emacs (25 1))) "Variables local to a frame" single ((:commit . "7ee1106c3bcd4022f48421f8cb1ef4f995da816e") (:authors ("Sebastien Chapuis" . "sebastien@chapu.is")) (:maintainer "Sebastien Chapuis" . "sebastien@chapu.is") (:keywords "frames" "tools" "local" "lisp") (:url . "https://github.com/sebastiencs/frame-local"))]) + (frame-mode . [(20190710 2030) ((s (1 9 0)) (emacs (24 4))) "Use frames instead of windows" single ((:commit . "ae2366969927c9f89ea07c999bef382b0b47cac1") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:keywords "frames") (:url . "https://github.com/IvanMalison/frame-mode"))]) + (frame-purpose . [(20201219 1340) ((emacs (25 1)) (dash (2 12)) (dash-functional (1 2 0))) "Purpose-specific frames" single ((:commit . "b4a259fa077671e2dcf33d11b42955c91e395b8b") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "buffers" "convenience" "frames") (:url . "http://github.com/alphapapa/frame-purpose.el"))]) + (frame-tag . [(20170111 6) ((cl-lib (0 5))) "Minor mode that assigns a unique number to each frame for easy switching" single ((:commit . "73d6163568c7d32952175e663318b872f995a4e5") (:authors ("Wong Liang Zan" . "zan@liangzan.net")) (:maintainer "Wong Liang Zan" . "zan@liangzan.net") (:keywords "frame" "movement") (:url . "http://github.com/liangzan/frame-tag.el"))]) + (frames-only-mode . [(20210107 918) ((emacs (24 4)) (dash (2 13 0)) (s (1 11 0))) "Use frames instead of Emacs windows" single ((:commit . "d3f6647c484656ddabdac5d18546599a03823cd4") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com") (:keywords "frames" "windows") (:url . "https://github.com/davidshepherd7/frames-only-mode"))]) + (frameshot . [(20200103 1238) ((emacs (25 3))) "Take screenshots of a frame" single ((:commit . "1b5974f0cc7c2a34e5f9fab6b25578dad7df3dbf") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/tarsius/frameshot"))]) + (framesize . [(20131017 2132) ((key-chord (0 5 20080915))) "change the size of frames in Emacs" single ((:commit . "f2dbf5d2513b2bc45f2085370a55c1754b6025da") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:keywords "frames") (:url . "http://github.com/nicferrier/emacs-framesize"))]) + (frecency . [(20170909 631) ((emacs (25 1)) (a (0 1)) (dash (2 13 0))) "Library for sorting items by frequency and recency of access" single ((:commit . "6d57aee131d96315aedf6cb7d6e5d6d09bf71503") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "libraries" "recency" "recent" "frequency" "frequent") (:url . "http://github.com/alphapapa/frecency.el"))]) + (frecentf . [(20210330 1521) ((emacs (26 1)) (frecency (0 1 -1)) (persist (0 4)) (async (1 9 4))) "Pervasive recentf using frecency" single ((:commit . "19e2c48a8b8c8ee8cae5c93b58b57a0aa81a8c46") (:authors ("Felipe Lema" . "felipel@mortemale.org")) (:maintainer "Felipe Lema" . "felipel@mortemale.org") (:keywords "files" "maint") (:url . "https://launchpad.net/frecentf.el"))]) + (free-keys . [(20160726 2050) ((cl-lib (0 3))) "Show free keybindings for modkeys or prefixes" single ((:commit . "edfd69dc369b2647447b7c28c7c1163b1ddf45b4") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:keywords "convenience") (:url . "https://github.com/Fuco1/free-keys"))]) + (freeradius-mode . [(20190401 1743) ((emacs (24 4))) "major mode for FreeRadius server config files" single ((:commit . "cf8bf0359cf6c77848facbd24b764b3e111b4c2d") (:url . "https://github.com/VersBinarii/freeradius-mode"))]) + (freeze-it . [(20210201 731) ((emacs (24 4))) "Minor mode to make your previous writing read-only" single ((:commit . "d5dc811fc892d78e042394bb4a1342dea2480b5c") (:authors ("Paul W. Rankin" . "pwr@bydasein.com")) (:maintainer "Paul W. Rankin" . "pwr@bydasein.com") (:keywords "wp" "text") (:url . "https://github.com/rnkn/freeze-it"))]) + (friendly-remote-shell . [(20200527 830) ((emacs (24 1)) (cl-lib (0 6 1)) (with-shell-interpreter (0 2 3)) (friendly-tramp-path (0 1 0)) (friendly-shell (0 2 0))) "Human-friendly remote interactive shells" single ((:commit . "ad4ac00662829fa18858be02b322753ad091ffe3") (:keywords "processes" "terminals") (:url . "https://github.com/p3r7/friendly-shell"))]) + (friendly-shell . [(20201212 2302) ((emacs (24 1)) (cl-lib (0 6 1)) (dash (2 17 0)) (with-shell-interpreter (0 2 4))) "Better shell-mode API" single ((:commit . "ad4ac00662829fa18858be02b322753ad091ffe3") (:keywords "processes" "terminals") (:url . "https://github.com/p3r7/friendly-shell"))]) + (friendly-shell-command . [(20200527 830) ((emacs (24 1)) (cl-lib (0 6 1)) (dash (2 17 0)) (with-shell-interpreter (0 2 3))) "Better shell-command API" single ((:commit . "ad4ac00662829fa18858be02b322753ad091ffe3") (:keywords "processes" "terminals") (:url . "https://github.com/p3r7/friendly-shell"))]) + (friendly-tramp-path . [(20200502 1032) ((cl-lib (0 6 1))) "Human-friendly TRAMP path construction" single ((:commit . "be572b8953b9e5a3a35c30bb64c2936d3e9802ba") (:url . "https://github.com/p3r7/prf-tramp"))]) + (fringe-current-line . [(20140111 411) nil "show current line on the fringe." single ((:commit . "0ef000bac76abae30601222e6f06c7d133ab4942") (:authors ("Kouhei Yanagita" . "yanagi@shakenbu.org")) (:maintainer "Kouhei Yanagita" . "yanagi@shakenbu.org") (:url . "http://github.com/kyanagi/fringe-current-line/raw/master/fringe-current-line.el"))]) + (fringe-helper . [(20140620 2109) nil "helper functions for fringe bitmaps" single ((:commit . "ef4a9c023bae18ec1ddd7265f1f2d6d2e775efdd") (:authors ("Nikolaj Schumacher <bugs * nschum de>")) (:maintainer "Nikolaj Schumacher <bugs * nschum de>") (:keywords "lisp") (:url . "http://nschum.de/src/emacs/fringe-helper/"))]) + (frog-jump-buffer . [(20210308 2316) ((emacs (24)) (avy (0 4 0)) (dash (2 4 0)) (frog-menu (0 2 8))) "The fastest buffer-jumping Emacs lisp package around." single ((:commit . "3481626cccea8e77e4eee79b05f99c9171559f7b") (:authors ("Justin Talbott")) (:maintainer "Justin Talbott") (:keywords "convenience" "tools") (:url . "https://github.com/waymondo/frog-jump-buffer"))]) + (frontside-javascript . [(20210515 1811) ((emacs (25 1)) (add-node-modules-path (1 2 0)) (company (0 9 2)) (flycheck (20201228 2104)) (js2-mode (20201220)) (js2-refactor (0 9 0)) (rjsx-mode (0 5 0)) (tide (4 0 2)) (web-mode (17))) "JS development that just work™️" single ((:commit . "f11fea0cf3b92eddf1d083e0ce1abfc396f06631") (:authors ("Frontside Engineering" . "engineering@frontside.com")) (:maintainer "Frontside Engineering" . "engineering@frontside.com") (:keywords "files" "tools") (:url . "https://github.com/thefrontside/frontmacs"))]) + (fsbot-data-browser . [(20160921 1533) nil "browse the fsbot database using tabulated-list-mode" single ((:commit . "6bca4f7de63e31839d2542f6c678b79931dec344") (:authors ("Benaiah Mischenko")) (:maintainer "Benaiah Mischenko") (:keywords "fsbot" "irc" "tabulated-list-mode") (:url . "http://github.com/benaiah/fsbot-data-browser"))]) + (fsharp-mode . [(20210331 1931) ((emacs (25)) (s (1 3 1))) "Support for the F# programming language" tar ((:commit . "93b1fbc31d73286a18640a36fc2be87d1736e0f2") (:authors ("1993-1997 Xavier Leroy, Jacques Garrigue and Ian T Zimmerman") ("2010-2011 Laurent Le Brun" . "laurent@le-brun.eu") ("2012-2014 Robin Neatherway" . "robin.neatherway@gmail.com") ("2017-2021 Jürgen Hötzel")) (:maintainer "Jürgen Hötzel") (:keywords "languages"))]) + (fstar-mode . [(20201012 2201) ((emacs (24 3)) (dash (2 11)) (company (0 8 12)) (quick-peek (1 0)) (yasnippet (0 11 0)) (flycheck (30 0)) (company-quickhelp (2 2 0))) "Support for F* programming" tar ((:commit . "3afbf04e4eb21af950cfdb727d8b808164fd9415") (:authors ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com") (:keywords "convenience" "languages") (:url . "https://github.com/FStarLang/fstar-mode.el"))]) + (fuel . [(20210602 1531) ((cl-lib (0 2)) (emacs (24 2))) "Major mode for the Factor programming language." tar ((:commit . "b989a860d1d6191bb9c5911ac77ed0931424eaeb"))]) + (fuff . [(20170202 1503) ((seq (2 3))) "Find files with findutils, recursively" single ((:commit . "278e849913df87bd8756c59382282d87474802c3") (:authors ("Joel Moberg")) (:maintainer "Joel Moberg") (:keywords "files" "project" "convenience") (:url . "https://github.com/joelmo/fuff"))]) + (full-ack . [(20140223 1732) nil "a front-end for ack" single ((:commit . "761d846e105b150f8e6d13d7a8983f0248313a45") (:authors ("Nikolaj Schumacher <bugs * nschum de>")) (:maintainer "Nikolaj Schumacher <bugs * nschum de>") (:keywords "tools" "matching") (:url . "http://nschum.de/src/emacs/full-ack/"))]) + (fullframe . [(20210226 1057) ((cl-lib (0 5))) "Generalized automatic execution in a single frame" single ((:commit . "886b831c001b44ec95aec4ff36e8bc1b3003c786") (:authors ("Tom Regner" . "tom@goochesa.de")) (:maintainer "Tom Regner" . "tom@goochesa.de") (:keywords "fullscreen"))]) + (function-args . [(20171031 1704) ((ivy (0 9 1))) "C++ completion for GNU Emacs" tar ((:commit . "609b25305670fff08d5e357298e7128e4f4e3497") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/function-args"))]) + (fuo . [(20190812 927) ((emacs (24 4))) "feeluown client." single ((:commit . "0e4122f94a336a50c02bc96652d25ac3d74bedeb") (:authors ("cosven" . "yinshaowen241@gmail.com")) (:maintainer "cosven" . "yinshaowen241@gmail.com") (:keywords "feeluown" "multimedia" "unix") (:url . "http://github.com/cosven/emacs-fuo"))]) + (furl . [(20150509 316) nil "Friendly URL retrieval" single ((:commit . "014438271e0ef27333dfcd599cb247f12a20d870") (:authors ("Natalie Weizenbaum" . "nweiz@google.com")) (:maintainer "Natalie Weizenbaum" . "nweiz@google.com"))]) + (futhark-mode . [(20200823 1521) ((emacs (24 3)) (cl-lib (0 5))) "major mode for editing Futhark source files" tar ((:commit . "88e7bb1eefbe01f781cc4958bc0431fea90b7d93") (:keywords "languages") (:url . "https://github.com/diku-dk/futhark-mode"))]) + (fuz . [(20200104 524) ((emacs (25 1))) "Fast and precise fuzzy scoring/matching utils" tar ((:commit . "fee874aa35d2ee6b12b836290b5c8eaa44175a28") (:authors ("Zhu Zihao" . "all_but_last@163.com")) (:maintainer "Zhu Zihao" . "all_but_last@163.com") (:keywords "lisp") (:url . "https://github.com/cireu/fuz.el"))]) + (fuzzy . [(20210317 140) ((emacs (24 3))) "Fuzzy Matching" single ((:commit . "edce468a3077d03ca63e1559f7ffebfa09c8effd") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainer "Tomohiro Matsuyama" . "m2ym.pub@gmail.com") (:keywords "convenience") (:url . "https://github.com/auto-complete/fuzzy-el"))]) + (fuzzy-finder . [(20200909 907) ((emacs (24 4))) "Fuzzy Finder App Integration" single ((:commit . "c19235a35db076eebb5ad31fb42daf6520620f6d") (:authors ("10sr" . "8.slashes@gmail.com")) (:maintainer "10sr" . "8.slashes@gmail.com") (:keywords "matching") (:url . "https://github.com/10sr/fuzzy-finder-el"))]) + (fvwm-mode . [(20160411 1138) nil "A major mode for editing Fvwm configuration files" single ((:commit . "6832a1c1f68bf6249c3fd6672ea8e27dc7a5c79e") (:authors ("Bert Geens" . "bert@lair.be")) (:maintainer "Bert Geens" . "bert@lair.be") (:keywords "files") (:url . "https://github.com/theBlackDragon/fvwm-mode"))]) + (fwb-cmds . [(20180318 2219) nil "misc frame, window and buffer commands" single ((:commit . "90258a5c7dbbaa2ac227e0fb4ff6c7d5aec3628f") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "https://github.com/tarsius/fwb-cmds"))]) + (fxrd-mode . [(20170728 1801) ((s (1 2))) "Major mode for editing fixed field width files" tar ((:commit . "18a603474abb5a786a8d9f20c283d5f7beed3540") (:authors ("Marc Sherry" . "msherry@gmail.com")) (:maintainer "Marc Sherry" . "msherry@gmail.com") (:keywords "convenience") (:url . "https://github.com/msherry/fxrd-mode"))]) + (fyure . [(20130216 1314) nil "An interface to fix Japanese hyoki-yure" tar ((:commit . "b6977f1eb148e8b63259f7233b55bb050e44d9b8") (:authors ("Masafumi Oyamada" . "stillpedant@gmail.com")) (:maintainer "Masafumi Oyamada" . "stillpedant@gmail.com") (:keywords "languages"))]) + (fzf . [(20210508 1516) ((emacs (24 4))) "A front-end for fzf." single ((:commit . "23c09c9c0417c7de67a8965d9b506d0cc7aea7a2") (:authors ("Bailey Ling")) (:maintainer "Bailey Ling") (:keywords "fzf" "fuzzy" "search") (:url . "https://github.com/bling/fzf.el"))]) + (gameoflife . [(20200614 1814) nil "Screensaver running Conway's Game of Life" single ((:commit . "2483f3d98dbcf7f1633f551cc3691f5659b4b942") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "games") (:url . "https://github.com/Lindydancer/gameoflife"))]) + (gams-ac . [(20180423 926) ((emacs (24)) (auto-complete (1 0)) (gams-mode (4 0))) "auto-complete source file for GAMS mode" single ((:commit . "66d04ff36033f54205c19bc1d893e926d4dbf02e") (:authors ("Shiro Takeda")) (:maintainer "Shiro Takeda") (:keywords "languages" "tools" "gams-mode" "auto-complete") (:url . "https://github.com/ShiroTakeda/gams-ac"))]) + (gams-mode . [(20210227 251) ((emacs (24 3))) "Major mode for General Algebraic Modeling System (GAMS)" tar ((:commit . "52e984d64c48f518222e0f6bd326236f78d7bf7a") (:authors ("Shiro Takeda")) (:maintainer "Shiro Takeda") (:keywords "languages" "tools" "gams") (:url . "http://shirotakeda.org/en/gams/gams-mode/"))]) + (gandalf-theme . [(20130809 947) nil "Gandalf color theme" single ((:commit . "4e472fc851431458537d458d09c1f5895e338536") (:authors ("Peter Vasil" . "mail@petervasil.net")) (:maintainer "Peter Vasil" . "mail@petervasil.net") (:keywords "color" "theme"))]) + (gap-mode . [(20191110 2237) nil "Major mode for editing files in the GAP programing language." tar ((:commit . "62adb8935033eead7fbf2c107c2dfb79afa53c67") (:authors ("Michael Smith" . "smith@pell.anu.edu.au") ("Gary Zablackis") ("Goetz Pfeiffer") ("Ivan Andrus" . "darthandrus@gmail.com")) (:maintainer "Ivan Andrus" . "darthandrus@gmail.com") (:keywords "gap") (:url . "https://gitlab.com/gvol/gap-mode"))]) + (gather . [(20141230 1338) nil "Gather string in buffer." single ((:commit . "50809fbc22d70a1c724c2dd99ac5a1f818ffeb6b") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "matching" "convenience" "tools") (:url . "https://github.com/mhayashi1120/Emacs-gather/raw/master/gather.el"))]) + (gcmh . [(20201116 2251) ((emacs (24))) "the Garbage Collector Magic Hack" single ((:commit . "0089f9c3a6d4e9a310d0791cf6fa8f35642ecfd9") (:authors ("Andrea Corallo" . "akrl@sdf.org")) (:maintainer nil . "akrl@sdf.org") (:keywords "internal") (:url . "https://gitlab.com/koral/gcmh"))]) + (gcode-mode . [(20210522 1025) ((emacs (24 4))) "Simple G-Code major mode" tar ((:commit . "1f83845af4102efc5e5856b55bd5ad165b2f0cdd") (:authors ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainer "Yuri D'Elia" . "wavexx@thregr.org") (:keywords "gcode" "languages" "highlight" "syntax") (:url . "https://gitlab.com/wavexx/gcode-mode.el"))]) + (gdscript-mode . [(20210328 2037) ((emacs (26 3))) "Major mode for Godot's GDScript language" tar ((:commit . "b7bfa6a3b294039f5093f85e4ff809ff05333abd") (:authors ("Nathan Lovato <nathan@gdquest.com>, Fabián E. Gallina" . "fgallina@gnu.org")) (:maintainer nil . "nathan@gdquest.com") (:keywords "languages") (:url . "https://github.com/godotengine/emacs-gdscript-mode/"))]) + (geben . [(20170801 1251) ((emacs (24 3)) (cl-lib (0 5))) "DBGp protocol frontend, a script debugger" tar ((:commit . "ec3f5e9376cf1ea5615990bd8c212543d57f033b") (:authors ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com") (:keywords "c" "comm" "tools") (:url . "https://github.com/ahungry/geben"))]) + (geben-helm-projectile . [(20160611 59) ((emacs (24)) (geben (0 26)) (helm-projectile (0 13 0))) "Integrate helm-projectile with geben" single ((:commit . "31ce0faca5dcc71924884f03fd5a7a25d00ccd9b") (:authors ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com") (:keywords "ahungry" "emacs" "geben" "helm" "projectile" "debug") (:url . "https://github.com/ahungry/geben-helm-projectile"))]) + (geeknote . [(20160717 1249) ((emacs (24))) "Use Evernote in Emacs through geeknote" single ((:commit . "8ed607c76864afcc9c338972ab093caf4501cbf8") (:authors ("Evan Dale Aromin")) (:maintainer "Evan Dale Aromin") (:keywords "evernote" "geeknote" "note" "emacs-evernote" "evernote-mode") (:url . "http://github.com/avendael/emacs-geeknote"))]) + (geiser . [(20210428 1942) ((emacs (24 4))) "GNU Emacs and Scheme talk to each other" tar ((:commit . "4099dce8f5f17cce8f292cdf0bc1bf2e5cb6975c") (:authors ("Jose Antonio Ortega Ruiz" . "jao@gnu.org")) (:maintainer "Jose Antonio Ortega Ruiz" . "jao@gnu.org") (:keywords "languages" "scheme" "geiser") (:url . "https://gitlab.com/emacs-geiser/"))]) + (geiser-chez . [(20210421 120) ((emacs (26 1)) (geiser (0 16))) "Chez Scheme's implementation of the geiser protocols" tar ((:commit . "03da1c17253856d8713bc5a25140cb5002c9c188") (:authors ("Peter" . "craven@gmx.net")) (:maintainer "Jose A Ortega Ruiz" . "jao@gnu.org") (:keywords "languages" "chez" "scheme" "geiser") (:url . "https://gitlab.com/emacs-geiser/chez"))]) + (geiser-chibi . [(20210421 123) ((emacs (24 4)) (geiser (0 16))) "Chibi Scheme's implementation of the geiser protocols" tar ((:commit . "6f59291d8d1dc92ffd3f53f919d8cab4bf50b7d3") (:authors ("Peter" . "craven@gmx.net")) (:maintainer "Jose A Ortega Ruiz" . "jao@gnu.org") (:keywords "languages" "chibi" "scheme" "geiser") (:url . "https://gitlab.com/emacs-geiser/chibi"))]) + (geiser-chicken . [(20210421 127) ((emacs (24 4)) (geiser (0 16))) "Chicken's implementation of the geiser protocols" tar ((:commit . "ceab39c89607f55cba88e5606ba5eb37c7df5260") (:authors ("Daniel Leslie")) (:maintainer "Daniel Leslie") (:keywords "languages" "chicken" "scheme" "geiser") (:url . "https://gitlab.com/emacs-geiser/chicken"))]) + (geiser-gambit . [(20210421 124) ((emacs (26 1)) (geiser (0 16))) "Gambit's implementation of the geiser protocols" tar ((:commit . "3294c944d1c3b79db44ed14b133129fec454bd60") (:authors ("Daniel Leslie")) (:maintainer "Daniel Leslie, Jose A Ortega Ruiz" . "jao@gnu.org") (:keywords "languages" "gambit" "scheme" "geiser") (:url . "https://gitlab.com/emacs-geiser/gambit"))]) + (geiser-gauche . [(20200802 1300) ((emacs (26 1)) (geiser (0 11 2))) "Gauche scheme support for Geiser" tar ((:commit . "66e51430bded0f0e2037f474818a7bbaafb2906c") (:authors ("András Simonyi" . "andras.simonyi@gmail.com")) (:maintainer "András Simonyi" . "andras.simonyi@gmail.com") (:keywords "languages" "gauche" "scheme" "geiser") (:url . "https://gitlab.com/emacs-geiser/gauche"))]) + (geiser-guile . [(20210508 1838) ((emacs (24 4)) (geiser (0 16))) "Guile's implementation of the geiser protocols" tar ((:commit . "8dda28f4f1758221f84f5cb5dc5b5ca5fd56caa9") (:authors ("Jose Antonio Ortega Ruiz" . "jao@gnu.org")) (:maintainer "Jose Antonio Ortega Ruiz" . "jao@gnu.org") (:keywords "languages" "guile" "scheme" "geiser") (:url . "https://gitlab.com/emacs-geiser/guile"))]) + (geiser-kawa . [(20210427 1626) ((emacs (26 1)) (geiser (0 16))) "Kawa scheme support for Geiser" tar ((:commit . "3d999a33deedd62dae60f3f7cedfbdb715587ea7") (:authors ("spellcard199" . "spellcard199@protonmail.com")) (:maintainer "spellcard199" . "spellcard199@protonmail.com") (:keywords "languages" "kawa" "scheme" "geiser") (:url . "https://gitlab.com/emacs-geiser/kawa"))]) + (geiser-mit . [(20210405 1920) ((emacs (24 4)) (geiser (0 12))) "MIT/GNU Scheme's implementation of the geiser protocols" tar ((:commit . "d17394f577aaa2854a74a1a0039cb8f73378b400") (:authors ("Peter" . "craven@gmx.net")) (:maintainer "Jose A Ortega Ruiz" . "jao@gnu.org") (:keywords "languages" "mit" "scheme" "geiser") (:url . "https://gitlab.com/emacs-geiser/mit"))]) + (geiser-racket . [(20210421 125) ((emacs (26 1)) (geiser (0 16))) "Support for Racket in Geiser" tar ((:commit . "22e56ce80389544d3872cf4beb4008fb514b2218") (:authors ("Jose Antonio Ortega Ruiz" . "jao@gnu.org")) (:maintainer "Jose Antonio Ortega Ruiz" . "jao@gnu.org") (:keywords "languages" "racket" "scheme" "geiser") (:url . "https://gitlab.com/emacs-geiser/racket"))]) + (geiser-stklos . [(20210503 944) ((emacs (24 4)) (geiser (0 16))) "STklos Scheme implementation of the geiser protocols" single ((:commit . "0e3a0570354c03c0cfa25da82fb34ad2e81c1981") (:authors ("Jeronimo Pellegrini" . "j_p@aleph0.info")) (:maintainer "Jeronimo Pellegrini" . "j_p@aleph0.info") (:keywords "languages" "stklos" "scheme" "geiser") (:url . "https://gitlab.com/emacs-geiser/stklos"))]) + (gemini-mode . [(20210611 1833) ((emacs (24 4))) "A simple highlighting package for text/gemini" single ((:commit . "97e096ab2400bbe3c0f6d19fb49bd952f2f14e03") (:authors ("Jason McBrayer <jmcbray@carcosa.net>, tastytea <tastytea@tastytea.de>, Étienne Deparis" . "etienne@depar.is")) (:maintainer "Jason McBrayer <jmcbray@carcosa.net>, tastytea <tastytea@tastytea.de>, Étienne Deparis" . "etienne@depar.is") (:keywords "languages") (:url . "https://git.carcosa.net/jmcbray/gemini.el"))]) + (general . [(20200516 50) ((emacs (24 4)) (cl-lib (0 5))) "Convenience wrappers for keybindings." tar ((:commit . "a0b17d207badf462311b2eef7c065b884462cb7c") (:authors ("Fox Kiester" . "noct@posteo.net")) (:maintainer "Fox Kiester" . "noct@posteo.net") (:keywords "vim" "evil" "leader" "keybindings" "keys") (:url . "https://github.com/noctuid/general.el"))]) + (genrnc . [(20140612 1237) ((deferred (0 3 1)) (concurrent (0 3)) (log4e (0 2 0)) (yaxception (0 1))) "generate RELAX NG Compact Schema from RELAX NG Schema, XML Schema and DTD." tar ((:commit . "da75b1966a73ad215ec2ced4522c25f4d0bf1f9a") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "xml") (:url . "https://github.com/aki2o/emacs-genrnc"))]) + (geoip . [(20200310 911) ((emacs (25 1))) "Find out where an IP address is located via GeoIP2" single ((:commit . "25eb1278788b942c38405c233d3614a1de92ddea") (:authors ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:keywords "tools") (:url . "https://github.com/xuchunyang/geoip.el"))]) + (geolocation . [(20200317 1559) ((request-deferred (0 3 2)) (deferred (0 5 1)) (emacs (25 1))) "Get your location on Earth" single ((:commit . "bc7848832eb0352e3a71f4b9d89d917fe12d18be") (:authors ("Neil Okamoto" . "neil.okamoto+melpa@gmail.com")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com") (:keywords "hardware") (:url . "https://github.com/gonewest818/geolocation.el"))]) + (german-holidays . [(20181213 644) nil "German holidays for Emacs calendar" single ((:commit . "a8462dffccaf2b665f2032e646b5370e993a386a") (:authors ("Sebastian Christ" . "rudolfo.christ@gmail.com")) (:maintainer "Sebastian Christ" . "rudolfo.christ@gmail.com") (:url . "https://github.com/rudolfochrist/german-holidays"))]) + (gerrit . [(20210530 402) ((emacs (25 1)) (hydra (0 15 0)) (magit (2 13 1)) (s (1 12 0)) (dash (0 2 15))) "Gerrit client" tar ((:commit . "f1bdc47ab2bb29c2a0a385aaa9a5f0f6d543ffb5") (:authors ("Thomas Hisch" . "t.hisch@gmail.com")) (:maintainer "Thomas Hisch" . "t.hisch@gmail.com") (:keywords "extensions") (:url . "https://github.com/thisch/gerrit.el"))]) + (gerrit-download . [(20150714 1408) ((emacs (24 0)) (magit (2 1 0))) "Show gerrit reviews in a diff buffer." single ((:commit . "d568acc7c5935188c9bc19ba72719a6092d9f6fd") (:authors ("Chmouel Boudjnah" . "chmouel@chmouel.com")) (:maintainer "Chmouel Boudjnah" . "chmouel@chmouel.com") (:keywords "tools" "gerrit" "git") (:url . "https://github.com/chmouel/gerrit-download.el"))]) + (gf . [(20181028 1542) ((s (1 0)) (ht (2 0))) "Major mode for editing GF code" single ((:commit . "30b3127f229e0db522c7752f6957ca01b2ea2821") (:authors ("Johan Bockgård" . "bojohan+mail@dd.chalmers.se")) (:maintainer "bruno cuconato" . "bcclaro+emacs@gmail.com") (:keywords "languages") (:url . "https://github.com/GrammaticalFramework/gf-emacs-mode"))]) + (ggo-mode . [(20210310 1345) nil "Gengetopt major mode" single ((:commit . "6a7617b5af3d13029e4d680a375e8107c40d0fac") (:authors ("Matthew K. Junker" . "junker@alum.mit.edu")) (:maintainer "Matthew K. Junker" . "junker@alum.mit.edu") (:keywords "extensions" "convenience" "local"))]) + (ggtags . [(20190320 2208) ((emacs (25))) "emacs frontend to GNU Global source code tagging system" single ((:commit . "1c43705753e639b34b58c9bf961a80b6610a7109") (:authors ("Leo Liu" . "sdl.web@gmail.com")) (:maintainer "Leo Liu" . "sdl.web@gmail.com") (:keywords "tools" "convenience") (:url . "https://github.com/leoliu/ggtags"))]) + (gh . [(20201222 438) ((emacs (25 1)) (pcache (0 4 2)) (logito (0 1)) (marshal (0 9 0))) "A GitHub library for Emacs" tar ((:commit . "4b2dd0667ebe9c684c1de5bc96961c2ab0885c07") (:authors ("Yann Hodique" . "yhodique@gmail.com")) (:maintainer "Yann Hodique" . "yhodique@gmail.com"))]) + (gh-md . [(20151207 1740) ((emacs (24))) "Render markdown using the Github api" single ((:commit . "693cb0dcadff70e813e1a9d303d227aff7898557") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:keywords "convenience") (:url . "https://github.com/emacs-pe/gh-md.el"))]) + (ghc-imported-from . [(20141124 1932) ((emacs (24 1))) "Haskell documentation lookup with ghc-imported-from" single ((:commit . "fcff08628a19f5d26151564659218cc677779b79") (:authors ("David Raymond Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Raymond Christiansen" . "david@davidchristiansen.dk") (:keywords "languages"))]) + (ghci-completion . [(20151125 1257) ((emacs (24 1)) (cl-lib (0 5))) "Completion for GHCi commands in inferior-haskell buffers" single ((:commit . "c47e23d585d2a3c7b13aac163693fdc4f2bb90e5") (:authors ("Oleksandr Manzyuk" . "manzyuk@gmail.com")) (:maintainer "Oleksandr Manzyuk" . "manzyuk@gmail.com") (:keywords "convenience"))]) + (gherkin-mode . [(20171224 1353) nil "An emacs major mode for editing gherkin files." single ((:commit . "0313492e7da152f0aa73ddf96c0287ded8f51253") (:authors ("Craig Andera")) (:maintainer "Craig Andera") (:keywords "languages"))]) + (ghost-blog . [(20171023 742) ((markdown-mode (1 0))) "A package to manage Ghost blog" single ((:commit . "71b358643cc9a2db1bf752281ff94aba9b59e4cc") (:authors ("Javier Aguirre" . "hello@javaguirre.net")) (:maintainer "Javier Aguirre" . "hello@javaguirre.net") (:keywords "ghost" "blog") (:url . "https://github.com/javaguirre/ghost-blog"))]) + (ghq . [(20210504 902) nil "Ghq interface for emacs" single ((:commit . "582bd6daa505d04c7cc06d6c82ed8aee0624bfbe") (:authors ("Roman Coedo" . "romancoedo@gmail.com")) (:maintainer "Roman Coedo" . "romancoedo@gmail.com") (:keywords "ghq"))]) + (ghub . [(20210531 2006) ((emacs (25 1)) (let-alist (1 0 5)) (treepy (0 1 1))) "Minuscule client libraries for Git forge APIs." tar ((:commit . "e9a819c9c997b8e752eeb4a3fcd1a7b55ab8da47") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "tools") (:url . "https://github.com/magit/ghub"))]) + (ghub+ . [(20191229 1748) ((emacs (25)) (ghub (2 0)) (apiwrap (0 5))) "a thick GitHub API client built on ghub" single ((:commit . "b1adef2402d7599911d4dd447a987a0cea04e6fe") (:authors ("Sean Allred" . "code@seanallred.com")) (:maintainer "Sean Allred" . "code@seanallred.com") (:keywords "extensions" "multimedia" "tools") (:url . "https://github.com/vermiculus/ghub-plus"))]) + (gif-screencast . [(20210401 656) ((emacs (25 1))) "One-frame-per-action GIF recording" single ((:commit . "fa81e915c256271fa10b807a2935d5eaa4700dff") (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") (:keywords "multimedia" "screencast") (:url . "https://gitlab.com/ambrevar/emacs-gif-screencast"))]) + (gift-mode . [(20210528 1459) nil "major mode for editing GIFT format quizzes" single ((:commit . "c93354e8fe1173b22f398f17b127875807f15b87") (:authors ("Christophe Rhodes" . "christophe@rhodes.io")) (:maintainer "Christophe Rhodes" . "christophe@rhodes.io") (:url . "https://github.com/csrhodes/gift-mode"))]) + (gildas-mode . [(20181022 649) ((polymode (0 1 5)) (emacs (25))) "Major mode for Gildas" single ((:commit . "d0c9e997e2aa0bcd9b8b7db082d69100448cb1b2") (:authors ("Sébastien Maret" . "sebastien.maret@icloud.com")) (:maintainer "Sébastien Maret" . "sebastien.maret@icloud.com") (:keywords "languages" "gildas") (:url . "https://github.com/smaret/gildas-mode"))]) + (gist . [(20171128 406) ((emacs (24 1)) (gh (0 10 0))) "Emacs integration for gist.github.com" single ((:commit . "314fe6ab80fae35b95f0734eceb82f72813b6f41") (:authors ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainer "Yann Hodique" . "yann.hodique@gmail.com") (:keywords "tools") (:url . "https://github.com/defunkt/gist.el"))]) + (git . [(20140128 1041) ((s (1 7 0)) (dash (2 2 0)) (f (0 10 0))) "An Elisp API for programmatically using Git" single ((:commit . "a3396a7027a7d986598c6a2d6d5599bac918f3da") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "git") (:url . "http://github.com/rejeep/git.el"))]) + (git-annex . [(20190625 2118) nil "Mode for easy editing of git-annex'd files" single ((:commit . "1324d3f23c534fe79391a2c256bb8803054e383b") (:authors ("John Wiegley" . "jwiegley@gmail.com")) (:maintainer "John Wiegley" . "jwiegley@gmail.com") (:keywords "files" "data" "git" "annex") (:url . "https://github.com/jwiegley/git-annex-el"))]) + (git-assembler-mode . [(20210207 1545) ((emacs (24 4))) "git-assembler major mode" single ((:commit . "1243bdc1a9cdc79802ece05c90731ee14e4f92c9") (:authors ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainer "Yuri D'Elia" . "wavexx@thregr.org") (:keywords "git" "git-assembler" "languages" "highlight" "syntax") (:url . "https://gitlab.com/wavexx/git-assembler-mode.el"))]) + (git-attr . [(20180925 2003) ((emacs (24 3))) "Git attributes of buffer file" tar ((:commit . "50df0630eba2a931146f676d349b29bde6b6b37b") (:authors ("Arne Jørgensen" . "arne@arnested.dk")) (:maintainer "Arne Jørgensen" . "arne@arnested.dk") (:keywords "vc") (:url . "https://github.com/arnested/emacs-git-attr"))]) + (git-auto-commit-mode . [(20200828 653) nil "Emacs Minor mode to automatically commit and push" single ((:commit . "a6b6e0fa183be381463e2b44ef128db1b6c4234b") (:authors ("Tom Willemse" . "tom@ryuslash.org")) (:maintainer "Tom Willemse" . "tom@ryuslash.org") (:keywords "vc") (:url . "https://github.com/ryuslash/git-auto-commit-mode"))]) + (git-backup . [(20191209 2144) ((emacs (24 3)) (s (1 8 0))) "Backup each file change using git" single ((:commit . "67e38c659c918e98642171ba3f385a15182347f4") (:authors ("Anthony HAMON" . "hamon.anth@gmail.com")) (:maintainer "Anthony HAMON" . "hamon.anth@gmail.com") (:keywords "backup" "files" "tools" "git") (:url . "http://github.com/antham/git-backup"))]) + (git-backup-ivy . [(20200709 818) ((ivy (0 12 0)) (git-backup (0 0 1)) (emacs (25 1))) "An ivy interface to git-backup" single ((:commit . "0a5c52e64d0062f77ffefc9213e75690c6d7b111") (:authors ("Sebastian Wålinder" . "s.walinder@gmail.com")) (:maintainer "Sebastian Wålinder" . "s.walinder@gmail.com") (:keywords "backup" "convenience" "files" "tools" "vc") (:url . "https://github.com/walseb/git-backup-ivy"))]) + (git-blamed . [(20161028 1926) nil "Minor mode for incremental blame for Git" single ((:commit . "cef196abf398e2dd11f775d1e6cd8690567408aa") (:keywords "git" "version control" "release management"))]) + (git-command . [(20191028 333) ((term-run (0 1 4)) (with-editor (2 3 1))) "A Git Command-Line interface" single ((:commit . "a773d40da39dfb1c6ecf2b0758aa370ddea8f06d") (:authors ("10sr <8slashes+el [at] gmail [dot] com>")) (:maintainer "10sr <8slashes+el [at] gmail [dot] com>") (:keywords "utility" "git") (:url . "https://github.com/10sr/git-command-el"))]) + (git-commit . [(20210525 844) ((emacs (25 1)) (dash (20210330)) (transient (20210524)) (with-editor (20210524))) "Edit Git commit messages" single ((:commit . "71f57c5582448be81b02ba53750dd2ea39ed0eaf") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li") ("Sebastian Wiesner" . "lunaryorn@gmail.com") ("Florian Ragwitz" . "rafl@debian.org") ("Marius Vollmer" . "marius.vollmer@gmail.com")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "git" "tools" "vc") (:url . "https://github.com/magit/magit"))]) + (git-commit-insert-issue . [(20210107 2018) ((emacs (25)) (projectile (0)) (s (0)) (ghub (0)) (bitbucket (0))) "Get issues list when typing \"Fixes #\"" single ((:commit . "6cfb8b4b5b23ae881cf3d005da4d7f60d91cd2cd") (:authors ("Vindarel")) (:maintainer "Vindarel") (:keywords "tools" "vc" "github" "gitlab" "bitbucket" "commit" "issues") (:url . "https://gitlab.com/emacs-stuff/git-commit-insert-issue/"))]) + (git-dwim . [(20170126 1214) nil "Context-aware git commands such as branch handling" single ((:commit . "485c732130686c2f28a026e385366006435394b9") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "git" "tools" "convenience") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/git-dwim.el"))]) + (git-grep . [(20200920 1751) ((projectile (0 10 0))) "Search tools using git grep" single ((:commit . "12ff6045e9b6aa42f98abd4ddc44d670268a0849") (:authors ("Sam Kleinman")) (:maintainer "tychoish" . "garen@tychoish.com") (:keywords "matching" "files" "grep" "search" "using" "git-grep") (:url . "https://github.com/tychoish/git-grep.el"))]) + (git-gutter . [(20210511 427) ((emacs (24 3))) "Port of Sublime Text plugin GitGutter" single ((:commit . "d050abdd7f5a46c9cfbec2953d2fca90095e2857") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com") (:url . "https://github.com/emacsorphanage/git-gutter"))]) + (git-gutter+ . [(20151204 1723) ((git-commit (0)) (dash (0))) "Manage Git hunks straight from the buffer" single ((:commit . "b7726997806d9a2da9fe84ff00ecf21d62b6f975") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:keywords "git" "vc") (:url . "https://github.com/nonsequitur/git-gutter-plus"))]) + (git-gutter-fringe . [(20200323 2249) ((git-gutter (0 88)) (fringe-helper (0 1 1)) (cl-lib (0 5)) (emacs (24))) "Fringe version of git-gutter.el" single ((:commit . "4f19866494fa1debfa319382913e39a153431634") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com") (:url . "https://github.com/emacsorphanage/git-gutter-fringe"))]) + (git-gutter-fringe+ . [(20140729 1103) ((git-gutter+ (0 1)) (fringe-helper (1 0 1))) "Fringe version of git-gutter+.el" single ((:commit . "7a2f49d2455a3a872e90e5f7dd4e6b27f1d96cfc") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/nonsequitur/git-gutter-fringe-plus"))]) + (git-identity . [(20210430 1603) ((emacs (25 1)) (dash (2 10)) (hydra (0 14)) (f (0 20))) "Identity management for (ma)git" single ((:commit . "5b1191f79f1845d7144bd2a49ad25c49866456aa") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:keywords "git" "vc" "convenience") (:url . "https://github.com/akirak/git-identity.el"))]) + (git-io . [(20180317 1752) ((emacs (24 4))) "git.io integration" single ((:commit . "48753acba73b48b997bb678fb5e2a938ae63b5d6") (:authors ("Tejas Bubane" . "tejasbubane@gmail.com")) (:maintainer "Tejas Bubane" . "tejasbubane@gmail.com") (:keywords "convenience" "files") (:url . "https://github.com/tejasbubane/emacs-git-io"))]) + (git-lens . [(20190319 1342) ((emacs (24 4))) "Show new, deleted or modified files in branch" single ((:commit . "f6cc0a37c9c5c422c49c32650e70bc4721707985") (:authors ("Peter Stiernström" . "peter@stiernstrom.se")) (:maintainer "Peter Stiernström" . "peter@stiernstrom.se") (:keywords "vc" "convenience") (:url . "https://github.com/pidu/git-lens"))]) + (git-link . [(20210504 2207) ((emacs (24 3))) "Get the GitHub/Bitbucket/GitLab URL for a buffer location" single ((:commit . "0d2fd02c160cf2a09ca4b5b4ffa544833df5afed") (:authors ("Skye Shaw" . "skye.shaw@gmail.com")) (:maintainer "Skye Shaw" . "skye.shaw@gmail.com") (:keywords "git" "vc" "github" "bitbucket" "gitlab" "sourcehut" "convenience") (:url . "http://github.com/sshaw/git-link"))]) + (git-messenger . [(20201202 1637) ((emacs (24 3)) (popup (0 5 3))) "Popup last commit of current line" single ((:commit . "a69b6f359bd34b77335619103c82cef07ecdbc7c") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Neil Okamoto") (:url . "https://github.com/emacsorphanage/git-messenger"))]) + (git-msg-prefix . [(20191031 1304) ((emacs (24)) (s (1 10 0)) (dash (2 9 0))) "Insert commit message prefix (issue number)" single ((:commit . "43f6b31c1090371260a2f15b2117a7666920bee7") (:authors ("Raimon Grau" . "raimonster@gmail.com")) (:maintainer "Raimon Grau" . "raimonster@gmail.com") (:keywords "vc" "tools") (:url . "http://github.com/kidd/git-msg-prefix.el"))]) + (git-ps1-mode . [(20200113 704) nil "Global minor-mode to print __git_ps1 in mode-line" single ((:commit . "6762a309bd593d26258dfbf43e7bc21254a70fbf") (:authors ("10sr <8slashes+el [at] gmail [dot] com>")) (:maintainer "10sr <8slashes+el [at] gmail [dot] com>") (:keywords "utility" "mode-line" "git") (:url . "https://github.com/10sr/git-ps1-mode-el"))]) + (git-time-metric . [(20181116 2011) nil "Provide function to record time with gtm ( git time metric )" single ((:commit . "287108ed1d6885dc795eb3bad4476aa08c626186") (:authors ("Anton Sivolapov" . "anton.sivolapov@gmail.com")) (:maintainer "Anton Sivolapov" . "anton.sivolapov@gmail.com") (:keywords "tools" "gtm" "productivity" "time") (:url . "https://github.com/c301/gtm-emacs-plugin"))]) + (git-timemachine . [(20210528 908) ((emacs (24 3)) (transient (0 1 0))) "Walk through git revisions of a file" single ((:commit . "3381797bcbf906b18dff654a2361032d2d01b4a3") (:authors ("Peter Stiernström" . "peter@stiernstrom.se")) (:maintainer "Peter Stiernström" . "peter@stiernstrom.se") (:keywords "vc") (:url . "https://gitlab.com/pidu/git-timemachine"))]) + (git-walktree . [(20191101 302) ((emacs (26 1)) (git (0 1 1)) (cl-lib (0 5))) "Browse Git tree and blob objects" tar ((:commit . "162d9073286c256502df4baa9845790b9f4c2f05") (:authors ("10sr <8.slashes [at] gmail [dot] com>")) (:maintainer "10sr <8.slashes [at] gmail [dot] com>") (:keywords "vc" "utility" "git") (:url . "https://github.com/10sr/git-walktree-el"))]) + (git-wip-timemachine . [(20150408 1006) ((s (1 9 0))) "Walk through git-wip revisions of a file" single ((:commit . "ed4c7931a5f5233bf3e358b1e81647d063526460") (:authors ("Tim Krones" . "t.krones@gmx.net")) (:maintainer "Tim Krones" . "t.krones@gmx.net") (:keywords "git") (:url . "https://github.com/itsjeyd/git-wip-timemachine"))]) + (gitattributes-mode . [(20210528 1854) ((emacs (24 3))) "Major mode for editing .gitattributes files" single ((:commit . "433e1c57a63c88855fc41a942e29d7bc8c9c16c7") (:authors ("Rüdiger Sonderfeld" . "ruediger@c-plusplus.net")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience" "vc" "git") (:url . "https://github.com/magit/git-modes"))]) + (gitconfig . [(20130718 935) nil "Emacs lisp interface to work with git-config variables" single ((:commit . "7612a37ca14009cac8fb8d6b6f54adad739a5741") (:authors ("Samuel Tonini")) (:maintainer "Samuel Tonini") (:keywords "git" "gitconfig" "git-config"))]) + (gitconfig-mode . [(20210528 1856) ((emacs (24 3))) "Major mode for editing .gitconfig files" single ((:commit . "433e1c57a63c88855fc41a942e29d7bc8c9c16c7") (:authors ("Sebastian Wiesner" . "lunaryorn@gmail.com")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience" "vc" "git") (:url . "https://github.com/magit/git-modes"))]) + (github-browse-file . [(20160205 1427) ((cl-lib (0 5))) "View the file you're editing on GitHub" single ((:commit . "9742a5183af853788c6ecb83fb7ee0b00d1675ac") (:authors ("Ozan Sener" . "ozan@ozansener.com")) (:maintainer "Ozan Sener" . "ozan@ozansener.com") (:keywords "convenience" "vc" "git" "github") (:url . "https://github.com/osener/github-browse-file"))]) + (github-clone . [(20210108 1920) ((gh (1 0 1)) (magit (3 0 0)) (emacs (25 1))) "Fork and clone github repos" single ((:commit . "9e40d6d3c6128407d7456bf71c95ad1fbb473b2a") (:authors ("Charles L.G. Comstock" . "dgtized@gmail.com")) (:maintainer "Charles L.G. Comstock" . "dgtized@gmail.com") (:keywords "vc" "tools") (:url . "https://github.com/dgtized/github-clone.el"))]) + (github-elpa . [(20200129 417) ((package-build (1 0)) (commander (0 7 0)) (git (0 1 1))) "Build and publish ELPA repositories with GitHub Pages" tar ((:commit . "04a55c723ffcd84dd35e5438e7e2b9f1cce08d42") (:authors (nil . "10sr<8slashes+el@gmail.com>")) (:maintainer nil . "10sr<8slashes+el@gmail.com>") (:url . "https://github.com/10sr/github-elpa"))]) + (github-explorer . [(20210402 1246) ((emacs (24 4))) "Explore a GitHub repository on the fly" single ((:commit . "633b7371a6a00660422e195795c4b79f16bf29ae") (:authors ("Giap Tran" . "txgvnn@gmail.com")) (:maintainer "Giap Tran" . "txgvnn@gmail.com") (:keywords "comm") (:url . "https://github.com/TxGVNN/github-explorer"))]) + (github-modern-theme . [(20171109 1251) nil "The GitHub color theme for Emacs." single ((:commit . "a7e7b8e5e9c122138e79e837caf9b7299e748d44") (:authors ("Philip Arvidsson" . "philip@philiparvidsson.com")) (:maintainer "Philip Arvidsson" . "philip@philiparvidsson.com") (:url . "https://github.com/philiparvidsson/GitHub-Theme-for-Emacs"))]) + (github-notifier . [(20180421 316) ((emacs (24))) "Displays your GitHub notifications unread count in mode-line" single ((:commit . "274f3812926ea371346f639fcee98066f6e8c96f") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:keywords "github" "mode-line") (:url . "https://github.com/xuchunyang/github-notifier.el"))]) + (github-pullrequest . [(20170116 616) ((emacs (24 4)) (request (0 2 0)) (dash (2 11 0)) (magit (2 10 0))) "Create and fetch Github Pull requests with ease" single ((:commit . "6ae5c38b0fc15b638b5ba4490112d9822ce5e267") (:authors ("Jakob Lind" . "karl.jakob.lind@gmail.com")) (:maintainer "Jakob Lind" . "karl.jakob.lind@gmail.com") (:keywords "tools") (:url . "https://github.com/jakoblind/github-pullrequest"))]) + (github-review . [(20210314 2203) ((emacs (25 1)) (s (1 12 0)) (ghub (2 0)) (dash (2 11 0)) (deferred (0 5 1)) (a (0 1 1))) "GitHub based code review" single ((:commit . "341b7a1352e4ee1f1119756360ac0714abbaf460") (:authors ("Laurent Charignon" . "l.charignon@gmail.com")) (:maintainer "Laurent Charignon" . "l.charignon@gmail.com") (:keywords "git" "tools" "vc" "github") (:url . "https://github.com/charignon/github-review"))]) + (github-search . [(20190624 436) ((magit (0 8 1)) (gh (1 0 0))) "Clone repositories by searching github" single ((:commit . "b73efaf19491010522b09db35bb0f1bad1620e63") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:keywords "github" "search" "clone" "api" "gh" "magit" "vc" "tools") (:url . "https://github.com/IvanMalison/github-search"))]) + (github-stars . [(20190517 1319) ((emacs (25 1)) (ghub (2 0 0))) "Browse your Github Stars" single ((:commit . "a9f25ab2487c886f5d50d26693d49856bd51383b") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:keywords "tools") (:url . "https://github.com/xuchunyang/github-stars.el"))]) + (github-theme . [(20170630 2201) nil "The GitHub color theme for Emacs." single ((:commit . "29f00a51d949a248a5f6355a97131e216747c797") (:authors ("Philip Arvidsson" . "philip@philiparvidsson.com")) (:maintainer "Philip Arvidsson" . "philip@philiparvidsson.com") (:url . "https://github.com/philiparvidsson/GitHub-Theme-for-Emacs"))]) + (gitignore-mode . [(20210528 1856) ((emacs (24 3))) "Major mode for editing .gitignore files" single ((:commit . "433e1c57a63c88855fc41a942e29d7bc8c9c16c7") (:authors ("Sebastian Wiesner" . "lunaryorn@gmail.com")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience" "vc" "git") (:url . "https://github.com/magit/git-modes"))]) + (gitignore-snippets . [(20201118 1551) ((emacs (26)) (yasnippet (0 8 0))) "Gitignore.io templates for Yasnippet" tar ((:commit . "0de6945ff0fc6943eebcf92d1cbb66b6a1d8fa60") (:authors ("Seong Yong-ju" . "sei40kr@gmail.com")) (:maintainer "Seong Yong-ju" . "sei40kr@gmail.com") (:keywords "tools") (:url . "https://github.com/sei40kr/gitignore-snippets"))]) + (gitignore-templates . [(20200228 1419) ((emacs (24 3))) "Create .gitignore using GitHub or gitignore.io API" single ((:commit . "b147d1930645dda76dbd48fb6f4f7f790353de26") (:authors ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:keywords "tools") (:url . "https://github.com/xuchunyang/gitignore-templates.el"))]) + (gitlab . [(20180312 1647) ((s (1 9 0)) (dash (2 9 0)) (pkg-info (0 5 0)) (request (0 1 0))) "Emacs client for Gitlab" tar ((:commit . "8c2324c02119500f094c2f92dfaba4c9977ce1ba") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "gitlab") (:url . "https://github.com/nlamirault/emacs-gitlab"))]) + (gitlab-ci-mode . [(20191022 2017) ((emacs (25 1)) (yaml-mode (0 0 12))) "Mode for editing GitLab CI files" single ((:commit . "c861dc5fa17d380d5c3aca99dc3bbec5eee623bc") (:authors ("Joe Wreschnig")) (:maintainer "Joe Wreschnig") (:keywords "tools" "vc") (:url . "https://gitlab.com/joewreschnig/gitlab-ci-mode/"))]) + (gitlab-ci-mode-flycheck . [(20190323 1829) ((emacs (25)) (flycheck (31)) (gitlab-ci-mode (1))) "Flycheck support for ‘gitlab-ci-mode’" single ((:commit . "eba81cfb7224fd1fa4e4da90d11729cc7ea12f72") (:authors ("Joe Wreschnig")) (:maintainer "Joe Wreschnig") (:keywords "tools" "vc" "convenience") (:url . "https://gitlab.com/joewreschnig/gitlab-ci-mode-flycheck/"))]) + (gitlab-pipeline . [(20210601 1339) ((emacs (25 1)) (ghub (3 3 0))) "Get infomation about Gitlab pipelines" single ((:commit . "2404f9cf0a064aabea975adada250895c385e057") (:authors ("Giap Tran" . "txgvnn@gmail.com")) (:maintainer "Giap Tran" . "txgvnn@gmail.com") (:keywords "comm" "tools" "git") (:url . "https://github.com/TxGVNN/gitlab-pipeline"))]) + (gitlab-snip-helm . [(20200427 2014) ((emacs (25)) (dash (2 12 0)) (helm (3 2))) "Gitlab snippets api helm package" single ((:commit . "782df679e33646db29e07508311bc8e8624b484e") (:authors ("Fermin MF" . "fmfs@posteo.net")) (:maintainer "Fermin MF" . "fmfs@posteo.net") (:keywords "tools" "files" "convenience") (:url . "https://gitlab.com/sasanidas/gitlab-snip-helm"))]) + (gitolite-clone . [(20160609 2355) ((dash (2 10 0)) (s (1 9 0)) (pcache (0 3 1)) (emacs (24))) "Clone gitolite repositories from a completing list" single ((:commit . "d8a4c2875c984e51137c980b5773f42703602721") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:keywords "gitolite" "clone" "git") (:url . "https://github.com/IvanMalison/gitolite-clone"))]) + (gitpatch . [(20170722 410) ((emacs (24 3))) "Git-format patch toolkit" single ((:commit . "577d5adf65c8133caa325c10e89e1e2fc323c907") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:keywords "convenience") (:url . "https://github.com/tumashu/gitpatch"))]) + (gitter . [(20180122 856) ((emacs (24 4)) (let-alist (1 0 4))) "An Emacs Gitter client" single ((:commit . "11cb9b4b45f67bdc24f055a9bfac21d2bd19ea1a") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:keywords "gitter" "chat" "client" "internet") (:url . "https://github.com/xuchunyang/gitter.el"))]) + (gkroam . [(20201204 917) ((emacs (26 3)) (db (0 0 6)) (company (0 9 10))) "A lightweight org-mode Roam Research replica" single ((:commit . "b40555f45a844b8fefc419cd43dc9bf63205a0b4") (:authors ("Kinney Zhang" . "kinneyzhang666@gmail.com")) (:maintainer "Kinney Zhang" . "kinneyzhang666@gmail.com") (:keywords "org" "convenience") (:url . "https://github.com/Kinneyzhang/gkroam"))]) + (gl-conf-mode . [(20170714 1310) ((emacs (24 3))) "Mode for editing gitolite config files" single ((:commit . "9136a9b737e0a5b6471a91571d104c487c43f35b") (:authors ("Luis Lloret")) (:maintainer "Luis Lloret") (:keywords "git" "gitolite" "languages") (:url . "https://github.com/llloret/gitolite-emacs"))]) + (global-tags . [(20210225 1553) ((emacs (26 1)) (async (1 9 4)) (project (0 5 2)) (ht (2 3))) "Elisp API and editor integration for GNU global" single ((:commit . "344d084ec5ff6c99b31c5ea57e5352c85b57ae26") (:authors ("Felipe Lema" . "felipelema@mortemale.org")) (:maintainer "Felipe Lema" . "felipelema@mortemale.org") (:keywords "convenience" "matching" "tools") (:url . "https://launchpad.net/global-tags.el"))]) + (glsl-mode . [(20200501 2304) nil "major mode for Open GLSL shader files" single ((:commit . "b07112016436d9634cd4ef747f9af6b01366d136") (:keywords "languages" "opengl" "gpu" "spir-v" "vulkan") (:url . "https://github.com/jimhourihan/glsl-mode"))]) + (gmail-message-mode . [(20160627 1847) ((ham-mode (1 0))) "A major-mode for editing gmail messages using markdown syntax." single ((:commit . "ec36672a9dc93c09ebe2f77597b498d11883d008") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com") (:keywords "mail" "convenience" "emulation") (:url . "http://github.com/Bruce-Connor/gmail-message-mode"))]) + (gmail2bbdb . [(20170423 1144) nil "import email and name into bbdb from vcard." single ((:commit . "a84fa385cfaec7fc5f1518c368e52722da139f99") (:authors ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com") (:keywords "vcard" "bbdb" "email" "contact" "gmail") (:url . "http://github.com/redguardtoo/gmail2bbdb"))]) + (gmpl-mode . [(20171031 2054) ((emacs (24))) "Major mode for editing GMPL(MathProg) files" single ((:commit . "c5d362169819ee8b8e8954145daee7e260c54921") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions"))]) + (gn-mode . [(20190428 1812) ((emacs (24)) (cl-lib (0 5))) "major mode for editing GN (generate ninja) files" single ((:commit . "fcf8e1e500d953364e97e7ebc5708a2c00fa3cd2") (:authors ("Emily Backes" . "lucca@accela.net")) (:maintainer "Emily Backes" . "lucca@accela.net") (:keywords "data") (:url . "http://github.com/lashtear/gn-mode"))]) + (gnome-calendar . [(20161110 1256) nil "Integration with the GNOME Shell calendar" single ((:commit . "489f9f15f7bb35696b1cc19db75b554ae8328df2") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr") (:keywords "gnome" "calendar"))]) + (gnome-screencast . [(20210125 2001) ((emacs (25))) "Use Gnome screen recording functionality using elisp" single ((:commit . "6450ee470e84ff14a15c5c3c0489c79ff593f165") (:authors ("Jürgen Hötzel" . "juergen@hoetzel.info")) (:maintainer "Jürgen Hötzel" . "juergen@hoetzel.info") (:keywords "tools" "multimedia") (:url . "https://github.com/juergenhoetzel/emacs-gnome-screencast"))]) + (gnomenm . [(20150316 1918) ((s (1 9 0)) (dash (2 3 0)) (kv (0 0 19))) "Emacs interface to Gnome nmcli command" single ((:commit . "9065cda44ffc9e06239b8189a0154d31314c3b4d") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:keywords "processes" "hardware") (:url . "http://github.com/nicferrier/emacs-nm"))]) + (gntp . [(20141025 250) nil "Growl Notification Protocol for Emacs" single ((:commit . "767571135e2c0985944017dc59b0be79af222ef5") (:authors ("Engelke Eschner" . "tekai@gmx.li")) (:maintainer "Engelke Eschner" . "tekai@gmx.li"))]) + (gnu-apl-mode . [(20200108 1633) ((emacs (24))) "Integrate GNU APL with Emacs" tar ((:commit . "7f84eb307e9765fadcd1e0a9201ae562724ef1c9") (:authors ("Elias Mårtenson" . "lokedhs@gmail.com")) (:maintainer "Elias Mårtenson" . "lokedhs@gmail.com") (:keywords "languages") (:url . "http://www.gnu.org/software/apl/"))]) + (gnuplot . [(20210609 834) ((emacs (24 3))) "Major-mode and interactive frontend for gnuplot" tar ((:commit . "7138b139d2dca9683f1a81325c643b2744aa1ea3") (:authors ("Jon Oddie") ("Bruce Ravel") ("Phil Type")) (:maintainer "Bruce Ravel" . "bruceravel1@gmail.com") (:keywords "data" "gnuplot" "plotting") (:url . "https://github.com/emacsorphanage/gnuplot"))]) + (gnuplot-mode . [(20171013 1616) nil "Major mode for editing gnuplot scripts" single ((:commit . "601f6392986f0cba332c87678d31ae0d0a496ce7") (:keywords "gnuplot" "plotting") (:url . "https://github.com/mkmcc/gnuplot-mode"))]) + (gnus-alias . [(20150316 42) nil "an alternative to gnus-posting-styles" single ((:commit . "9447d3ccb4c0e75d0468899cccff7aa249657bac") (:authors ("Joe Casadonte" . "emacs@northbound-train.com")) (:maintainer "Mark A. Hershberger" . "mah@everybody.org") (:keywords "personality" "identity" "news" "mail" "gnus"))]) + (gnus-desktop-notify . [(20180623 1538) ((gnus (1 0))) "Gnus Desktop Notification global minor mode" single ((:commit . "b438feb59136621a8ab979f0e2784f7002398d06") (:authors ("Yuri D'Elia <wavexx AT thregr.org>")) (:maintainer "Yuri D'Elia <wavexx AT thregr.org>") (:url . "http://www.thregr.org/~wavexx/software/gnus-desktop-notify.el/"))]) + (gnus-notes . [(20210207 1010) ((emacs (27 1)) (bbdb (3 1)) (helm (3 1)) (hydra (0 13 0)) (org (8 3)) (s (0 0)) (lv (0 0)) (async (1 9 1))) "Keep handy notes of read Gnus articles with helm and org" tar ((:commit . "1457bba34b40d5197aa14dbf0856925f83025ae1") (:authors ("Deus Max" . "deusmax@gmx.com")) (:maintainer "Deus Max" . "deusmax@gmx.com") (:keywords "convenience" "mail" "bbdb" "gnus" "helm" "org" "hydra") (:url . "https://github.com/deusmax/gnus-notes"))]) + (gnus-recent . [(20210604 720) ((emacs (25 3 2))) "Article breadcrumbs for Gnus" single ((:commit . "09b9e96f8e0ab006d9cfe8f5ab000ce7e50ef4de") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org") (:keywords "convenience" "mail") (:url . "https://github.com/unhammer/gnus-recent"))]) + (gnus-select-account . [(20170722 511) nil "Select an account before writing a mail in gnus" single ((:commit . "ddc8c135eeaf90f5b6692a033af2badae36e68ce") (:authors ("Feng Shu " . "tumashu@163.com")) (:maintainer "Feng Shu " . "tumashu@163.com") (:keywords "convenience") (:url . "https://github.com/tumashu/gnus-select-account"))]) + (gnus-summary-ext . [(20180113 1316) nil "Extra limit and process mark commands for the gnus summary buffer" single ((:commit . "025fd853fe9280ae696a89ec2c2cac9befd010aa") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:keywords "comm") (:url . "https://github.com/vapniks/gnus-summary-ext"))]) + (gnus-summary-repo . [(20190617 1419) ((emacs (25))) "Import and export files between IMAP and local by using GNUS" single ((:commit . "d0cb218fea13563c1b2bfba3e72716fb860f767c") (:authors ("Giap Tran" . "txgvnn@gmail.com")) (:maintainer "Giap Tran" . "txgvnn@gmail.com") (:keywords "gnus" "repository") (:url . "https://github.com/TxGVNN/gnus-summary-repo"))]) + (gnus-x-gm-raw . [(20140610 731) ((log4e (0 2 0)) (yaxception (0 1))) "Search mail of Gmail using X-GM-RAW as web interface" single ((:commit . "978bdfcecc8844465b71641c2e909fcdc66b22be") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "gnus") (:url . "https://github.com/aki2o/gnus-x-gm-raw"))]) + (go . [(20161111 249) ((emacs (24))) "Play GO, translate and transfer between GO back ends" tar ((:commit . "ff45fb44d9cb6579d8511d8b6156ed0b34d5ac97") (:authors ("Eric Schulte" . "schulte.eric@gmail.com")) (:maintainer "Eric Schulte" . "schulte.eric@gmail.com") (:keywords "game" "go" "sgf") (:url . "http://eschulte.github.io/el-go/"))]) + (go-add-tags . [(20161123 1227) ((emacs (24 3)) (s (1 11 0))) "Add field tags for struct fields" single ((:commit . "54879945e46a0884c5f93d7fd6c866a9cdf401ac") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-go-add-tags"))]) + (go-autocomplete . [(20150904 240) ((auto-complete (1 4 0))) "auto-complete-mode backend for go-mode" single ((:commit . "4acdcbdea79de6b3dee1c637eca5cbea0fdbe37c") (:authors ("Mikhail" . "tensai@cirno.in")) (:maintainer "Mikhail" . "tensai@cirno.in") (:keywords "languages"))]) + (go-complete . [(20190409 516) ((go-mode (0)) (cl-lib (0 5))) "Native code completion for Go" single ((:commit . "056294014f37a1004958ec17ebd6748deed63502") (:authors ("Vibhav Pant" . "vibhavp@gmail.com")) (:maintainer "Vibhav Pant" . "vibhavp@gmail.com") (:keywords "go" "golang" "completion") (:url . "https://github.com/vibhavp/go-complete"))]) + (go-direx . [(20150316 143) ((direx (1 0 0)) (cl-lib (0 5))) "Tree style source code viewer for Go language" single ((:commit . "8f2206469328ee932c7f1892f5e1fb02dec98432") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-go-direx"))]) + (go-dlv . [(20200713 1202) ((go-mode (1 3 1))) "Go Delve - Debug Go programs interactively with the GUD." single ((:commit . "69b86c1bdb73d78fb3404f2f1eefbc9a93b1aba6") (:authors ("Marko Bencun" . "mbencun@gmail.com")) (:maintainer "Marko Bencun" . "mbencun@gmail.com") (:keywords "go" "debug" "debugger" "delve" "interactive" "gud") (:url . "https://github.com/benma/go-dlv.el/"))]) + (go-eldoc . [(20170305 1427) ((emacs (24 3)) (go-mode (1 0 0))) "eldoc for go-mode" single ((:commit . "cbbd2ea1e94a36004432a9ac61414cb5a95a39bd") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-go-eldoc"))]) + (go-errcheck . [(20160723 43) nil "errcheck integration for go-mode" single ((:commit . "9db21eccecedc2490793f176246094167164af31") (:authors ("Dominik Honnef" . "dominikh@fork-bomb.org")) (:maintainer "Dominik Honnef" . "dominikh@fork-bomb.org"))]) + (go-expr-completion . [(20200817 1750) ((emacs (24 1))) "Complement the return values for Go" single ((:commit . "66bba78f52a732b978848e3a4c99fa2afeb6c25f") (:authors ("Ryo Fujimoto" . "fujimisakri@gmail.com")) (:maintainer "Ryo Fujimoto" . "fujimisakri@gmail.com") (:url . "https://github.com/fujimisakari/emacs-go-expr-completion"))]) + (go-fill-struct . [(20171225 331) ((emacs (24))) "Fill struct for golang." single ((:commit . "a613d0b378473eef39e8fd5724abe790aea84321") (:authors ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainer "Sergey Kostyaev" . "feo.me@ya.ru") (:keywords "tools") (:url . "https://github.com/s-kostyaev/go-fill-struct"))]) + (go-gen-test . [(20171023 358) ((emacs (24 3)) (s (1 12))) "Generate tests for go code with gotests" single ((:commit . "44c202ac97e728e93a35cee028a0ea8dd6e4292c") (:authors ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainer "Sergey Kostyaev" . "feo.me@ya.ru") (:keywords "languages") (:url . "https://github.com/s-kostyaev/go-gen-test"))]) + (go-gopath . [(20160705 1034) ((cl-lib (0 5))) "Will guess GOPATH using gb and projectile." single ((:commit . "5172fc53f21edbf9347d5ee7d1d745da1ec88a15") (:authors ("Andrew Kirilenko" . "andrew.kirilenko.main@gmail.com")) (:maintainer "Andrew Kirilenko" . "andrew.kirilenko.main@gmail.com") (:url . "http://github.com/iced/go-gopath/"))]) + (go-guru . [(20181012 330) ((go-mode (1 3 1)) (cl-lib (0 5))) "Integration of the Go 'guru' analysis tool into Emacs." single ((:commit . "34974346d1f74fa835d745514c9fe9afccce8dae") (:keywords "tools"))]) + (go-imenu . [(20181029 1029) ((emacs (24 3))) "Enhance imenu for go language" single ((:commit . "4f3f334ed0b6f6afaca6b9775636a52ad3843053") (:authors ("Brantou" . "brantou89@gmail.com")) (:maintainer "Brantou" . "brantou89@gmail.com") (:keywords "tools") (:url . "https://github.com/brantou/go-imenu.el"))]) + (go-impl . [(20170125 1552) ((emacs (24 3)) (go-mode (1 3 0))) "impl integration for go-mode" single ((:commit . "69f0d0ef05771487e15abec500cd06befd171abf") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-go-impl"))]) + (go-imports . [(20190715 1647) nil "Insert go import statement given package name" tar ((:commit . "55681e815da93b6f927213c4aa352ae33db97c37") (:authors ("Yaz Saito")) (:maintainer "Yaz Saito") (:keywords "tools" "go" "import") (:url . "https://github.com/yasushi-saito/go-imports"))]) + (go-mode . [(20210509 2353) nil "Major mode for the Go programming language" single ((:commit . "34974346d1f74fa835d745514c9fe9afccce8dae") (:authors ("The go-mode Authors")) (:maintainer "The go-mode Authors") (:keywords "languages" "go") (:url . "https://github.com/dominikh/go-mode.el"))]) + (go-noisegate . [(20200502 703) ((emacs (24 4))) "Run Golang tests with Noise Gate" single ((:commit . "e3fc198c234131c94f7d307b7f7c6ef623fb93b7") (:authors ("The Noise Gate Authors")) (:maintainer "The Noise Gate Authors") (:keywords "languages" "go" "test") (:url . "https://github.com/go-noisegate/go-noisegate.el"))]) + (go-playground . [(20200818 2215) ((emacs (24)) (go-mode (1 4 0)) (gotest (0 13 0))) "Local Golang playground for short snippets." single ((:commit . "ede417a52c0eea1a69658f4c6c6c12d6165e64a4") (:authors ("Alexander I.Grafov" . "grafov@gmail.com")) (:maintainer "Alexander I.Grafov" . "grafov@gmail.com") (:keywords "tools" "golang") (:url . "https://github.com/grafov/go-playground"))]) + (go-playground-cli . [(20160503 914) ((emacs (24)) (request (0 2 0)) (deferred (0 3 2)) (names (20151201 404)) (s (1 10 0)) (f (0 17 2)) (let-alist (1 0 4)) (cl-lib (0 5))) "Go Playground client tool" single ((:commit . "60beebd98e3930641d41cee0189c579626f223bc") (:authors ("KOBAYASHI Shigeru (kosh)" . "shigeru.kb@gmail.com")) (:maintainer "KOBAYASHI Shigeru (kosh)" . "shigeru.kb@gmail.com") (:url . "https://github.com/kosh04/go-playground-cli"))]) + (go-projectile . [(20200609 131) ((projectile (0 10 0)) (go-mode (0)) (go-eldoc (0 16)) (go-rename (0)) (go-guru (0)) (dash (2 17 0))) "Go add-ons for Projectile" single ((:commit . "ad4ca3b5695a0e31e95e3cc4ccab498f87d68303") (:authors ("Doug MacEachern" . "dougm@vmware.com")) (:maintainer "Doug MacEachern" . "dougm@vmware.com") (:keywords "project" "convenience") (:url . "https://github.com/dougm/go-projectile"))]) + (go-rename . [(20190805 2101) ((go-mode (1 3 1))) "Integration of the 'gorename' tool into Emacs." single ((:commit . "34974346d1f74fa835d745514c9fe9afccce8dae") (:keywords "tools"))]) + (go-scratch . [(20150810 440) ((go-mode (1 3 1)) (emacs (24))) "*scratch* buffer for Go" single ((:commit . "3f68cbcce04f59eb8e83af109164731ec0454be0") (:authors ("Emanuel Evans" . "mail@emanuel.industries")) (:maintainer "Emanuel Evans" . "mail@emanuel.industries") (:keywords "languages" "go"))]) + (go-snippets . [(20180113 611) ((yasnippet (0 8 0))) "Yasnippets for go" tar ((:commit . "d437df148879566ffe7f2e503a3cf2602aa9fb28") (:keywords "snippets"))]) + (go-stacktracer . [(20150430 2142) nil "parse Go stack traces" single ((:commit . "a2ac6d801b389f80ca4e2fcc1ab44513a9e55976") (:authors ("Samer Masterson" . "samer@samertm.com")) (:maintainer "Samer Masterson" . "samer@samertm.com") (:keywords "tools") (:url . "https://github.com/samertm/go-stacktracer.el"))]) + (go-tag . [(20180227 411) ((emacs (24 0)) (go-mode (1 5 0))) "Edit Golang struct field tag" single ((:commit . "59b243f2fa079d9de9d56f6e2d94397e9560310a") (:authors ("Brantou" . "brantou89@gmail.com")) (:maintainer "Brantou" . "brantou89@gmail.com") (:keywords "tools") (:url . "https://github.com/brantou/emacs-go-tag"))]) + (go-translate . [(20210527 1257) ((emacs (26 1))) "Google Translate" single ((:commit . "7a9b7978057bf747ed06fa6c9d2f30047714aa05") (:authors ("lorniu" . "lorniu@gmail.com")) (:maintainer "lorniu" . "lorniu@gmail.com") (:keywords "convenience") (:url . "https://github.com/lorniu/go-translate"))]) + (gobgen . [(20161020 1523) ((emacs (24 4))) "Generate GObject descendants using a detailed form" single ((:commit . "ed2c2b0d217deae293096f3cf14aa492791ddd4f") (:authors ("Gergely Polonkai" . "gergely@polonkai.eu")) (:maintainer "Gergely Polonkai" . "gergely@polonkai.eu") (:keywords "gobject" "glib" "gtk" "helper" "utilities"))]) + (god-mode . [(20210102 515) ((emacs (25 1))) "Minor mode for God-like command entering" tar ((:commit . "fcbd45f78b85500f66f323bd19994941832c28d1") (:authors ("Chris Done" . "chrisdone@gmail.com")) (:maintainer "Chris Done" . "chrisdone@gmail.com") (:url . "https://github.com/emacsorphanage/god-mode"))]) + (godoctor . [(20180710 2152) nil "Frontend for godoctor" single ((:commit . "4b45ff3d0572f0e84056e4c3ba91fcc178199859") (:authors ("Sangho Na" . "microamp@protonmail.com")) (:maintainer "Sangho Na" . "microamp@protonmail.com") (:keywords "go" "golang" "refactoring") (:url . "https://github.com/microamp/godoctor.el"))]) + (goggles . [(20210208 124) ((emacs (26))) "Pulse modified regions" single ((:commit . "b014b2414fad8bb3a9a7b6a7e765822887c28fe8") (:authors ("Daniel Mendler")) (:maintainer "Daniel Mendler") (:url . "https://github.com/minad/goggles"))]) + (gold-mode . [(20140607 206) ((sws-mode (0))) "Major mode for editing .gold files" single ((:commit . "6d3aa59602b1b835495271c8c9741ac344c2eab1") (:authors ("Yuta Yamada <cokesboy\"at\"gmail.com>")) (:maintainer "Yuta Yamada <cokesboy\"at\"gmail.com>") (:keywords "golang" "template" "gold") (:url . "https://github.com/yuutayamada/gold-mode-el"))]) + (golden-ratio . [(20191028 1732) nil "Automatic resizing of Emacs windows to the golden ratio" single ((:commit . "007911d8a431b72670f5fe5f0e5b4380c2777a31") (:authors ("Roman Gonzalez" . "romanandreg@gmail.com")) (:maintainer "Roman Gonzalez" . "romanandreg@gmail.com") (:keywords "window" "resizing"))]) + (golden-ratio-scroll-screen . [(20200419 451) nil "Scroll half screen down or up, and highlight current line" single ((:commit . "1b6ff0e3e8822423335d3f7d88c1fcb4cf43ce42") (:authors ("纪秀峰 <jixiuf at gmail dot com>")) (:maintainer "纪秀峰 <jixiuf at gmail dot com>") (:keywords "scroll" "screen" "highlight") (:url . "https://github.com/jixiuf/golden-ratio-scroll-screen"))]) + (goldendict . [(20201108 201) ((emacs (24 4)) (cl-lib (0 5))) "query word smartly with goldendict.el" single ((:commit . "700f60be192f4d46787e7f009637c15567064f2a") (:keywords "dict" "goldendict") (:url . "https://github.com/stardiviner/goldendict.el"))]) + (golint . [(20180221 2015) nil "lint for the Go source code" single ((:commit . "6edffad5e6160f5949cdefc81710b2706fbcd4f6") (:url . "https://github.com/golang/lint"))]) + (gom-mode . [(20131008 253) nil "Major mode for Gomfile" single ((:commit . "972e33df1d38ff323bc97de87477305826013701") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-gom-mode"))]) + (gomacro-mode . [(20200326 1103) ((emacs (24 4)) (go-mode (1 5 0))) "Gomacro mode and Go REPL integration" single ((:commit . "3112e56d2d5e645a3e0fd877f3e810dbccbf989f") (:authors ("Petter Storvik")) (:maintainer "Petter Storvik") (:keywords "gomacro" "repl" "languages" "tools" "processes") (:url . "https://github.com/storvik/gomacro-mode"))]) + (good-scroll . [(20210612 503) ((emacs (27 1))) "Good pixel line scrolling" tar ((:commit . "4ca86e18c8f64fd7a2d088a591ac11773d6b06a7") (:authors ("Benjamin Levy" . "blevy@protonmail.com")) (:maintainer "Benjamin Levy" . "blevy@protonmail.com") (:url . "https://github.com/io12/good-scroll.el"))]) + (google . [(20140416 1748) nil "Emacs interface to the Google API" single ((:commit . "3b3189a8b201c8d36fed6e61496274e530dd40bd") (:authors ("Edward O'Connor" . "ted@oconnor.cx")) (:maintainer "Edward O'Connor" . "ted@oconnor.cx") (:keywords "comm" "processes" "tools"))]) + (google-c-style . [(20180130 1736) nil "Google's C/C++ style for c-mode" single ((:commit . "9c8784ded344f6a35d1e1550385002f613a0c788") (:keywords "c" "tools"))]) + (google-contacts . [(20201012 1056) ((oauth2 (0 10)) (cl-lib (0 5))) "Support for Google Contacts in Emacs" tar ((:commit . "8923c238fe0906184d2254b33ba72792ed12cd47") (:authors ("Julien Danjou" . "julien@danjou.info")) (:maintainer "Julien Danjou" . "julien@danjou.info") (:keywords "comm") (:url . "https://github.com/jd/google-contacts.el"))]) + (google-maps . [(20181121 1532) ((emacs (24 3))) "Access Google Maps from Emacs" tar ((:commit . "2eb16ff609f5a9f8d02c15238a111fbb7db6c146") (:authors ("Julien Danjou" . "julien@danjou.info")) (:maintainer "Julien Danjou" . "julien@danjou.info") (:keywords "comm") (:url . "https://julien.danjou.info/projects/emacs-packages#google-maps"))]) + (google-this . [(20170810 1215) ((emacs (24 1))) "A set of functions and bindings to google under point." single ((:commit . "8a2e3ca5da6a8c89bfe99a21486c6c7db125dc84") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com") (:keywords "convenience" "hypermedia") (:url . "http://github.com/Malabarba/emacs-google-this"))]) + (google-translate . [(20210406 1138) nil "Emacs interface to Google Translate." tar ((:commit . "0f7f48a09bca064999ecea03102a7c96f52cbd1b") (:authors ("Oleksandr Manzyuk" . "manzyuk@gmail.com")) (:maintainer "Andrey Tykhonov" . "atykhonov@gmail.com") (:keywords "convenience") (:url . "https://github.com/atykhonov/google-translate"))]) + (goose-theme . [(20160828 1245) ((emacs (24 1))) "A gray color theme" single ((:commit . "acd017b50ab25a75fd1331eb3de66467e2042e9c") (:authors ("Stephen Whipple" . "shw@wicdmedia.org")) (:maintainer "Stephen Whipple" . "shw@wicdmedia.org") (:url . "https://github.com/thwg/goose-theme"))]) + (gopher . [(20190512 1351) ((emacs (24 4)) (w3m (0))) "easily access and navigate Gopher servers" single ((:commit . "6f4accac226698b22e8388e41ad5723b12553dde") (:authors ("Matthew Snyder" . "matthew.c.snyder@gmail.com") ("and the gopher.el authors (see AUTHORS.org)")) (:maintainer "Matthew Snyder" . "matthew.c.snyder@gmail.com") (:url . "http://github.com/ardekantur/gopher.el"))]) + (gore-mode . [(20151123 1927) ((go-mode (1 0 0))) "Simple mode for gore, a command-line evaluator for golang." single ((:commit . "94d7f3e99104e06167967c98fdc201049c433c2d") (:authors ("Sergey Pashaev" . "sergey.pashaev@gmail.com")) (:maintainer "Sergey Pashaev" . "sergey.pashaev@gmail.com") (:keywords "go" "repl"))]) + (gorepl-mode . [(20170905 945) ((emacs (24)) (s (1 11 0)) (f (0 19 0)) (hydra (0 13 0))) "Go REPL Interactive Development in top of Gore" single ((:commit . "6a73bf352e8d893f89cad36c958c4db2b5e35e07") (:authors ("Manuel Alonso" . "manuteali@gmail.com")) (:maintainer "Manuel Alonso" . "manuteali@gmail.com") (:keywords "languages" "go" "golang" "gorepl") (:url . "http://www.github.com/manute/gorepl-mode"))]) + (gotest . [(20210221 1905) ((emacs (24 3)) (s (1 11 0)) (f (0 19 0)) (go-mode (1 5 0))) "Launch GO unit tests" single ((:commit . "9b1dc4eba1b22d751cb2f0a12e29912e010fac60") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "languages" "go" "tests") (:url . "https://github.com/nlamirault/gotest.el"))]) + (gotham-theme . [(20210508 1632) ((emacs (24 1))) "A very dark Emacs color theme" single ((:commit . "8a97fb8a68cef8e431c972b3d5713b637e21dd7e") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:url . "https://depp.brause.cc/gotham-theme"))]) + (goto-char-preview . [(20210323 332) ((emacs (24 3))) "Preview character when executing `goto-char` command" single ((:commit . "6ab5128c028aac3ae070ba8df041b8039487253a") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/goto-char-preview"))]) + (goto-chg . [(20210508 1632) ((emacs (24 1))) "Go to last change" single ((:commit . "3ce1389fea12edde4e343bc7d54c8da97a1a6136") (:authors ("David Andersson <l.david.andersson(at)sverige.nu>")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:keywords "convenience" "matching") (:url . "https://github.com/emacs-evil/goto-chg"))]) + (goto-last-change . [(20150109 1823) nil "Move point through buffer-undo-list positions" single ((:commit . "58b0928bc255b47aad318cd183a5dce8f62199cc") (:authors ("Kevin Rodgers" . "ihs_4664@yahoo.com")) (:maintainer "Kevin Rodgers" . "ihs_4664@yahoo.com") (:keywords "convenience") (:url . "https://github.com/camdez/goto-last-change.el"))]) + (goto-last-point . [(20190525 1855) ((emacs (24 3))) "Record and jump to the last point in the buffer." single ((:commit . "7ea191df18ff4774cf1dc568e1726143dd54ea02") (:authors ("Manuel Uberti" . "manuel.uberti@inventati.org")) (:maintainer "Manuel Uberti" . "manuel.uberti@inventati.org") (:keywords "convenience") (:url . "https://github.com/manuel-uberti/goto-last-point"))]) + (goto-line-preview . [(20210323 422) ((emacs (25))) "Preview line when executing `goto-line` command" single ((:commit . "c83688ea95b4308145555fea50e953a26d67b1b2") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/goto-line-preview"))]) + (govc . [(20191213 2131) ((emacs (24 3)) (dash (1 5 0)) (s (1 9 0)) (magit-popup (2 0 50)) (json-mode (1 6 0))) "Interface to govc for managing VMware ESXi and vCenter" single ((:commit . "381aa00a0d03120e12e9a4fba08feaa757d24e5d") (:authors ("The govc developers")) (:maintainer "The govc developers") (:keywords "convenience") (:url . "https://github.com/vmware/govmomi/tree/master/govc/emacs"))]) + (govet . [(20170808 1724) nil "linter/problem finder for the Go source code" single ((:commit . "1c05817cf8b96589076c7ac4e52ee58a860a0cbf") (:url . "https://godoc.org/golang.org/x/tools/cmd/vet"))]) + (gpastel . [(20181229 1404) ((emacs (25 1))) "Integrates GPaste with the kill-ring" single ((:commit . "d5fc55bc825203f998537c5834718e665bb87c29") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:keywords "tools") (:url . "https://gitlab.petton.fr/DamienCassou/desktop-environment"))]) + (grab-mac-link . [(20210511 1303) ((emacs (24))) "Grab link from Mac Apps and insert it into Emacs" single ((:commit . "2c722016ca01bd4265d57c4a7d55712c94cf4ea5") (:authors ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:keywords "mac" "hyperlink") (:url . "https://github.com/xuchunyang/grab-mac-link.el"))]) + (grab-x-link . [(20191113 848) ((emacs (24)) (cl-lib (0 5))) "Grab links from X11 apps and insert into Emacs" single ((:commit . "d898db46e4864118359fdedfe915e180de3fe290") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:keywords "hyperlink") (:url . "https://github.com/xuchunyang/grab-x-link"))]) + (gradle-mode . [(20150313 1905) ((s (1 8 0))) "Gradle integration with Emacs' compile" single ((:commit . "e4d665d5784ecda7ddfba015f07c69be3cfc45f2") (:authors ("Daniel Mijares" . "daniel.j.mijares@gmail.com")) (:maintainer "Daniel Mijares" . "daniel.j.mijares@gmail.com") (:keywords "gradle") (:url . "http://github.com/jacobono/emacs-gradle-mode"))]) + (grails . [(20200519 1909) ((emacs (24))) "Minor mode for Grails projects" single ((:commit . "d47273a619d6731683afe60636259b02e2c78a2e") (:url . "https://github.com/lifeisfoo/emacs-grails"))]) + (grails-mode . [(20160504 911) nil "minor-mode that adds some Grails project management to a grails project" single ((:commit . "99eaf70720e4a6337fbd5acb68ae45cc1779bdc4") (:authors ("Jim Morris" . "morris@wolfman.com")) (:maintainer "Russel Winder" . "russel@winder.org.uk") (:keywords "languages") (:url . "http://blog.wolfman.com"))]) + (grails-projectile-mode . [(20160327 1324) ((projectile (0 10 0)) (emacs (24)) (cl-lib (0 5))) "Grails mode with Projectile for projects management." tar ((:commit . "8efca50ce92b556fe9d467b157d7aec635bcc017") (:authors ("Yves Zoundi" . "rimerosolutions@gmail.com")) (:maintainer "Yves Zoundi") (:keywords "grails" "projectile") (:url . "https://github.com/yveszoundi/grails-projectile-mode"))]) + (grammarly . [(20210219 1713) ((emacs (24 4)) (s (1 12 0)) (request (0 3 0)) (websocket (1 6))) "Grammarly API interface" single ((:commit . "175e68d7ce9fd4c44d1eb808954cf0ba66b59599") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/emacs-grammarly/grammarly"))]) + (grandshell-theme . [(20180606 517) nil "Dark color theme for Emacs > 24 with intensive colors." tar ((:commit . "0ed8e4273607dd4fcaa742b4097259233b09eda6") (:authors ("steckerhalter")) (:maintainer "steckerhalter") (:keywords "color" "theme" "grand" "shell" "faces") (:url . "https://framagit.org/steckerhalter/grandshell-theme"))]) + (graphene . [(20180529 1112) ((dash (2 10 0)) (exec-path-from-shell (1 9)) (ppd-sr-speedbar (0 0 6)) (sr-speedbar (20140505)) (ido-completing-read+ (4 3)) (smex (3 0)) (web-mode (11 2)) (smartparens (1 8 0)) (graphene-meta-theme (0 0 2)) (flycheck (0 23)) (company (0 8 12))) "Friendly Emacs defaults" tar ((:commit . "cc8477fcfb7771ea4e5bbaf3c01f9e679234c1c1") (:authors ("Robert Dallas Gray" . "mail@robertdallasgray.com")) (:maintainer "Robert Dallas Gray" . "mail@robertdallasgray.com") (:keywords "defaults") (:url . "https://github.com/rdallasgray/graphene"))]) + (graphene-meta-theme . [(20161204 1607) nil "Integrated theming for common packages" single ((:commit . "62cc73fee31f1bd9474027b83a249feee050271e") (:authors ("Robert Dallas Gray" . "mail@robertdallasgray.com")) (:maintainer "Robert Dallas Gray" . "mail@robertdallasgray.com") (:keywords "defaults") (:url . "https://github.com/rdallasgray/graphene"))]) + (graphql . [(20180912 31) ((emacs (25))) "GraphQL utilities" single ((:commit . "e2b309689f4faf9225f290080f836e988c5a576d") (:authors ("Sean Allred" . "code@seanallred.com")) (:maintainer "Sean Allred" . "code@seanallred.com") (:keywords "hypermedia" "tools" "lisp") (:url . "https://github.com/vermiculus/graphql.el"))]) + (graphql-doc . [(20210530 221) ((emacs (26 1)) (request (0 3 2)) (promise (1 1))) "GraphQL Documentation Explorer" single ((:commit . "a60a646413fce528ecf42be3ee111b3f92d9f95b") (:authors ("Ian Fitzpatrick")) (:maintainer "Ian Fitzpatrick") (:url . "https://github.com/ifitzpatrick/graphql-doc.el"))]) + (graphql-mode . [(20201001 2113) ((emacs (24 3))) "Major mode for editing GraphQL schemas" single ((:commit . "2371316a750b807de941184d49ca19d277ecadcd") (:authors ("David Vazquez Pua" . "davazp@gmail.com")) (:maintainer "David Vazquez Pua" . "davazp@gmail.com") (:keywords "languages") (:url . "https://github.com/davazp/graphql-mode"))]) + (graphviz-dot-mode . [(20200304 432) ((emacs (25 0))) "Mode for the dot-language used by graphviz (att)." tar ((:commit . "3642a0a5f41a80c8ecef7c6143d514200b80e194") (:maintainer "Pieter Pareit" . "pieter.pareit@gmail.com") (:keywords "mode" "dot" "dot-language" "dotlanguage" "graphviz" "graphs" "att") (:url . "https://ppareit.github.io/graphviz-dot-mode/"))]) + (grapnel . [(20131001 1534) nil "HTTP request lib with flexible callback dispatch" single ((:commit . "fbd0f9a51139973d35e4014855964fa435e8ecaf") (:authors ("David Leatherman" . "leathekd@gmail.com")) (:maintainer "David Leatherman" . "leathekd@gmail.com") (:url . "http://www.github.com/leathekd/grapnel"))]) + (grass-mode . [(20170503 1500) ((cl-lib (0 2)) (dash (2 8 0))) "Provides Emacs modes for interacting with the GRASS GIS program" single ((:commit . "8a7e9dcb2295eef1ec25d886b05e09c876bd8398") (:authors ("Tyler Smith" . "tyler@plantarum.ca")) (:maintainer "Tyler Smith" . "tyler@plantarum.ca") (:keywords "grass" "gis"))]) + (grayscale-theme . [(20171005 802) nil "A simple grayscale theme" single ((:commit . "53ad50e10e68f2f076ebfc96e10ecef7a932d38d") (:authors ("Kaleb Elwert" . "belak@coded.io")) (:maintainer "Kaleb Elwert" . "belak@coded.io") (:keywords "lisp") (:url . "https://github.com/belak/emacs-grayscale-theme"))]) + (greek-polytonic . [(20190303 1358) ((emacs (24))) "Quail package for inputting polytonic Greek" single ((:commit . "114cba0f57cc077871693c799b807df2292341ec") (:authors ("Johannes Choo" . "jhanschoo@gmail.com")) (:maintainer "Johannes Choo" . "jhanschoo@gmail.com") (:keywords "i18n" "multilingual" "input method" "greek") (:url . "https://github.com/jhanschoo/greek-polytonic"))]) + (green-is-the-new-black-theme . [(20210203 1511) nil "A cool and minimalist green blackened theme engine" single ((:commit . "09f6908064dd1854379a072d7cdd706959256299") (:authors ("Fred Campos" . "fred.tecnologia@gmail.com")) (:maintainer "Fred Campos" . "fred.tecnologia@gmail.com") (:keywords "faces" "themes") (:url . "https://github.com/fredcamps/green-is-the-new-black-emacs"))]) + (green-phosphor-theme . [(20150515 1447) nil "A light color theme with muted, autumnal colors." single ((:commit . "fa42f598626adfdc5450e5c380fa2d5df6110f28") (:authors ("Adam Alpern" . "adam.alpern@gmail.com")) (:maintainer "Adam Alpern" . "adam.alpern@gmail.com") (:keywords "color" "theme") (:url . "http://github.com/aalpern/emacs-color-theme-green-phosphor"))]) + (green-screen-theme . [(20180816 1502) nil "A nice color theme for those who miss green CRTs" single ((:commit . "774e8f6c033786406267f71ec07319d906a30b75") (:authors ("Ricardo Banffy" . "rbanffy@gmail.com")) (:maintainer "Ricardo Banffy" . "rbanffy@gmail.com") (:keywords "faces" "theme") (:url . "https://github.com/rbanffy/green-screen-emacs"))]) + (gregorio-mode . [(20170705 1451) nil "Gregorio Mode for .gabc files" single ((:commit . "736fd3d05fb67f707cca1a7ce24e3ee7ca5e9567") (:authors ("Fr. John Jenkins" . "jenkins@sspx.ng")) (:maintainer "Fr. John Jenkins" . "jenkins@sspx.ng") (:keywords "gregorio" "chant") (:url . "https://jsrjenkins.github.io/gregorio-mode/"))]) + (grep-a-lot . [(20131006 1347) nil "manages multiple search results buffers for grep.el" single ((:commit . "9f9f645b9e308a0d887b66864ff97d0fca1ba4ad") (:authors ("Avi Rozen" . "avi.rozen@gmail.com")) (:maintainer "Avi Rozen" . "avi.rozen@gmail.com") (:keywords "tools" "convenience" "search") (:url . "https://github.com/ZungBang/emacs-grep-a-lot"))]) + (greymatters-theme . [(20150621 1123) ((emacs (24))) "Emacs 24 theme with a light background." single ((:commit . "a7220a8c6cf18ccae2b76946b6f01188a7c9d5d1") (:authors ("Martin Haesler")) (:maintainer "Martin Haesler"))]) + (grip-mode . [(20210609 1305) ((emacs (24 4))) "Instant GitHub-flavored Markdown/Org preview using grip." single ((:commit . "0ef2a3566f76e1c03ec64ac64cbb916530e40e32") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Vincent Zhang" . "seagle0128@gmail.com") (:keywords "convenience" "markdown" "preview") (:url . "https://github.com/seagle0128/grip-mode"))]) + (grizzl . [(20160818 737) ((cl-lib (0 5)) (emacs (24 3))) "Fast fuzzy search index for Emacs." single ((:commit . "1e917253ce2b846f0272b8356fad3dbff9cd513a") (:authors ("Chris Corbyn" . "chris@w3style.co.uk")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.com") (:keywords "convenience" "usability") (:url . "https://github.com/grizzl/grizzl"))]) + (groovy-imports . [(20210505 1807) ((emacs (24 4)) (s (1 10 0)) (pcache (0 3 2))) "Code for dealing with Groovy imports" single ((:commit . "a60c3202973e3185091db623d960f71840a22205") (:authors ("Miro Bezjak")) (:maintainer "Miro Bezjak") (:keywords "groovy") (:url . "http://www.github.com/mbezjak/emacs-groovy-imports"))]) + (groovy-mode . [(20210510 317) ((s (1 12 0)) (emacs (24 3)) (dash (2 13 0))) "Major mode for Groovy source files" tar ((:commit . "99eaf70720e4a6337fbd5acb68ae45cc1779bdc4") (:authors ("Russel Winder" . "russel@winder.org.uk") ("Jim Morris" . "morris@wolfman.com") ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Russel Winder" . "russel@winder.org.uk") (:keywords "languages"))]) + (gruber-darker-theme . [(20200227 2238) nil "Gruber Darker color theme for Emacs 24." single ((:commit . "7f95ce96079eb22b9214435ed25c5af98f60b482") (:authors ("Alexey Kutepov" . "reximkut@gmail.com")) (:maintainer "Alexey Kutepov" . "reximkut@gmail.com") (:url . "http://github.com/rexim/gruber-darker-theme"))]) + (grugru . [(20210127 432) ((emacs (24 4))) "Rotate text at point" tar ((:commit . "4ac2bf3877e3af7d23ace3165b9c8ed536ff4832") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com") (:keywords "convenience" "abbrev" "tools") (:url . "https://github.com/ROCKTAKEY/grugru"))]) + (grunt . [(20160316 1528) ((dash (2 9 0)) (ansi-color (3 4 2)) (emacs (24 3))) "Some glue to stick Emacs and Gruntfiles together" single ((:commit . "4c269e2738658643ec2ed9ef61a2a3d71b08d304") (:authors ("Daniel Gempesaw" . "dgempesaw@sharecare.com")) (:maintainer "Daniel Gempesaw" . "dgempesaw@sharecare.com") (:keywords "convenience" "grunt") (:url . "https://github.com/gempesaw/grunt.el"))]) + (gruvbox-theme . [(20210606 1419) ((autothemer (0 2))) "A retro-groove colour theme for Emacs" tar ((:commit . "c2ae5e3fff39f78f23109d90fdf36b3b189df511") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com") (:url . "http://github.com/greduan/emacs-theme-gruvbox"))]) + (gs-mode . [(20151202 1006) nil "Major mode for editing GrADS script files" single ((:commit . "1a13051db21b999c7682a015b33a03096ff9d891") (:authors ("Joe Wielgosz" . "joew@cola.iges.org")) (:maintainer "Joe Wielgosz" . "joew@cola.iges.org") (:keywords "grads" "script" "major-mode"))]) + (gscholar-bibtex . [(20190130 555) nil "Retrieve BibTeX from Google Scholar and other online sources(ACM, IEEE, DBLP)" single ((:commit . "3b651e3de116860eb1f1aef9b547a561784871fe") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions"))]) + (gsettings . [(20210407 2045) ((emacs (24 3)) (dash (2 16 0)) (gvariant (1 0 0)) (s (1 12 0))) "GSettings (Gnome) helpers" single ((:commit . "9f9fb1fe946bbba46307c26355f355225ea7262a") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee") (:keywords "languages") (:url . "https://github.com/wbolster/emacs-gsettings"))]) + (gsnip . [(20200928 357) ((emacs (26)) (aio (1 0)) (log4e (0 3 3))) "A gitlab snippet client" single ((:commit . "c8bff61b10cd33de9d6f5fd84e4b27f48c772304") (:authors ("Wang Kai" . "kaiwkx@gmail.com")) (:maintainer "Wang Kai" . "kaiwkx@gmail.com") (:keywords "extensions" "tools") (:url . "https://github.com/kaiwk/gitlab-snippet"))]) + (gtk-pomodoro-indicator . [(20191007 1500) nil "A pomodoro indicator for the GTK tray" tar ((:commit . "338e6dca6d749cfc85195907bba593f9f6855715") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "convenience" "pomodoro") (:url . "https://github.com/abo-abo/gtk-pomodoro-indicator"))]) + (gtk-variant . [(20200416 2136) ((emacs (25 1))) "Set the GTK theme variant (titlebar color)" single ((:commit . "e0653e4a654b7800dc15f7e1a06a956b77d2aabe") (:authors ("Paul Oppenheimer")) (:maintainer "Paul Oppenheimer") (:keywords "frames" "gtk" "titlebar") (:url . "https://github.com/bepvte/gtk-variant.el"))]) + (guess-language . [(20210308 1514) ((cl-lib (0 5)) (emacs (24))) "Robust automatic language detection" tar ((:commit . "7e511d23ee4315a79081c53596398c471572fb0f") (:authors ("Titus von der Malsburg" . "malsburg@posteo.de")) (:maintainer "Titus von der Malsburg" . "malsburg@posteo.de") (:keywords "wp") (:url . "https://github.com/tmalsburg/guess-language.el"))]) + (guide-key . [(20150108 635) ((dash (2 10 0)) (popwin (0 3 0)) (s (1 9 0))) "Guide the following key bindings automatically and dynamically" single ((:commit . "8f8b839f42edd53af13d588254f07727108ae312") (:authors ("Tsunenobu Kai" . "kai2nenobu@gmail.com")) (:maintainer "Tsunenobu Kai" . "kai2nenobu@gmail.com") (:keywords "help" "convenience") (:url . "https://github.com/kai2nenobu/guide-key"))]) + (guide-key-tip . [(20161011 823) ((guide-key (1 2 3)) (pos-tip (0 4 5))) "Show guide-key.el hints using pos-tip.el" single ((:commit . "02c5d4b0b65f3e91be5a47f0ff1ae5e86e00c64e") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "help" "convenience" "tooltip") (:url . "https://github.com/aki2o/guide-key-tip"))]) + (guix . [(20210608 1653) ((emacs (24 3)) (dash (2 11 0)) (geiser (0 8)) (bui (1 2 0)) (magit-popup (2 1 0)) (edit-indirect (0 1 4))) "Interface for GNU Guix" tar ((:commit . "c9aef52121b458297e70bb50f49f7276b4a8d759") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "tools") (:url . "https://emacs-guix.gitlab.io/website/"))]) + (gulp-task-runner . [(20170718 2041) nil "Gulp task runner" single ((:commit . "877990e956b1d71e2d9c7c3e5a129ad199b9debb") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr") (:keywords "convenience" "javascript"))]) + (guru-mode . [(20200708 728) nil "Become an Emacs guru" single ((:commit . "fcb13d46f85dda886249bfaa19bcb777fe9f8a6a") (:authors ("Bozhidar Batsov")) (:maintainer "Bozhidar Batsov") (:keywords "convenience") (:url . "https://github.com/bbatsov/guru-mode"))]) + (gvariant . [(20210507 1310) ((emacs (24)) (parsec (0 1 4))) "GVariant (GLib) helpers" single ((:commit . "f2e87076845800cbaaeed67f175ad4e4a9c01e37") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee") (:keywords "languages") (:url . "https://github.com/wbolster/emacs-gvariant"))]) + (gvpr-mode . [(20201007 2054) nil "A major mode offering basic syntax coloring for gvpr scripts." single ((:commit . "ef6ec2d4a4c9de68078c94a0e43b05bf77ec4674") (:authors ("Rod Waldhoff" . "r.waldhoff@gmail.com")) (:maintainer "Rod Waldhoff" . "r.waldhoff@gmail.com") (:keywords "graphviz" "gv" "dot" "gvpr" "graph") (:url . "https://raw.github.com/rodw/gvpr-lib/master/extra/gvpr-mode.el"))]) + (gxref . [(20170411 1753) ((emacs (25))) "xref backend using GNU Global." single ((:commit . "380b02c3c3c2586c828456716eef6a6392bb043b") (:authors ("Dedi Hirschfeld")) (:maintainer "Dedi Hirschfeld") (:keywords "xref" "global" "tools") (:url . "https://github.com/dedi/gxref"))]) + (habamax-theme . [(20181001 850) ((emacs (24))) "Boring white background color that gets the job done." single ((:commit . "6e86a1b23b6e2aaf40d4374b5673da00a28be447") (:authors ("Maxim Kim" . "habamax@gmail.com")) (:maintainer "Maxim Kim" . "habamax@gmail.com") (:url . "https://github.com/habamax/habamax-theme"))]) + (habitica . [(20201210 1933) ((org (8 3 5)) (emacs (24 3))) "Interface for habitica.com" single ((:commit . "eeb0209fd638192f0b833526deb222f9f61361cb") (:authors ("Adrien Brochard")) (:maintainer "Adrien Brochard") (:keywords "habitica" "todo") (:url . "https://github.com/abrochard/emacs-habitica"))]) + (hack-mode . [(20210519 108) ((emacs (25 1)) (s (1 11 0))) "Major mode for the Hack programming language" single ((:commit . "f9315be69954b95b6a3ceaa37f31a88f8369a59f") (:authors ("John Allen <jallen@fb.com>, Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "John Allen <jallen@fb.com>, Wilfred Hughes" . "me@wilfred.me.uk") (:url . "https://github.com/hhvm/hack-mode"))]) + (hacker-typer . [(20170206 1520) ((emacs (24))) "Pretend to write code like a pro" tar ((:commit . "d5a23714a4ccc5071580622f278597d5973f40bd") (:authors ("Diego A. Mundo" . "diegoamundo@gmail.com")) (:maintainer "Diego A. Mundo" . "diegoamundo@gmail.com") (:keywords "hacker" "typer" "multimedia" "games") (:url . "http://github.com/therockmandolinist/emacs-hacker-typer"))]) + (hackernews . [(20210226 1226) nil "Hacker News Client for Emacs" single ((:commit . "cea521750eddb3a70ccd38789d12b09bbdc7e906") (:authors ("Lincoln de Sousa" . "lincoln@comum.org")) (:maintainer "Basil L. Contovounesios" . "contovob@tcd.ie") (:keywords "comm" "hypermedia" "news") (:url . "https://github.com/clarete/hackernews.el"))]) + (hal-mode . [(20160704 1746) nil "Major mode for editing HAL files" single ((:commit . "cd2f66f219ee520198d4586fb6b169cef7ad3f21") (:authors ("Alexander Rössler")) (:maintainer "Alexander Rössler") (:keywords "language") (:url . "https://github.com/strahlex/hal-mode/"))]) + (ham-mode . [(20150811 1306) ((html-to-markdown (1 2)) (markdown-mode (2 0))) "Html As Markdown. Transparently edit an html file using markdown" single ((:commit . "3a141986a21c2aa6eefb428983352abb8b7907d2") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com") (:keywords "convenience" "emulation" "wp") (:url . "http://github.com/Bruce-Connor/ham-mode"))]) + (hamburg-theme . [(20160123 740) ((emacs (24))) "Color Theme with a dark blue background." single ((:commit . "aacefdf1501d97a5afc0e63c8ead4b2463323028") (:authors ("Martin Haesler")) (:maintainer "Martin Haesler"))]) + (hamburger-menu . [(20160825 2031) ((emacs (24 5))) "Mode line hamburger menu" single ((:commit . "3568159c693c30bed7f61580e4f3b6241253ad4e") (:authors ("Iain Nicol")) (:maintainer "Iain Nicol") (:keywords "hamburger" "menu") (:url . "https://gitlab.com/iain/hamburger-menu-mode"))]) + (haml-mode . [(20190219 2102) ((emacs (24)) (cl-lib (0 5))) "Major mode for editing Haml files" single ((:commit . "bf5b6c11b1206759d2b28af48765e04882dd1fc4") (:authors ("Natalie Weizenbaum")) (:maintainer "Natalie Weizenbaum") (:keywords "markup" "languages" "html") (:url . "https://github.com/nex3/haml-mode"))]) + (hamlet-mode . [(20131208 724) ((cl-lib (0 3)) (dash (2 3 0)) (s (1 7 0))) "Hamlet editing mode" single ((:commit . "7362b955e556a3d007fa06945a27e5b99349527d") (:authors (nil . "Kata <lightquake@amateurtopologist.com")) (:maintainer nil . "Kata <lightquake@amateurtopologist.com") (:keywords "wp" "languages" "comm") (:url . "https://github.com/lightquake/hamlet-mode"))]) + (handle . [(20191029 856) ((emacs (25 1)) (parent-mode (2 3))) "A handle for major-mode generic functions." single ((:commit . "e27b2d0b229923f81a2c8afa3e9c65ae9e84a0da") (:authors ("Uros Perisic")) (:maintainer "Uros Perisic") (:keywords "convenience") (:url . "https://gitlab.com/jjzmajic/handle"))]) + (handlebars-mode . [(20150211 1749) nil "A major mode for editing Handlebars files." single ((:commit . "81f6b73fea8f397807781a1b51568397af21a6ef") (:authors ("Tony Gentilcore") ("Chris Wanstrath") ("Daniel Hackney") ("Daniel Evans")) (:maintainer "Tony Gentilcore"))]) + (handlebars-sgml-mode . [(20130623 2333) nil "Add Handlebars contextual indenting support to sgml-mode" single ((:commit . "c76df93a9a8c1b1b3efdcc4add32bf93304192a4") (:authors ("Geoff Jacobsen" . "geoffjacobsen@gmail.com")) (:maintainer "Geoff Jacobsen" . "geoffjacobsen@gmail.com") (:url . "http://github.com/jacott/handlebars-sgml-mode"))]) + (handoff . [(20150917 600) nil "Get your hand off that mouse, damn it!" single ((:commit . "75dc7a7e352f38679f65d0ca80ad158798e168bd") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:url . "http://github.com/rejeep/handoff.el"))]) + (hardcore-mode . [(20151114 701) nil "Disable arrow keys + optionally backspace and return" single ((:commit . "b1dda19692b4a7a58a689e81784a9b35be39e70d") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))]) + (hardhat . [(20210515 1422) ((emacs (24 3)) (ignoramus (0 7 0))) "Protect against clobbering user-writable files" single ((:commit . "908cb130be3d56921a3687a00b974ba5eef3a11f") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "convenience") (:url . "http://github.com/rolandwalker/hardhat"))]) + (harvest . [(20170822 1746) ((swiper (0 7 0)) (hydra (0 13 0)) (s (1 11 0))) "Harvest integration" single ((:commit . "7acbc0564b250521b67131ee2a0a92720239454f") (:authors ("Kosta Harlan" . "kosta@kostaharlan.net")) (:maintainer "Kosta Harlan" . "kosta@kostaharlan.net") (:keywords "harvest") (:url . "https://github.com/kostajh/harvest.el"))]) + (haskell-emacs . [(20160904 2026) nil "Write emacs extensions in haskell" tar ((:commit . "a2c6a079175904689eed7c6c200754bfa85d1ed9") (:authors ("Florian Knupfer")) (:maintainer "Florian Knupfer") (:keywords "haskell" "emacs" "ffi") (:url . "https://github.com/knupfer/haskell-emacs"))]) + (haskell-emacs-base . [(20150714 1559) ((haskell-emacs (2 4 0))) "Haskell functions from Prelude" tar ((:commit . "a2c6a079175904689eed7c6c200754bfa85d1ed9") (:authors ("Florian Knupfer")) (:maintainer "Florian Knupfer") (:keywords "haskell" "emacs" "ffi") (:url . "https://github.com/knupfer/haskell-emacs/modules/base"))]) + (haskell-emacs-text . [(20150713 1416) ((haskell-emacs (2 4 0))) "Haskell functions from Data.Text" tar ((:commit . "a2c6a079175904689eed7c6c200754bfa85d1ed9") (:authors ("Florian Knupfer")) (:maintainer "Florian Knupfer") (:keywords "haskell" "emacs" "ffi") (:url . "https://github.com/knupfer/haskell-emacs/modules/text"))]) + (haskell-mode . [(20210507 2243) ((emacs (25 1))) "A Haskell editing mode" tar ((:commit . "b35e8547b67f3d2c4d38ec7e7e516e3c0925352f") (:authors ("1992 Simon Marlow") ("1997-1998 Graeme E Moss" . "gem@cs.york.ac.uk") ("Tommy Thorn" . "thorn@irisa.fr") ("2001-2002 Reuben Thomas (>=v1.4)") ("2003 Dave Love" . "fx@gnu.org") ("2016 Arthur Fayzrakhmanov")) (:maintainer "1992 Simon Marlow") (:keywords "faces" "files" "haskell") (:url . "https://github.com/haskell/haskell-mode"))]) + (haskell-snippets . [(20210228 344) ((cl-lib (0 5)) (yasnippet (0 8 0))) "Yasnippets for Haskell" tar ((:commit . "1c29c4a68ce89848b8d371c6510d1de3b586c8b3") (:authors ("Luke Hoersten" . "luke@hoersten.org")) (:maintainer "Luke Hoersten" . "luke@hoersten.org") (:keywords "snippets" "haskell") (:url . "https://github.com/haskell/haskell-snippets"))]) + (haskell-tab-indent . [(20200513 1950) nil "tab-based indentation for haskell-mode" single ((:commit . "3239e814d6999f31ad845cc58df53395ad299059") (:authors ("Sean Whitton" . "spwhitton@spwhitton.name")) (:maintainer "Sean Whitton" . "spwhitton@spwhitton.name") (:keywords "indentation" "haskell") (:url . "https://spwhitton.name/tech/code/haskell-tab-indent/"))]) + (hasklig-mode . [(20181110 1859) ((emacs (25))) "Hasklig ligatures" single ((:commit . "57e8ac22bd499b632ab94657b855c7c43b166dda") (:authors ("Daniel Mendler")) (:maintainer "Daniel Mendler") (:url . "https://github.com/minad/hasklig-mode"))]) + (hasky-extensions . [(20190204 2016) ((emacs (24 4)) (avy-menu (0 2))) "Toggle Haskell language extensions" single ((:commit . "4a0d1d9beb3be8ff4a1857eb920c916734dcc8e1") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:keywords "programming") (:url . "https://github.com/hasky-mode/hasky-extensions"))]) + (hasky-stack . [(20190304 2248) ((emacs (24 4)) (f (0 18 0)) (magit-popup (2 10))) "Interface to the Stack Haskell development tool" single ((:commit . "9ef133ed831a95a2b9990a46a3c57f1918d0274f") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:keywords "tools" "haskell") (:url . "https://github.com/hasky-mode/hasky-stack"))]) + (haste . [(20141030 2034) ((json (1 2))) "Emacs client for hastebin (http://hastebin.com/about.md)" single ((:commit . "22d05aacc3296ab50a7361222ab139fb4d447c25") (:authors ("Ric Lister")) (:maintainer "Ric Lister") (:url . "http://github.com/rlister/emacs-haste-client"))]) + (haxe-imports . [(20170330 2304) ((emacs (24 4)) (s (1 10 0)) (pcache (0 3 1))) "Code for dealing with Haxe imports" single ((:commit . "f104a641f3dfe698359d9aca1f28d9383cf43e04") (:authors ("Juan Karlo Licudine" . "karlo@accidentalrebel.com")) (:maintainer "Juan Karlo Licudine" . "karlo@accidentalrebel.com") (:keywords "haxe") (:url . "http://www.github.com/accidentalrebel/emacs-haxe-imports"))]) + (haxe-mode . [(20210108 1835) nil "Major mode for editing Haxe files" single ((:commit . "fb3f3c9514e652f8955a67baeae13de264996860") (:authors ("Jens Peter Secher (original)")) (:maintainer "Jen-Chieh Shen" . "jcs090218@gmail.com") (:url . "https://github.com/emacsorphanage/haxe-mode"))]) + (haxor-mode . [(20160618 1129) ((emacs (24 0))) "Major mode for editing Haxor Assembly Files" single ((:commit . "6fa25a8e6b6a59481bc0354c2fe1e0ed53cbdc91") (:authors ("Krzysztof Magosa" . "krzysztof@magosa.pl")) (:maintainer "Krzysztof Magosa" . "krzysztof@magosa.pl") (:keywords "haxor") (:url . "https://github.com/krzysztof-magosa/haxor-mode"))]) + (hayoo . [(20140831 1221) ((emacs (24)) (json (1 3))) "Query hayoo and show results in a tabulated buffer." single ((:commit . "3ca2fb0c4d5f337d0410c21b2702dd147014e984") (:authors ("Marko Bencun" . "mbencun@gmail.com")) (:maintainer "Marko Bencun" . "mbencun@gmail.com") (:keywords "hayoo" "haskell") (:url . "https://github.com/benma/hayoo.el/"))]) + (hc-zenburn-theme . [(20150928 1633) nil "An higher contrast version of the Zenburn theme." single ((:commit . "fd0024a5191cdce204d91c8f1db99ba31640f6e9") (:authors ("Nantas Nardelli" . "nantas.nardelli@gmail.com")) (:maintainer "Nantas Nardelli" . "nantas.nardelli@gmail.com") (:url . "https:github.com/edran/hc-zenburn-emacs"))]) + (hcl-mode . [(20200315 2129) ((emacs (24 3))) "Major mode for Hashicorp" single ((:commit . "e12b1df2ca28d2b06c471cd709c038a2dc0bcdbd") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/emacs-hcl-mode"))]) + (headlong . [(20150417 1526) nil "reckless completion" single ((:commit . "f6830f87f236eee88263cb6976125f72422abe72") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "completion") (:url . "https://github.com/abo-abo/headlong"))]) + (heaven-and-hell . [(20190713 1830) ((emacs (24 4))) "easy toggle light/dark themes" single ((:commit . "e1febfd60d060c110a1e43c5f093cd8537251308") (:authors ("Valentin Ignatev" . "valentignatev@gmail.com")) (:maintainer "Valentin Ignatev" . "valentignatev@gmail.com") (:keywords "faces") (:url . "https://github.com/valignatev/heaven-and-hell"))]) + (helm . [(20210607 1026) ((emacs (25 1)) (async (1 9 4)) (popup (0 5 3)) (helm-core (3 7 1))) "Helm is an Emacs incremental and narrowing framework" tar ((:commit . "a92156303021e0ec91a904e16a994d8e1ccd78f7") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://github.com/emacs-helm/helm"))]) + (helm-R . [(20120820 14) ((helm (20120517)) (ess (20120509))) "helm-sources and some utilities for GNU R." single ((:commit . "b0eb9d5f6a483a9dbe6eb6cf1f2024d4f5938bc2") (:authors ("myuhe <yuhei.maeda_at_gmail.com>")) (:maintainer "myuhe") (:keywords "convenience") (:url . "https://github.com/myuhe/helm-R.el"))]) + (helm-ack . [(20141030 1226) ((helm (1 0)) (cl-lib (0 5))) "Ack command with helm interface" single ((:commit . "889bc225318d14c6e3be80e73b1d9d6fb30e48c3") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-helm-ack"))]) + (helm-ad . [(20151209 1015) ((dash (2 8 0)) (helm (1 6 2))) "helm source for Active Directory" single ((:commit . "8ac044705d8620ee354a9cfa8cc1b865e83c0d55") (:authors ("Takahiro Noda" . "takahiro.noda+github@gmail.com")) (:maintainer "Takahiro Noda" . "takahiro.noda+github@gmail.com") (:keywords "comm"))]) + (helm-ag . [(20210305 334) ((emacs (25 1)) (helm (2 0))) "The silver searcher with helm interface" single ((:commit . "51e164b4bb1a9826fe8b39c0d02b4064c9352b9f") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-helm-ag"))]) + (helm-ag-r . [(20131123 1531) ((helm (1 0))) "Search something by ag and display by helm" single ((:commit . "67de4ebafe9b088db950eefa5ef590a6d78b4ac8") (:authors ("Yuta Yamada <cokesboy\"at\"gmail.com>")) (:maintainer "Yuta Yamada <cokesboy\"at\"gmail.com>") (:keywords "searching") (:url . "https://github.com/yuutayamada/helm-ag-r"))]) + (helm-apt . [(20210324 1929) ((helm (3 6)) (emacs (25 1))) "Helm interface for Debian/Ubuntu packages (apt-*)" single ((:commit . "c952b5dc26015bc9c947973df99246212d276b63") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://github.com/emacs-helm/helm-apt"))]) + (helm-atoms . [(20201013 1723) ((emacs (25 1)) (helm (2 0))) "Reverse variable lookup using Helm" single ((:commit . "7e6f91a16f556c96ae1b0d1f965ea56861bb6372") (:authors ("Dante Catalfamo")) (:maintainer "Dante Catalfamo") (:keywords "help" "lisp" "maint" "helm" "tools" "matching") (:url . "https://github.com/dantecatalfamo/helm-atoms"))]) + (helm-aws . [(20180514 1032) ((helm (1 5 3)) (cl-lib (0 5)) (s (1 9 0))) "Manage AWS EC2 server instances directly from Emacs" single ((:commit . "b36c744b3f00f458635a91d1f5158fccbb5baef6") (:authors ("istib")) (:maintainer "istib") (:url . "https://github.com/istib/helm-aws"))]) + (helm-backup . [(20180911 614) ((helm (1 5 5)) (s (1 8 0)) (cl-lib (0))) "Backup each file change using git" single ((:commit . "691fe542f38fc7c8cca409997f6a0ff5d76ad6c2") (:authors ("Anthony HAMON" . "hamon.anth@gmail.com")) (:maintainer "Anthony HAMON" . "hamon.anth@gmail.com") (:keywords "backup" "convenience" "files" "tools" "vc") (:url . "http://github.com/antham/helm-backup"))]) + (helm-bbdb . [(20190728 1325) ((emacs (24 3)) (helm (1 5)) (bbdb (3 1 2))) "Helm interface for bbdb" single ((:commit . "db69114ff1af8bf48b5a222242e3a8dd6e101e67") (:url . "https://github.com/emacs-helm/helm-bbdb"))]) + (helm-bibtex . [(20201214 2111) ((bibtex-completion (1 0 0)) (helm (1 5 5)) (cl-lib (0 5)) (emacs (24 1))) "A bibliography manager based on Helm" single ((:commit . "9f6ea920a49457d85096caa0e61f086a42b2908e") (:authors ("Titus von der Malsburg" . "malsburg@posteo.de")) (:maintainer "Titus von der Malsburg" . "malsburg@posteo.de") (:url . "https://github.com/tmalsburg/helm-bibtex"))]) + (helm-bibtexkey . [(20140214 1504) ((helm (1 5 8))) "Bibtexkey source for helm" tar ((:commit . "aa1637ea5c8c5f1817e480fc2a3750cafab3d99f") (:authors ("TAKAGI Kentaro <kentaro0910_at_gmail.com>")) (:maintainer "TAKAGI Kentaro <kentaro0910_at_gmail.com>") (:keywords "bib" "tex") (:url . "https://github.com/kenbeese/helm-bibtexkey"))]) + (helm-bind-key . [(20141109 515) ((bind-key (1 0)) (helm (1 6 4))) "helm-source for for bind-key." single ((:commit . "9da6ad8b7530e72fb4ac67be8c6a482898dddc25") (:authors ("Yuhei Maeda <yuhei.maeda_at_gmail.com>")) (:maintainer "myuhe") (:keywords "convenience" "emulation"))]) + (helm-bitbucket . [(20190422 1102) ((emacs (24)) (helm-core (3 0))) "Search Bitbucket with Helm" single ((:commit . "c722016622ad019202419cca60c3be3c53e56130") (:authors ("Peter Urbak" . "tolowercase@gmail.com")) (:maintainer "Peter Urbak" . "tolowercase@gmail.com") (:keywords "matching") (:url . "https://github.com/dragonwasrobot/helm-bitbucket"))]) + (helm-bm . [(20160321 1331) ((bm (1 0)) (cl-lib (0 5)) (helm (1 9 3)) (s (1 11 0))) "helm sources for bm.el" single ((:commit . "d66341f5646c23178d4d8bffb6cfebe3fb73f1d7") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com") (:keywords "helm" "bookmark") (:url . "https://github.com/yasuyk/helm-bm"))]) + (helm-books . [(20170325 631) ((helm (1 7 7))) "Helm interface for searching books" single ((:commit . "625aadec1541a5ca36951e4ce1301f4b6fe2bf3f") (:authors ("grugrut" . "grugruglut+github@gmail.com")) (:maintainer "grugrut" . "grugruglut+github@gmail.com") (:url . "https://github.com/grugrut/helm-books"))]) + (helm-bufler . [(20201216 826) ((emacs (26 3)) (bufler (0 2 -1)) (helm (1 9 4))) "Helm source for Bufler" single ((:commit . "097f4349920215bdd829fceabc1afdbba172c32a") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "convenience") (:url . "https://github.com/alphapapa/bufler.el"))]) + (helm-bundle-show . [(20190526 1401) ((emacs (24)) (helm (1 8 0))) "Bundle show with helm interface" single ((:commit . "70f1ca7d1847c7d5cd5a3e488562cd4a295b809f") (:authors ("Takashi Masuda" . "masutaka.net@gmail.com")) (:maintainer "Takashi Masuda" . "masutaka.net@gmail.com") (:url . "https://github.com/masutaka/emacs-helm-bundle-show"))]) + (helm-c-moccur . [(20151230 924) ((helm (20120811)) (color-moccur (2 71))) "helm source for color-moccur.el" single ((:commit . "b0a906f85fa352db091f88b91a9c510de607dfe9") (:authors ("Kenji.I (Kenji Imakado)" . "ken.imakaado@gmail.com")) (:maintainer "Kenji.I (Kenji Imakado)" . "ken.imakaado@gmail.com") (:keywords "convenience" "emulation"))]) + (helm-c-yasnippet . [(20210330 16) ((emacs (25 1)) (helm (1 7 7)) (yasnippet (0 8 0))) "helm source for yasnippet.el" single ((:commit . "e214eec8b2875d8a7cd09006dfb6a8e15e9e4079") (:authors ("Kenji.I (Kenji Imakado)" . "ken.imakaado@gmail.com")) (:maintainer "Kenji.I (Kenji Imakado)" . "ken.imakaado@gmail.com") (:keywords "convenience" "emulation"))]) + (helm-catkin . [(20190425 1520) ((emacs (24 3)) (helm (0)) (xterm-color (0))) "Package for compile ROS workspaces with catkin-tools" single ((:commit . "d33c71cecd35616dfa7c3b81d8f51c128405977f") (:authors ("Thore Goll" . "thoregoll@googlemail.com")) (:maintainer "Thore Goll" . "thoregoll@googlemail.com") (:keywords "catkin" "helm" "build" "tools" "ros") (:url . "https://github.com/gollth/helm-catkin"))]) + (helm-charinfo . [(20170810 1231) ((emacs (24)) (helm (1 7 0)) (cl-lib (0 5))) "A helm source for character information" single ((:commit . "91798a49dc115342a7e01e48b264e9a0bf5ea414") (:authors ("Christian Wittern" . "cwittern@gmail.com")) (:maintainer "Christian Wittern" . "cwittern@gmail.com") (:keywords "convenience") (:url . "https://github.com/cwittern/helm-charinfo"))]) + (helm-chrome . [(20160719 520) ((helm (1 5)) (cl-lib (0 3)) (emacs (24))) "Helm interface for Chrome bookmarks" single ((:commit . "fd630ace4b4b4f33355a973743bbfe0c90ce4830") (:authors ("KAWABATA, Taichi <kawabata.taichi_at_gmail.com>")) (:maintainer "KAWABATA, Taichi <kawabata.taichi_at_gmail.com>") (:keywords "tools") (:url . "https://github.com/kawabata/helm-chrome"))]) + (helm-chrome-control . [(20190707 1807) ((emacs (25 1)) (helm-core (3 0))) "Control Chrome tabs with Helm (macOS only)" tar ((:commit . "e6758763099959e961e218bb1122526323f7ee5e") (:authors ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:url . "https://github.com/xuchunyang/helm-chrome-control"))]) + (helm-chrome-history . [(20191031 1233) ((emacs (25 1)) (helm-core (3 0))) "Browse Chrome History with Helm" single ((:commit . "f9002d4c12df65a99830376b126dbbeae3ef2148") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:keywords "tools") (:url . "https://github.com/xuchunyang/helm-chrome-history"))]) + (helm-chronos . [(20150528 2036) ((chronos (1 2)) (helm (1 7 1))) "helm interface for chronos timers" tar ((:commit . "a14fc3d65dd96ce6616234b3f7b8b08b4c1817ef") (:authors ("David Knight" . "dxknight@opmbx.org")) (:maintainer "David Knight" . "dxknight@opmbx.org") (:keywords "calendar") (:url . "http://github.com/dxknight/helm-chronos"))]) + (helm-cider . [(20180307 458) ((emacs (24 4)) (cider (0 16)) (helm-core (2 8))) "Helm interface to CIDER" tar ((:commit . "9363cc537f06233345aa3af5cd46aa5681ad607b") (:authors ("Tianxiang Xiong" . "tianxiang.xiong@gmail.com")) (:maintainer "Tianxiang Xiong" . "tianxiang.xiong@gmail.com") (:keywords "cider" "clojure" "helm" "languages") (:url . "https://github.com/clojure-emacs/helm-cider"))]) + (helm-cider-history . [(20150719 2120) ((helm (1 4 0)) (cider (0 9 0))) "Helm interface for cider history" single ((:commit . "c391fcb2e162a02001605a0b9449783575a831fd") (:authors ("Andreas Klein" . "git@kungi.org")) (:maintainer "Andreas Klein" . "git@kungi.org") (:keywords "convenience") (:url . "https://github.com/Kungi/helm-cider-history"))]) + (helm-circe . [(20160207 652) ((emacs (24)) (helm (0 0)) (circe (0 0)) (cl-lib (0 5))) "helm circe buffer management." single ((:commit . "9091651d9fdd8d49d8ff6f9dcf3a2ae416c9f15a") (:authors ("Les Harris" . "les@lesharris.com")) (:maintainer "Les Harris" . "les@lesharris.com") (:keywords "helm" "circe") (:url . "https://github.com/lesharris/helm-circe"))]) + (helm-clojuredocs . [(20160405 723) ((edn (1 1 2)) (helm (1 5 7))) "search for help in clojuredocs.org" single ((:commit . "5a7f0f2cb401be0b09e73262a1c18265ab9a3cea") (:authors ("Michal Buczko" . "michal.buczko@gmail.com")) (:maintainer "Michal Buczko" . "michal.buczko@gmail.com") (:keywords "helm" "clojure") (:url . "https://github.com/mbuczko/helm-clojuredocs"))]) + (helm-cmd-t . [(20170125 1459) nil "cmd-t style completion" tar ((:commit . "7fa3d4a9f7271512e54c5de999079b27c9eec6bf") (:authors ("Le Wang")) (:maintainer "Le Wang") (:keywords "helm" "project-management" "completion" "convenience" "cmd-t" "textmate") (:url . "https://github.com/lewang/helm-cmd-t"))]) + (helm-codesearch . [(20190412 1153) ((emacs (25 1)) (s (1 11 0)) (dash (2 12 0)) (helm (1 7 7)) (cl-lib (0 5))) "helm interface for codesearch" single ((:commit . "72f1d1de746115ab7e861178b49fa3c0b6b58d90") (:authors ("Youngjoo Lee" . "youngker@gmail.com")) (:maintainer "Youngjoo Lee" . "youngker@gmail.com") (:keywords "tools"))]) + (helm-commandlinefu . [(20150611 545) ((emacs (24 1)) (helm (1 7 0)) (json (1 3)) (let-alist (1 0 3))) "Search and browse commandlinefu.com from helm" single ((:commit . "9ee7e018c5db23ae9c8d1c8fa969876f15b7280d") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:keywords "commandlinefu.com") (:url . "https://github.com/xuchunyang/helm-commandlinefu"))]) + (helm-company . [(20190812 1429) ((helm (1 5 9)) (company (0 6 13))) "Helm interface for company-mode" single ((:commit . "6eb5c2d730a60e394e005b47c1db018697094dde") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Daniel Ralston" . "Sodel-the-Vociferous@users.noreply.github.com") (:url . "https://github.com/Sodel-the-Vociferous/helm-company"))]) + (helm-core . [(20210606 1857) ((emacs (25 1)) (async (1 9 4))) "Development files for Helm" tar ((:commit . "a92156303021e0ec91a904e16a994d8e1ccd78f7"))]) + (helm-cscope . [(20190615 41) ((xcscope (1 0)) (helm (1 6 7)) (cl-lib (0 5)) (emacs (24 1))) "Helm interface for xcscope.el." single ((:commit . "af1d9e7f4460a88d7400b5a74d5da68084089ac1") (:authors ("alpha22jp" . "alpha22jp@gmail.com")) (:maintainer "alpha22jp" . "alpha22jp@gmail.com") (:keywords "cscope" "helm") (:url . "https://github.com/alpha22jp/helm-cscope.el"))]) + (helm-css-scss . [(20191230 1549) ((emacs (24 3)) (helm (1 0))) "CSS/SCSS/LESS Selectors with helm interface" single ((:commit . "48b996f73af1fef8d6e88a1c545d98f8c50b0cf3") (:authors ("Shingo Fukuyama - http://fukuyama.co")) (:maintainer "Shingo Fukuyama - http://fukuyama.co") (:keywords "convenience" "scss" "css" "less" "selector" "helm") (:url . "https://github.com/ShingoFukuyama/helm-css-scss"))]) + (helm-ctest . [(20191031 1435) ((s (1 9 0)) (dash (2 11 0)) (helm-core (1 7 4))) "Run ctest from within emacs" single ((:commit . "2a29cfb4ec583da247fa2ae7bac88790b1223e40") (:authors ("Dan LaManna" . "me@danlamanna.com")) (:maintainer "Dan LaManna" . "me@danlamanna.com") (:keywords "helm" "ctest"))]) + (helm-dash . [(20190527 1118) ((emacs (24 4)) (dash-docs (1 4 0)) (helm (1 9 2)) (cl-lib (0 5))) "Offline documentation browser for +150 APIs using Dash docsets." single ((:commit . "7f853bd34da666f0e9a883011c80f451b06f6c59") (:authors ("Raimon Grau" . "raimonster@gmail.com") ("Toni Reina " . "areina0@gmail.com") ("Bryan Gilbert" . "bryan@bryan.sh")) (:maintainer "Raimon Grau" . "raimonster@gmail.com") (:keywords "docs") (:url . "https://github.com/dash-docs-el/helm-dash"))]) + (helm-descbinds . [(20190501 935) ((helm (1 5))) "A convenient `describe-bindings' with `helm'" single ((:commit . "b72515982396b6e336ad7beb6767e95a80fca192") (:authors ("Taiki SUGAWARA" . "buzz.taiki@gmail.com")) (:maintainer "Taiki SUGAWARA" . "buzz.taiki@gmail.com") (:keywords "helm" "help") (:url . "https://github.com/emacs-helm/helm-descbinds"))]) + (helm-describe-modes . [(20160212 518) ((helm (1 9)) (cl-lib (0 5)) (emacs (24 1))) "Helm interface to major and minor modes." single ((:commit . "11fb36af119b784539d31c6160002de1957408aa") (:authors ("Tianxiang Xiong" . "tianxiang.xiong@gmail.com")) (:maintainer "Tianxiang Xiong" . "tianxiang.xiong@gmail.com") (:keywords "docs" "convenience") (:url . "https://github.com/emacs-helm/helm-describe-modes"))]) + (helm-dictionary . [(20201006 1511) ((helm (1 5 5))) "Helm source for looking up dictionaries" single ((:commit . "b316a1d55e58645d59a84d33851d46fab3cd54b5") (:authors ("Titus von der Malsburg" . "malsburg@posteo.de") ("Michael Heerdegen" . "michael_heerdegen@web.de")) (:maintainer "Titus von der Malsburg" . "malsburg@posteo.de") (:url . "https://github.com/emacs-helm/helm-dictionary"))]) + (helm-directory . [(20170706 402) ((emacs (24 4)) (helm (2 0))) "selecting directory before select the file" single ((:commit . "51bd7cd6e40a84a7efda894283ec76a0107830ad") (:authors ("Masashı Mıyaura")) (:maintainer "Masashı Mıyaura") (:url . "https://github.com/masasam/emacs-helm-directory"))]) + (helm-dired-history . [(20170524 1046) ((helm (1 9 8)) (cl-lib (0 5))) "Show dired history with helm.el support." single ((:commit . "281523f9fc46cf00fafd670ba5cd16552a607212") (:authors ("Joseph(纪秀峰)" . "jixiuf@gmail.com")) (:maintainer "Joseph(纪秀峰)" . "jixiuf@gmail.com") (:keywords "helm" "dired history") (:url . "https://github.com/jixiuf/helm-dired-history"))]) + (helm-dired-recent-dirs . [(20131228 1414) ((helm (1 0))) "Show recent dirs with helm.el support." single ((:commit . "3bcd125b44f5a707588ae3868777d91192351523") (:authors ("Akisute" . "akisute3@gmail.com")) (:maintainer "Akisute" . "akisute3@gmail.com") (:keywords "helm" "dired" "zsh"))]) + (helm-dirset . [(20151209 12) ((f (0 16 2)) (helm (1 6 1)) (s (1 9 0)) (cl-lib (0 5))) "helm sources for multi directories" single ((:commit . "eb30810cd26e1ee73d84a863e6b2667700e9aead") (:authors ("k1LoW (Kenichirou Oyama), <k1lowxb [at] gmail [dot] com> <k1low [at] 101000lab [dot] org>")) (:maintainer "k1LoW (Kenichirou Oyama), <k1lowxb [at] gmail [dot] com> <k1low [at] 101000lab [dot] org>") (:keywords "files" "directories") (:url . "http://101000lab.org"))]) + (helm-emmet . [(20160713 1231) ((helm (1 0)) (emmet-mode (1 0 2))) "helm sources for emmet-mode's snippets" single ((:commit . "f0364e736b10cf44232053a78de04133a88185ae") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com") (:keywords "convenience" "helm" "emmet") (:url . "https://github.com/yasuyk/helm-emmet"))]) + (helm-emms . [(20201205 1635) ((helm (1 5)) (emms (6 0)) (cl-lib (0 5)) (emacs (24 1))) "Emms for Helm." single ((:commit . "43d387504a292b36e4e4246abdc9090c1717a561") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:keywords "multimedia" "emms") (:url . "https://github.com/emacs-helm/helm-emms"))]) + (helm-esa . [(20190721 1429) ((emacs (26 2)) (helm (3 2)) (request (0 3 0))) "Esa with helm interface" single ((:commit . "d93b4af404346870cb2cf9c257d055332ef3f577") (:authors ("Takashi Masuda" . "masutaka.net@gmail.com")) (:maintainer "Takashi Masuda" . "masutaka.net@gmail.com") (:url . "https://github.com/masutaka/emacs-helm-esa"))]) + (helm-etags-plus . [(20201003 1424) ((helm (1 7 8))) "Another Etags helm.el interface" single ((:commit . "52598fe69636add4b62cd9873041de5c6db9b7ac") (:authors ("纪秀峰(Joseph)" . "jixiuf@gmail.com")) (:maintainer "纪秀峰(Joseph)" . "jixiuf@gmail.com") (:keywords "helm" "etags") (:url . "https://github.com/jixiuf/helm-etags-plus"))]) + (helm-evil-markers . [(20200506 715) ((emacs (25 1)) (helm (2 0 0)) (evil (1 2 10))) "Show evil markers with helm" single ((:commit . "0245f0c268e0eaec85df51ab2deba7ac961f6770") (:authors ("Bill Xue")) (:maintainer "Bill Xue") (:keywords "extensions") (:url . "https://github.com/xueeinstein/helm-evil-markers"))]) + (helm-eww . [(20190315 907) ((emacs (24 4)) (helm (2 8 6)) (seq (1 8))) "Helm UI wrapper for EWW." single ((:commit . "76ba59fda8dd6f32a1bc7c6df0b43c6f76169911") (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") (:keywords "helm" "packages") (:url . "https://github.com/emacs-helm/helm-eww"))]) + (helm-ext . [(20200722 107) ((emacs (24 4)) (helm (2 5 3))) "A few extensions to Helm" tar ((:commit . "c30f7772ec577a5ce1de3215f0507826e0725a69") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions"))]) + (helm-exwm . [(20210215 858) ((emacs (25 2)) (helm (2 8 5)) (exwm (0 15))) "Helm for EXWM buffers" single ((:commit . "5b35a42ff10fbcbf673268987df700ea6b6288e8") (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") (:keywords "helm" "exwm") (:url . "https://github.com/emacs-helm/helm-exwm"))]) + (helm-file-preview . [(20200927 528) ((emacs (25 1)) (helm (2 0))) "Preview the current helm file selection" single ((:commit . "59adbf2d3c67b174a354f0dd64f647b4391ab8d0") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/helm-file-preview"))]) + (helm-filesets . [(20140929 1835) ((helm (1 6 3)) (filesets+ (0))) "A helm source for emacs filesets" single ((:commit . "b352910af4c3099267a8aa0169c7f743b35bb1fa") (:authors ("Graham Clark" . "grclark@gmail.com")) (:maintainer "Graham Clark" . "grclark@gmail.com") (:keywords "filesets") (:url . "https://github.com/gcla/helm-filesets"))]) + (helm-firefox . [(20210331 1900) ((helm (1 5)) (cl-lib (0 5)) (emacs (24 1))) "Firefox bookmarks" single ((:commit . "58a7ff023c76857ca9cd82075c8743446a50c055") (:url . "https://github.com/emacs-helm/helm-firefox"))]) + (helm-fish-completion . [(20200908 1504) ((emacs (25)) (helm (3)) (fish-completion (1 2))) "Helm interface for fish completion" single ((:commit . "2a2001b3a876da3c468ffec8935572509c485aac") (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") (:url . "https://github.com/emacs-helm/helm-fish-completion"))]) + (helm-flx . [(20180103 516) ((emacs (24 4)) (helm (1 7 9)) (flx (0 5))) "Sort helm candidates by flx score" single ((:commit . "6640fac5cb16bee73c95b8ed1248a4e5e113690e") (:authors ("PythonNut" . "pythonnut@pythonnut.com")) (:maintainer "PythonNut" . "pythonnut@pythonnut.com") (:keywords "convenience" "helm" "fuzzy" "flx") (:url . "https://github.com/PythonNut/helm-flx"))]) + (helm-flycheck . [(20160710 829) ((dash (2 12 1)) (flycheck (28)) (helm-core (1 9 8))) "Show flycheck errors with helm" single ((:commit . "3cf7d3bb194acacc6395f88360588013d92675d6") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com") (:keywords "helm" "flycheck") (:url . "https://github.com/yasuyk/helm-flycheck"))]) + (helm-flymake . [(20160610 2) ((helm (1 0))) "helm interface for flymake" single ((:commit . "72cf18a1a1f843db9bb5d58301739ea9ccb1655b") (:authors ("Akira Tamamori" . "tamamori5917@gmail.com")) (:maintainer "Akira Tamamori" . "tamamori5917@gmail.com") (:url . "https://github.com/tam17aki"))]) + (helm-flyspell . [(20170210 1901) ((helm (1 6 5))) "Helm extension for correcting words with flyspell" single ((:commit . "8d4d947c687cb650cb149aa2271ad5201ea92594") (:authors ("Andrzej Pronobis")) (:maintainer "Andrzej Pronobis") (:keywords "convenience") (:url . "https://github.com/pronobis/helm-flyspell"))]) + (helm-frame . [(20180604 1005) ((emacs (24 4))) "open helm buffers in a dedicated frame" single ((:commit . "485e2a534b0de5e8dbeb144a9a60ceca00215a4a") (:authors ("chee" . "chee@snake.dog")) (:maintainer "chee" . "chee@snake.dog") (:keywords "lisp" "helm" "popup" "frame"))]) + (helm-fuz . [(20200812 1222) ((emacs (25 1)) (fuz (1 4 0)) (helm (3 6))) "Integrate Helm and Fuz" single ((:commit . "fee874aa35d2ee6b12b836290b5c8eaa44175a28") (:authors ("Zhu Zihao" . "all_but_last@163.com")) (:maintainer "Zhu Zihao" . "all_but_last@163.com") (:keywords "convenience") (:url . "https://github.com/cireu/fuz.el"))]) + (helm-fuzzier . [(20160605 2145) ((emacs (24 3)) (helm (1 7 0))) "Better fuzzy matching for Helm" single ((:commit . "8798dcf3583b863df5b9dea7fe3b0179ba1c35bc") (:authors ("Ephram Perdition")) (:maintainer "Ephram Perdition") (:keywords "convenience" "helm" "fuzzy") (:url . "http://github.com/EphramPerdition/helm-fuzzier"))]) + (helm-fuzzy . [(20200927 532) ((emacs (24 4)) (helm (1 7 9)) (flx (0 5))) "Fuzzy matching for helm source" single ((:commit . "72d618f95d6531854a60322d88b242825016f8e6") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/helm-fuzzy"))]) + (helm-fuzzy-find . [(20171106 400) ((emacs (24 1)) (helm (1 7 0))) "Find file using Fuzzy Search" single ((:commit . "de2abbf7ca13609587325bacd4a1ed4376b5c927") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:keywords "helm" "fuzzy" "find" "file") (:url . "https://github.com/xuchunyang/helm-fuzzy-find"))]) + (helm-ghq . [(20190526 1409) ((emacs (24)) (helm (2 2 0))) "Ghq with helm interface" single ((:commit . "d0d6aa0f407388e7012f0443df8ae657ece01779") (:authors ("Takashi Masuda" . "masutaka.net@gmail.com")) (:maintainer "Takashi Masuda" . "masutaka.net@gmail.com") (:url . "https://github.com/masutaka/emacs-helm-ghq"))]) + (helm-ghs . [(20170715 541) ((emacs (24)) (helm (2 2 0))) "ghs with helm interface" single ((:commit . "17a70bf16255d90d67c8350e88200ec8bfd47563") (:authors ("iory" . "ab.ioryz@gmail.com")) (:maintainer "iory" . "ab.ioryz@gmail.com") (:url . "https://github.com/iory/emacs-helm-ghs"))]) + (helm-git . [(20120630 2103) nil "Helm extension for Git." single ((:commit . "cb96a52b5aecadd3c27aba7749d14e43ab128d55") (:authors ("Marian Schubert" . "marian.schubert@gmail.com")) (:maintainer "Marian Schubert" . "marian.schubert@gmail.com") (:keywords "helm" "git") (:url . "https://github.com/maio/helm-git"))]) + (helm-git-files . [(20141212 1317) ((helm (1 5 9))) "helm for git files" single ((:commit . "43193960774069369ac6964bbf7c026900206fa8") (:authors ("INA Lintaro <tarao.gnn at gmail.com>") ("TAKAGI Kentaro <kentaro0910_at_gmail.com>")) (:maintainer "INA Lintaro <tarao.gnn at gmail.com>") (:keywords "helm" "git"))]) + (helm-git-grep . [(20170614 1411) ((helm-core (2 2 0))) "helm for git grep, an incremental git-grep(1)" single ((:commit . "744cea07dba6e6a5effbdba83f1b786c78fd86d3") (:authors ("mechairoi")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com") (:url . "https://github.com/yasuyk/helm-git-grep"))]) + (helm-github-stars . [(20190428 1047) ((helm (1 6 8)) (emacs (24 4))) "Helm interface for your github's stars" single ((:commit . "c891690218b0d8b957ea6cb45b1b6cffd15a6950") (:authors ("Sliim" . "sliim@mailoo.org") ("xuchunyang" . "xuchunyang56@gmail.com")) (:maintainer "Sliim" . "sliim@mailoo.org") (:keywords "helm" "github" "stars") (:url . "https://github.com/Sliim/helm-github-stars"))]) + (helm-gitignore . [(20170211 8) ((gitignore-mode (1 1 0)) (helm (1 7 0)) (request (0 1 0)) (cl-lib (0 5))) "Generate .gitignore files with gitignore.io." single ((:commit . "2a2e7da7855a6db0ab3bb6a6a087863d7abd4391") (:authors ("Juan Placencia")) (:maintainer "Juan Placencia") (:keywords "helm" "gitignore" "gitignore.io") (:url . "https://github.com/jupl/helm-gitignore"))]) + (helm-gitlab . [(20180312 1647) ((s (1 9 0)) (dash (2 9 0)) (helm (1 0)) (gitlab (0 8 0))) "Helm interface to Gitlab" single ((:commit . "8c2324c02119500f094c2f92dfaba4c9977ce1ba") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "gitlab" "helm") (:url . "https://github.com/nlamirault/emacs-gitlab"))]) + (helm-go-package . [(20161103 153) ((emacs (24 4)) (helm-core (2 2 1)) (go-mode (1 4 0)) (deferred (0 4 0))) "helm sources for Go programming language's package" single ((:commit . "e42c563936c205ceedb930a687c11b4bb56447bc") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com") (:url . "https://github.com/yasuyk/helm-go-package"))]) + (helm-google . [(20210527 900) ((helm (0))) "Emacs Helm Interface for quick Google searches" single ((:commit . "27834161391c350ef790062391cb7eab1d59fb62") (:authors ("steckerhalter")) (:maintainer "steckerhalter") (:keywords "helm" "google" "search" "browse" "searx") (:url . "https://framagit.org/steckerhalter/helm-google"))]) + (helm-grepint . [(20200811 1616) ((helm (2 9 7)) (emacs (24 4))) "Generic helm interface to grep" single ((:commit . "9aec98428823b749eb14d2c8512b46b59ca9f8ca") (:authors ("Kalle Kankare" . "kalle.kankare@iki.fi")) (:maintainer "Kalle Kankare" . "kalle.kankare@iki.fi") (:keywords "grep" "grepping" "searching" "helm" "tools" "convenience") (:url . "https://github.com/kopoli/helm-grepint"))]) + (helm-growthforecast . [(20140120 344) ((helm (1 5 9))) "helm extensions for growthforecast." single ((:commit . "0f94ac090d6c354058ad89a86e5c18385c136d9b") (:authors ("Daichi Hirata" . "daichi.hirat@gmail.com")) (:maintainer "Daichi Hirata" . "daichi.hirat@gmail.com") (:url . "https://github.com/daic-h/helm-growthforecast"))]) + (helm-gtags . [(20200602 1610) ((emacs (24 4)) (helm (2 0))) "GNU GLOBAL helm interface" single ((:commit . "a15fe1dd272d252ad933d8129db1dce02fd41adb") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-helm-gtags"))]) + (helm-hatena-bookmark . [(20190609 1455) ((emacs (24)) (helm (2 8 2))) "Hatena::Bookmark with helm interface" single ((:commit . "10b8bfbd7fc4c3f503b2bc01f0c062dac128059e") (:authors ("Takashi Masuda" . "masutaka.net@gmail.com")) (:maintainer "Takashi Masuda" . "masutaka.net@gmail.com") (:url . "https://github.com/masutaka/emacs-helm-hatena-bookmark"))]) + (helm-hayoo . [(20151014 651) ((helm (1 6 0)) (json (1 2)) (haskell-mode (13 7))) "Source and configured helm for searching hayoo" single ((:commit . "dd4c0c8c87521026edf1b808c4de01fa19b7c693") (:authors ("Markus Hauck" . "markus1189@gmail.com")) (:maintainer "Markus Hauck" . "markus1189@gmail.com") (:keywords "helm"))]) + (helm-helm-commands . [(20130902 1748) ((helm (1 5 4))) "List all helm commands with helm" single ((:commit . "3a05aa19c976501343ad9ae630a36810921a85f6") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:keywords "convenience") (:url . "https://github.com/vapniks/helm-helm-commands"))]) + (helm-hoogle . [(20161027 534) ((helm (1 6 2)) (emacs (24 4))) "Use helm to navigate query results from Hoogle" single ((:commit . "73969a9d46d2121a849a01a9f7ed3636d01f7bbc") (:authors ("John Wiegley" . "jwiegley@gmail.com")) (:maintainer "John Wiegley" . "jwiegley@gmail.com") (:keywords "haskell" "programming" "hoogle") (:url . "https://github.com/jwiegley/haskell-config"))]) + (helm-hunks . [(20171217 1933) ((emacs (24 4)) (helm (1 9 8))) "A helm interface for git hunks - browsing, staging, unstaging and killing" single ((:commit . "6392bf716f618eac23ce81140aceb0dfacb9c6d0") (:authors ("@torgeir")) (:maintainer "@torgeir") (:keywords "helm" "git" "hunks" "vc"))]) + (helm-icons . [(20210330 1216) ((emacs (25 1)) (dash (2 14 1)) (f (0 20 0)) (treemacs (2 7))) "Helm icons" single ((:commit . "8d2f5e705c8b78a390677cf242024739c932fc95") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainer "Ivan Yonchovski" . "yyoncho@gmail.com") (:keywords "convenience") (:url . "https://github.com/yyoncho/helm-icons"))]) + (helm-idris . [(20141202 1757) ((helm (0 0 0)) (idris-mode (0 9 14))) "A Helm datasource for Idris documentation, queried from the compiler" single ((:commit . "a2f45d6817974f318b55ad9b7fd19d5df132d47e") (:authors ("David Raymond Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Raymond Christiansen" . "david@davidchristiansen.dk") (:keywords "languages" "helm"))]) + (helm-img . [(20151224 2321) ((helm (1 7 7)) (cl-lib (0 5))) "Utilities for making image sources for helm." tar ((:commit . "aa3f8a5dce8d0413bf07584f07153a39015c2bfc") (:authors ("Sho Matsumoto <l3msh0_at_gmail.com>")) (:maintainer "l3msh0") (:keywords "convenience") (:url . "https://github.com/l3msh0/helm-img"))]) + (helm-img-tiqav . [(20151224 2322) ((helm-img (0 0 1))) "An helm-source for joking." single ((:commit . "33a7e9508bc8f37d53320b56c92b53d321a57bb0") (:authors ("Sho Matsumoto <l3msh0_at_gmail.com>")) (:maintainer "l3msh0") (:keywords "convenience") (:url . "https://github.com/l3msh0/helm-img"))]) + (helm-ispell . [(20151231 853) ((helm-core (1 7 7))) "ispell-complete-word with helm interface" single ((:commit . "cb735695ab3a0e66c123c2f3f3e8911fb1c2d5fc") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-helm-ispell"))]) + (helm-itunes . [(20151013 648) ((helm (1 6 1))) "Play local iTunes and Spotify tracks" single ((:commit . "966de755a5aadbe02311a6cef77bd4790e84c263") (:authors ("Adam Schwartz" . "adam@adamschwartz.io")) (:maintainer "Adam Schwartz" . "adam@adamschwartz.io") (:url . "https://github.com/daschwa/helm-itunes"))]) + (helm-j-cheatsheet . [(20170217 829) ((helm (1 5 3))) "Quick J reference for Emacs" single ((:commit . "6c47e7162b9ba2de4b41221d01180146973d860b") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/helm-j-cheatsheet"))]) + (helm-jira . [(20180802 815) ((emacs (25)) (cl-lib (0 5)) (helm (1 9 9))) "Helm bindings for JIRA/Bitbucket/stash" single ((:commit . "75d6ed5bd7a041fa8c1adb21cbbbe57b5a7c7cc7") (:authors ("Roman Decker <roman dot decker at gmail dot com>")) (:maintainer "Roman Decker <roman dot decker at gmail dot com>") (:keywords "tools" "helm" "jira" "bitbucket" "stash") (:url . "https://github.com/DeX3/helm-jira"))]) + (helm-js-codemod . [(20190921 942) ((emacs (24 4)) (helm-core (1 9 8)) (js-codemod (1 0 0))) "A helm interface for running js-codemods" single ((:commit . "29b1b3c441f0d7e450a3c65b5ff9e72023dc6314") (:authors (nil . "Torgeir Thoresen <@torgeir>")) (:maintainer nil . "Torgeir Thoresen <@torgeir>") (:keywords "helm" "js" "codemod" "region"))]) + (helm-jstack . [(20150603 422) ((emacs (24)) (helm (1 7 0)) (cl-lib (0 5))) "Helm interface to Jps & Jstack for Java/JVM processes" single ((:commit . "2064f7215dcf4ccbd6a7b8784223251507746da4") (:authors ("Raghav Kumar Gautam" . "rgautam@apache.com")) (:maintainer "Raghav Kumar Gautam" . "rgautam@apache.com") (:keywords "java" "jps" "jstack" "jvm" "emacs" "elisp" "helm"))]) + (helm-kythe . [(20170709 726) ((emacs (25)) (dash (2 12 0)) (helm (2 0))) "Google Kythe helm interface" single ((:commit . "eabbef4948f8ec7c7b2fac498e9145dfdb10ca82") (:authors ("Fangrui Song" . "i@maskray.me")) (:maintainer "Fangrui Song" . "i@maskray.me") (:url . "https://github.com/MaskRay/emacs-helm-kythe"))]) + (helm-lastpass . [(20180722 806) ((emacs (25 1)) (helm (2 0)) (csv (2 1))) "Helm interface of LastPass" single ((:commit . "82e1ffb6ae77d9d9e29c398eb013cd20ce963f77") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:url . "https://github.com/xuchunyang/helm-lastpass"))]) + (helm-lean . [(20210305 1705) ((emacs (24 3)) (dash (2 18 0)) (helm (2 8 0)) (lean-mode (3 3 0))) "Helm interfaces for lean-mode" single ((:commit . "bf32bb97930ed67c5cbe0fe3d4a69dedcf68be44") (:authors ("Leonardo de Moura" . "leonardo@microsoft.com") ("Soonho Kong " . "soonhok@cs.cmu.edu") ("Gabriel Ebner " . "gebner@gebner.org") ("Sebastian Ullrich" . "sebasti@nullri.ch")) (:maintainer "Sebastian Ullrich" . "sebasti@nullri.ch") (:keywords "languages") (:url . "https://github.com/leanprover/lean-mode"))]) + (helm-lib-babel . [(20180510 1324) ((cl-lib (0 5)) (helm (1 9 2)) (emacs (24 4))) "helm insertion of babel function references" single ((:commit . "41bc0cdea8a604c6c8dc83ed5066644d33688fad") (:authors ("Derek Feichtinger" . "dfeich@gmail.com")) (:maintainer "Derek Feichtinger" . "dfeich@gmail.com") (:keywords "convenience") (:url . "https://github.com/dfeich/helm-lib-babel.el"))]) + (helm-lines . [(20180601 2033) ((emacs (24 4)) (helm (1 9 8))) "A helm interface for completing by lines" single ((:commit . "3bfe15a60c6405682085ab289de3eb364624c4e9") (:authors ("@torgeir")) (:maintainer "@torgeir") (:keywords "files" "helm" "ag" "pt" "vc" "git" "lines" "complete" "tools" "languages") (:url . "https://github.com/torgeir/helm-lines.el/"))]) + (helm-lobsters . [(20150213 1546) ((helm (1 0)) (cl-lib (0 5))) "helm front-end for lobste.rs" single ((:commit . "53c5b42baf72776dcba891fc3d7cd7d47721e9b0") (:authors ("Julien BLANCHARD" . "julien@sideburns.eu")) (:maintainer "Julien BLANCHARD" . "julien@sideburns.eu") (:url . "https://github.com/julienXX/helm-lobste.rs"))]) + (helm-ls-git . [(20210324 1515) ((helm (1 7 8))) "list git files." single ((:commit . "48696448e52d266f5b2cb5ee1390071dab4d16e8"))]) + (helm-ls-hg . [(20150909 543) ((helm (1 7 8))) "List hg files in hg project." single ((:commit . "61b91a22fcfb62d0fc56e361ec01ce96973c7165"))]) + (helm-ls-svn . [(20190316 2203) ((emacs (24 1)) (helm (1 7 0)) (cl-lib (0 5))) "helm extension to list svn files" single ((:commit . "a6043e1187282f649e2cb9f0e722a42daf41294b") (:authors ("Chunyang Xu" . "chunyang@macports.org")) (:maintainer "Chunyang Xu" . "chunyang@macports.org") (:keywords "helm" "svn") (:url . "https://svn.macports.org/repository/macports/users/chunyang/helm-ls-svn.el/helm-ls-svn.el"))]) + (helm-lsp . [(20210419 2014) ((emacs (25 1)) (dash (2 14 1)) (lsp-mode (5 0)) (helm (2 0))) "LSP helm integration" single ((:commit . "c2c6974dadfac459b1a69a1217441283874cea92") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainer "Ivan Yonchovski" . "yyoncho@gmail.com") (:keywords "languages" "debug") (:url . "https://github.com/yyoncho/helm-lsp"))]) + (helm-lxc . [(20200323 816) ((emacs (25)) (cl-lib (0 5)) (helm (2 9 4)) (lxc-tramp (0 2 0))) "Helm interface to manage LXC containers" single ((:commit . "37fe2d7ed97967edf59a3b68b1434910516ae24f") (:authors ("montag451")) (:maintainer "montag451") (:keywords "helm" "lxc" "convenience") (:url . "https://github.com/montag451/helm-lxc"))]) + (helm-make . [(20200620 27) nil "Select a Makefile target with helm" single ((:commit . "ebd71e85046d59b37f6a96535e01993b6962c559") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "makefile") (:url . "https://github.com/abo-abo/helm-make"))]) + (helm-migemo . [(20151010 356) ((emacs (24 4)) (helm-core (1 7 8)) (migemo (1 9)) (cl-lib (0 5))) "Migemo plug-in for helm" single ((:commit . "66c6a19d07c6a385daefd2090d0709d26b608b4e") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "Yuhei Maeda <yuhei.maeda_at_gmail.com>") (:keywords "matching" "convenience" "tools" "i18n") (:url . "https://github.com/emacs-jp/helm-migemo"))]) + (helm-mode-manager . [(20210108 2330) ((helm (1 5 3))) "Select and toggle major and minor modes with helm" single ((:commit . "7df8ed3ddd46a0402838b748d317c01454346164") (:authors ("istib")) (:maintainer "istib") (:url . "https://github.com/istib/helm-mode-manager"))]) + (helm-mt . [(20160918 452) ((emacs (24)) (helm (0 0)) (multi-term (0 0)) (cl-lib (0 5))) "helm multi-term management" single ((:commit . "d2bff4100118483bc398c56d0ff095294209265b") (:authors ("Didier Deshommes" . "dfdeshom@gmail.com")) (:maintainer "Didier Deshommes" . "dfdeshom@gmail.com") (:keywords "helm" "multi-term") (:url . "https://github.com/dfdeshom/helm-mt"))]) + (helm-mu . [(20210104 1214) ((helm (1 5 5))) "Helm sources for searching emails and contacts" single ((:commit . "392a8c11ab27b625d9f863cdde14e09893401b15") (:authors ("Titus von der Malsburg" . "malsburg@posteo.de")) (:maintainer "Titus von der Malsburg" . "malsburg@posteo.de") (:url . "https://github.com/emacs-helm/helm-mu"))]) + (helm-navi . [(20201220 1823) ((emacs (24 4)) (helm (1 9 4)) (helm-org (1 0)) (navi-mode (2 0)) (s (1 10 0))) "Helm for navi-mode" single ((:commit . "c5666cc171288d1fa892900ee66fba2a1c892c81") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "navigation" "outlines") (:url . "http://github.com/emacs-helm/helm-navi"))]) + (helm-nixos-options . [(20151013 2309) ((nixos-options (0 0 1)) (helm (1 5 6))) "Helm Interface for nixos-options" single ((:commit . "053a2d5110ce05b7f99bcc2ac4804b70cbe87916") (:authors ("Diego Berrocal" . "cestdiego@gmail.com") ("Travis B. Hartwell" . "nafai@travishartwell.net")) (:maintainer "Diego Berrocal" . "cestdiego@gmail.com") (:keywords "unix") (:url . "http://www.github.com/travisbhartwell/nix-emacs/"))]) + (helm-notmuch . [(20190320 1048) ((helm (1 9 3)) (notmuch (0 21))) "Search emails with Notmuch and Helm" single ((:commit . "97a01497e079a7b6505987e9feba6b603bbec288") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:keywords "mail") (:url . "https://github.com/emacs-helm/helm-notmuch"))]) + (helm-open-github . [(20170220 159) ((emacs (24 4)) (helm-core (1 7 7)) (gh (0 8 2))) "Utilities of Opening Github Page" single ((:commit . "2f03d97552a1233db7694116d5f80ecde7612756") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-helm-open-github"))]) + (helm-org . [(20210324 1927) ((helm (3 3)) (emacs (24 4))) "Helm for org headlines and keywords completion" single ((:commit . "d67186d3a64e610c03a5f3d583488f018fb032e4") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://github.com/emacs-helm/helm-org"))]) + (helm-org-multi-wiki . [(20210228 1853) ((emacs (26 1)) (org (9 3)) (org-multi-wiki (0 4)) (org-ql (0 5)) (dash (2 18)) (helm-org-ql (0 5)) (helm (3 5))) "Helm interface to org-multi-wiki" single ((:commit . "bf8039aadddaf02569fab473f766071ef7e63563") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:keywords "org" "outlines") (:url . "https://github.com/akirak/org-multi-wiki"))]) + (helm-org-ql . [(20210608 1556) ((emacs (26 1)) (dash (2 18 1)) (s (1 12 0)) (helm-org (1 0)) (org-ql (0 6 -1))) "Helm support for org-ql" single ((:commit . "3c7a93d71f7c480d37cfc9f34cc7675e24a97932") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:url . "https://github.com/alphapapa/org-ql"))]) + (helm-org-recent-headings . [(20201213 837) ((emacs (26 1)) (org (9 0 5)) (dash (2 13 0)) (helm (1 9 4)) (org-recent-headings (0 2 -1)) (s (1 12 0))) "Helm source for org-recent-headings" single ((:commit . "5da516a1586675992c0122ed32978c18dda06318") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "hypermedia" "outlines" "org") (:url . "http://github.com/alphapapa/org-recent-headings"))]) + (helm-org-rifle . [(20200512 1943) ((emacs (24 4)) (dash (2 12)) (f (0 18 1)) (helm (1 9 4)) (s (1 10 0))) "Rifle through your Org files" single ((:commit . "5e13a0e59606b40088927870dab116a8eab8e66c") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "hypermedia" "outlines") (:url . "http://github.com/alphapapa/helm-org-rifle"))]) + (helm-orgcard . [(20151001 1524) ((helm-core (1 7 7))) "browse the orgcard by helm" single ((:commit . "9655ac340d1ccc5f3d1c0f7c49be8dd3556d4d0d") (:authors ("Yuhei Maeda <yuhei.maeda_at_gmail.com>")) (:maintainer "Yuhei Maeda") (:keywords "convenience" "helm" "org") (:url . "https://github.com/emacs-jp/helm-orgcard"))]) + (helm-osx-app . [(20190717 958) ((emacs (25 1)) (helm-core (3 0))) "Launch macOS apps with helm" single ((:commit . "634ed5d721a20af265825a018e9df3ee6640daee") (:authors ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:url . "https://github.com/xuchunyang/helm-osx-app"))]) + (helm-pages . [(20161121 226) ((helm (1 6 5)) (emacs (24)) (cl-lib (0 5))) "Pages in current buffer as Helm datasource" single ((:commit . "51dcb9374d1df9feaae85e60cfb39b970554ecba") (:authors ("David Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Christiansen" . "david@davidchristiansen.dk") (:keywords "convenience" "helm" "outlines"))]) + (helm-pass . [(20210221 1655) ((emacs (25)) (helm (0)) (password-store (0)) (auth-source-pass (4 0 0))) "helm interface of pass, the standard Unix password manager" single ((:commit . "4ce46f1801f2e76e53482c65aa0619d427a3fbf9") (:authors ("J. Alexander Branham" . "branham@utexas.edu")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") (:url . "https://github.com/emacs-helm/helm-pass"))]) + (helm-perldoc . [(20200315 1716) ((helm-core (2 0)) (deferred (0 3 1)) (emacs (24 4))) "perldoc with helm interface" tar ((:commit . "6f3526f07f3df3059dbde779f8e681f5f1fee6ea") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-helm-perldoc"))]) + (helm-perspeen . [(20170228 1345) ((perspeen (0 1 0)) (helm (2 5 0))) "Helm interface for perspeen." single ((:commit . "7fe2922d85608bfa9e18269fc44181428b8849ff") (:authors ("Yoshinobu Fujimoto")) (:maintainer "Yoshinobu Fujimoto") (:keywords "projects" "lisp") (:url . "https://github.com/jimo1001/helm-perspeen"))]) + (helm-phpunit . [(20160513 853) ((helm (1 9 5)) (phpunit (0 7 0))) "Helm integration for phpunit.el" single ((:commit . "739f26204ad2ba76c25f45e8eab1e5216f7c3518") (:authors ("Eric Hansen" . "hansen.c.eric@gmail.com")) (:maintainer "Eric Hansen" . "hansen.c.eric@gmail.com") (:keywords "phpunit" "helm" "php") (:url . "https://github.com/eric-hansen/phpunit-helm"))]) + (helm-posframe . [(20210412 1147) ((emacs (26 0)) (posframe (1 0 0)) (helm (0 1))) "Using posframe to show helm window" single ((:commit . "2412e5b3c584c7683982a7e9cfa10a67427f2567") (:authors ("Feng Shu")) (:maintainer "Feng Shu" . "tumashu@163.com") (:keywords "abbrev" "convenience" "matching" "helm") (:url . "https://github.com/tumashu/helm-posframe"))]) + (helm-proc . [(20161006 305) ((helm (1 6 0))) "Helm interface for managing system processes" tar ((:commit . "576d31c2d74ba3897d56e2acd2b0993f52c2547c") (:authors ("Markus Hauck" . "markus1189@gmail.com")) (:maintainer "Markus Hauck" . "markus1189@gmail.com") (:keywords "helm"))]) + (helm-project-persist . [(20151210 1543) ((helm (1 5 2)) (project-persist (0 1 4))) "Helm integration for project-persist package" single ((:commit . "357950fbac18090985a750e40d5d8b10ee9dcd53") (:authors ("Sliim" . "sliim@mailoo.org")) (:maintainer "Sliim" . "sliim@mailoo.org") (:keywords "project-persist" "project" "helm"))]) + (helm-projectile . [(20201217 908) ((helm (1 9 9)) (projectile (2 2 0)) (cl-lib (0 3))) "Helm integration for Projectile" single ((:commit . "58123f14c392021714fc5d23b9f95c7f95ce07f1") (:authors ("Bozhidar Batsov")) (:maintainer "Bozhidar Batsov") (:keywords "project" "convenience") (:url . "https://github.com/bbatsov/helm-projectile"))]) + (helm-prosjekt . [(20140129 717) ((prosjekt (0 3)) (helm (1 5 9))) "Helm integration for prosjekt." single ((:commit . "a864a8be5842223043702395f311e3350c28e9db") (:authors ("Sohail Somani" . "sohail@taggedtype.net")) (:maintainer "Sohail Somani" . "sohail@taggedtype.net") (:url . "https://github.com/abingham/prosjekt"))]) + (helm-pt . [(20160214 2342) ((helm (1 5 6))) "Helm interface to the platinum searcher" tar ((:commit . "8acc52911dad1ed0c3975f134a468762afe0b76b") (:authors ("Rich Alesi")) (:maintainer "Rich Alesi") (:url . "https://github.com/ralesi/helm-pt"))]) + (helm-purpose . [(20170114 1636) ((emacs (24)) (helm (1 9 2)) (window-purpose (1 4))) "Helm Interface for Purpose" single ((:commit . "9ff4c21c1e9ebc7afb851b738f815df7343bb287") (:authors ("Bar Magal (2016)")) (:maintainer "Bar Magal (2016)") (:url . "https://github.com/bmag/helm-purpose"))]) + (helm-pydoc . [(20160918 542) ((helm-core (2 0)) (emacs (24 4))) "pydoc with helm interface" tar ((:commit . "85480a29b56dacde425655bc8f5a597c785afdf5") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-helm-pydoc"))]) + (helm-qiita . [(20190526 1359) ((emacs (24)) (helm (2 8 2))) "Qiita with helm interface" single ((:commit . "5f82010c595f8e122aa3f68148ba8d8ccb1333d8") (:authors ("Takashi Masuda" . "masutaka.net@gmail.com")) (:maintainer "Takashi Masuda" . "masutaka.net@gmail.com") (:url . "https://github.com/masutaka/emacs-helm-qiita"))]) + (helm-rage . [(20180118 1532) ((helm (1 9 8)) (emacs (24 4)) (dash (2 13 0)) (s (1 11 0))) "Helm command for rage characters." tar ((:commit . "5d0aefb53d859186181d4bdcfeff7d315339c7b8") (:keywords "helm" "rage" "meme") (:url . "https://github.com/bomgar/helm-rage"))]) + (helm-rails . [(20130424 1519) ((helm (1 5 1)) (inflections (1 1))) "Helm extension for Rails projects." single ((:commit . "506d9948d45dfbc575c9c4c0d102c1ad2f511e82") (:authors ("Adam Sokolnicki" . "adam.sokolnicki@gmail.com")) (:maintainer "Adam Sokolnicki" . "adam.sokolnicki@gmail.com") (:keywords "helm" "rails" "git") (:url . "https://github.com/asok/helm-rails"))]) + (helm-rb . [(20131123 1639) ((helm (1 0)) (helm-ag-r (20131123))) "Search Ruby's method by ag and display helm" tar ((:commit . "4949d646420a9849af234dacdd8eb34a77c662fd") (:authors ("Yuta Yamada <cokesboy\"at\"gmail.com>")) (:maintainer "Yuta Yamada <cokesboy\"at\"gmail.com>") (:keywords "searching" "ruby") (:url . "https://github.com/yuutayamada/helm-rb"))]) + (helm-rdefs . [(20161130 536) ((emacs (24)) (helm (1 6 4))) "rdefs with helm interface" single ((:commit . "cd3a6b3af3015ee58ef30cb7c81c79ebe5fc867b") (:authors ("Hiroshi Saito" . "monodie@gmail.com")) (:maintainer "Hiroshi Saito" . "monodie@gmail.com") (:keywords "matching" "tools") (:url . "https://github.com/saidie/helm-rdefs"))]) + (helm-recoll . [(20200805 1235) ((helm (3 3)) (emacs (24 4))) "helm interface for the recoll desktop search tool." single ((:commit . "c021a3b5e8c010bdad062cceb80fb49788f89e9f") (:authors ("Thierry Volpiatto <thierry.volpiatto at gmail.com>")) (:maintainer "Thierry Volpiatto <thierry.volpiatto at gmail.com>") (:keywords "convenience") (:url . "https://github.com/emacs-helm/helm-recoll"))]) + (helm-rg . [(20200721 725) ((emacs (25)) (cl-lib (0 5)) (dash (2 13 0)) (helm (2 8 8))) "a helm interface to ripgrep" single ((:commit . "ee0a3c09da0c843715344919400ab0a0190cc9dc") (:authors ("Danny McClanahan")) (:maintainer "Danny McClanahan") (:keywords "find" "file" "files" "helm" "fast" "rg" "ripgrep" "grep" "search" "match") (:url . "https://github.com/cosmicexplorer/helm-rg"))]) + (helm-rhythmbox . [(20160524 1158) ((helm (1 5 0)) (cl-lib (0 5))) "control Rhythmbox's play queue via Helm" single ((:commit . "c92e1ded34ddd4e62e7e9a558259c232e05193fa") (:authors ("Thomas Winant" . "dewinant@gmail.com")) (:maintainer "Thomas Winant" . "dewinant@gmail.com") (:url . "https://github.com/mrBliss/helm-rhythmbox"))]) + (helm-robe . [(20151209 355) ((helm (1 7 7))) "completing read function for robe" single ((:commit . "6e69543b4ee76c5f8f3f2510c76e6d9aed17a370") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-helm-robe"))]) + (helm-ros . [(20160812 1752) ((helm (1 9 9)) (xterm-color (1 0)) (cl-lib (0 5))) "Interfaces ROS with helm" single ((:commit . "92b0b215f6a017f0f57f1af15466cc0b2a5a0135") (:authors ("David Landry" . "davidlandry93@gmail.com")) (:maintainer "David Landry" . "davidlandry93@gmail.com") (:keywords "helm" "ros") (:url . "https://www.github.com/davidlandry93/helm-ros"))]) + (helm-rtags . [(20191222 920) ((helm (2 0)) (rtags (2 10))) "A front-end for rtags" single ((:commit . "63f18acb21e664fd92fbc19465f0b5df085b5e93") (:authors ("Jan Erik Hanssen" . "jhanssen@gmail.com") ("Anders Bakken" . "agbakken@gmail.com")) (:maintainer "Jan Erik Hanssen" . "jhanssen@gmail.com") (:url . "https://github.com/Andersbakken/rtags"))]) + (helm-rubygems-local . [(20130712 111) ((helm (1 5 3))) "Installed local rubygems find-file for helm" single ((:commit . "289cb33d41c703af9791d6da46b55f070013c2e3") (:authors ("hadashiA" . "dev@hadashikick.jp")) (:maintainer "hadashiA" . "dev@hadashikick.jp") (:url . "https://github.com/f-kubotar/helm-rubygems-local"))]) + (helm-rubygems-org . [(20140826 1156) ((emacs (24)) (helm (1 6 3)) (cl-lib (0 5))) "Use helm to search rubygems.org" single ((:commit . "6aaed984f698cbdf9f9aceb0221404563e28764d") (:authors ("Chad Albers" . "calbers@neomantic.com")) (:maintainer "Chad Albers" . "calbers@neomantic.com") (:keywords "ruby" "rubygems" "gemfile" "helm") (:url . "https://github.com/neomantic/helm-rubygems-org"))]) + (helm-safari . [(20160404 324) ((helm (1 9 1)) (emacs (24))) "Browse your Safari bookmarks and history" single ((:commit . "664c7f4488829228eed7e90cd53002e14bec555b") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:keywords "tools") (:url . "https://github.com/xuchunyang/helm-safari"))]) + (helm-sage . [(20160514 745) ((cl-lib (0 5)) (helm (1 5 6)) (sage-shell-mode (0 1 0))) "A helm extension for sage-shell-mode." single ((:commit . "f14e9281d8f2162df7d8f9c2ad9ad1248a24803b") (:authors ("Sho Takemori" . "stakemorii@gmail.com")) (:maintainer "Sho Takemori" . "stakemorii@gmail.com") (:keywords "sage" "math" "helm") (:url . "https://github.com/stakemori/helm-sage"))]) + (helm-searcher . [(20210221 923) ((emacs (25 1)) (helm (2 0)) (searcher (0 1 8)) (s (1 12 0)) (f (0 20 0))) "Helm interface to use searcher" single ((:commit . "181f60cb8505aec05393a9dbf414733d19f76d2a") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/emacs-helm/helm-searcher"))]) + (helm-selected . [(20171223 210) ((emacs (24 4)) (helm (2 8 6)) (selected (1 1))) "helm extension for selected.el" single ((:commit . "a9c769998bc56373d19f0ec9cbbbb4bd89a43c2d") (:authors ("Takaaki ISHIKAWA <takaxp at ieee dot org>")) (:maintainer "Takaaki ISHIKAWA <takaxp at ieee dot org>") (:keywords "extensions" "convenience") (:url . "https://github.com/takaxp/helm-selected"))]) + (helm-selector . [(20210125 857) ((emacs (26 1)) (helm (3))) "Helm buffer selector" tar ((:commit . "4da4711c4cfd14527abe20d66787beeb49171b26") (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") (:url . "https://github.com/emacs-helm/helm-selector"))]) + (helm-sheet . [(20130630 1239) ((helm (1 0))) "helm sources for sheet" single ((:commit . "d360b68d0ddb09aa1854e7b2f3cb39caeee26463") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com") (:keywords "helm" "sheet") (:url . "https://github.com/yasuyk/helm-sheet"))]) + (helm-shell-history . [(20210214 948) ((helm (3 7)) (emacs (24 3))) "Find shell history from helm" single ((:commit . "0c861f3db721e54053fc65f5651cf548cc1cb600") (:authors ("Yuta Yamada <cokesboy\"at\"gmail.com>")) (:maintainer "Yuta Yamada <cokesboy\"at\"gmail.com>") (:keywords "helm" "terminals" "shell") (:url . "https://github.com/yuutayamada/helm-shell-history"))]) + (helm-slime . [(20191016 1601) ((emacs (25)) (helm (3 2)) (slime (2 18)) (cl-lib (0 5))) "helm-sources and some utilities for SLIME." single ((:commit . "7886cc49906a87ebd73be3b71f5dd6b1433a9b7b") (:authors ("Takeshi Banse" . "takebi@laafc.net")) (:maintainer "Takeshi Banse" . "takebi@laafc.net") (:keywords "convenience" "helm" "slime") (:url . "https://github.com/emacs-helm/helm-slime"))]) + (helm-sly . [(20210205 1424) ((emacs (25 1)) (helm (3 2)) (cl-lib (0 5)) (sly (0 0))) "Helm sources and some utilities for SLY." single ((:commit . "3691626c80620e992a338c3222283d9149f1ecb5") (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") (:keywords "convenience" "helm" "sly" "lisp") (:url . "https://github.com/emacs-helm/helm-sly"))]) + (helm-smex . [(20171004 2008) ((emacs (24)) (smex (3 0)) (helm (1 7 7))) "Helm interface for smex" single ((:commit . "2269375dfa452b88b5170d1a5d5849ebb2c1e413") (:authors ("Peter Vasil" . "mail@petervasil.net")) (:maintainer "Peter Vasil" . "mail@petervasil.net") (:keywords "convenience"))]) + (helm-spaces . [(20161001 1409) ((helm-core (2 2)) (spaces (0 1 0))) "helm sources for spaces" single ((:commit . "877e2b5178926308d6a7c2a37477bb12c33a96d4") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com") (:keywords "helm" "frames" "convenience") (:url . "https://github.com/yasuyk/helm-spaces"))]) + (helm-spotify . [(20160905 2147) ((helm (0 0 0)) (multi (2 0 0))) "Control Spotify with Helm." single ((:commit . "f7a62d1ff88e3127de9be7cd3e818b0a92268ab3") (:authors ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainer "Kris Jenkins" . "krisajenkins@gmail.com") (:keywords "helm" "spotify") (:url . "https://github.com/krisajenkins/helm-spotify"))]) + (helm-spotify-plus . [(20190913 2236) ((emacs (24 4)) (helm (2 0 0)) (multi (2 0 1))) "Control Spotify search and select music with Helm." single ((:commit . "c3922ec368250965e483876cde5880d88a40a71b") (:authors ("Wanderson Ferreira <https://github.com/wandersoncferreira> and Luis Moneda <https://github.com/lgmoneda>")) (:maintainer "Wanderson Ferreira <https://github.com/wandersoncferreira> and Luis Moneda <https://github.com/lgmoneda>") (:url . "https://github.com/wandersoncferreira/helm-spotify-plus"))]) + (helm-sql-connect . [(20170319 1251) ((helm (0 0 0))) "Choose a database to connect to via Helm." single ((:commit . "5aead55b6f8636140945714d8c332b287ab9ef10") (:authors ("Eric Hansen" . "hansen.c.eric@gmail.com")) (:maintainer "Eric Hansen" . "hansen.c.eric@gmail.com") (:keywords "tools" "convenience" "comm") (:url . "https://github.com/eric-hansen/helm-sql-connect"))]) + (helm-switch-shell . [(20210106 1810) ((emacs (25 1)) (helm (2 8 8))) "A Helm source for switching between shell buffers" single ((:commit . "9de26ca41e94c095c978ed920009de0280f5c4ec") (:authors ("James N. V. Cash" . "james.cash@occasionallycogent.com")) (:maintainer "James N. V. Cash" . "james.cash@occasionallycogent.com") (:keywords "matching" "processes" "terminals" "tools") (:url . "https://github.com/jamesnvc/helm-switch-shell"))]) + (helm-switch-to-repl . [(20210206 844) ((emacs (26 1)) (helm (3))) "Helm action to switch directory in REPLs" single ((:commit . "f0e732e7217fc0373b0805245fa15920cf676619") (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") (:url . "https://github.com/emacs-helm/helm-switch-to-repl"))]) + (helm-swoop . [(20210426 547) ((emacs (25 1)) (helm (3 6))) "Efficiently hopping squeezed lines powered by helm interface" single ((:commit . "1b3285791f1dc1fde548fe67aec07214d698fd57") (:authors ("Shingo Fukuyama - http://fukuyama.co")) (:maintainer "Shingo Fukuyama - http://fukuyama.co") (:keywords "convenience" "helm" "swoop" "inner" "buffer" "search") (:url . "https://github.com/emacsorphanage/helm-swoop"))]) + (helm-system-packages . [(20201114 1019) ((emacs (24 4)) (helm (2 8 7)) (seq (1 8))) "Helm UI wrapper for system package managers." tar ((:commit . "c331c69de0a37d2bc4d6f882cc021a905e7e56f9") (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") (:keywords "helm" "packages") (:url . "https://github.com/emacs-helm/helm-system-packages"))]) + (helm-systemd . [(20210105 542) ((emacs (24 4)) (helm (1 9 2)) (with-editor (2 5 0))) "helm's systemd interface" single ((:commit . "8b26ab2d3a5b08c1e03c9312818512d7492bbc9a") (:authors (nil . "<lompik@oriontabArch>")) (:maintainer nil . "<lompik@oriontabArch>") (:keywords "convenience"))]) + (helm-tail . [(20181124 439) ((emacs (25 1)) (helm (2 7 0))) "Read recent output from various sources" single ((:commit . "1f5a6355aa3bdb00b9b0bc93db29c17f0d6701e3") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:keywords "maint" "tools") (:url . "https://github.com/akirak/helm-tail"))]) + (helm-taskswitch . [(20190304 1414) ((emacs (24)) (helm (3 0))) "Use helm to switch windows and buffers" single ((:commit . "59f7cb99defa6e6bf6e7d599559fa8d5786cf8a9") (:authors ("Brian Caruso" . "briancaruso@gmail.com")) (:maintainer "Brian Caruso" . "briancaruso@gmail.com") (:keywords "frames") (:url . "https://github.com/bdc34/helm-taskswitch"))]) + (helm-themes . [(20200323 712) ((helm-core (2 0)) (emacs (24 4))) "Color theme selection with helm interface" single ((:commit . "244121903650c2d25a233d12b378060cf8b010e7") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-helm-themes"))]) + (helm-tramp . [(20190616 125) ((emacs (24 3)) (helm (2 0))) "Tramp helm interface for ssh, docker, vagrant" single ((:commit . "55e56975fe1456591a293bf60c183c3dda9f788f") (:authors ("Masashı Mıyaura")) (:maintainer "Masashı Mıyaura") (:url . "https://github.com/masasam/emacs-helm-tramp"))]) + (helm-unicode . [(20180608 1407) ((helm (1 9 8)) (emacs (24 4))) "Helm command for unicode characters." single ((:commit . "fbeb0c5e741a6f462520884b744d43a9acbe1d34"))]) + (helm-w32-launcher . [(20141223 2014) ((emacs (24)) (helm (1 6 5)) (cl-lib (0 5))) "Start Menu entry launcher using Helm" tar ((:commit . "3e59ad62b89dd21d334af0203d445a83eb25dc5b") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/helm-w32-launcher"))]) + (helm-w3m . [(20210315 723) ((helm (1 5)) (w3m (0 0)) (cl-lib (0 5)) (emacs (24 1))) "W3m bookmark - helm interface." single ((:commit . "0a25a2b1df9bc660a90d633beb301b3815556e4e"))]) + (helm-wikipedia . [(20210525 717) ((helm (3 6)) (emacs (25 1))) "Wikipedia suggestions" single ((:commit . "c242c74efaeda2ffbafd281ee6bceae1a42507bb") (:url . "https://github.com/emacs-helm/helm-wikipedia"))]) + (helm-wordnet . [(20160128 1507) ((emacs (24)) (helm (1 7 0)) (cl-lib (0 5))) "Helm interface to local wordnet dictionary" single ((:commit . "a36dbc6fcb570b812870bc1e190f203e0a0042fc") (:authors ("Raghav Kumar Gautam" . "rgautam@apache.com")) (:maintainer "Raghav Kumar Gautam" . "rgautam@apache.com") (:keywords "dictionary" "wordnet" "emacs" "elisp" "helm") (:url . "https://github.com/raghavgautam/helm-wordnet"))]) + (helm-xcdoc . [(20160116 1018) ((helm (1 5)) (emacs (24 4))) "Search Xcode Document by docsetutil and eww with helm interface" single ((:commit . "a85612149a6d8e18ab309b3db2d222ce39c42049") (:authors ("Ryo Fujimoto" . "fujimisakri@gmail.com")) (:maintainer "Ryo Fujimoto" . "fujimisakri@gmail.com") (:url . "https://github.com/fujimisakari/emacs-helm-xcdoc"))]) + (helm-xref . [(20201004 1817) ((emacs (25 1)) (helm (1 9 4))) "Helm interface for xref results" single ((:commit . "23f1174cfca7667d95828dcd388c655a4a9c877d") (:authors ("Fritz Stelzer" . "brotzeitmacher@gmail.com")) (:maintainer "Fritz Stelzer" . "brotzeitmacher@gmail.com") (:url . "https://github.com/brotzeit/helm-xref"))]) + (helm-youtube . [(20190101 1733) ((request (0 2 0)) (helm (2 3 1)) (cl-lib (0 5))) "Query YouTube and play videos in your browser" single ((:commit . "e7272f1648c7fa836ea5ac1a61770b4931ab4709") (:authors ("Maximilian Roquemore" . "maximus12793@gmail.com")) (:maintainer "Maximilian Roquemore" . "maximus12793@gmail.com") (:keywords "youtube" "multimedia") (:url . "https://github.com/maximus12793/helm-youtube"))]) + (helm-z . [(20171204 325) ((helm (1 0))) "Show z directory list with helm.el support." single ((:commit . "37212220bebea8b9c238cb1bbacd8332b7f26c03") (:authors ("yynozk" . "yynozk@gmail.com")) (:maintainer "yynozk" . "yynozk@gmail.com") (:url . "https://github.com/yynozk/helm-z"))]) + (helm-zhihu-daily . [(20160625 1145) ((helm (1 0)) (cl-lib (0 5)) (emacs (24 4))) "Helm interface for 知乎日报 (http://daily.zhihu.com)" single ((:commit . "be27dcc6be1eb97663b65581a9a5c0fc81cfaba7") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:url . "https://github.com/xuchunyang/helm-zhihu-daily"))]) + (help-find-org-mode . [(20181204 234) ((emacs (24 4))) "Advise help to find org source over tangled code" single ((:commit . "aeda7f92c086dab9d8dfcd580fe80b332887a548") (:authors ("Eric Crosson" . "eric.s.crosson@utexas.com")) (:maintainer "Eric Crosson" . "eric.s.crosson@utexas.com") (:keywords "convenience") (:url . "https://github.com/EricCrosson/help-find-org-mode"))]) + (helpful . [(20210319 802) ((emacs (25)) (dash (2 18 0)) (s (1 11 0)) (f (0 20 0)) (elisp-refs (1 2))) "A better *help* buffer" single ((:commit . "7e4b1f0d5572a4e2b8ee7a9b084ef863d0315a73") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:keywords "help" "lisp") (:url . "https://github.com/Wilfred/helpful"))]) + (hemera-theme . [(20180916 924) ((emacs (24))) "Light theme" single ((:commit . "b67c902b210b37b00cac68726822404543147ba8") (:authors ("Guido Schmidt")) (:maintainer "Guido Schmidt" . "guido.schmidt.2912@gmail.com") (:keywords "themes" "light-theme") (:url . "https://github.com/GuidoSchmidt/emacs-hemera-theme"))]) + (hemisu-theme . [(20130508 1844) nil "Hemisu for Emacs." tar ((:commit . "5c206561aa2c844ecdf3e3b672c3235e559ddd7f") (:authors ("Andrzej Sliwa")) (:maintainer "Andrzej Sliwa") (:url . "http://github/anrzejsliwa/django-theme"))]) + (hercules . [(20200420 747) ((emacs (24 4)) (which-key (3 3 2))) "An auto-magical, which-key-based hydra banisher." single ((:commit . "557da39878d0637395fdded91243b340c37eff7b") (:authors ("Uros Perisic")) (:maintainer "Uros Perisic") (:keywords "convenience") (:url . "https://gitlab.com/jjzmajic/hercules"))]) + (heroku-theme . [(20150523 219) nil "Heroku color theme" single ((:commit . "8083643fe92ec3a1c3eb82f1b8dc2236c9c9691d") (:authors ("Jonathan Chu" . "me@jonathanchu.is")) (:maintainer "Jonathan Chu" . "me@jonathanchu.is") (:url . "https://github.com/jonathanchu/color-theme-heroku"))]) + (hexo . [(20200416 1410) ((emacs (24 3))) "Major mode & tools for Hexo" single ((:commit . "d600b6c2d51959f1331c8abf3953365544322afa") (:authors ("Ono Hiroko (kuanyui)" . "azazabc123@gmail.com")) (:maintainer "Ono Hiroko (kuanyui)" . "azazabc123@gmail.com") (:keywords "tools" "hexo") (:url . "https://github.com/kuanyui/hexo.el"))]) + (hfst-mode . [(20160708 1202) nil "major mode for editing HFST files" single ((:commit . "ac1bb9dd92545d3e7fdc05c83996c227cc15c6b8") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org") (:keywords "languages") (:url . "http://wiki.apertium.org/wiki/Emacs"))]) + (hg-histedit . [(20210302 2334) ((emacs (25 1)) (with-editor (2 8 3))) "Edit HG histedit files" single ((:commit . "a05149483b9c5f7848ece0ba6028c900595a6a25") (:authors ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com") (:keywords "mercurial" "hg" "emacs" "tools") (:url . "https://github.com/jojojames/hg-histedit"))]) + (hgignore-mode . [(20210314 431) nil "a major mode for editing hgignore files" single ((:commit . "2c5aa4c238848f5b4f2955afcfb5f21ea513653b") (:authors ("Omair Majid" . "omair.majid@gmail.com")) (:maintainer "Omair Majid" . "omair.majid@gmail.com") (:keywords "convenience" "vc" "hg") (:url . "http://github.com/omajid/hgignore-mode"))]) + (hgrc-mode . [(20150409 2043) nil "major mode for editing hgrc files" single ((:commit . "314e8320b82cc1ce74b1bd372f296252e7a23090") (:authors ("Omair Majid" . "omair.majid@gmail.com")) (:maintainer "Omair Majid" . "omair.majid@gmail.com") (:keywords "convenience" "vc" "hg") (:url . "http://github.com/omajid/hgrc-mode"))]) + (hi2 . [(20141005 1931) nil "indentation module for Haskell Mode" single ((:commit . "c9d199727b5cdcb9e36a972b38131ce4611fd6c8") (:authors ("Gergely Risko" . "gergely@risko.hu")) (:maintainer "Gergely Risko" . "gergely@risko.hu") (:keywords "indentation" "haskell") (:url . "https://github.com/errge/hi2"))]) + (hiccup-cli . [(20210208 652) ((emacs (26 1))) "Convert HTML to Hiccup syntax" single ((:commit . "b56ae0d5cd5ce3ef24ed13be5103e231c91ef4e2") (:authors ("Kevin W. van Rooijen")) (:maintainer "Kevin W. van Rooijen") (:keywords "tools") (:url . "https://github.com/kwrooijen/hiccup-cli"))]) + (hide-lines . [(20210513 1636) nil "Commands for hiding lines based on a regexp" single ((:commit . "f0828c15e50db5eddb905de783e7683b04d1eca3") (:authors ("Mark Hulme-Jones <ture at plig cucumber dot net>")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:keywords "convenience") (:url . "https://github.com/vapniks/hide-lines"))]) + (hide-mode-line . [(20190922 115) ((emacs (24 4))) "minor mode that hides/masks your modeline" single ((:commit . "88888825b5b27b300683e662fa3be88d954b1cea") (:authors ("Henrik Lissner <http://github/hlissner>")) (:maintainer "Henrik Lissner" . "henrik@lissner.net") (:keywords "frames" "mode-line") (:url . "https://github.com/hlissner/emacs-hide-mode-line"))]) + (hidepw . [(20200326 112) nil "Minor mode to hide passwords" single ((:commit . "73f099da79d73fe4087472df3469d8b9b20a59f2") (:authors ("Chris Forno" . "jekor@jekor.com")) (:maintainer "Chris Forno" . "jekor@jekor.com") (:keywords "hide" "hidden" "password" "faces") (:url . "https://github.com/jekor/hidepw"))]) + (hideshow-org . [(20120223 2250) nil "Provides org-mode like hide and show for hideshow.el" single ((:commit . "16419e52e6cdd2f46f755144c0ab11ce00d1a626") (:authors ("Shane Celis <shane (at) gnufoo (dot) org>")) (:maintainer "Shane Celis <shane (at) gnufoo (dot) org>") (:keywords "c" "c++" "java" "lisp" "tools" "editing" "comments" "blocks" "hiding" "outlines" "org-mode"))]) + (hierarchy . [(20190425 842) ((emacs (25 1))) "Library to create and display hierarchy structures" single ((:commit . "fed505b8e71bf51772887c8a94bb57f5b8838b63") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://github.com/DamienCassou/hierarchy"))]) + (highlight . [(20210318 2248) nil "Highlighting commands." single ((:commit . "28557cb8d99b96eb509aaec1334c7cdda162517f") (:authors ("Drew Adams")) (:maintainer nil . "Drew Adams (concat \"drew.adams\" \"@\" \"oracle\" \".com\")") (:keywords "faces" "help" "local") (:url . "https://www.emacswiki.org/emacs/download/highlight.el"))]) + (highlight-blocks . [(20190318 1557) ((emacs (24))) "Highlight the blocks point is in" single ((:commit . "33cf3d36662faa36c86c8d53e4d5a3922efa3eb8") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/highlight-blocks"))]) + (highlight-context-line . [(20181122 2203) nil "Improve orientation when scrolling" single ((:commit . "6b334e8207c780835a05b6909b4d826898c33d26") (:authors ("Stefan Kamphausen <www.skamphausen.de>")) (:maintainer "Stefan Kamphausen <www.skamphausen.de>") (:keywords "faces" "services" "user") (:url . "https://github.com/ska2342/highlight-context-line/"))]) + (highlight-defined . [(20210411 222) ((emacs (24))) "Syntax highlighting of known Elisp symbols" single ((:commit . "4420bdda419875dacb065468aafe273b2022580e") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/highlight-defined"))]) + (highlight-doxygen . [(20200520 1713) nil "Highlight Doxygen comments" single ((:commit . "eec4874e2e89d4eb39091aad89a67dff8f8ec84c") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "faces") (:url . "https://github.com/Lindydancer/highlight-doxygen"))]) + (highlight-escape-sequences . [(20201214 1730) nil "Highlight escape sequences" single ((:commit . "fae976568c04b6fe8a9f2d854c8fe23b357a6878") (:authors ("Dmitry Gutov" . "dgutov@yandex.ru") ("Pavel Matcula" . "dev.plvlml@gmail.com")) (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru") (:keywords "convenience") (:url . "https://github.com/dgutov/highlight-escape-sequences"))]) + (highlight-function-calls . [(20170908 500) ((emacs (24 4))) "Highlight function/macro calls" single ((:commit . "f7a1eaf95fc64cc0db4d0567f9ff79ec4ae04787") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "faces" "highlighting") (:url . "http://github.com/alphapapa/highlight-function-calls"))]) + (highlight-indent-guides . [(20200820 2328) ((emacs (24 1))) "Minor mode to highlight indentation" single ((:commit . "cf352c85cd15dd18aa096ba9d9ab9b7ab493e8f6") (:authors ("DarthFennec" . "darthfennec@derpymail.org")) (:maintainer "DarthFennec" . "darthfennec@derpymail.org") (:url . "https://github.com/DarthFennec/highlight-indent-guides"))]) + (highlight-indentation . [(20210221 1418) nil "Minor modes for highlighting indentation" single ((:commit . "d88db4248882da2d4316e76ed673b4ac1fa99ce3") (:authors ("Anton Johansson" . "anton.johansson@gmail.com")) (:maintainer "Anton Johansson" . "anton.johansson@gmail.com") (:url . "https://github.com/antonj/Highlight-Indentation-for-Emacs"))]) + (highlight-leading-spaces . [(20151216 1222) ((emacs (24 4))) "Highlight leading spaces" single ((:commit . "840db19d863dd97993fd9f893f5be501627b6354") (:authors ("Thomas Winant" . "dewinant@gmail.com")) (:maintainer "Thomas Winant" . "dewinant@gmail.com") (:url . "https://github.com/mrBliss/highlight-leading-spaces"))]) + (highlight-numbers . [(20181013 1744) ((emacs (24)) (parent-mode (2 0))) "Highlight numbers in source code" single ((:commit . "8b4744c7f46c72b1d3d599d4fb75ef8183dee307") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/highlight-numbers"))]) + (highlight-operators . [(20170213 2220) nil "a face for operators in programming modes" single ((:commit . "7696b43419505d6e3511ad2781f9f1dd3c55ef8c") (:authors ("Jonathan Kotta" . "jpkotta@gmail.com")) (:maintainer "Jonathan Kotta" . "jpkotta@gmail.com"))]) + (highlight-parentheses . [(20210420 1924) ((emacs (24 3))) "Highlight surrounding parentheses" single ((:commit . "891538de31524956136e1419e1206af0c8befe02") (:authors ("Nikolaj Schumacher <bugs * nschum de>")) (:maintainer "Tassilo Horn" . "tsdh@gnu.org") (:keywords "faces" "matching") (:url . "https://sr.ht/~tsdh/highlight-parentheses.el/"))]) + (highlight-quoted . [(20140916 1822) ((emacs (24))) "Highlight Lisp quotes and quoted symbols" single ((:commit . "24103478158cd19fbcfb4339a3f1fa1f054f1469") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/highlight-quoted"))]) + (highlight-refontification . [(20170211 2024) nil "Visualize font-lock refontification." single ((:commit . "32632897d88c4611fadb08517ca00ef5cbc989b6") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "faces" "tools") (:url . "https://github.com/Lindydancer/highlight-refontification"))]) + (highlight-stages . [(20210306 418) nil "highlight staged (quasi-quoted) expressions" single ((:commit . "95daa710f3d8fc83f42c5da38003fc71ae0da1fc") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))]) + (highlight-symbol . [(20160102 2009) nil "automatic and manual symbol highlighting" single ((:commit . "7a789c779648c55b16e43278e51be5898c121b3a") (:authors ("Nikolaj Schumacher <bugs * nschum de>")) (:maintainer "Nikolaj Schumacher <bugs * nschum de>") (:keywords "faces" "matching") (:url . "http://nschum.de/src/emacs/highlight-symbol/"))]) + (highlight-thing . [(20181229 1301) nil "Minimalistic minor mode to highlight current thing under point." single ((:commit . "561d08a26f78f18d405d4f371f1c813db094e2f3") (:authors ("Felix Geller" . "fgeller@gmail.com")) (:maintainer "Felix Geller" . "fgeller@gmail.com") (:keywords "highlight" "thing" "symbol") (:url . "https://github.com/fgeller/highlight-thing.el"))]) + (highlight-unique-symbol . [(20130612 542) ((deferred (0 3 2))) "highlight symbols which not appear in the repository" single ((:commit . "4141bf86a94e30d94d9af9c29d40b16886226e1c") (:authors ("hitode909" . "hitode909@gmail.com")) (:maintainer "hitode909" . "hitode909@gmail.com") (:url . "https://github.com/hitode909/emacs-highlight-unique-symbol"))]) + (highlight2clipboard . [(20151020 1840) ((htmlize (1 47))) "Copy text to clipboard with highlighting." tar ((:commit . "6ce58a060d9c5843ccb8c79ec2bba7858c68ac15") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "tools"))]) + (hindent . [(20210201 148) ((cl-lib (0 5))) "Indent haskell code using the \"hindent\" program" single ((:commit . "e146d672ea4c00fe17018e7e76e49d59570eeb2b") (:authors ("Chris Done" . "chrisdone@gmail.com")) (:maintainer "Chris Done" . "chrisdone@gmail.com") (:url . "https://github.com/chrisdone/hindent"))]) + (hippie-exp-ext . [(20160502 2326) nil "Extension of hippie-expand" single ((:commit . "4eda13f90da51ab217d024701f4c30f91ffcb90e") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "abbrev" "convenience" "completions" "hippie-expand") (:url . "http://www.emacswiki.org/emacs/download/hippie-exp-ext.el"))]) + (hippie-expand-slime . [(20170723 146) nil "Hook slime's completion into hippie-expand" single ((:commit . "39bbae94896a62854d31754debdfae71d35fec62") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/hippie-expand-slime"))]) + (hippie-namespace . [(20140508 2041) nil "Special treatment for namespace prefixes in hippie-expand" single ((:commit . "d0d0f15c67ab8bef5e9d1e29a89ecd3613a60b49") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "convenience" "lisp" "tools" "completion") (:url . "http://github.com/rolandwalker/hippie-namespace"))]) + (historian . [(20200203 1927) ((emacs (24 4))) "Persistently store selected minibuffer candidates" single ((:commit . "ac1bea7d99dd6965c72fabeb72d5fdc38c5380a4") (:authors ("PythonNut" . "pythonnut@pythonnut.com")) (:maintainer "PythonNut" . "pythonnut@pythonnut.com") (:keywords "convenience") (:url . "https://github.com/PythonNut/historian.el"))]) + (history . [(20160821 1602) ((emacs (24 3))) "History utility for source code navigation" tar ((:commit . "5317663fb45bbd5e96d258cb0807dcc266ce67ff") (:authors ("boyw165")) (:maintainer "boyw165") (:url . "https://github.com/boyw165/history"))]) + (historyf . [(20151124 159) nil "file history library like browser" single ((:commit . "196c058ceb092fdd56b0e4ce85b7e714d6f72224") (:authors ("k1LoW (Kenichirou Oyama), <k1lowxb [at] gmail [dot] com> <k1low [at] 101000lab [dot] org>")) (:maintainer "k1LoW (Kenichirou Oyama), <k1lowxb [at] gmail [dot] com> <k1low [at] 101000lab [dot] org>") (:url . "https://github.com/k1LoW/emacs-historyf"))]) + (hive . [(20131217 1512) ((sql (3 0))) "Hive SQL mode extension" single ((:commit . "11b5172e081ad8079fc78758bef6f306f82ae32b") (:authors ("Roman Scherer" . "roman@burningswell.com")) (:maintainer "Roman Scherer" . "roman@burningswell.com") (:keywords "sql" "hive"))]) + (hiwin . [(20150825 827) nil "Visible active window mode." single ((:commit . "6ee8ed051405653bd9b7332d7e9fbb591d954051") (:authors ("k.sugita")) (:maintainer "k.sugita") (:keywords "faces" "editing" "emulating"))]) + (hl-anything . [(20160422 1708) ((emacs (24 3))) "Highlight symbols, selections, enclosing parens and more." tar ((:commit . "8696bc55a8cba408f0fc83a907a9ec529d79e558") (:authors ("boyw165")) (:maintainer "boyw165"))]) + (hl-block-mode . [(20210320 1051) ((emacs (26 0))) "highlighting nested blocks" single ((:commit . "717b4f743c633362a8b28c883c454c5ef3711722") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-hl-block-mode"))]) + (hl-fill-column . [(20200607 757) ((names (0 5)) (emacs (24))) "Highlight fill column." single ((:commit . "5782a91ba0182c4e562fa0db6379ff9dd472856b") (:keywords "fill column" "faces") (:url . "https://github.com/laishulu/hl-fill-column"))]) + (hl-indent . [(20170429 2104) ((emacs (24)) (cl-lib (0 5))) "Highlight irregular indentation." single ((:commit . "bdb2e0177a7c8b29af26998e688b856adc6ded93") (:authors ("Kirill Ignatiev <github.com/ikirill>")) (:maintainer "Kirill Ignatiev <github.com/ikirill>") (:keywords "convenience" "faces") (:url . "https://github.com/ikirill/hl-indent"))]) + (hl-prog-extra . [(20210422 56) ((emacs (26 2))) "Customizable highlighting for source-code" single ((:commit . "42dee82058e49a7eae5490af2b6b4147600e87ed") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:keywords "convenience") (:url . "https://gitlab.com/ideasman42/emacs-hl-prog-extra"))]) + (hl-sentence . [(20171018 1519) nil "highlight a sentence based on customizable face" single ((:commit . "86ae38d3103bd20da5485cbdd59dfbd396c45ee4") (:authors ("Donald Ephraim Curtis" . "dcurtis@milkbox.net")) (:maintainer "Donald Ephraim Curtis" . "dcurtis@milkbox.net") (:keywords "highlighting") (:url . "http://github.com/milkypostman/hl-sentence"))]) + (hl-todo . [(20210504 1406) ((emacs (25))) "highlight TODO and similar keywords" single ((:commit . "57378bd4511887a815725a7850e1ff2c6e9fda16") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "https://github.com/tarsius/hl-todo"))]) + (hledger-mode . [(20201212 2121) ((emacs (24 4)) (popup (0 5 3)) (async (1 9)) (htmlize (1 47))) "A mode for writing journal entries for hledger." tar ((:commit . "f1deebb0cbe9ca040856d3cc99942335250d9566") (:authors ("Narendra Joshi" . "narendraj9@gmail.com")) (:maintainer "Narendra Joshi" . "narendraj9@gmail.com") (:keywords "data") (:url . "https://github.com/narendraj9/hledger-mode.git"))]) + (hlint-refactor . [(20190115 900) nil "Apply HLint suggestions" single ((:commit . "c4307f86aad6d02e32e9b30cb6edc115584c791c") (:keywords "haskell" "refactor") (:url . "https://github.com/mpickering/hlint-refactor-mode"))]) + (hlinum . [(20180422 412) ((cl-lib (0 2))) "Extension for linum.el to highlight current line number" single ((:commit . "5646d9c0b9e7598b20b2004eab5439fdc6dbeda5") (:authors ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainer "Tomoya Tanjo" . "ttanjo@gmail.com") (:keywords "convenience" "extensions") (:url . "https://github.com/tom-tan/hlinum-mode/"))]) + (hmac . [(20201004 1819) ((emacs (25 1))) "Hash-based message authentication code" single ((:commit . "f2b99a9a10becfff207cf9418c6dce78364b1a4b") (:authors ("Sean McAfee")) (:maintainer "Sean McAfee") (:url . "https://github.com/grimnebulin/emacs-hmac"))]) + (hnreader . [(20210518 428) ((emacs (25 1)) (promise (1 1)) (request (0 3 0)) (org (9 2))) "A hackernews reader" single ((:commit . "0bda35e6b2063ddecca2fe2b0dd21f46a3391de3") (:authors ("Thanh Vuong" . "thanhvg@gmail.com")) (:maintainer "Thanh Vuong" . "thanhvg@gmail.com") (:url . "https://github.com/thanhvg/emacs-hnreader/"))]) + (hoa-mode . [(20200610 1339) nil "Major mode for the HOA format" single ((:commit . "18f5c981e256f867f29a93376ccdc04717b159cd") (:authors ("Alexandre Duret-Lutz" . "adl@lrde.epita.fr")) (:maintainer "Alexandre Duret-Lutz" . "adl@lrde.epita.fr") (:keywords "major-mode" "automata" "convenience") (:url . "https://gitlab.lrde.epita.fr/spot/emacs-modes"))]) + (hoa-pp-mode . [(20151027 736) ((emacs (24 1)) (names (20150723 0))) "Major mode for Hoa PP grammars" single ((:commit . "925b79930a3f4377b0fb2a36b3c6d5566d4b9a8e") (:authors ("Steven Rémot")) (:maintainer "Steven Rémot") (:keywords "php" "hoa") (:url . "https://github.com/hoaproject/Contributions-Emacs-Pp"))]) + (holiday-pascha-etc . [(20160822 58) nil "Eastern Christian analog to holiday-easter-etc" single ((:commit . "eb198656f63cb8679fb0e3a8248782df071a0f3c") (:authors ("Mark A. Hershberger" . "mah@everybody.org")) (:maintainer "Mark A. Hershberger" . "mah@everybody.org") (:url . "http://github.com/hexmode/holiday-pascha-etc"))]) + (holy-books . [(20210227 2225) ((s (1 12 0)) (dash (2 16 0)) (emacs (27 1)) (org (9 1))) "Org-mode links/tooltips/lookups for Quran & Bible" single ((:commit . "53ee29d1b1a1a9cbd664c318b01aa1c13011efff") (:authors ("Musa Al-hassy" . "alhassy@gmail.com")) (:maintainer "Musa Al-hassy" . "alhassy@gmail.com") (:keywords "quran" "bible" "links" "tooltips" "convenience" "comm" "hypermedia") (:url . "https://alhassy.github.io/holy-books/"))]) + (home-end . [(20180817 855) ((emacs (24 3)) (keypress-multi-event (1 0))) "Smart multi-purpose home / end keys" single ((:commit . "fbddad2c1268720ce17662a232b48f666e489526") (:authors ("Boruch Baum" . "boruch_baum@gmx.com")) (:maintainer "Boruch Baum" . "boruch_baum@gmx.com") (:keywords "abbrev" "convenience" "wp" "keyboard") (:url . "https://www.github.com/Boruch_Baum/emacs-home-end"))]) + (homebrew-mode . [(20200205 224) ((emacs (24 4)) (inf-ruby (2 4 0)) (dash (1 2 0))) "minor mode for editing Homebrew formulae" single ((:commit . "8c04b040656dc99719efd7663c10f26f74df4a47") (:authors ("Alex Dunn" . "dunn.alex@gmail.com")) (:maintainer "Alex Dunn" . "dunn.alex@gmail.com") (:keywords "homebrew" "brew" "ruby") (:url . "https://github.com/dunn/homebrew-mode"))]) + (honcho . [(20190623 2120) ((emacs (25 1)) (sudo-edit (0 1))) "Run and manage long-running services" single ((:commit . "d5e6206dd23ff9305d976c52845c750a064aca4b") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:keywords "convenience") (:url . "https://github.com/emacs-pe/honcho.el"))]) + (hookify . [(20141216 2209) ((s (1 9 0)) (dash (1 5 0))) "Interactive commands to create temporary hooks" single ((:commit . "21baae7393b07257de5796402fde0ca72fb00d77") (:authors ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainer "Philippe Vaucher" . "philippe.vaucher@gmail.com") (:keywords "hook" "convenience") (:url . "https://github.com/Silex/hookify"))]) + (horizon-theme . [(20200720 1832) ((emacs (24 3))) "A beautifully warm dual theme" single ((:commit . "9595549c514a9376c61d5d303405f6a6982e9e46") (:url . "https://github.com/aodhneine/horizon-theme.el"))]) + (horoscope . [(20180409 641) ((emacs (24))) "generate horoscopes." single ((:commit . "f4c683e991adce0a8f9023f15050f306f9b9a9ed") (:authors ("Bob Manson" . "manson@cygnus.com")) (:maintainer "Noah Friedman" . "friedman@prep.ai.mit.edu") (:keywords "extensions" "games") (:url . "https://github.com/mschuldt/horoscope.el"))]) + (hound . [(20200122 1700) ((request (0 2 0)) (cl-lib (0 5))) "Display hound search results in a compilation window" single ((:commit . "35e2cdc81fcc904b450a7ef3ec00fd25df6a4431") (:authors ("Ryan Young")) (:maintainer "Ryan Young"))]) + (hover . [(20201206 2227) ((emacs (25 2)) (dash (2 14 1))) "Package to use hover with flutter" single ((:commit . "c9c0593b2bffd6a494f570d707fe8d4e97718da4") (:authors ("Eric Dallo")) (:maintainer "Eric Dallo") (:keywords "hover" "flutter" "mobile" "tools") (:url . "https://github.com/ericdallo/hover.el"))]) + (howdoi . [(20150204 43) nil "Instant coding answers via Emacs." tar ((:commit . "5fbf7069ee160c597a328e5ce5fb32920e1ca88f") (:authors ("Andrey Tykhonov <atykhonov at gmail.com>")) (:maintainer "Andrey Tykhonov" . "atykhonov@gmail.com") (:keywords "howdoi" "convenience") (:url . "https://github.com/atykhonov/emacs-howdoi/"))]) + (howdoyou . [(20210217 1723) ((emacs (25 1)) (promise (1 1)) (request (0 3 0)) (org (9 2))) "A stackoverflow and its sisters' sites reader" single ((:commit . "27e9e015b930175896c07536c25e379a4e1997af") (:authors ("Thanh Vuong" . "thanhvg@gmail.com")) (:maintainer "Thanh Vuong" . "thanhvg@gmail.com") (:url . "https://github.com/thanhvg/howdoyou/"))]) + (howm . [(20210217 1128) ((cl-lib (0 5))) "Wiki-like note-taking tool" tar ((:commit . "bac98b873d07baf039fe252b9d67f71c235dca06") (:authors ("HIRAOKA Kazuyuki" . "khi@users.osdn.me")) (:maintainer "HIRAOKA Kazuyuki" . "khi@users.osdn.me") (:url . "https://howm.osdn.jp"))]) + (hsluv . [(20181127 1206) ((seq (2 20))) "hsluv color space conversions" single ((:commit . "c3bc5228e30d66e7dee9ff1a0694c2b976862fc0") (:authors ("Geert Vermeiren")) (:maintainer "Geert Vermeiren") (:keywords "color" "hsluv") (:url . "https://github.com/hsluv/hsluv-emacs"))]) + (ht . [(20210119 741) ((dash (2 12 0))) "The missing hash table library for Emacs" single ((:commit . "c4c1be487d6ecb353d07881526db05d7fc90ea87") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:keywords "hash table" "hash map" "hash"))]) + (html-check-frag . [(20201106 1748) ((emacs (24 3))) "Check html-fragments" single ((:commit . "b9d1f2003a126c2e8b6d469964ec2278ad55c9df") (:authors ("Tobias.Zawada" . "i@tn-home.de")) (:maintainer "Tobias.Zawada" . "i@tn-home.de") (:keywords "html"))]) + (html-script-src . [(20120403 1815) nil "Insert <script src=\"..\"> for popular JavaScript libraries" single ((:commit . "66460f8ab1b24656e6f3ce5bd50cff6a81be8422") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "tools" "convenience") (:url . "http://github.com/rejeep/html-script-src"))]) + (html-to-hiccup . [(20190909 1549) ((emacs (25 1)) (dash (2 13 0)) (s (1 10 0))) "Convert HTML to Hiccup syntax" single ((:commit . "50a52e2b0d13d865187acdf775b8203d5003f2f1") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net") (:keywords "html" "hiccup" "clojure") (:url . "https://github.com/plexus/html-to-hiccup"))]) + (html-to-markdown . [(20151105 840) ((cl-lib (0 5))) "HTML to Markdown converter written in Emacs-lisp." single ((:commit . "60c5498c801be186478cf7c05be05b4430c4a144") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com") (:keywords "tools" "wp" "languages") (:url . "http://github.com/Bruce-Connor/html-to-markdown"))]) + (html2org . [(20170418 501) ((emacs (24 4))) "Convert html to org format text" single ((:commit . "6904aed40259ad8afccff079ebd8a07bff319ebc") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "convenience" "html" "org") (:url . "http://github.com/lujun9972/html2org.el"))]) + (htmlize . [(20200816 746) nil "Convert buffer text and decorations to HTML." single ((:commit . "49205105898ba8993b5253beec55d8bddd820a70") (:authors ("Hrvoje Niksic" . "hniksic@gmail.com")) (:maintainer "Hrvoje Niksic" . "hniksic@gmail.com") (:keywords "hypermedia" "extensions") (:url . "https://github.com/hniksic/emacs-htmlize"))]) + (htmltagwrap . [(20200929 559) ((emacs (24 4))) "Wraps a chunk of HTML code in tags" single ((:commit . "8cb33f9513d79e44a602927f35d5a3bb0dccbb92") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/htmltagwrap"))]) + (http . [(20201010 920) ((emacs (24 4)) (request (0 2 0)) (edit-indirect (0 1 4))) "Yet another HTTP client" single ((:commit . "5fdceed1fbf36e274e578e349a53ce922c574774") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:keywords "convenience") (:url . "https://github.com/emacs-pe/http.el"))]) + (http-post-simple . [(20170715 940) nil "HTTP POST requests using the url library" single ((:commit . "f53697fca278c741051aeb668b00466b5e0fd3fe") (:authors ("Tom Schutzer-Weissmann")) (:maintainer "Tom Schutzer-Weissmann") (:keywords "comm" "data" "processes" "hypermedia"))]) + (http-twiddle . [(20160801 1911) nil "send & twiddle & resend HTTP requests" single ((:commit . "4d0c73b7dcbde8b483d4f3a75c49c74d2fe3ca45") (:authors ("Luke Gorrie" . "luke@synap.se")) (:maintainer "Hasan Veldstra" . "h@vidiowiki.com") (:keywords "http" "rest" "soap") (:url . "https://github.com/hassy/http-twiddle/blob/master/http-twiddle.el"))]) + (httpcode . [(20121002 345) nil "explains the meaning of an HTTP status code" single ((:commit . "a45e735082b09477cd704a99294d336cdbeb12ba") (:authors ("Ruslan Spivak" . "ruslan.spivak@gmail.com")) (:maintainer "Ruslan Spivak" . "ruslan.spivak@gmail.com") (:url . "http://github.com/rspivak/httpcode.el"))]) + (httprepl . [(20141101 1734) ((s (1 9 0)) (dash (2 5 0)) (emacs (24))) "An HTTP REPL" single ((:commit . "cfa3693267a8ed1c96a86a126823f37dbfe077d8") (:authors ("Greg Sexton" . "gregsexton@gmail.com")) (:maintainer "Greg Sexton" . "gregsexton@gmail.com") (:keywords "http" "repl") (:url . "https://github.com/gregsexton/httprepl.el"))]) + (hugsql-ghosts . [(20180425 1129) ((s (1 9 0)) (dash (2 10 0)) (cider (0 14 0))) "Display hugsql defqueries in clojure code as an overlay." single ((:commit . "f3ebc60c66204ad39058cb84eb4bd5facce091df") (:authors ("Roland Kaercher" . "roland.kaercher@gmail.com")) (:maintainer "Roland Kaercher" . "roland.kaercher@gmail.com") (:url . "https://github.com/rkaercher/hugsql-ghosts"))]) + (humanoid-themes . [(20210525 2259) ((emacs (24 3))) "Color themes with a dark and light variant" tar ((:commit . "9b4587417f2583c503f84f3b1e994d7934e57bdd") (:authors ("Thomas Friese")) (:maintainer "Thomas Friese") (:keywords "faces" "color" "theme") (:url . "https://github.com/humanoid-colors/emacs-humanoid-themes"))]) + (hungarian-holidays . [(20161020 1138) nil "Adds a list of Hungarian public holidays to Emacs calendar" single ((:commit . "653108769279499d84a79267c90e640d98823872") (:authors ("Gergely Polonkai" . "gergely@polonkai.eu")) (:maintainer "Gergely Polonkai" . "gergely@polonkai.eu") (:keywords "calendar"))]) + (hungry-delete . [(20210409 1643) nil "hungry delete minor mode" single ((:commit . "d919e555e5c13a2edf4570f3ceec84f0ade71657") (:authors ("Nathaniel Flath" . "flat0103@gmail.com")) (:maintainer "Nathaniel Flath" . "flat0103@gmail.com") (:url . "http://github.com/nflath/hungry-delete"))]) + (hy-mode . [(20201010 1351) ((dash (2 13 0)) (dash-functional (1 2 0)) (s (1 11 0)) (emacs (24))) "Major mode for Hylang" tar ((:commit . "5253533ddbd55f58168d00940352a82a66d38fec") (:keywords "languages" "lisp" "python") (:url . "http://github.com/hylang/hy-mode"))]) + (hyai . [(20170301 1447) ((cl-lib (0 5)) (emacs (24))) "Haskell Yet Another Indentation" single ((:commit . "9efad2ac6a57059b3be624588f649e276a96fdd4") (:authors ("Iku Iwasa" . "iku.iwasa@gmail.com")) (:maintainer "Iku Iwasa" . "iku.iwasa@gmail.com") (:url . "https://github.com/iquiw/hyai"))]) + (hybrid-reverse-theme . [(20210527 2324) ((emacs (24 1))) "Emacs theme with material color scheme" single ((:commit . "4cad8a17f6c9d98a628d78fe358d589b03172b57") (:authors ("Riyyi")) (:maintainer "Riyyi") (:keywords "faces" "theme") (:url . "https://github.com/riyyi/emacs-hybrid-reverse"))]) + (hydandata-light-theme . [(20190809 1925) nil "A light color theme that is easy on your eyes" single ((:commit . "180c3797fa7ef3e4bb679baaf5b492c33bbb9b8b") (:authors ("David Chkhikvadze" . "david@chkhd.net")) (:maintainer "David Chkhikvadze" . "david@chkhd.net") (:keywords "color-theme" "theme") (:url . "https://github.com/chkhd/hydandata-light-theme"))]) + (hyde . [(20160508 308) nil "Major mode to help create and manage Jekyll blogs" tar ((:commit . "a8cd6ed00ecd8d7de0ded2f4867015b412b15b76"))]) + (hydra . [(20201115 1055) ((cl-lib (0 5)) (lv (0))) "Make bindings that stick around." tar ((:commit . "2d553787aca1aceb3e6927e426200e9bb9f056f1") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "bindings") (:url . "https://github.com/abo-abo/hydra"))]) + (hyperkitty . [(20200927 106) ((request (0 3 2)) (emacs (25 1))) "Emacs interface for Hyperkitty archives" single ((:commit . "ad65766fee2675bf123491544707b056b89b52ce") (:authors ("Abhilash Raj" . "maxking@asynchronous.in")) (:maintainer "Abhilash Raj" . "maxking@asynchronous.in") (:keywords "mail" "hyperkitty" "mailman") (:url . "https://github.com/maxking/hyperkitty.el"))]) + (hyperlist-mode . [(20200515 2209) ((emacs (24))) "A major-mode for viewing Hyperlists" single ((:commit . "374cdc04761df23e7a50ca276319ba9745cda9d7") (:authors ("Wojciech Siewierski")) (:maintainer "Wojciech Siewierski") (:keywords "outlines") (:url . "https://github.com/vifon/hyperlist-mode"))]) + (hyperspace . [(20210603 1825) ((emacs (25)) (s (1 12 0))) "Get there from here" single ((:commit . "c4c363c140250ba6b775516082063878975a6154") (:authors ("Ian Eure" . "ian@retrospec.tv")) (:maintainer "Ian Eure" . "ian@retrospec.tv") (:keywords "tools" "convenience") (:url . "https://github.com/ieure/hyperspace-el"))]) + (i-ching . [(20210222 1519) ((emacs (25 1)) (request (0 3))) "The Book of Changes" tar ((:commit . "51a3180ed07ae9f8b7ff3f2b822d998495864a07") (:authors ("nik gaffney" . "nik@fo.am")) (:maintainer "nik gaffney" . "nik@fo.am") (:keywords "games" "divination" "stochastism" "cleromancy" "change") (:url . "https://github.com/zzkt/i-ching"))]) + (i2b2-mode . [(20140710 104) nil "Highlights corresponding PHI data in the text portion of an i2b2 XML Document." single ((:commit . "db10efcfc8bed369a516bbf7526ede41f98cb95a") (:authors ("Dan LaManna" . "dan.lamanna@gmail.com")) (:maintainer "Dan LaManna" . "dan.lamanna@gmail.com") (:keywords "xml" "phi" "i2b2" "deidi2b2"))]) + (i3wm . [(20170822 1438) nil "i3wm integration library" single ((:commit . "71391dc61063fee77ad174f3b2ca25c60b41009e") (:authors ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org") (:keywords "convenience" "extensions") (:url . "https://git.flintfam.org/swf-projects/emacs-i3"))]) + (i3wm-config-mode . [(20201105 2022) ((emacs (24 1))) "Better syntax highlighting for i3wm's config file" single ((:commit . "c70bdc1367e461299e13a4797bc9d9d950184edd") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:keywords "faces" "languages" "i3wm" "font-lock") (:url . "https://github.com/Alexander-Miller/i3wm-Config-Mode"))]) + (ialign . [(20200711 1117) ((emacs (24 4))) "visual align-regexp" single ((:commit . "eca40b8b59ea713dba21b18f5b047a6c086b91dc") (:authors ("Michał Krzywkowski" . "k.michal@zoho.com")) (:maintainer "Michał Krzywkowski" . "k.michal@zoho.com") (:keywords "tools" "editing" "align" "interactive") (:url . "https://github.com/mkcms/interactive-align"))]) + (iasm-mode . [(20171023 1422) nil "interactive assembly major mode." single ((:commit . "abbec7f308f9ce97beeb57e459fff35f559b4c18") (:authors ("Rémi Attab" . "remi.attab@gmail.com")) (:maintainer "Rémi Attab" . "remi.attab@gmail.com") (:keywords ":" "tools") (:url . "https://github.com/RAttab/iasm-mode"))]) + (ibuffer-git . [(20110508 731) nil "show git status in ibuffer column" single ((:commit . "d326319c05ddb8280885b31f9094040c1b365876") (:authors ("Jonathan Rockway" . "jon@jrock.us")) (:maintainer "Jonathan Rockway" . "jon@jrock.us") (:keywords "convenience"))]) + (ibuffer-project . [(20210205 1940) ((emacs (25 1))) "Group ibuffer's list by project or any function" single ((:commit . "2483d2dbd715c4bd892d1fbc968a17a01888cb2d") (:authors ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainer "Andrii Kolomoiets" . "andreyk.mad@gmail.com") (:keywords "tools") (:url . "https://github.com/muffinmad/emacs-ibuffer-project"))]) + (ibuffer-projectile . [(20200805 604) ((projectile (0 11 0)) (emacs (24 1))) "Group ibuffer's list by projectile root" single ((:commit . "ecbe482804a217b1471593f6c7a8b3d64f3cdc47") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "convenience") (:url . "https://github.com/purcell/ibuffer-projectile"))]) + (ibuffer-rcirc . [(20150215 2118) ((cl-lib (0 2))) "Ibuffer integration for rcirc" single ((:commit . "8a4409b1c679d65c819dee4085faf929840e79f8") (:authors ("Fabián Ezequiel Gallina" . "fgallina@gnu.org")) (:maintainer "Fabián Ezequiel Gallina" . "fgallina@gnu.org") (:keywords "buffer" "convenience" "comm") (:url . "https://github.com/fgallina/ibuffer-rcirc"))]) + (ibuffer-sidebar . [(20210508 836) ((emacs (25 1))) "Sidebar for `ibuffer'" single ((:commit . "fb685e1e43db979e25713081d8ae4073453bbd5e") (:authors ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com") (:keywords "ibuffer" "files" "tools") (:url . "https://github.com/jojojames/ibuffer-sidebar"))]) + (ibuffer-tramp . [(20151118 1739) nil "Group ibuffer's list by TRAMP connection" single ((:commit . "bcad0bda3a67f55d1be936bf8fa9ef735fe1e3f3") (:authors ("Svend Sorensen" . "svend@ciffer.net")) (:maintainer "Svend Sorensen" . "svend@ciffer.net") (:keywords "convenience") (:url . "http://github.com/svend/ibuffer-tramp"))]) + (ibuffer-vc . [(20200805 604) ((emacs (24 1)) (cl-lib (0 2))) "Group ibuffer's list by VC project, or show VC status" single ((:commit . "5fa6aea09bc67f71ea743302d609f459967b1e81") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "convenience") (:url . "https://github.com/purcell/ibuffer-vc"))]) + (iceberg-theme . [(20200812 943) ((emacs (26 1)) (solarized-theme (1 3))) "Well-designed, eye-friendly, dark blue color scheme" single ((:commit . "183b41eae07d94d4a8f299306078410bddc41d34") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "convenience") (:url . "https://github.com/conao3/iceberg-theme.el"))]) + (icomplete-vertical . [(20210603 1343) ((emacs (26 1))) "Display icomplete candidates vertically" tar ((:commit . "3bee30b374226deecde8a5cbbc6ca8471c303348") (:authors ("Omar Antolín Camarena" . "omar@matem.unam.mx")) (:maintainer "Omar Antolín Camarena" . "omar@matem.unam.mx") (:keywords "convenience" "completion") (:url . "https://github.com/oantolin/icomplete-vertical"))]) + (icsql . [(20210605 1658) ((emacs (26)) (choice-program (0 13)) (buffer-manage (0 12))) "Interactive iSQL iteraface to ciSQL" single ((:commit . "bc7c5f27f9d804613759a1d1357166f9ccecbe0e") (:authors ("Paul Landes")) (:maintainer "Paul Landes") (:keywords "isql" "sql" "rdbms" "data") (:url . "https://github.com/plandes/icsql"))]) + (id-manager . [(20170320 1246) nil "id-password management" single ((:commit . "14ebc35db298aac4dedc8aa188bc46bacab81f3b") (:authors ("SAKURAI Masashi <m.sakurai atmark kiwanami.net>")) (:maintainer "SAKURAI Masashi <m.sakurai atmark kiwanami.net>") (:keywords "password" "convenience"))]) + (idea-darkula-theme . [(20160416 2303) ((emacs (24 1))) "Color theme based on IntelliJ IDEA Darkula color theme" single ((:commit . "52602d9b91883e1f297d000951aeed48bf60176e") (:authors ("Alexey Veretennikov <alexey dot veretennikov at gmail dot com>")) (:maintainer "Alexey Veretennikov <alexey dot veretennikov at gmail dot com>") (:keywords "themes") (:url . "http://github.com/fourier/idea-darkula-theme"))]) + (identica-mode . [(20130204 2253) nil "Major mode API client for status.net open microblogging" tar ((:commit . "cf9183ee11ac922e85c7c908f04e2d00b03111b3") (:authors ("Gabriel Saldana" . "gsaldana@gmail.com")) (:maintainer "Gabriel Saldana" . "gsaldana@gmail.com") (:keywords "identica" "web") (:url . "http://blog.gabrielsaldana.org/identica-mode-for-emacs/"))]) + (idle-highlight-in-visible-buffers-mode . [(20181027 1531) nil "highlight the word the point is on" single ((:commit . "8d8de309d5bd4b035c01bf7f0cfc6e079c79d898") (:authors ("Ignacy Moryc")) (:maintainer "Ignacy Moryc") (:keywords "convenience") (:url . "https://github.com/ignacy/idle-highlight-in-visible-buffers"))]) + (idle-highlight-mode . [(20120920 1648) nil "highlight the word the point is on" single ((:commit . "c466f2a9e291f9da1167dc879577b2e1a7880482") (:authors ("Phil Hagelberg, Cornelius Mika")) (:maintainer "Phil Hagelberg, Cornelius Mika") (:keywords "convenience") (:url . "http://www.emacswiki.org/cgi-bin/wiki/IdleHighlight"))]) + (idle-org-agenda . [(20190106 1844) nil "Shows your agenda when editor is idle." single ((:commit . "8e6052fc4923c30132052d67d794b76c92851c20") (:authors ("John Wiegley" . "jwiegley@gmail.com")) (:maintainer "Enis Özgen" . "mail@enisozgen.com") (:keywords "org" "org-mode" "org-agenda" "calendar") (:url . "https://github.com/enisozgen/idle-org-agenda"))]) + (idle-require . [(20090715 2203) nil "load elisp libraries while Emacs is idle" single ((:commit . "33592bb098223b4432d7a35a1d65ab83f47c1ec1") (:authors ("Nikolaj Schumacher <bugs * nschum de>")) (:maintainer "Nikolaj Schumacher <bugs * nschum de>") (:keywords "internal") (:url . "http://nschum.de/src/emacs/idle-require/"))]) + (ido-at-point . [(20151021 757) ((emacs (24))) "ido-style completion-at-point" single ((:commit . "e5907bbe8a3d148d07698b76bd994dc3076e16ee") (:authors ("katspaugh")) (:maintainer "katspaugh") (:keywords "convenience" "abbrev") (:url . "https://github.com/katspaugh/ido-at-point"))]) + (ido-complete-space-or-hyphen . [(20210206 1505) nil "Allow spaces to also match hyphens in ido" single ((:commit . "d1244243e042b8d5b6b991db752a17a44ea169bc") (:authors ("Ryan C. Thompson" . "rct@thompsonclan.org") ("Ian Yang <me (at) iany.me>")) (:maintainer "Ryan C. Thompson" . "rct@thompsonclan.org") (:keywords "ido" "completion" "convenience") (:url . "https://github.com/DarwinAwardWinner/ido-complete-space-or-hyphen"))]) + (ido-completing-read+ . [(20210529 1318) ((emacs (24 4)) (seq (0 5)) (memoize (1 1))) "A completing-read-function using ido" single ((:commit . "49e7967ea8c0ab0a206b40d70fc19be115083fa1") (:authors ("Ryan C. Thompson" . "rct@thompsonclan.org")) (:maintainer "Ryan C. Thompson" . "rct@thompsonclan.org") (:keywords "ido" "completion" "convenience") (:url . "https://github.com/DarwinAwardWinner/ido-completing-read-plus"))]) + (ido-exit-target . [(20170717 1851) ((emacs (24 4))) "Commands and keys for selecting other window and frame targets within ido" single ((:commit . "e56fc6928649c87ccf39d56d84ab53ebaced1f73") (:authors ("justin talbott" . "justin@waymondo.com")) (:maintainer "justin talbott" . "justin@waymondo.com") (:keywords "convenience" "tools" "extensions") (:url . "https://github.com/waymondo/ido-exit-target"))]) + (ido-flex-with-migemo . [(20190408 350) ((flx-ido (0 6 1)) (migemo (1 9 1)) (emacs (24 4))) "use ido with flex and migemo" single ((:commit . "da64f2fe3849492d35e155d81a817308a4853473") (:authors ("ROCKTAKEY " . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY " . "rocktakey@gmail.com") (:keywords "matching") (:url . "https://github.com/ROCKTAKEY/ido-flex-with-migemo"))]) + (ido-gnus . [(20140216 1646) ((gnus (5 13))) "Access gnus groups or servers using ido" single ((:commit . "f5fe3f6aa8086f675ba216abace9e3d5f2e3a089") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:keywords "comm") (:url . "https://github.com/vapniks/ido-gnus"))]) + (ido-grid-mode . [(20160122 1139) ((emacs (24 4))) "Display ido-prospects in the minibuffer in a grid." single ((:commit . "7cfca3988a6dc3ad18e28abe114218095ff2366f") (:authors ("Tom Hinton")) (:maintainer "Tom Hinton" . "t@larkery.com") (:keywords "convenience") (:url . "https://github.com/larkery/ido-grid-mode.el"))]) + (ido-hacks . [(20190206 2153) nil "Put more IDO in your IDO" single ((:commit . "d2153a3e8d23436ee07ecae2a106f434361a10c5") (:authors ("Andreas Politz")) (:maintainer "Scott Jaderholm" . "jaderholm@gmail.com") (:keywords "convenience"))]) + (ido-load-library . [(20140611 1600) ((persistent-soft (0 8 8)) (pcache (0 2 3))) "Load-library alternative using ido-completing-read" single ((:commit . "e03b55957c93aa1a7dd190e173e16ec59dbb2ba7") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "maint" "completion") (:url . "http://github.com/rolandwalker/ido-load-library"))]) + (ido-migemo . [(20191017 1919) ((migemo (1 9 1))) "Migemo plug-in for Ido" single ((:commit . "09a2cc175b500cab7655a25ffc982e78d46ca669") (:authors ("myuhe <yuhei.maeda_at_gmail.com>")) (:maintainer "myuhe") (:keywords "files") (:url . "https://github.com/myuhe/ido-migemo.el"))]) + (ido-occasional . [(20150214 1248) ((emacs (24 1))) "Use ido where you choose." single ((:commit . "d405f1795e1e0c63be411ee2825184738d29c33a") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "completion") (:url . "https://github.com/abo-abo/ido-occasional"))]) + (ido-select-window . [(20131220 2047) ((emacs (24 1))) "Select a window using ido and buffer names" single ((:commit . "a64707d8d154664d50d12e26417d586e4c3dd78b") (:authors ("Peter Jones" . "pjones@devalot.com")) (:maintainer "Peter Jones" . "pjones@devalot.com") (:url . "https://github.com/pjones/ido-select-window"))]) + (ido-skk . [(20151111 950) ((emacs (24 4)) (ddskk (20150912 1820))) "ido interface for skk henkan" single ((:commit . "89a2e62799bff2841ff634517c86084c4ce69246") (:authors ("tsukimizake <shomasd_at_gmail.com>")) (:maintainer "tsukimizake <shomasd_at_gmail.com>") (:keywords "languages") (:url . "https://github.com/tsukimizake/ido-skk"))]) + (ido-sort-mtime . [(20171121 859) nil "Sort Ido's file list by modification time" single ((:commit . "f638ff0c922af862f5211779f2311a27fde428eb") (:authors ("Paweł Kraśnicki")) (:maintainer "Paweł Kraśnicki") (:keywords "convenience" "files"))]) + (ido-springboard . [(20170106 755) nil "Temporarily change default-directory for one command" single ((:commit . "687d1e5898a880878995dc9bffe93b4598366203") (:authors ("John Wiegley" . "jwiegley@gmail.com")) (:maintainer "John Wiegley" . "jwiegley@gmail.com") (:keywords "ido") (:url . "https://github.com/jwiegley/springboard"))]) + (ido-vertical-mode . [(20210205 436) ((emacs (24 4))) "Makes ido-mode display vertically" single ((:commit . "b1659e967da0687abceca733b389ace24004fa66") (:authors ("Steven Degutis")) (:maintainer "Christopher Reichert" . "creichert07@gmail.com") (:keywords "convenience") (:url . "https://github.com/creichert/ido-vertical-mode.el"))]) + (ido-yes-or-no . [(20161108 2351) ((ido-completing-read+ (0))) "Use Ido to answer yes-or-no questions" single ((:commit . "c55383b1fce5879e87e7ca6809fc60534508e182") (:authors ("Ryan C. Thompson")) (:maintainer "Ryan C. Thompson") (:keywords "convenience" "completion" "ido") (:url . "https://github.com/DarwinAwardWinner/ido-yes-or-no"))]) + (idomenu . [(20141123 2120) nil "imenu tag selection a la ido" single ((:commit . "4b0152d606360c70204fb4c27f68de79ca885386") (:authors ("Georg Brandl" . "georg@python.org")) (:maintainer "Georg Brandl" . "georg@python.org"))]) + (idris-mode . [(20210223 850) ((emacs (24)) (prop-menu (0 1)) (cl-lib (0 5))) "Major mode for editing Idris code" tar ((:commit . "80aabd2566082aa67d17eccdd80e9f1fb10c9ec8") (:keywords "languages") (:url . "https://github.com/idris-hackers/idris-mode"))]) + (ids-edit . [(20170818 1502) ((emacs (24 3))) "IDS (Ideographic Description Sequence) editing tool" tar ((:commit . "8562a6cbfb3f2d44bc6f62ab15081a80f8fee502") (:authors ("KAWABATA, Taichi <kawabata.taichi_at_gmail.com>")) (:maintainer "KAWABATA, Taichi <kawabata.taichi_at_gmail.com>") (:keywords "i18n" "wp") (:url . "http://github.com/kawabata/ids-edit"))]) + (iedit . [(20210612 546) nil "Edit multiple regions in the same way simultaneously." tar ((:commit . "3247f3029a4e309c71a5b066fa4299d4cbb79fbc") (:authors ("Victor Ren" . "victorhge@gmail.com")) (:maintainer "Victor Ren" . "victorhge@gmail.com") (:keywords "occurrence" "region" "simultaneous" "refactoring") (:url . "https://github.com/victorhge/iedit"))]) + (ietf-docs . [(20190420 851) nil "Fetch, Cache and Load IETF documents" single ((:commit . "ae157549eae5ec78dcbf215c2f48cb662b73abd0") (:authors ("Christian E. Hopps" . "chopps@gmail.com")) (:maintainer "Christian E. Hopps" . "chopps@gmail.com") (:keywords "ietf" "rfc") (:url . "https://github.com/choppsv1/ietf-docs"))]) + (iflipb . [(20210515 829) nil "Interactively flip between recently visited buffers" single ((:commit . "94f12bb6d2e03690562647b5fbb7b6672ac83e37") (:authors ("Joel Rosdahl" . "joel@rosdahl.net")) (:maintainer "Joel Rosdahl" . "joel@rosdahl.net") (:url . "https://github.com/jrosdahl/iflipb"))]) + (ignoramus . [(20210515 1422) ((emacs (24 3))) "Ignore backups, build files, et al." single ((:commit . "e509e134eeb81617414e5381b610108c967dbc45") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "convenience" "tools") (:url . "http://github.com/rolandwalker/ignoramus"))]) + (igv . [(20141210 1227) nil "Control Integrative Genomic Viewer within Emacs" single ((:commit . "47ac6ceede252f451348a2c696398c0cb5279555") (:authors ("Stefano Barbi" . "stefanobarbi@gmail.com")) (:maintainer "Stefano Barbi" . "stefanobarbi@gmail.com"))]) + (image+ . [(20150707 1616) ((cl-lib (0 3))) "Image manipulate extensions for Emacs" single ((:commit . "6834d0c09bb4df9ecc0d7a559bd7827fed48fffc") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "multimedia" "extensions") (:url . "https://github.com/mhayashi1120/Emacs-imagex"))]) + (image-archive . [(20150621 132) ((emacs (24)) (cl-lib (0 5))) "Image thumbnails in archive file with non-blocking" single ((:commit . "8d29535bd832329ffeeac780aae7aa8919af1175") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "multimedia") (:url . "https://github.com/mhayashi1120/Emacs-image-archive"))]) + (image-dired+ . [(20150430 544) ((cl-lib (0 3))) "Image-dired extensions" single ((:commit . "b68094625d963056ad64e0e44af0e2266b2eadc7") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "extensions" "multimedia") (:url . "https://github.com/mhayashi1120/Emacs-image-diredx"))]) + (imakado . [(20141024 923) nil "imakado's usefull macros and functions" single ((:commit . "00a1e7eea2cb9e9066343a23927d6c747707902f") (:authors ("imakado <ken.imakado_at_gmail.com>")) (:maintainer "imakado") (:keywords "convenience") (:url . "https://github.com/imakado/emacs-imakado"))]) + (imake . [(20200103 1238) ((emacs (24 3))) "Simple, opinionated make target runner" single ((:commit . "100d62c7095743fadddfad5b9e0740ee386ba4cf") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/tarsius/imake"))]) + (imapfilter . [(20180318 2027) nil "run the imapfilter executable" single ((:commit . "79bbbe918319bc1e8f42a0bef53dc7c77fe868ea") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "mail") (:url . "https://github.com/tarsius/imapfilter"))]) + (imbot . [(20210423 731) ((emacs (25 1))) "Automatic system input method switcher" tar ((:commit . "01bf1e1101ac9cd34bfda7016ce0f82f97a3de35") (:keywords "convenience") (:url . "https://github.com/QiangF/imbot"))]) + (imenu-anywhere . [(20210201 1704) ((cl-lib (0 5)) (emacs (25))) "ido/ivy/helm imenu across same mode/project/etc buffers" single ((:commit . "06ec33d79e33edf01b9118aead1eabeae8ee08b1") (:authors ("Vitalie Spinu <spinuvit.list[ aaattt ]gmail[ dot ]com>")) (:maintainer "Vitalie Spinu <spinuvit.list[ aaattt ]gmail[ dot ]com>") (:keywords "ido" "imenu" "tags") (:url . "https://github.com/vitoshka/imenu-anywhere"))]) + (imenu-extra . [(20201229 1035) ((emacs (25 1))) "Add extra items into existing imenu items" single ((:commit . "a8d867e7cc446afcd4dc71d4f528e58d639840e1") (:authors ("Chen Bin <chenbin DOT sh AT gmail DOT com>")) (:maintainer "Chen Bin <chenbin DOT sh AT gmail DOT com>") (:keywords "convenience") (:url . "https://github.com/redguardtoo/imenu-extra"))]) + (imenu-list . [(20210420 1200) ((emacs (24 3))) "Show imenu entries in a separate buffer" single ((:commit . "76f2335ee6f2f066d87fe4e4729219d70c9bc70d") (:authors ("Bar Magal (2015)")) (:maintainer "Bar Magal (2015)") (:url . "https://github.com/bmag/imenu-list"))]) + (imenus . [(20200730 855) ((cl-lib (0 5))) "Imenu for multiple buffers and without subgroups" single ((:commit . "90200f5f22377903b405082eabe185447968f3e2") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "tools" "convenience") (:url . "https://github.com/alezost/imenus.el"))]) + (imgbb . [(20180609 1649) ((emacs (24)) (request (0 3 0))) "Simple image upload client for imgbb.com" single ((:commit . "a524a46263835aa474f908827ebab4e8fa586001") (:authors ("Peter" . "craven@gmx.net")) (:maintainer "Peter" . "craven@gmx.net") (:keywords "extensions") (:url . "https://github.com/ecraven/imgbb.el"))]) + (immaterial-theme . [(20210126 1127) ((emacs (25))) "A flexible theme based on material design principles" tar ((:commit . "c5684a17c78e6e05ea0bdb63e44373b064db935a") (:authors ("Peter Gardfjäll")) (:maintainer "Peter Gardfjäll") (:keywords "themes") (:url . "https://github.com/petergardfjall/emacs-immaterial-theme"))]) + (immortal-scratch . [(20160517 2118) nil "respawn the scratch buffer when it's killed" single ((:commit . "faeab0ad6c33c74c0cbd1dfcebffaa0690de40c6") (:authors ("Jonathan Kotta" . "jpkotta@gmail.com")) (:maintainer "Jonathan Kotta" . "jpkotta@gmail.com"))]) + (immutant-server . [(20140311 2208) nil "Run your Immutant server in Emacs" single ((:commit . "2a21e65588acb6a976f2998e30b21fdabdba4dbb") (:authors ("David Leatherman" . "leathekd@gmail.com")) (:maintainer "David Leatherman" . "leathekd@gmail.com") (:url . "http://www.github.com/leathekd/immutant-server.el"))]) + (impatient-mode . [(20200723 2117) ((emacs (24 3)) (simple-httpd (1 5 0)) (htmlize (1 40))) "Serve buffers live over HTTP" tar ((:commit . "cbddfd54242210df3e1c3b590fada5bb5423f5ed") (:authors ("Brian Taylor" . "el.wubo@gmail.com")) (:maintainer "Brian Taylor" . "el.wubo@gmail.com") (:url . "https://github.com/netguy204/imp.el"))]) + (impatient-showdown . [(20200914 221) ((emacs (24 3)) (impatient-mode (1 1))) "Preview markdown buffer live over HTTP using showdown" tar ((:commit . "60ae30d07b857c074e2918680805cb37249de0ad") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/impatient-showdown"))]) + (import-js . [(20180709 1833) ((grizzl (0 1 0)) (emacs (24))) "Import Javascript dependencies" single ((:commit . "fb1f167e33c388b09a2afd32fbda90a67bfb2e40") (:authors ("Kevin Kehl" . "kevin.kehl@gmail.com")) (:maintainer "Kevin Kehl" . "kevin.kehl@gmail.com") (:keywords "javascript") (:url . "http://github.com/Galooshi/emacs-import-js/"))]) + (import-popwin . [(20170218 1407) ((emacs (24 3)) (popwin (0 6))) "popwin buffer near by import statements with popwin" single ((:commit . "bb05a9e226f8c63fe7b18a3e92010357049ab5ba") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-import-popwin"))]) + (importmagic . [(20180520 303) ((f (0 11 0)) (epc (0 1 0)) (emacs (24 3))) "Fix Python imports using importmagic." tar ((:commit . "701dfcca5f3ab42be0f26a8d381d7116c79be850") (:authors ("Nicolás Salas V." . "nikosalas@gmail.com")) (:maintainer "Nicolás Salas V." . "nikosalas@gmail.com") (:keywords "languages" "convenience") (:url . "https://github.com/anachronic/importmagic.el"))]) + (indent-control . [(20210508 309) ((emacs (26 1))) "Management for indentation level" single ((:commit . "044291cf063a86927dae50dffdb2b0e2e3f9199b") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/indent-control"))]) + (indent-guide . [(20210115 400) nil "show vertical lines to guide indentation" single ((:commit . "d388c3387781a370ca13233ff445d03f3c5cf12f") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))]) + (indent-info . [(20210111 745) ((emacs (24 3))) "Show indentation information in status bar" single ((:commit . "05a787afeb9946714d8b0c724868195a678db49e") (:authors ("Terje Larsen" . "terlar@gmail.com")) (:maintainer "Terje Larsen" . "terlar@gmail.com") (:keywords "convenience" "tools") (:url . "https://github.com/terlar/indent-info.el"))]) + (indent-lint . [(20200812 949) ((emacs (25 1)) (async-await (1 0)) (async (1 9 4))) "Async indentation checker" single ((:commit . "c55f4ded11e8e50a96f43675a071354a8fb501c3") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "tools") (:url . "https://github.com/conao3/indent-lint.el"))]) + (indent-tools . [(20190606 1642) ((s (0)) (hydra (0)) (yafolding (0))) "Indent, navigate (and more) by blocks of indentation: yaml, python etc." tar ((:commit . "c419874e6fb296ecdba94b2f4b73c9eecdd5329d") (:authors ("vindarel" . "vindarel@mailz.org")) (:maintainer "vindarel" . "vindarel@mailz.org") (:keywords "indentation" "movements" "navigation" "kill" "fold" "yaml" "python") (:url . "https://gitlab.com/emacs-stuff/indent-tools/"))]) + (indian-ext . [(20190424 1547) ((emacs (24))) "Extension to Indian language utilities" single ((:commit . "c941cde1205642c6b933ae6abbc47d199f609df0") (:authors ("Patrick McAllister" . "pma@rdorte.org")) (:maintainer "Patrick McAllister" . "pma@rdorte.org") (:keywords "i18n" "tools" "wp" "indian" "devanagari" "encoding") (:url . "https://github.com/paddymcall/indian-ext"))]) + (indicators . [(20161211 1126) ((dash (2 13 0)) (cl-lib (0 5 0))) "Display the buffer relative location of line in the fringe." single ((:commit . "f62a1201f21453e3aca93f48483e65ae8251432e") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:keywords "fringe" "frames") (:url . "https://github.com/Fuco1/indicators.el"))]) + (indium . [(20210309 1210) ((emacs (25)) (seq (2 16)) (js2-mode (20140114)) (js2-refactor (0 9 0)) (company (0 9 0)) (json-process-client (0 2 0))) "JavaScript Awesome Development Environment" tar ((:commit . "8499e156bf7286846c3a2bf8c9e0c4d4f24b224c") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr") (:keywords "tools" "javascript") (:url . "https://github.com/NicolasPetton/indium"))]) + (indy . [(20190807 625) nil "A minor mode and EDSL to manage your mode's indentation rules." single ((:commit . "abc5bee424780ad2de5520f8fefbf8e120c0d9ed") (:authors ("Kevin W. van Rooijen" . "kevin.van.rooijen@attichacker.com")) (:maintainer "Kevin W. van Rooijen" . "kevin.van.rooijen@attichacker.com") (:keywords "convenience" "matching" "tools"))]) + (inf-clojure . [(20210322 1421) ((emacs (25 1)) (clojure-mode (5 11))) "Run an external Clojure process in an Emacs buffer" single ((:commit . "a2cebf5362fe583538dda8dcf6348a8d73b462a2") (:keywords "processes" "clojure") (:url . "http://github.com/clojure-emacs/inf-clojure"))]) + (inf-crystal . [(20180119 211) ((emacs (24 3)) (crystal-mode (0 1 0))) "Run a Inferior-Crystal process in a buffer" single ((:commit . "02007b2a2a3bea44902d7c83c4acba1e39d278e3") (:authors ("Brantou" . "brantou89@gmail.com")) (:maintainer "Brantou" . "brantou89@gmail.com") (:keywords "languages" "crystal") (:url . "https://github.com/brantou/inf-crystal.el"))]) + (inf-elixir . [(20210315 1723) ((emacs (25 1))) "Run an interactive Elixir shell" single ((:commit . "b526ce852886d1863163e054fcbbcbb83c55b32a") (:authors ("Jonathan Arnett" . "jonathan.arnett@protonmail.com")) (:maintainer "Jonathan Arnett" . "jonathan.arnett@protonmail.com") (:keywords "languages" "processes" "tools") (:url . "https://github.com/J3RN/inf-elixir"))]) + (inf-mongo . [(20180408 1338) nil "Run a MongoDB shell process in a buffer" single ((:commit . "2e498d1c88bd1904eeec18ed06b1a0cf8bdc2a92") (:authors ("Tobias Svensson")) (:maintainer "Tobias Svensson") (:keywords "databases" "mongodb") (:url . "http://github.com/endofunky/inf-mongo"))]) + (inf-ruby . [(20210607 2336) ((emacs (24 3))) "Run a Ruby process in a buffer" single ((:commit . "03dd9c9d4e3f94f5519a786804d3ef9d3a09ef9f") (:authors ("Yukihiro Matsumoto") ("Nobuyoshi Nakada") ("Cornelius Mika" . "cornelius.mika@gmail.com") ("Dmitry Gutov" . "dgutov@yandex.ru") ("Kyle Hargraves" . "pd@krh.me")) (:maintainer "Yukihiro Matsumoto") (:keywords "languages" "ruby") (:url . "http://github.com/nonsequitur/inf-ruby"))]) + (inflections . [(20210110 2237) ((cl-lib (0 5)) (emacs (24))) "convert english words between singular and plural" single ((:commit . "55caa66a7cc6e0b1a76143fd40eff38416928941") (:authors ("Dmitry Galinsky, Howard Yeh")) (:maintainer "Dmitry Galinsky, Howard Yeh") (:keywords "languages" "tools" "wp") (:url . "https://github.com/eschulte/jump.el"))]) + (info-beamer . [(20210427 1033) ((emacs (24 4))) "Utilities for working with info-beamer" single ((:commit . "6b4cc29f1aec72d8e23b2c25a99cdd84e6cdc92b") (:authors ("Daniel Kraus" . "daniel@kraus.my")) (:maintainer "Daniel Kraus" . "daniel@kraus.my") (:keywords "tools" "processes" "comm") (:url . "https://github.com/dakra/info-beamer.el"))]) + (info-buffer . [(20170112 1422) nil "Display info topics in separate buffers" single ((:commit . "d35dad6e766c6e2ddb8dc6acb4ce5b6e10fbcaa7") (:authors ("Lluís Vilanova" . "vilanova@ac.upc.edu")) (:maintainer "Lluís Vilanova" . "vilanova@ac.upc.edu") (:keywords "docs" "info") (:url . "http://www.github.com/llvilanova/info-buffer"))]) + (info-colors . [(20200125 1447) ((emacs (24)) (cl-lib (0 5))) "Extra colors for Info-mode" single ((:commit . "47ee73cc19b1049eef32c9f3e264ea7ef2aaf8a5") (:authors ("Tuấn-Anh Nguyễn" . "ubolonton@gmail.com")) (:maintainer "Tuấn-Anh Nguyễn" . "ubolonton@gmail.com") (:keywords "faces") (:url . "https://github.com/ubolonton/info-colors"))]) + (info-rename-buffer . [(20200328 1450) ((emacs (24 3))) "Rename Info buffers to match manuals" single ((:commit . "87fb263b18717538fd04878e3358e1e720415db8") (:authors ("Bruno Félix Rezende Ribeiro" . "oitofelix@gnu.org")) (:maintainer "Bruno Félix Rezende Ribeiro" . "oitofelix@gnu.org") (:keywords "help") (:url . "https://github.com/oitofelix/info-rename-buffer"))]) + (inform . [(20200723 500) ((emacs (25 1))) "Symbol links in Info buffers to their help documentation." tar ((:commit . "8ff0a19a9f40cfa8283da8ed73de94c35a327423") (:authors ("H. Dieter Wilhelm" . "dieter@duenenhof-wilhelm.de")) (:maintainer "H. Dieter Wilhelm") (:keywords "help" "docs" "convenience") (:url . "https://github.com/dieter-wilhelm/inform"))]) + (inform7 . [(20200430 1539) ((emacs (24 3)) (s (1 12 0))) "Major mode for working with Inform 7 files" single ((:commit . "a409bbc6f04264f7f00616a995fa6ecf59d33d0d") (:authors ("Ben Moon" . "software@guiltydolphin.com")) (:maintainer "Ben Moon" . "software@guiltydolphin.com") (:keywords "languages") (:url . "https://github.com/GuiltyDolphin/inform7-mode"))]) + (inherit-local . [(20170409 1649) ((emacs (24 3))) "Inherited buffer-local variables" single ((:commit . "b1f4ff9c41f9d64e4adaf5adcc280b82f084cdc7") (:authors ("Shea Levy")) (:maintainer "Shea Levy") (:url . "https://github.com/shlevy/inherit-local/tree-master/"))]) + (inheritenv . [(20210204 354) ((emacs (24 4))) "Make temp buffers inherit buffer-local environment variables" single ((:commit . "7e4c8b0d0a43b6f1c6c4d6dbd2f3bf5ce7f20067") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "unix") (:url . "https://github.com/purcell/inheritenv"))]) + (ini-mode . [(20170424 909) nil "Major mode for Windows-style ini files." single ((:commit . "2194cfa2fd13196a37350ec20b3f00dcf6162b7c") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "languages" "faces") (:url . "https://github.com/Lindydancer/ini-mode"))]) + (init-loader . [(20200520 2345) nil "Loader for configuration files" single ((:commit . "10b8d7b12acbd1036e68dfb59f460714baedaa33") (:authors ("IMAKADO" . "ken.imakado@gmail.com")) (:maintainer "IMAKADO" . "ken.imakado@gmail.com") (:url . "https://github.com/emacs-jp/init-loader/"))]) + (init-open-recentf . [(20210528 1902) ((emacs (24 4))) "Invoke a command immediately after startup" single ((:commit . "c019ea85a9c589815b0af60153858d09bcef130e") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "files" "recentf" "after-init-hook") (:url . "https://github.com/zonuexe/init-open-recentf.el"))]) + (initsplit . [(20160919 1818) nil "code to split customizations into different files" single ((:commit . "c941d436eb2b10b01c76a582c5a2b23fb30751aa") (:authors ("John Wiegley <johnw@gnu.org>, Dave Abrahams" . "dave@boostpro.com")) (:maintainer "John Wiegley <johnw@gnu.org>, Dave Abrahams" . "dave@boostpro.com") (:keywords "lisp") (:url . "http://www.gci-net.com/users/j/johnw/emacs.html"))]) + (ink-mode . [(20201105 2242) ((emacs (26 1))) "Major mode for writing interactive fiction in Ink" tar ((:commit . "63c7ef39acf434a1682951bcf352e8fe1e1ac6d9") (:authors ("Erik Sjöstrand") ("Damien Picard")) (:maintainer "Damien Picard") (:keywords "languages" "wp" "hypermedia") (:url . "https://github.com/Kungsgeten/ink-mode"))]) + (inkpot-theme . [(20210427 1337) nil "port of vim's inkpot theme" single ((:commit . "7c3a0a76fa00db41a4d3d990cc98a1c6b088df3d") (:authors ("Sarah Iovan" . "sarah@hwaetageek.com") ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Sarah Iovan" . "sarah@hwaetageek.com") (:keywords "color" "theme") (:url . "https://gitlab.com/ideasman42/emacs-inkpot-theme"))]) + (inline-crypt . [(20170824 900) nil "Simple inline encryption via openssl" tar ((:commit . "281385b383f850fd2e895926b1cef804dd052633") (:authors ("Daniel Ralston" . "Wubbulous@gmail.com")) (:maintainer "Daniel Ralston" . "Wubbulous@gmail.com") (:keywords "crypt") (:url . "https://github.com/Sodel-the-Vociferous/inline-crypt-el"))]) + (inline-docs . [(20170523 450) ((emacs (24 3))) "Show inline contextual docs." single ((:commit . "b57f1681be6147f999cdc12abff414a0442e8897") (:authors ("stardiviner" . "numbchild@gmail.com")) (:maintainer "stardiviner" . "numbchild@gmail.com") (:keywords "inline" "docs" "overlay") (:url . "https://github.com/stardiviner/inline-docs.el"))]) + (inlineR . [(20191017 1920) nil "insert Tag for inline image of R graphics" single ((:commit . "bf6450a3540aa3538546d312324c41befd0a4e54") (:authors ("myuhe <yuhei.maeda_at_gmail.com>")) (:maintainer "myuhe") (:keywords "convenience" "iimage.el" "cacoo.el") (:url . "https://github.com/myuhe/inlineR.el"))]) + (insert-char-preview . [(20201023 2108) ((emacs (24 1))) "Insert Unicode char" single ((:commit . "0e4a62b5407fb1bed8920a4c13cf9a91065e15ad") (:authors ("Matsievskiy S.V.")) (:maintainer "Matsievskiy S.V.") (:keywords "convenience") (:url . "https://gitlab.com/matsievskiysv/insert-char-preview"))]) + (insert-esv . [(20201201 722) ((emacs (24 3)) (request (0 3 2))) "Insert ESV Bible passages" single ((:commit . "067bdd92ab2fccdfdee3d8707aa570527c74fd6a") (:authors ("Sam (sam030820)")) (:maintainer "Sam (sam030820)") (:keywords "convenience") (:url . "https://github.com/sam030820/insert-esv/"))]) + (insert-kaomoji . [(20200325 2248) ((emacs (24 4))) "Easily insert kaomojis" tar ((:commit . "d18423f78cc02ba866b1a1dfb0617476cd941c54") (:authors ("Philip K." . "philip@warpmail.net")) (:maintainer "Philip K." . "philip@warpmail.net") (:keywords "wp") (:url . "https://git.sr.ht/~zge/kaomoji"))]) + (insert-shebang . [(20201203 1648) nil "Insert shebang line automatically." single ((:commit . "cc8cea997a8523bce9f303de993af3a73eb0d2e2") (:authors ("Sachin Patil" . "iclcoolster@gmail.com")) (:maintainer "Sachin Patil" . "iclcoolster@gmail.com") (:keywords "shebang" "tool" "convenience") (:url . "https://gitlab.com/psachin/insert-shebang"))]) + (insfactor . [(20141117 2) nil "Client for a Clojure project with insfactor in it" single ((:commit . "7ef5446cebb08a17d4106d2e6f3c053e49e1e829") (:authors ("John D. Hume" . "duelin.markers@gmail.com")) (:maintainer "John D. Hume" . "duelin.markers@gmail.com") (:keywords "clojure") (:url . "http://github.com/duelinmarkers/insfactor.el"))]) + (instapaper . [(20110419 1355) nil "No description available." single ((:commit . "f21531bcb935e7e9b9e8df83dd0e0838adbf9b1b") (:authors ("Jason F. McBrayer" . "jmcbray@carcosa.net")) (:maintainer "Jason F. McBrayer" . "jmcbray@carcosa.net") (:url . "htts://bitbucket.org/jfm/emacs-instapaper"))]) + (intel-hex-mode . [(20180423 31) nil "Mode for Intel Hex files." single ((:commit . "e83c94e1c31a8435a88b3ae395f2bc842ef83217") (:maintainer "Michael Schuldt" . "mbschuldt@gmail.com") (:keywords "tools" "hex") (:url . "https://github.com/mschuldt/intel-hex-mode"))]) + (intellij-theme . [(20171017 1415) nil "Inspired by IntelliJ's default theme" single ((:commit . "1bbfff8e6742d18e9b77ed796f44da3b7bd10606") (:authors ("Vladimir Polushin" . "vovapolu@gmail.com")) (:maintainer "Vladimir Polushin" . "vovapolu@gmail.com") (:keywords "faces"))]) + (interaction-log . [(20160305 1301) ((cl-lib (0))) "exhaustive log of interactions with Emacs" single ((:commit . "a49a06746d4df6bcfceec3c48dece065d635f9f9") (:authors ("Michael Heerdegen" . "michael_heerdegen@web.de")) (:maintainer "Michael Heerdegen" . "michael_heerdegen@web.de") (:keywords "convenience") (:url . "https://github.com/michael-heerdegen/interaction-log.el"))]) + (interval-list . [(20150327 1718) ((dash (2 4 0)) (cl-lib (0 5)) (emacs (24 4))) "Interval list data structure for 1D selections" single ((:commit . "38af7ecf0a493ad8f487074938a2a115f3531177") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:keywords "extensions" "data structure") (:url . "https://github.com/Fuco1/interval-list"))]) + (interval-tree . [(20130325 1407) ((dash (1 1 0))) "Interval tree data structure for 1D range queries" single ((:commit . "301302f480617091cf3ab6989caac385d52543dc") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:keywords "extensions" "data structure") (:url . "https://github.com/Fuco1/interval-tree"))]) + (inverse-acme-theme . [(20210204 1640) ((autothemer (0 2)) (cl-lib (0 5))) "A theme that looks like an inverse of Acme's color scheme." single ((:commit . "79008920ce7923312ada6f95a3ec1f96ce513c0b") (:authors ("Dylan Johnson")) (:maintainer "Dylan Johnson") (:url . "http://github.com/dcjohnson/inverse-acme-theme"))]) + (io-mode . [(20161004 756) nil "Major mode to edit Io language files in Emacs" single ((:commit . "fd65ae769093defcf554d6d637eba6e6dfc29f56") (:authors ("Sergei Lebedev" . "superbobry@gmail.com")) (:maintainer "Sergei Lebedev" . "superbobry@gmail.com") (:keywords "languages" "io") (:url . "https://github.com/superbobry/io-mode"))]) + (io-mode-inf . [(20140128 1934) nil "Interaction with an Io interpreter." single ((:commit . "6dd2bac3fd87484bb7d97e135b06c29d70b444b6") (:keywords "io" "languages") (:url . "https://github.com/slackorama/io-emacs"))]) + (iodine-theme . [(20151031 1639) ((emacs (24))) "A light emacs color theme" single ((:commit . "02fb780e1d8d8a6b9c709bfac399abe1665c6999") (:authors ("Srđan Panić" . "srdja.panic@gmail.com")) (:maintainer "Srđan Panić" . "srdja.panic@gmail.com") (:keywords "themes") (:url . "https://github.com/srdja/iodine-theme"))]) + (ipcalc . [(20200809 1444) ((cl-lib (0 5))) "IP subnet calculator" single ((:commit . "58b2b6c90af93ae46c5445b33ee4d1ef4bac1efb") (:authors ("\"Aleksandar Simic\"" . "asimic@gmail.com")) (:maintainer "\"Aleksandar Simic\"" . "asimic@gmail.com") (:keywords "networking" "tools") (:url . "http://github.com/dotemacs/ipcalc.el"))]) + (iplayer . [(20161120 2120) nil "Browse and download BBC TV/radio shows" single ((:commit . "b788fffa4b36bbd558047ffa6be51b1f0f462f23") (:authors ("Christophe Rhodes" . "csr21@cantab.net")) (:maintainer "Christophe Rhodes" . "csr21@cantab.net") (:keywords "multimedia" "bbc") (:url . "https://github.com/csrhodes/iplayer-el"))]) + (ipretty . [(20180606 522) nil "Interactive Emacs Lisp pretty-printing" single ((:commit . "042f5cc4e6f81d59115e8335c582bb5c571c2585") (:authors ("steckerhalter")) (:maintainer "steckerhalter") (:keywords "pretty-print" "elisp" "buffer") (:url . "https://framagit.org/steckerhalter/ipretty"))]) + (ipython-shell-send . [(20190220 2246) ((emacs (24))) "Send code (including magics) to ipython shell" single ((:commit . "0faed86faff02a361f23ce5fc923d0e9b09bb2da") (:authors ("Jack Kamm" . "jackkamm@gmail.com")) (:maintainer "Jack Kamm" . "jackkamm@gmail.com") (:keywords "tools" "processes") (:url . "https://github.com/jackkamm/ipython-shell-send-el"))]) + (iqa . [(20200520 1137) ((emacs (24 3))) "Init file(and directory) Quick Access" single ((:commit . "c1077aca6553cb2011f21b178e10271a17fe4f58") (:url . "https://github.com/a13/iqa.el"))]) + (ir-black-theme . [(20130303 755) nil "Port of ir-black theme" single ((:commit . "36e930d107604b5763c80294a6f92aaa02e6c272") (:authors ("Jon-Michael Deldin" . "dev@jmdeldin.com")) (:maintainer "Jon-Michael Deldin" . "dev@jmdeldin.com") (:keywords "faces"))]) + (iregister . [(20150515 2107) nil "Interactive register commands for Emacs." tar ((:commit . "6a48c66187289de5f300492be11c83e98410c018") (:authors ("Andrey Tykhonov" . "atykhonov@gmail.com")) (:maintainer "Andrey Tykhonov" . "atykhonov@gmail.com") (:keywords "convenience") (:url . "https://github.com/atykhonov/iregister.el"))]) + (irony . [(20210321 1750) ((cl-lib (0 5)) (json (1 2))) "C/C++ minor mode powered by libclang" tar ((:commit . "ec6dce7ee16ffaa9a735204534aa4aa074d14487") (:authors ("Guillaume Papin" . "guillaume.papin@epitech.eu")) (:maintainer "Guillaume Papin" . "guillaume.papin@epitech.eu") (:keywords "c" "convenience" "tools") (:url . "https://github.com/Sarcasm/irony-mode"))]) + (irony-eldoc . [(20200622 2214) ((emacs (24)) (cl-lib (0 5)) (irony (0 1))) "irony-mode support for eldoc-mode" single ((:commit . "73e79a89fad982a2ba072f2fcc1b4e41f0aa2978") (:authors ("Kirill Ignatiev <github.com/ikirill>")) (:maintainer "Kirill Ignatiev <github.com/ikirill>") (:keywords "c" "c++" "objc" "convenience" "tools") (:url . "https://github.com/ikirill/irony-eldoc"))]) + (iscroll . [(20210128 1938) ((emacs (26 0))) "Smooth scrolling over images" single ((:commit . "d6e11066169d232fe23c2867d44c012722ddfc5a") (:authors ("Yuan Fu" . "casouri@gmail.com")) (:maintainer "Yuan Fu" . "casouri@gmail.com") (:keywords "convenience" "image") (:url . "https://github.com/casouri/iscroll"))]) + (isearch-dabbrev . [(20141224 622) ((cl-lib (0 5))) "Use dabbrev in isearch" single ((:commit . "1efe7abba4923015cbc2462395deaec5446a9cc8") (:authors ("Dewdrops" . "v_v_4474@126.com")) (:maintainer "Dewdrops" . "v_v_4474@126.com") (:keywords "dabbrev" "isearch") (:url . "https://github.com/Dewdrops/isearch-dabbrev"))]) + (isearch-project . [(20200907 1453) ((emacs (26 1)) (f (0 20 0))) "Incremental search through the whole project" single ((:commit . "1077b395e1c34a734120faf1f3a7feae6dc4d9c5") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/isearch-project"))]) + (isearch-symbol-at-point . [(20130728 2221) nil "Use isearch to search for the symbol at point" single ((:commit . "51a1029bec1ec414885f9edb7e5947603dffdab2") (:authors ("atom smith")) (:maintainer "atom smith") (:keywords "isearch") (:url . "https://github.com/re5et/isearch-symbol-at-point"))]) + (isend-mode . [(20210106 1506) nil "Interactively send parts of an Emacs buffer to an interpreter" single ((:commit . "ea855f63be7febc15bd08aec6229fab9407734fb") (:authors ("François Févotte" . "fevotte@gmail.com")) (:maintainer "François Févotte" . "fevotte@gmail.com") (:url . "https://github.com/ffevotte/isend-mode.el"))]) + (isgd . [(20150414 936) nil "Shorten URLs using the isgd.com shortener service" single ((:commit . "764306dadd5a9213799081a48aba22f7c75cca9a") (:authors ("Chmouel Boudjnah" . "chmouel@chmouel.com")) (:maintainer "Chmouel Boudjnah" . "chmouel@chmouel.com") (:url . "https://github.com/chmouel/isgd.el"))]) + (isortify . [(20190315 2004) ((emacs (25)) (pythonic (0 1 0))) "(automatically) format python buffers using isort." single ((:commit . "ae7fb7163ce075209543f72953c9f431d103f6a3") (:authors ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainer "Artem Malyshev" . "proofit404@gmail.com") (:url . "https://github.com/proofit404/isortify"))]) + (ispc-mode . [(20201215 852) nil "Syntax coloring for ispc programs" single ((:commit . "722fdc45da2714f8fe0757968589cdb5ccacc8a0") (:authors ("Philip Munksgaard" . "philip@munksgaard.me")) (:maintainer "Philip Munksgaard" . "philip@munksgaard.me") (:keywords "c" "ispc") (:url . "https://github.com/Munksgaard/ispc-mode"))]) + (iss-mode . [(20141001 1913) nil "Mode for InnoSetup install scripts" single ((:commit . "3b517aff31529bab33f8d7b562bd17aff0107fd1") (:authors ("Stefan Reichoer," . "stefan@xsteve.at")) (:maintainer "Stefan Reichoer," . "stefan@xsteve.at"))]) + (itail . [(20171112 804) nil "An interactive tail mode" single ((:commit . "6e43c20da03be3b9c6ece93b7dc3495975ec1888") (:authors ("atom smith")) (:maintainer "atom smith") (:keywords "tail") (:url . "https://github.com/re5et/itail"))]) + (itasca . [(20170601 1622) ((emacs (24 3))) "Major modes for Itasca software data files." tar ((:commit . "3d15dd1b70d6db69b0f4758a3e28b8b506cc84ca") (:authors ("Jason Furtney" . "jkfurtney@gmail.com")) (:maintainer "Jason Furtney" . "jkfurtney@gmail.com") (:keywords "itasca" "flac" "3dec" "udec" "flac3d" "pfc" "pfc2d" "pfc3d" "fish") (:url . "http://github.com/jkfurtney/itasca-emacs/"))]) + (iter2 . [(20200517 1623) ((emacs (25 1))) "Reimplementation of Elisp generators" single ((:commit . "987045585d60700b4b9e617313c1a73618a144c9") (:authors ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com") (:keywords "elisp" "extensions") (:url . "https://github.com/doublep/iter2"))]) + (iterator . [(20210109 1859) ((emacs (24)) (cl-lib (0 5))) "A library to create and use elisp iterators objects." single ((:commit . "b514d4d1d0167e5973afbc93a34070d1aa967d82") (:authors ("Thierry Volpiatto <thierry dot volpiatto at gmail dot com>")) (:maintainer "Thierry Volpiatto <thierry dot volpiatto at gmail dot com>") (:url . "https://github.com/thierryvolpiatto/iterator"))]) + (ivariants . [(20170823 224) ((emacs (24 3)) (ivs-edit (1 0))) "Ideographic variants editor and browser" tar ((:commit . "ca0b74d32b5d2d77a45cc6ad6edc00be0ee85284") (:authors ("KAWABATA, Taichi <kawabata.taichi_at_gmail.com>")) (:maintainer "KAWABATA, Taichi <kawabata.taichi_at_gmail.com>") (:keywords "i18n" "languages") (:url . "http://github.com/kawabata/ivariants"))]) + (ivs-edit . [(20170818 1441) ((emacs (24 3)) (dash (2 6 0)) (cl-lib (1 0))) "IVS (Ideographic Variation Sequence) editing tool" tar ((:commit . "5db39c234aa7393b591168a4fd0a9a4cbbca347d") (:authors ("KAWABATA, Taichi <kawabata.taichi_at_gmail.com>")) (:maintainer "KAWABATA, Taichi <kawabata.taichi_at_gmail.com>") (:keywords "text") (:url . "http://github.com/kawabata/ivs-edit"))]) + (ivy . [(20210602 1349) ((emacs (24 5))) "Incremental Vertical completYon" tar ((:commit . "040d458bce4a88f37359192061bcea5ebe87007c") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "matching") (:url . "https://github.com/abo-abo/swiper"))]) + (ivy-avy . [(20210310 1230) ((emacs (24 5)) (ivy (0 13 4)) (avy (0 5 0))) "Avy integration for Ivy" single ((:commit . "040d458bce4a88f37359192061bcea5ebe87007c") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "convenience") (:url . "https://github.com/abo-abo/swiper"))]) + (ivy-bibtex . [(20201014 803) ((bibtex-completion (1 0 0)) (swiper (0 7 0)) (cl-lib (0 5))) "A bibliography manager based on Ivy" single ((:commit . "9f6ea920a49457d85096caa0e61f086a42b2908e") (:authors ("Justin Burkett" . "justin@burkett.cc")) (:maintainer "Titus von der Malsburg" . "malsburg@posteo.de") (:url . "https://github.com/tmalsburg/helm-bibtex"))]) + (ivy-clipmenu . [(20200302 1419) ((emacs (26 1)) (f (0 20 0)) (s (1 12 0)) (dash (2 16 0)) (ivy (0 13 0))) "Ivy client for clipmenu" single ((:commit . "ef25acf3f058fe1ede3a29fae2e9cdac8b08cd17") (:authors ("William Carroll" . "wpcarro@gmail.com")) (:maintainer "William Carroll" . "wpcarro@gmail.com") (:url . "https://github.com/wpcarro/ivy-clipmenu.el"))]) + (ivy-clojuredocs . [(20201129 2355) ((edn (1 1 2)) (ivy (0 12 0)) (emacs (24 4))) "Search for help in clojuredocs.org" single ((:commit . "8b6de19b3578c72d2b88f898e2290d94c04350f9") (:authors ("Wanderson Ferreira" . "iagwanderson@gmail.com")) (:maintainer "Wanderson Ferreira" . "iagwanderson@gmail.com") (:keywords "matching") (:url . "https://github.com/wandersoncferreira/ivy-clojuredocs"))]) + (ivy-dired-history . [(20210418 1444) ((ivy (0 9 0)) (counsel (0 9 0)) (cl-lib (0 5))) "use ivy to open recent directories" single ((:commit . "1ffa9b705c52a9d5b03c97150addb4f746c08380") (:authors ("纪秀峰" . "jixiuf@gmail.com")) (:maintainer "纪秀峰" . "jixiuf@gmail.com") (:url . "https://github.com/jixiuf/ivy-dired-history"))]) + (ivy-emms . [(20200629 801) ((ivy (0 13 0)) (emms (0 0)) (emacs (24 4))) "Ivy interface to emms tracks" single ((:commit . "6f547f9f3dcbf0d5b88595760b3505c7195dc96b") (:authors ("Fran Burstall" . "fran.burstall@gmail.com")) (:maintainer "Fran Burstall" . "fran.burstall@gmail.com") (:keywords "multimedia") (:url . "https://github.com/franburstall/ivy-emms"))]) + (ivy-emoji . [(20200316 2351) ((emacs (26 1)) (ivy (0 13 0))) "Insert emojis with ivy" single ((:commit . "a1b7d32048278afd9b06536a8af96f533639d146") (:authors ("Gabriele Bozzola" . "sbozzolator@gmail.com")) (:maintainer "Gabriele Bozzola" . "sbozzolator@gmail.com") (:keywords "emoji" "ivy" "convenience") (:url . "https://github.com/sbozzolo/ivy-emoji.git"))]) + (ivy-erlang-complete . [(20191112 1137) ((async (1 9)) (counsel (0 11 0)) (ivy (0 11 0)) (erlang (19 2)) (emacs (25 1))) "Erlang context sensitive completion at point using ivy. It also support xref and eldoc." tar ((:commit . "c443dba0c466d36bef01a8985474f5da0a5a65fe") (:authors ("Sergey Kostyaev" . "feo.me@ya.ru")) (:maintainer "Sergey Kostyaev" . "feo.me@ya.ru") (:keywords "languages" "tools"))]) + (ivy-explorer . [(20190909 1921) ((emacs (25)) (ivy (0 10 0))) "Dynamic file browsing grid using ivy" single ((:commit . "a413966cfbcecacc082d99297fa1abde0c10d3f3") (:authors ("Clemens Radermacher" . "clemera@posteo.net")) (:maintainer "Clemens Radermacher" . "clemera@posteo.net") (:keywords "convenience" "files" "matching") (:url . "https://github.com/clemera/ivy-explorer"))]) + (ivy-file-preview . [(20210124 1639) ((emacs (25 1)) (ivy (0 8 0)) (s (1 12 0)) (f (0 20 0))) "Preview the current ivy file selection" single ((:commit . "b237ee8e9fd2fd1b52254ef84cd06a0bb6c10a24") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/ivy-file-preview"))]) + (ivy-fuz . [(20191222 946) ((emacs (25 1)) (fuz (1 3 0)) (ivy (0 13 0))) "Integration between fuz and ivy." single ((:commit . "f171ac73422a4bae1503d63d804e691482ed35b2") (:authors ("Zhu Zihao" . "all_but_last@163.com")) (:maintainer "Philippe Vaucher" . "philippe.vaucher@gmail.com") (:keywords "convenience") (:url . "https://github.com/Silex/ivy-fuz.el"))]) + (ivy-gitlab . [(20181228 826) ((s (1 9 0)) (dash (2 9 0)) (ivy (0 8 0)) (gitlab (0 8))) "Ivy interface to Gitlab" single ((:commit . "8c2324c02119500f094c2f92dfaba4c9977ce1ba") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "gitlab" "ivy") (:url . "https://github.com/nlamirault/emacs-gitlab"))]) + (ivy-historian . [(20190111 313) ((emacs (24 4)) (historian (20170111)) (ivy (0 8 0)) (flx (0 6 1))) "Persistently store selected minibuffer candidates" single ((:commit . "ac1bea7d99dd6965c72fabeb72d5fdc38c5380a4") (:authors ("PythonNut" . "pythonnut@pythonnut.com")) (:maintainer "PythonNut" . "pythonnut@pythonnut.com") (:keywords "convenience" "ivy") (:url . "https://github.com/PythonNut/historian.el"))]) + (ivy-hydra . [(20210311 1108) ((emacs (24 5)) (ivy (0 13 4)) (hydra (0 14 0))) "Additional key bindings for Ivy" single ((:commit . "040d458bce4a88f37359192061bcea5ebe87007c") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "convenience") (:url . "https://github.com/abo-abo/swiper"))]) + (ivy-lobsters . [(20200818 1406) ((ivy (0 8 0)) (cl-lib (0 5))) "Browse lobste.rs stories with ivy." single ((:commit . "3f7f90751d15ebcf91253ef3cda18c0aa7d856ff") (:authors ("Julien Blanchard <https://github.com/julienXX>")) (:maintainer "Julien Blanchard <https://github.com/julienXX>") (:url . "https://github.com/julienXX/ivy-lobsters"))]) + (ivy-migemo . [(20210425 613) ((emacs (24 3)) (ivy (0 13 0)) (migemo (1 9 2)) (nadvice (0 3))) "Use migemo on ivy" single ((:commit . "a2ce15abe6a30fae63ed457ab25a80455704f28e") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com") (:keywords "matching") (:url . "https://github.com/ROCKTAKEY/ivy-migemo"))]) + (ivy-mpdel . [(20190428 920) ((emacs (25 1)) (ivy (0 10 0)) (libmpdel (1 0 0)) (mpdel (1 0 0))) "Ivy interface to navigate MPD" single ((:commit . "a42dcc943914c71975c115195d38c739f25e475c") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:keywords "multimedia") (:url . "https://gitlab.petton.fr/mpdel/ivy-mpdel"))]) + (ivy-omni-org . [(20200810 1050) ((emacs (25 1)) (ivy (0 13)) (dash (2 12))) "Browse anything in Org mode" single ((:commit . "a6b284f65b229d9b118b4316c2f6377de93400b1") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:keywords "outlines") (:url . "https://github.com/akirak/ivy-omni-org"))]) + (ivy-pass . [(20170812 1955) ((emacs (24)) (ivy (0 8 0)) (password-store (1 6 5))) "ivy interface for pass" single ((:commit . "5b523de1151f2109fdd6a8114d0af12eef83d3c5") (:authors ("ecraven")) (:maintainer "ecraven") (:keywords "pass" "password" "convenience" "data") (:url . "https://github.com/ecraven/ivy-pass/"))]) + (ivy-phpunit . [(20180219 915) ((ivy (0 10 0)) (phpunit (0 7 0)) (emacs (25))) "Ivy integration for phpunit.el" single ((:commit . "ffedb0138d36564e8e36a28fd9bc71ea8944681f") (:authors ("12pt")) (:maintainer "12pt") (:keywords "convenience" "tools" "ivy" "phpunit" "php") (:url . "https://github.com/12pt/ivy-phpunit"))]) + (ivy-posframe . [(20210609 1053) ((emacs (26 0)) (posframe (1 0 0)) (ivy (0 13 0))) "Using posframe to show Ivy" single ((:commit . "9c8382823392d5e64fb4879055e43ab4a029e62a") (:authors ("Feng Shu" . "tumashu@163.com") ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:keywords "abbrev" "convenience" "matching" "ivy") (:url . "https://github.com/tumashu/ivy-posframe"))]) + (ivy-prescient . [(20210425 1720) ((emacs (25 1)) (prescient (5 1)) (ivy (0 11 0))) "prescient.el + Ivy" single ((:commit . "4a0f5405798cfcb98ea005078ef2e2d490e922c4") (:authors ("Radon Rosborough" . "radon.neon@gmail.com")) (:maintainer "Radon Rosborough" . "radon.neon@gmail.com") (:keywords "extensions") (:url . "https://github.com/raxod502/prescient.el"))]) + (ivy-purpose . [(20160724 1003) ((emacs (24)) (ivy (0 8)) (window-purpose (1 5))) "Ivy Interface for Purpose" single ((:commit . "0495f2f3aed64d7e0028125e76a9a68f8fc4107e") (:authors ("Bar Magal (2016)")) (:maintainer "Bar Magal (2016)") (:url . "https://github.com/bmag/ivy-purpose"))]) + (ivy-rich . [(20210409 931) ((emacs (25 1)) (ivy (0 13 0))) "More friendly display transformer for ivy" single ((:commit . "600b8183ed0be8668dcc548cc2c8cb94b001363b") (:authors ("Yevgnen Koh" . "wherejoystarts@gmail.com")) (:maintainer "Yevgnen Koh" . "wherejoystarts@gmail.com") (:keywords "convenience" "ivy") (:url . "https://github.com/Yevgnen/ivy-rich"))]) + (ivy-rtags . [(20191222 920) ((ivy (0 7 0)) (rtags (2 10))) "RTags completion back-end for ivy" single ((:commit . "63f18acb21e664fd92fbc19465f0b5df085b5e93") (:authors ("Jan Erik Hanssen" . "jhanssen@gmail.com") ("Anders Bakken" . "agbakken@gmail.com")) (:maintainer "Jan Erik Hanssen" . "jhanssen@gmail.com") (:url . "https://github.com/Andersbakken/rtags"))]) + (ivy-searcher . [(20210221 923) ((emacs (25 1)) (ivy (0 8 0)) (searcher (0 1 8)) (s (1 12 0)) (f (0 20 0))) "Ivy interface to use searcher" single ((:commit . "3a2f5073a0d5842a6b3c386e70cc484e3c4ea77b") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/ivy-searcher"))]) + (ivy-spotify . [(20210329 312) ((emacs (26 1)) (espotify (0 1)) (ivy (0 13 1))) "Search spotify with ivy" single ((:commit . "3d62a3319ab03a810030058d3fb368b28dfd82d5") (:authors ("Jose A Ortega Ruiz" . "jao@gnu.org")) (:maintainer "Jose A Ortega Ruiz") (:keywords "multimedia") (:url . "https://codeberg.org/jao/espotify"))]) + (ivy-todo . [(20200323 2005) ((ivy (0 8 0)) (emacs (25))) "Manage org-mode TODOs with ivy" single ((:commit . "d74501cd334b7d709659946c5e02b21cfd5507de") (:authors ("Erik Sjöstrand" . "sjostrand.erik@gmail.com")) (:maintainer "Erik Sjöstrand" . "sjostrand.erik@gmail.com") (:keywords "convenience") (:url . "https://github.com/Kungsgeten/ivy-todo"))]) + (ivy-xcdoc . [(20160917 1055) ((ivy (0 8 0)) (emacs (24 4))) "Search Xcode documents with ivy interface." single ((:commit . "5ea22af36c4c2737fb0bec53432c233482d8b314") (:authors ("C.T.Chen" . "chenct@7adybird.com")) (:maintainer "C.T.Chen" . "chenct@7adybird.com") (:keywords "ivy" "xcode" "xcdoc") (:url . "https://github.com/hex2010/emacs-ivy-xcdoc"))]) + (ivy-xref . [(20191126 401) ((emacs (25 1)) (ivy (0 10 0))) "Ivy interface for xref results" single ((:commit . "3d4c35fe2b243d948d8fe02a1f0d76a249d63de9") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/ivy-xref"))]) + (ivy-yasnippet . [(20200704 700) ((emacs (24 1)) (cl-lib (0 6)) (ivy (0 10 0)) (yasnippet (0 12 2)) (dash (2 14 1))) "Preview yasnippets with ivy" single ((:commit . "83402d91b4eba5307f71884a72df8e11cc6a994e") (:authors ("Michał Krzywkowski" . "k.michal@zoho.com")) (:maintainer "Michał Krzywkowski" . "k.michal@zoho.com") (:keywords "convenience") (:url . "https://github.com/mkcms/ivy-yasnippet"))]) + (ivy-ycmd . [(20180909 1225) ((ycmd (1 3)) (emacs (24)) (ivy (0 10 0)) (dash (2 14 1))) "Ivy interface to ycmd" single ((:commit . "25bfee8f676e4ecbb645e4f30b47083410a00c58") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:keywords "tools") (:url . "https://github.com/abingham/emacs-ivy-ycmd"))]) + (ivy-youtube . [(20181126 1039) ((request (0 2 0)) (ivy (0 8 0)) (cl-lib (0 5))) "Query YouTube and play videos in your browser" single ((:commit . "849b6db7ef02b080a86c1b887488e2935c31059a") (:authors ("Brunno dos Santos")) (:maintainer "Brunno dos Santos") (:keywords "youtube" "multimedia" "mpv" "vlc") (:url . "https://github.com/squiter/ivy-youtube"))]) + (ix . [(20131027 1629) ((grapnel (0 5 3))) "Emacs client for http://ix.io pastebin" single ((:commit . "aea4c54a5cc5a6f26637353c16a3a0e70fc76963") (:authors ("Abhishek L" . "abhishekl.2006@gmail.com")) (:maintainer "Abhishek L" . "abhishekl.2006@gmail.com") (:url . "http://www.github.com/theanalyst/ix.el"))]) + (j-mode . [(20171224 1856) nil "Major mode for editing J programs" tar ((:commit . "e8725ac8af95498faabb2ca3ab3bd809a8f148e6") (:keywords "j" "languages") (:url . "http://github.com/zellio/j-mode"))]) + (jabber . [(20180927 2325) ((fsm (0 2)) (srv (0 2))) "A Jabber client for Emacs." tar ((:commit . "fff33826f42e040dad7ef64ea312d85215d3b0a1"))]) + (jabber-otr . [(20150918 1144) ((emacs (24)) (jabber (0 8 92))) "Off-The-Record messaging for jabber.el" tar ((:commit . "2692b1530234e0ba9a0d6c1eaa1cbe8679f193c0") (:authors ("Magnus Henoch" . "magnus.henoch@gmail.com")) (:maintainer "Magnus Henoch" . "magnus.henoch@gmail.com") (:keywords "comm") (:url . "https://github.com/legoscia/emacs-jabber-otr/"))]) + (jack-connect . [(20200519 1027) nil "Manage jack connections within Emacs" single ((:commit . "fae8c5f9b383f7606f3883badfd1294e8affb0db") (:authors ("Stefano Barbi" . "stefanobarbi@gmail.com")) (:maintainer "Stefano Barbi" . "stefanobarbi@gmail.com"))]) + (jade-mode . [(20160525 1441) nil "Major mode for editing .jade files" single ((:commit . "4dbde92542fc7ad61df38776980905a4721d642e") (:authors ("Brian M. Carlson and other contributors")) (:maintainer "Brian M. Carlson and other contributors") (:url . "https://github.com/brianc/jade-mode"))]) + (jammer . [(20210508 1633) ((emacs (24 1))) "Punish yourself for using Emacs inefficiently" single ((:commit . "a780e4c2adb2e85a4daadcefd1a2b189d761872f") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:keywords "games") (:url . "https://depp.brause.cc/jammer"))]) + (janet-mode . [(20200509 1651) ((emacs (24 3))) "Defines a major mode for Janet" single ((:commit . "2f5bcabcb6953e1ed1926ba6a2328c453e8b4ac7") (:authors ("Adam Schwalm" . "adamschwalm@gmail.com")) (:maintainer "Adam Schwalm" . "adamschwalm@gmail.com") (:url . "https://github.com/ALSchwalm/janet-mode"))]) + (japanese-holidays . [(20201229 755) ((emacs (24 1)) (cl-lib (0 3))) "Calendar functions for the Japanese calendar" single ((:commit . "324b6bf2f55ec050bef49e001caedaabaf4fa35d") (:authors ("Takashi Hattori" . "hattori@sfc.keio.ac.jp") ("Hiroya Murata" . "lapis-lazuli@pop06.odn.ne.jp")) (:maintainer "Takashi Hattori" . "hattori@sfc.keio.ac.jp") (:keywords "calendar") (:url . "https://github.com/emacs-jp/japanese-holidays"))]) + (jape-mode . [(20140903 1506) nil "An Emacs editing mode mode for GATE's JAPE files" single ((:commit . "85b9182850707b5d107391f6caee5bd401507a7d") (:keywords "languages" "jape" "gate") (:url . "http://github.com/tanzoniteblack/jape-mode"))]) + (jar-manifest-mode . [(20160501 26) nil "Major mode to edit JAR manifest files" single ((:commit . "270dae14c481300f75ed96dad3a5ae42ca928a1d") (:authors ("Omair Majid" . "omair.majid@gmail.com")) (:maintainer "Omair Majid" . "omair.majid@gmail.com") (:keywords "convenience" "languages") (:url . "http://github.com/omajid/jar-manifest-mode"))]) + (jasminejs-mode . [(20150527 5) nil "A minor mode for manipulating jasmine test files" tar ((:commit . "9f8044bf81ab5b4841a30b0bd099916e1b7ff54a") (:authors ("Eric Stolten" . "stoltene2@gmail.com")) (:maintainer "Eric Stolten" . "stoltene2@gmail.com") (:keywords "javascript" "jasmine") (:url . "https://github.com/stoltene2/jasminejs-mode"))]) + (jastadd-ast-mode . [(20200926 1820) ((emacs (25))) "Major mode for editing JastAdd AST files" single ((:commit . "b7a0e32b669e726c8ccc348dd6b18ad4a7c70e1b") (:authors ("Rudi Schlatte" . "rudi@constantly.at")) (:maintainer "Rudi Schlatte" . "rudi@constantly.at") (:keywords "languages") (:url . "https://github.com/rudi/jastadd-ast-mode"))]) + (java-imports . [(20201115 545) ((emacs (24 4)) (s (1 10 0)) (pcache (0 3 2))) "Code for dealing with Java imports" single ((:commit . "7083b5efeb23ded95e6c1d2ab0319837851eb42f") (:authors ("Lee Hinman" . "lee@writequit.org")) (:maintainer "Lee Hinman" . "lee@writequit.org") (:keywords "java" "kotlin") (:url . "http://www.github.com/dakrone/emacs-java-imports"))]) + (java-snippets . [(20160627 252) ((yasnippet (0 8 0))) "Yasnippets for Java" tar ((:commit . "6d0e2768823be27dbe07448f4cb244cd657a7136") (:authors ("Takayoshi Kimura")) (:maintainer "Takayoshi Kimura") (:url . "https://github.com/nekop/yasnippet-java-mode"))]) + (javadoc-lookup . [(20160214 31) ((cl-lib (0 3))) "Javadoc Emacs integration with Maven" tar ((:commit . "507a2dd443d60b537b8f779c1847e2cd0ccd1382") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/javadoc-lookup"))]) + (javap-mode . [(20120223 2208) nil "Javap major mode" single ((:commit . "864c1130e204b2072e1d19cd027b6fce8ebe6629") (:url . "http://github.com/hiredman/javap-mode"))]) + (jaword . [(20210306 420) ((tinysegmenter (0 1)) (emacs (25 1))) "Minor-mode for handling Japanese words better" single ((:commit . "783544a265f91b2e568b52311afb36e3691d5ad3") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://zk-phi.github.io/"))]) + (jazz-theme . [(20201026 1027) nil "A warm color theme for Emacs 24+." single ((:commit . "0b5bfe7a30590326bdf38120fb4bc25fff21a509") (:authors ("Roman Parykin" . "donderom@ymail.com")) (:maintainer "Roman Parykin" . "donderom@ymail.com") (:url . "https://github.com/donderom/jazz-theme"))]) + (jbeans-theme . [(20200924 1946) ((emacs (24))) "Jbeans theme for GNU Emacs 24 (deftheme)" single ((:commit . "a63916a928324c42bfbe3016972c2ecff598b1ae") (:authors ("Adam Olsen" . "arolsen@gmail.com")) (:maintainer "Adam Olsen" . "arolsen@gmail.com") (:url . "https://github.com/synic/jbeans-emacs"))]) + (jdecomp . [(20170224 2200) ((emacs (24 5))) "Interface to Java decompilers" single ((:commit . "692866abc83deedce62be8d6040cf24dda7fb7a8") (:authors ("Tianxiang Xiong" . "tianxiang.xiong@gmail.com")) (:maintainer "Tianxiang Xiong" . "tianxiang.xiong@gmail.com") (:keywords "decompile" "java" "languages" "tools") (:url . "https://github.com/xiongtx/jdecomp"))]) + (jdee . [(20191102 1426) ((emacs (24 3)) (flycheck (30)) (memoize (1 0 1)) (dash (2 13 0)) (s (1 12 0))) "Java Development Environment for Emacs" tar ((:commit . "b510a29f1fc1bea218a6230fb219922775687c78") (:authors ("Paul Kinnucan" . "pkinnucan@attbi.com")) (:maintainer "Paul Landes") (:keywords "java" "tools") (:url . "http://github.com/jdee-emacs/jdee"))]) + (jedi . [(20191011 1750) ((emacs (24)) (jedi-core (0 2 2)) (auto-complete (1 4))) "a Python auto-completion for Emacs" single ((:commit . "e942a0e410cbb2a214c9cb30aaf0e47eb0895b78") (:authors ("Takafumi Arakaki <aka.tkf at gmail.com>")) (:maintainer "Takafumi Arakaki <aka.tkf at gmail.com>"))]) + (jedi-core . [(20210503 1315) ((emacs (24)) (epc (0 1 0)) (python-environment (0 0 2)) (cl-lib (0 5))) "Common code of jedi.el and company-jedi.el" tar ((:commit . "e942a0e410cbb2a214c9cb30aaf0e47eb0895b78") (:authors ("Takafumi Arakaki <aka.tkf at gmail.com>")) (:maintainer "Takafumi Arakaki <aka.tkf at gmail.com>"))]) + (jedi-direx . [(20140310 936) ((jedi (0 1 2)) (direx (0 1 -3))) "Tree style source code viewer for Python buffer" single ((:commit . "7a2e677400717ed12b959cb5988e7b3fb1c12117") (:authors ("Takafumi Arakaki <aka.tkf at gmail.com>")) (:maintainer "Takafumi Arakaki <aka.tkf at gmail.com>"))]) + (jeison . [(20190721 1651) ((emacs (25 1)) (dash (2 16 0))) "A library for declarative JSON parsing" single ((:commit . "66e276c1f2f08ca54d2cd60f2c9f974c662aae8b") (:keywords "lisp" "json" "data-types") (:url . "http://github.com/SavchenkoValeriy/jeison"))]) + (jekyll-modes . [(20141117 1314) ((polymode (0 2))) "Major modes (markdown and HTML) for authoring Jekyll content" single ((:commit . "7cb10b50fd2883e3f7b10fdfd98f19f2f0b2381c") (:authors ("Fredrik Appelberg" . "fredrik@milgrim.local")) (:maintainer "Fredrik Appelberg" . "fredrik@milgrim.local") (:keywords "docs") (:url . "https://github.com/fred-o/jekyll-modes"))]) + (jemdoc-mode . [(20170704 2027) ((emacs (24 3))) "Major mode for editing jemdoc files" single ((:commit . "529b4d4681e1198b9892f340fdd6c3f1592a047a") (:authors ("Dimitar Dimitrov" . "mail.mitko@gmail.com")) (:maintainer "Dimitar Dimitrov" . "mail.mitko@gmail.com") (:keywords "convenience" "usability") (:url . "https://github.com/drdv/jemdoc-mode"))]) + (jenkins . [(20200524 2016) ((dash (2 12)) (emacs (24 3)) (json (1 4))) "Minimalistic Jenkins client for Emacs" single ((:commit . "bd06cdc57c0cb9217d773eeba06ecc998f10033b") (:authors ("Rustem Muslimov" . "r.muslimov@gmail.com")) (:maintainer "Rustem Muslimov" . "r.muslimov@gmail.com") (:keywords "jenkins" "convenience"))]) + (jenkins-watch . [(20121004 2326) nil "Watch continuous integration build status" single ((:commit . "37b84dfbd98240a57ff798e1ff8bc7dba2913577") (:authors ("Andrew Taylor" . "ataylor@redtoad.ca")) (:maintainer "Andrew Taylor" . "ataylor@redtoad.ca") (:url . "https://github.com/ataylor284/jenkins-watch"))]) + (jenkinsfile-mode . [(20200929 428) ((emacs (24)) (groovy-mode (2 0))) "Major mode for editing Jenkins declarative pipeline syntax" single ((:commit . "65bf3925852c35c6bd499978f08f83c1193f4347") (:url . "https://github.com/john2x/jenkinsfile-mode"))]) + (jest . [(20210219 1508) ((emacs (24 4)) (dash (2 18 0)) (magit-popup (2 12 0)) (projectile (0 14 0)) (s (1 12 0)) (js2-mode (20180301)) (cl-lib (0 6 1))) "helpers to run jest" single ((:commit . "0fe875082e54bdbfe924808aa155b938ed90d401") (:authors ("Edmund Miller" . "edmund.a.miller@gmail.com")) (:maintainer "Edmund Miller" . "edmund.a.miller@gmail.com") (:keywords "jest" "javascript" "testing") (:url . "https://github.com/emiller88/emacs-jest/"))]) + (jest-test-mode . [(20210228 132) ((emacs (25 1))) "Minor mode for running Node.js tests using jest" single ((:commit . "fb2bacab9475410c79e6e4ca344f093f7698466d") (:authors ("Raymond Huang" . "rymndhng@gmail.com")) (:maintainer "Raymond Huang" . "rymndhng@gmail.com") (:url . "https://github.com/rymndhng/jest-test-mode.el"))]) + (jetbrains . [(20180301 502) ((emacs (24 3)) (cl-lib (0 5)) (f (0 17))) "JetBrains IDE bridge" single ((:commit . "56f71a17d455581c10d48f6dbb31d9e2126227bf") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "tools" "php") (:url . "https://github.com/emacs-php/jetbrains.el"))]) + (jetbrains-darcula-theme . [(20210602 1430) nil "A complete port of the default JetBrains Darcula theme" single ((:commit . "f57c359044ff1fa90db62a60b6691ff8d65c82f3") (:authors ("Ian Y.E. Pan")) (:maintainer "Ian Y.E. Pan") (:url . "https://github.com/ianpan870102/jetbrains-darcula-emacs-theme"))]) + (jg-quicknav . [(20170809 130) ((s (1 9 0)) (cl-lib (0 5))) "Quickly navigate the file system to find a file." single ((:commit . "c8d53e774d63e68a944092c08a026b57da741038") (:authors ("Jeff Gran" . "jeff@jeffgran.com")) (:maintainer "Jeff Gran" . "jeff@jeffgran.com") (:keywords "navigation") (:url . "https://github.com/jeffgran/jg-quicknav"))]) + (jinja2-mode . [(20200718 730) nil "A major mode for jinja2" single ((:commit . "ecd19a40b7832bb00f0a2244e3b0713d0bf3850d") (:authors ("Florian Mounier aka paradoxxxzero")) (:maintainer "Florian Mounier aka paradoxxxzero"))]) + (jira-markup-mode . [(20150601 2109) nil "Emacs Major mode for JIRA-markup-formatted text files" single ((:commit . "4fc534c47df26a2f402bf835ebe2ed89474a4062") (:authors ("Matthias Nuessler" . "m.nuessler@web.de>")) (:maintainer "Matthias Nuessler" . "m.nuessler@web.de>") (:keywords "jira" "markup") (:url . "https://github.com/mnuessler/jira-markup-mode"))]) + (jiralib2 . [(20200520 2031) ((emacs (25)) (request (0 3)) (dash (2 14 1))) "JIRA REST API bindings to Elisp" single ((:commit . "c21c4e759eff549dbda11099f2f680b78d7f5a01") (:authors ("Henrik Nyman" . "h@nyymanni.com")) (:maintainer "Henrik Nyman" . "h@nyymanni.com") (:keywords "comm" "jira" "rest" "api") (:url . "https://github.com/nyyManni/jiralib2"))]) + (jist . [(20161229 1721) ((emacs (24 4)) (dash (2 12 0)) (seq (1 11)) (let-alist (1 0 4)) (magit (2 1 0)) (request (0 2 0))) "Gist integration" single ((:commit . "da0692452e312a99bb27d8708504b521798aca48") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:keywords "convenience") (:url . "https://github.com/emacs-pe/jist.el"))]) + (jknav . [(20121006 2025) nil "Automatically enable j/k keys for line-based navigation" single ((:commit . "861245715c728503dad6573278fdd75c271dbf8b") (:authors ("Aaron Culich" . "aculich@gmail.com")) (:maintainer "Aaron Culich" . "aculich@gmail.com") (:keywords "keyboard" "navigation"))]) + (jmt-mode . [(20210512 2301) ((emacs (24 4))) "Java Mode Tamed" single ((:commit . "c3548cac4c4d2caffb750391b2d7d88c3892d139") (:authors ("Michael Allan" . "mike@reluk.ca")) (:maintainer "Michael Allan" . "mike@reluk.ca") (:keywords "c" "languages") (:url . "http://reluk.ca/project/Java/Emacs/"))]) + (jonprl-mode . [(20160819 59) ((emacs (24 3)) (cl-lib (0 5)) (yasnippet (0 8 0))) "A major mode for editing JonPRL files" tar ((:commit . "6059bb64891fae45827174e044d6a87ac07172d8") (:authors ("David Raymond Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Raymond Christiansen" . "david@davidchristiansen.dk") (:keywords "languages"))]) + (journalctl-mode . [(20201217 1625) ((emacs (24 1))) "Sample major mode for viewing output journalctl" single ((:commit . "c5bca1a5f42d2fe2a00fdf52fe480137ace971d3") (:authors ("Sebastian Meisel" . "sebastian.meisel@gmail.com")) (:maintainer "Sebastian Meisel" . "sebastian.meisel@gmail.com") (:keywords "unix") (:url . "https://github.com/SebastianMeisel/journalctl-mode"))]) + (jpop . [(20170410 1250) ((emacs (24)) (dash (2 11 0)) (cl-lib (0 5))) "Lightweight project caching and navigation framework" tar ((:commit . "7628b03260be96576b34459d45959ee77d8b2110") (:authors ("Dom Charlesworth" . "dgc336@gmail.com")) (:maintainer "Dom Charlesworth" . "dgc336@gmail.com") (:keywords "project" "convenience") (:url . "https://github.com/domtronn/jpop.el"))]) + (jq-format . [(20190428 1434) ((emacs (24)) (reformatter (0 3))) "Reformat JSON and JSONLines using jq" single ((:commit . "47e1c5adb89b37b4d53fe01302d8c675913c20e7") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee") (:keywords "languages") (:url . "https://github.com/wbolster/emacs-jq-format"))]) + (jq-mode . [(20200604 833) ((emacs (25 1))) "Edit jq scripts." tar ((:commit . "42ad0a99f0114233e2cb317585cb9af494d18a2f") (:authors ("Bjarte Johansen <Bjarte dot Johansen at gmail dot com>")) (:maintainer "Bjarte Johansen <Bjarte dot Johansen at gmail dot com>") (:url . "https://github.com/ljos/jq-mode"))]) + (jquery-doc . [(20150812 758) nil "jQuery api documentation interface for emacs" tar ((:commit . "24032284919b942ec27707d929bdd8bf48420062") (:authors ("Anantha kumaran" . "ananthakumaran@gmail.com")) (:maintainer "Anantha kumaran" . "ananthakumaran@gmail.com") (:keywords "docs" "jquery"))]) + (js-auto-beautify . [(20161031 509) ((web-beautify (0 3 1)) (web-mode (14 0 27))) "auto format you js/jsx file" single ((:commit . "180d15af7b5dfaab4ee1954cca2fdc797932f9de") (:authors (nil . "quanwei9958@126.com")) (:maintainer nil . "quanwei9958@126.com"))]) + (js-auto-format-mode . [(20180807 1352) ((emacs (24))) "Minor mode for auto-formatting JavaScript code" single ((:commit . "516abed166d687aa8b197973315bd6ea0900fb62") (:authors ("Masafumi Koba" . "ybiquitous@gmail.com")) (:maintainer "Masafumi Koba" . "ybiquitous@gmail.com") (:keywords "languages") (:url . "https://github.com/ybiquitous/js-auto-format-mode"))]) + (js-codemod . [(20190921 941) ((emacs (24 4))) "Run js-codemod on current sentence or selected region" tar ((:commit . "056bdf3e5e0c807b8cf17edb5834179a90fb722b") (:authors (nil . "Torgeir Thoresen <@torgeir>")) (:maintainer nil . "Torgeir Thoresen <@torgeir>") (:keywords "js" "codemod" "region"))]) + (js-comint . [(20200117 615) ((emacs (24 3))) "JavaScript interpreter in window." single ((:commit . "0dedaf4753fbe8cdbab14aa85f05d7673cbee8b6") (:authors ("Paul Huff" . "paul.huff@gmail.com")) (:maintainer "Chen Bin <chenbin.sh AT gmail DOT com>") (:keywords "javascript" "node" "inferior-mode" "convenience") (:url . "https://github.com/redguardtoo/js-comint"))]) + (js-doc . [(20160715 434) nil "Insert JsDoc style comment easily" single ((:commit . "f0606e89d5aa89146f96edb38cf69af0068a9d1e") (:authors ("mooz" . "stillpedant@gmail.com")) (:maintainer "mooz" . "stillpedant@gmail.com") (:keywords "document" "comment") (:url . "https://github.com/mooz/js-doc"))]) + (js-format . [(20170119 102) ((emacs (24 1)) (js2-mode (20101228))) "Format or transform code style using NodeJS server with different javascript formatter" tar ((:commit . "544bda9be72b74ec2d442543ba60cff727d96669") (:authors ("James Yang" . "jamesyang999@gmail.com")) (:maintainer "James Yang" . "jamesyang999@gmail.com") (:keywords "js" "javascript" "format" "standard" "jsbeautify" "esformatter" "airbnb") (:url . "http://github.com/futurist/js-format.el"))]) + (js-import . [(20210105 829) ((emacs (24 4)) (f (0 19 0)) (projectile (0 14 0)) (dash (2 13 0))) "Import Javascript files from your current project or dependencies" single ((:commit . "941091b3ab074c482a5920194d61f50e9b50d503") (:authors ("Jakob Lind" . "karl.jakob.lind@gmail.com")) (:maintainer "Jakob Lind" . "karl.jakob.lind@gmail.com") (:keywords "tools") (:url . "https://github.com/jakoblind/js-import"))]) + (js-react-redux-yasnippets . [(20200316 1144) ((emacs (24 3)) (yasnippet (0 8 0))) "JavaScript,React,Redux yasnippets" tar ((:commit . "9f509043f01fa59bff4daf31b2e95d63f8deab4a") (:authors ("sooqua")) (:maintainer "sooqua") (:keywords "convenience" "snippets") (:url . "https://github.com/sooqua/js-react-redux-yasnippets"))]) + (js2-closure . [(20170816 1918) ((js2-mode (20150909))) "Google Closure dependency manager" single ((:commit . "f59db386d7d0693935d0bf52babcd2c203c06d04") (:authors ("Justine Tunney" . "jart@google.com")) (:maintainer "Justine Tunney" . "jart@google.com") (:keywords "javascript" "closure") (:url . "http://github.com/jart/js2-closure"))]) + (js2-highlight-vars . [(20170418 1829) ((emacs (24 4)) (js2-mode (20150908))) "highlight occurrences of the variable under cursor" single ((:commit . "e3bb177e50f76b272e8073a94d4f46be6512a163") (:authors ("Mihai Bazon" . "mihai.bazon@gmail.com")) (:maintainer "Mihai Bazon" . "mihai.bazon@gmail.com") (:url . "http://mihai.bazon.net/projects/editing-javascript-with-emacs-js2-mode/js2-highlight-vars-mode"))]) + (js2-mode . [(20210414 2241) ((emacs (24 1)) (cl-lib (0 5))) "Improved JavaScript editing mode" tar ((:commit . "b891edecedf30be6321e2f109fdfeb25b0edad27") (:authors ("Steve Yegge" . "steve.yegge@gmail.com") ("mooz" . "stillpedant@gmail.com") ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainer "Steve Yegge" . "steve.yegge@gmail.com") (:keywords "languages" "javascript") (:url . "https://github.com/mooz/js2-mode/"))]) + (js2-refactor . [(20210306 2003) ((js2-mode (20101228)) (s (1 9 0)) (multiple-cursors (1 0 0)) (dash (1 0 0)) (s (1 0 0)) (yasnippet (0 9 0 1))) "A JavaScript refactoring library for emacs." tar ((:commit . "a0977c4ce1918cc266db9d6cd7a2ab63f3a76b9a") (:authors ("Magnar Sveen" . "magnars@gmail.com") ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "conveniences"))]) + (js2hl . [(20201119 816) ((emacs (25 1)) (js2-mode (20190219))) "Highlight/rename things using js2-mode parser" single ((:commit . "d970dd53dec76f9f72ade5b1f8717dea3d45bb3c") (:authors ("Chen Bin <chenbin DOT sh AT gmail DOT com>")) (:maintainer "Chen Bin <chenbin DOT sh AT gmail DOT com>") (:keywords "convenience") (:url . "https://github.com/redguardtoo/js2hl"))]) + (js3-mode . [(20160515 1550) nil "An improved JavaScript editing mode" tar ((:commit . "229aeb374f1b1f3ee5c59b8ba3eebb6385c232cb") (:authors ("Thom Blake" . "webmaster@thomblake.com")) (:maintainer "Thom Blake" . "webmaster@thomblake.com") (:keywords "javascript" "languages"))]) + (jscs . [(20151015 1749) ((emacs (24 1)) (cl-lib (0 5))) "Consistent JavaScript editing using JSCS" single ((:commit . "9d39d0f2355e69a020bf76242504f3a33e013ccf") (:authors ("papaeye" . "papaeye@gmail.com")) (:maintainer "papaeye" . "papaeye@gmail.com") (:keywords "languages" "convenience") (:url . "https://github.com/papaeye/emacs-jscs"))]) + (jsfmt . [(20180920 1008) nil "Interface to jsfmt command for javascript files" single ((:commit . "ca141a135c7700eaedef92561d334e1fb7dc28a1") (:authors ("Brett Langdon" . "brett@blangdon.com")) (:maintainer "Brett Langdon" . "brett@blangdon.com") (:url . "https://github.com/brettlangdon/jsfmt.el"))]) + (json-mode . [(20190123 422) ((json-reformat (0 0 5)) (json-snatcher (1 0 0))) "Major mode for editing JSON files." single ((:commit . "0e819e519ae17a2686e0881c4ca51fa873fa9b83") (:authors ("Josh Johnston")) (:maintainer "Josh Johnston") (:url . "https://github.com/joshwnj/json-mode"))]) + (json-navigator . [(20191213 755) ((emacs (25 1)) (hierarchy (0 6 0))) "View and navigate JSON structures" single ((:commit . "afd902e0b5cde37fad4786515a695d17f1625286") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://github.com/DamienCassou/json-navigator"))]) + (json-process-client . [(20210525 733) ((emacs (25 1))) "Interact with a TCP process using JSON" single ((:commit . "373b2cc7e3d26dc00594e0b2c1bb66815aad2826") (:authors ("Nicolas Petton" . "nicolas@petton.fr") ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr") (:url . "https://gitlab.petton.fr/nico/json-process-client"))]) + (json-reformat . [(20160212 853) nil "Reformatting tool for JSON" single ((:commit . "8eb6668ed447988aea06467ba8f42e1f2178246f") (:authors ("Wataru MIYAGUNI" . "gonngo@gmail.com")) (:maintainer "Wataru MIYAGUNI" . "gonngo@gmail.com") (:keywords "json") (:url . "https://github.com/gongo/json-reformat"))]) + (json-rpc . [(20200417 1629) ((emacs (24 1)) (cl-lib (0 5))) "JSON-RPC library" single ((:commit . "81a5a520072e20d18aeab2aac4d66c046b031e56") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/elisp-json-rpc"))]) + (json-rpc-server . [(20190714 1521) ((emacs (26))) "Server-side JSON-RPC library." single ((:commit . "2f41d292b87916f6989e7ff5dc94da18ae6a9e4e") (:authors ("GitHub user \"Jcaw\"")) (:maintainer "GitHub user \"Jcaw\"") (:keywords "tools" "comm" "json" "rpc") (:url . "https://github.com/jcaw/json-rpc-server.el"))]) + (json-snatcher . [(20200916 1717) ((emacs (24))) "Grabs the path to JSON values in a JSON file" single ((:commit . "b28d1c0670636da6db508d03872d96ffddbc10f2") (:authors ("Sterling Graham" . "sterlingrgraham@gmail.com")) (:maintainer "Sterling Graham" . "sterlingrgraham@gmail.com") (:url . "http://github.com/sterlingg/json-snatcher"))]) + (jsonl . [(20190623 509) ((emacs (25))) "Utility functions for working with line-delimited JSON" single ((:commit . "3dd0b7bb2b4bce9f9de7367941f0cc78f82049c9") (:authors ("Erik Anderson" . "erik@ebpa.link")) (:maintainer "Erik Anderson" . "erik@ebpa.link") (:keywords "tools") (:url . "https://github.com/ebpa/jsonl.el"))]) + (jsonnet-mode . [(20210527 1557) ((emacs (24)) (dash (2 17 0))) "Major mode for editing jsonnet files" single ((:commit . "54a89b0aaba7a68782008c5e1ab00d5ec757316a") (:authors ("Nick Lanham")) (:maintainer "Nick Lanham") (:keywords "languages") (:url . "https://github.com/mgyucht/jsonnet-mode"))]) + (jss . [(20130508 1423) ((emacs (24 1)) (websocket (0)) (js2-mode (0))) "An emacs interface to webkit and mozilla debuggers" tar ((:commit . "41749257aecf13c7bd6ed489b5ab3304d06e40bc") (:authors ("Marco Baringer" . "mb@bese.it")) (:maintainer "Marco Baringer" . "mb@bese.it") (:keywords "languages"))]) + (jst . [(20150604 1138) ((s (1 9)) (f (0 17)) (dash (2 10)) (pcache (0 3)) (emacs (24 4))) "JS test mode" single ((:commit . "2a3fd16c992f7790dc67134ef06a814c3d20579c") (:authors ("Cheung Hoi Yu" . "yeannylam@gmail.com")) (:maintainer "Cheung Hoi Yu" . "yeannylam@gmail.com") (:keywords "js" "javascript" "jasmine" "coffee" "coffeescript") (:url . "https://github.com/cheunghy/jst-mode"))]) + (jtags . [(20160211 2029) nil "enhanced tags functionality for Java development" tar ((:commit . "b50daa48510f71e74ce0ec2eb85030896a79cf96") (:authors ("Alexander Baltatzis" . "alexander@baltatzis.com") ("Johan Dykstrom" . "jody4711-sf@yahoo.se")) (:maintainer "Johan Dykstrom" . "jody4711-sf@yahoo.se") (:keywords "languages" "tools") (:url . "http://jtags.sourceforge.net"))]) + (julia-mode . [(20210323 612) ((emacs (24 3))) "Major mode for editing Julia source code" tar ((:commit . "fe6f6f7a80f8d60ecffa5b2cb43667bb9dc11705") (:keywords "languages") (:url . "https://github.com/JuliaEditorSupport/julia-emacs"))]) + (julia-repl . [(20210408 639) ((emacs (25 1)) (s (1 12))) "A minor mode for a Julia REPL" single ((:commit . "79e686e3ebf164bd39fc2ea5cf09d38d0e1d763a") (:authors ("Tamas Papp" . "tkpapp@gmail.com")) (:maintainer "Tamas Papp" . "tkpapp@gmail.com") (:keywords "languages") (:url . "https://github.com/tpapp/julia-repl"))]) + (julia-shell . [(20161125 1910) ((julia-mode (0 3))) "Major mode for an inferior Julia shell" tar ((:commit . "583a0b2ca20461ab4356929fd0f2212c22341b69") (:authors ("Dennis Ogbe" . "dogbe@purdue.edu")) (:maintainer "Dennis Ogbe" . "dogbe@purdue.edu"))]) + (julia-snail . [(20210330 1901) ((emacs (26 2)) (dash (2 16 0)) (julia-mode (0 3)) (s (1 12 0)) (spinner (1 7 3)) (vterm (0 0 1))) "Julia Snail" tar ((:commit . "03b4296ba7151963eb3c850f3314b02644101f51") (:url . "https://github.com/gcv/julia-snail"))]) + (julia-vterm . [(20210410 40) ((emacs (25 1)) (vterm (0 0 1))) "A mode for Julia REPL using vterm" single ((:commit . "d57448466c11833d4fd67f5dbbea9cb9a07a74e2") (:authors ("Shigeaki Nishina")) (:maintainer "Shigeaki Nishina") (:keywords "languages" "julia") (:url . "https://github.com/shg/julia-vterm.el"))]) + (jumblr . [(20170727 2043) ((s (1 8 0)) (dash (2 2 0))) "an anagram game for emacs" tar ((:commit . "34533dfb9db8538c005f4eaffafeff7ed193729f") (:keywords "anagram" "word game" "games") (:url . "https://github.com/mkmcc/jumblr"))]) + (jump . [(20161127 128) ((findr (0 7)) (inflections (2 4)) (cl-lib (0 5))) "build functions which contextually jump between files" single ((:commit . "55caa66a7cc6e0b1a76143fd40eff38416928941") (:authors ("Eric Schulte")) (:maintainer "Eric Schulte") (:keywords "project" "convenience" "navigation") (:url . "http://github.com/eschulte/jump.el"))]) + (jump-char . [(20180601 1348) nil "navigation by char" single ((:commit . "1e31a3c687f2b3c71bbfab881c6d75915534bb9e") (:authors ("Le Wang")) (:maintainer "Le Wang") (:url . "https://github.com/lewang/jump-char"))]) + (jump-to-line . [(20130122 1653) nil "Jump to line number at point." single ((:commit . "01ef8c3529d85e6c59cc20840acbc4a8e8325bc8") (:authors ("ongaeshi")) (:maintainer "ongaeshi") (:keywords "jump" "line" "back" "file" "ruby" "csharp" "python" "perl"))]) + (jump-tree . [(20171014 1551) nil "Treat position history as a tree" tar ((:commit . "282267dc6305889e31d46b405b7ad4dfe5923b66") (:authors ("Wen Yang" . "yangwen0228@foxmail.com")) (:maintainer "Wen Yang" . "yangwen0228@foxmail.com") (:keywords "convenience" "position" "jump" "tree") (:url . "https://github.com/yangwen0228/jump-tree"))]) + (jumplist . [(20151120 345) ((cl-lib (0 5))) "Jump like vim jumplist or ex jumplist" single ((:commit . "c482d137d95bc5e1bcd790cdbde25b7f729b2502") (:authors ("ganmacs <ganmacs_at_gmail.com>")) (:maintainer "ganmacs <ganmacs_at_gmail.com>") (:keywords "jumplist" "vim") (:url . "https://github.com/ganmacs/jumplist"))]) + (jupyter . [(20210422 1451) ((emacs (26)) (zmq (0 10 3)) (cl-lib (0 5)) (simple-httpd (1 5 0)) (websocket (1 9))) "Jupyter" tar ((:commit . "1f0612eb936d36abab0f27b09cca691e81fc6e74") (:authors ("Nathaniel Nicandro" . "nathanielnicandro@gmail.com")) (:maintainer "Nathaniel Nicandro" . "nathanielnicandro@gmail.com") (:url . "https://github.com/dzop/emacs-jupyter"))]) + (just-mode . [(20210311 2359) ((emacs (26 1))) "Justfile editing mode" single ((:commit . "45c248fe72d4a15c5a9f26bc0b27adb874265f53") (:authors ("Leon Barrett" . "leon@barrettnexus.com")) (:maintainer "Leon Barrett" . "leon@barrettnexus.com") (:keywords "files" "languages" "tools") (:url . "https://github.com/leon-barrett/just-mode.el"))]) + (jvm-mode . [(20150422 708) ((dash (2 6 0)) (emacs (24))) "Monitor and manage your JVMs" single ((:commit . "3355dbaf5b0185aadfbad24160399abb32c5bea0") (:authors ("Martin Trojer" . "martin.trojer@gmail.com")) (:maintainer "Martin Trojer" . "martin.trojer@gmail.com") (:keywords "convenience") (:url . "https://github.com/martintrojer/jvm-mode.el"))]) + (k8s-mode . [(20210414 1543) ((emacs (24 3)) (yaml-mode (0 0 10))) "Major mode for Kubernetes configuration file" tar ((:commit . "14f08627d5bc320fee5bd9926e9aabe6956f514e") (:authors ("Giap Tran" . "txgvnn@gmail.com")) (:maintainer "Giap Tran" . "txgvnn@gmail.com") (:url . "https://github.com/TxGVNN/emacs-k8s-mode"))]) + (kaesar . [(20160128 1008) ((cl-lib (0 3))) "Another AES algorithm encrypt/decrypt string with password." single ((:commit . "d087075cb1a46c2c85cd075220e09b2eaef9b86e") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "data") (:url . "https://github.com/mhayashi1120/Emacs-kaesar"))]) + (kaesar-file . [(20160128 1008) ((kaesar (0 1 1))) "Encrypt/Decrypt file by AES with password." single ((:commit . "d087075cb1a46c2c85cd075220e09b2eaef9b86e") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "data" "files") (:url . "https://github.com/mhayashi1120/Emacs-kaesar"))]) + (kaesar-mode . [(20160128 1008) ((kaesar (0 1 4)) (cl-lib (0 3))) "Encrypt/Decrypt buffer by AES with password." single ((:commit . "d087075cb1a46c2c85cd075220e09b2eaef9b86e") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "data" "convenience") (:url . "https://github.com/mhayashi1120/Emacs-kaesar"))]) + (kakapo-mode . [(20171004 451) ((cl-lib (0 5))) "TABS (hard or soft) for indentation (leading whitespace), and SPACES for alignment." single ((:commit . "292e07203c676361a1d918deb5acf2123cd70eaf") (:keywords "indentation") (:url . "https://github.com/listx/kakapo-mode"))]) + (kakoune . [(20210220 1858) ((ryo-modal (0 45)) (multiple-cursors (1 4)) (expand-region (0 11 0)) (emacs (25 1))) "A simulation, but not emulation, of kakoune" tar ((:commit . "c39f278811945dbf0958ca8cf81d7b03c39efbcf") (:authors ("Joseph Morag" . "jm4157@columbia.edu")) (:maintainer "Joseph Morag" . "jm4157@columbia.edu") (:url . "https://github.com/jmorag/kakoune.el"))]) + (kaleidoscope . [(20170808 817) ((s (1 11 0))) "Controlling Kaleidoscope-powered devices." single ((:commit . "af4034dcace867c4ede0bce744d5cb888c318f23") (:authors ("Gergely Nagy")) (:maintainer "Gergely Nagy") (:url . "https://github.com/algernon/kaleidoscope.el"))]) + (kaleidoscope-evil-state-flash . [(20170728 1020) ((evil (1 2 12)) (kaleidoscope (0 1 0)) (s (1 11 0))) "Flash keyboard LEDs when changing Evil state" single ((:commit . "af4034dcace867c4ede0bce744d5cb888c318f23") (:authors ("Gergely Nagy")) (:maintainer "Gergely Nagy") (:url . "https://github.com/algernon/kaleidoscope.el"))]) + (kana . [(20210531 1427) ((emacs (24 4)) (dash (2 17 0))) "Learn Japanese hiragana and katakana" single ((:commit . "d3d550aad67ef8625b3860598bf3622f5b2a7d32") (:authors ("Damon Chan" . "elecming@gmail.com")) (:maintainer "Damon Chan" . "elecming@gmail.com") (:keywords "tools") (:url . "https://github.com/chenyanming/kana"))]) + (kanban . [(20170418 810) nil "Parse org-todo headlines to use org-tables as Kanban tables" single ((:commit . "dd11d722b20ae720f29b8aa93a3b1cad87650b33") (:authors ("Arne Babenhauserheide" . "arne_bab@web.de")) (:maintainer "Arne Babenhauserheide" . "arne_bab@web.de") (:keywords "outlines" "convenience"))]) + (kanji-mode . [(20160826 1139) nil "View stroke order for kanji characters at cursor" tar ((:commit . "eda4f8666486689d36317db7dbda54fb73d3e3d2") (:authors ("Wojciech Gac" . "wojciech.s.gac@gmail.com")) (:maintainer "Wojciech Gac" . "wojciech.s.gac@gmail.com") (:url . "http://github.com/wsgac/kanji-mode "))]) + (kaocha-runner . [(20190904 1950) ((emacs (26)) (s (1 4 0)) (cider (0 21 0)) (parseedn (0 1 0))) "A package for running Kaocha tests via CIDER." single ((:commit . "755b0dfb3bd676c769c4b4aeb81c2cd5828bd207") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:url . "https://github.com/magnars/kaocha-runner.el"))]) + (kaolin-themes . [(20210605 1117) ((emacs (25 1)) (autothemer (0 2 2)) (cl-lib (0 6))) "A set of eye pleasing themes" tar ((:commit . "7eb08e47bc5f227c72c318ff327c689ab54a7620") (:authors ("Ogden Webb" . "ogdenwebb@gmail.com")) (:maintainer "Ogden Webb" . "ogdenwebb@gmail.com") (:keywords "dark" "light" "teal" "blue" "violet" "purple" "brown" "theme" "faces") (:url . "https://github.com/ogdenwebb/emacs-kaolin-themes"))]) + (kaomoji . [(20171227 440) ((emacs (24 3)) (helm-core (1 9 1))) "Input kaomoji superb easily" tar ((:commit . "90a1490743b2a30762f5454c9d9309018eff83dd") (:authors ("Ono Hiroko" . "azazabc123@gmail.com")) (:maintainer "Ono Hiroko" . "azazabc123@gmail.com") (:keywords "tools" "fun") (:url . "https://github.com/kuanyui/kaomoji.el"))]) + (kapacitor . [(20190414 1908) ((emacs (25 1)) (magit (2 13 0)) (magit-popup (2 12 4))) "Main file for kapacitor-mode" single ((:commit . "e3300d8b4017a2f66b0d929cb85bcc7ee2612072") (:authors ("Manoj Kumar Manikchand" . "manojm.321@gmail.com")) (:maintainer "Manoj Kumar Manikchand" . "manojm.321@gmail.com") (:keywords "kapacitor" "emacs" "magit" "tools") (:url . "http://github.com/Manoj321/kapacitor-el"))]) + (karma . [(20160220 1245) ((pkg-info (0 4)) (emacs (24))) "Karma Test Runner Emacs Integration" single ((:commit . "31d3e7708246183d7ed0686be92bf23140af348c") (:authors ("Samuel Tonini")) (:maintainer "Samuel Tonini") (:keywords "language" "javascript" "js" "karma" "testing") (:url . "http://github.com/tonini/karma.el"))]) + (kconfig-mode . [(20210321 1106) ((emacs (24 3))) "Major mode for editing Kconfig files" single ((:commit . "7d03fa239e6879854c3b26c8e750489eceb58503") (:authors ("Dela Anthonio" . "dell.anthonio@gmail.com")) (:maintainer "Dela Anthonio" . "dell.anthonio@gmail.com") (:keywords "kconfig" "languages" "linux" "kernel") (:url . "https://github.com/delaanthonio/kconfig-mode"))]) + (kdeconnect . [(20210519 2016) nil "An interface for KDE Connect" single ((:commit . "4977af8cb5fdc21da770f3ee43ad7823f2937da3") (:authors ("Carl Lieberman" . "dev@carl.ac")) (:maintainer "Carl Lieberman" . "dev@carl.ac") (:keywords "kdeconnect" "android"))]) + (keepass-mode . [(20210110 630) ((emacs (27))) "Mode to open Keepass DB" single ((:commit . "515343a7667b2bf4253309449f65a6eb94933df7") (:authors ("Ignasi Fosch" . "natx@y10k.ws")) (:maintainer "Ignasi Fosch" . "natx@y10k.ws") (:keywords "data" "files" "tools") (:url . "https://github.com/ifosch/keepass-mode"))]) + (keg . [(20210226 2246) ((emacs (24 1)) (cl-lib (0 6))) "Modern Elisp package development system" tar ((:commit . "e4c7d9d8f823fa717df5f0e7039d525758429fc9") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "convenience") (:url . "https://github.com/conao3/keg.el"))]) + (keg-mode . [(20200601 333) ((emacs (24 4))) "Major mode for editing Keg files" single ((:commit . "e4c7d9d8f823fa717df5f0e7039d525758429fc9") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "convenience") (:url . "https://github.com/conao3/keg.el"))]) + (kerl . [(20150424 2005) nil "Emacs integration for kerl" single ((:commit . "1732ee26213f021bf040919c45ad276aafcaae14") (:authors ("Correl Roush" . "correl@gmail.com")) (:maintainer "Correl Roush" . "correl@gmail.com") (:keywords "tools") (:url . "http://github.com/correl/kerl.el/"))]) + (key-assist . [(20210415 227) ((emacs (24 3))) "Minibuffer keybinding cheatsheet and launcher" single ((:commit . "fae7ce265db3bcfd1c6153eb051afd8789e61a4b") (:authors ("Boruch Baum" . "boruch_baum@gmx.com")) (:maintainer "Boruch Baum" . "boruch_baum@gmx.com") (:keywords "abbrev" "convenience" "docs" "help") (:url . "https://github.com/Boruch-Baum/emacs-key-assist"))]) + (key-chord . [(20201222 2030) ((emacs (24))) "map pairs of simultaneously pressed keys to commands" single ((:commit . "7f7fd7c5bd2b996fa054779357e1566f7989e07d") (:authors ("David Andersson <l.david.andersson(at)sverige.nu>")) (:maintainer "David Andersson <l.david.andersson(at)sverige.nu>") (:keywords "keyboard" "chord" "input"))]) + (key-combo . [(20150324 1439) nil "map key sequence to commands" single ((:commit . "2fb5c65bc82d5bd2964e2b163822429ab45d90a1") (:authors ("Yuuki Arisawa" . "yuuki.ari@gmail.com")) (:maintainer "Vitalie Spinu" . "spinuvit@gmail.com") (:keywords "keyboard" "input") (:url . "https://github.com/uk-ar/key-combo"))]) + (key-intercept . [(20140211 749) nil "Intercept prefix keys" single ((:commit . "d9a60edb4ce893f2d3d94f242164fdcc62d43cf2") (:authors ("INA Lintaro <tarao.gnn at gmail.com>")) (:maintainer "INA Lintaro <tarao.gnn at gmail.com>") (:keywords "keyboard") (:url . "http://github.com/tarao/key-intercept-el"))]) + (key-leap . [(20160831 1447) ((emacs (24 3))) "Leap between lines by typing keywords" single ((:commit . "b3f6ef15c8a13870475d5af159fa24b30f97dea0") (:authors ("Martin Rykfors" . "martinrykfors@gmail.com")) (:maintainer "Martin Rykfors" . "martinrykfors@gmail.com") (:keywords "point" "convenience") (:url . "https://github.com/MartinRykfors/key-leap"))]) + (key-quiz . [(20200226 2129) ((emacs (26))) "Emacs Keys Quiz" single ((:commit . "1ee67f3f8977d95785e021f7896685de1979137e") (:authors ("Federico Tedin" . "federicotedin@gmail.com")) (:maintainer "Federico Tedin" . "federicotedin@gmail.com") (:keywords "games") (:url . "https://github.com/federicotdn/key-quiz"))]) + (key-seq . [(20150907 756) ((key-chord (0 6))) "map pairs of sequentially pressed keys to commands" single ((:commit . "e29b083a6427d061638749194fc249ef69ad2cc0") (:authors ("Vyacheslav Levit" . "dev@vlevit.org")) (:maintainer "Vyacheslav Levit" . "dev@vlevit.org") (:keywords "convenience" "keyboard" "keybindings") (:url . "http://github.com/vlevit/key-seq.el"))]) + (keycast . [(20210521 828) ((emacs (25 3))) "Show current command and its key in the mode line" single ((:commit . "a12ef1fb480b56c34c92f48fc7f7aa8a1d7c4c4b") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/tarsius/keycast"))]) + (keychain-environment . [(20180318 2223) nil "load keychain environment variables" single ((:commit . "d3643196de6dc79ea77f9f4805028350fd76100b") (:authors ("Paul Tipper <bluefoo at googlemail dot com>")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "gnupg" "pgp" "ssh") (:url . "https://github.com/tarsius/keychain-environment"))]) + (keydef . [(20090428 1931) nil "a simpler way to define keys, with kbd syntax" single ((:commit . "dff2be9f58d12d8c6a490ad0c1b2b10b55528dc0") (:authors ("Michael John Downes" . "mjd@ams.org")) (:maintainer "Michael John Downes" . "mjd@ams.org") (:keywords "convenience" "lisp" "customization" "keyboard" "keys"))]) + (keyfreq . [(20160516 1416) ((cl-lib (0 5))) "track command frequencies" single ((:commit . "e5fe9d585ce882f1ba9afa5d894eaa82c79be4f4") (:authors ("Ryan Yeske, Michal Nazarewicz (mina86/AT/mina86.com)")) (:maintainer "David Capello, Xah lee"))]) + (keymap-utils . [(20210125 823) ((cl-lib (0 3))) "keymap utilities" single ((:commit . "0b282e19ac3d23b9a74f656b137b9eebeb2aaa39") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience" "extensions") (:url . "https://github.com/tarsius/keymap-utils"))]) + (keypress-multi-event . [(20190109 530) ((emacs (24 3))) "Perform different actions for the same keypress." single ((:commit . "f7041deccd9d03066c2fe41c3443c42a4713ac02") (:authors ("Boruch Baum" . "boruch_baum@gmx.com")) (:maintainer "Boruch Baum" . "boruch_baum@gmx.com") (:keywords "abbrev" "convenience" "wp" "keyboard") (:url . "https://www.github.com/Boruch_Baum/emacs-keypress-multi-event"))]) + (keypression . [(20200819 534) ((emacs (26 3))) "Keystroke visualizer" single ((:commit . "9427241f3fa539e4b5ad7581a05eb7e49f2cf518") (:authors ("chuntaro" . "chuntaro@sakura-games.jp")) (:maintainer "chuntaro" . "chuntaro@sakura-games.jp") (:keywords "key" "screencast" "tools") (:url . "https://github.com/chuntaro/emacs-keypression"))]) + (keyset . [(20150220 530) ((dash (2 8 0)) (cl-lib (0 5))) "A small library for structuring key bindings." single ((:commit . "45ce83c4b56f064874256db37e697a63b2c69e65") (:authors ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainer "Hiroki YAMAKAWA" . "s06139@gmail.com") (:url . "https://github.com/HKey/keyset"))]) + (keystore-mode . [(20190409 1946) ((emacs (24 3)) (origami (1 0)) (s (1 12 0)) (seq (2 20))) "A major mode for viewing and managing (java) keystores" tar ((:commit . "43bd5926348298d077c7221f37902c990df3f951") (:authors ("Peterpaul Taekele Klein Haneveld" . "pp.kleinhaneveld@gmail.com")) (:maintainer "Peterpaul Taekele Klein Haneveld" . "pp.kleinhaneveld@gmail.com") (:keywords "tools") (:url . "https://github.com/peterpaul/keystore-mode"))]) + (keyswap . [(20160813 957) ((emacs (24 3))) "swap bindings between key pairs" single ((:commit . "cd682a7c4a8d64d6bae6a005db5045232e5e7b95") (:authors ("Matthew Malcomson" . "hardenedapple@gmail.com")) (:maintainer "Matthew Malcomson" . "hardenedapple@gmail.com") (:keywords "convenience") (:url . "http://github.com/hardenedapple/keyswap.el"))]) + (keytar . [(20210523 403) ((emacs (24 4))) "Emacs Lisp interface for node-keytar" single ((:commit . "8d2a5ec4a7fe766a62037b05f26a8f36fff45c06") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/emacs-grammarly/keytar"))]) + (keyword-search . [(20180424 1102) nil "browser keyword search from Emacs" tar ((:commit . "f8475ecaddb8804a9be6bee47678207c86ac8dee") (:maintainer "Jens Petersen") (:keywords "web" "search" "keyword") (:url . "https://github.com/juhp/keyword-search"))]) + (kfg . [(20140909 538) ((f (0 17 1))) "an emacs configuration system" single ((:commit . "d2c9dd26618fb2f7bf1e7b6eae193b1cceba3c97") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/kfg"))]) + (khardel . [(20201019 553) ((emacs (25 1)) (yaml-mode (0 0 13))) "Integrate with khard" tar ((:commit . "ca021fad32430e3f3a995d4158e73b5ee485258d") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://github.com/DamienCassou/khardel"))]) + (kibit-helper . [(20150508 1533) ((s (0 8)) (emacs (24))) "Conveniently use the Kibit Leiningen plugin from Emacs" single ((:commit . "16bdfff785ee05d8e74a5780f6808506d990cef7") (:authors ("Jonas Enlund") ("James Elliott" . "james@brunchboy.com")) (:maintainer "Jonas Enlund") (:keywords "languages" "clojure" "kibit") (:url . "http://www.github.com/brunchboy/kibit-helper"))]) + (kill-or-bury-alive . [(20210320 1231) ((emacs (24 4)) (cl-lib (0 5))) "Precise control over buffer killing in Emacs" single ((:commit . "388067e764bf3922234196e2e9dd9e8f664c634d") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:keywords "buffer" "killing" "convenience") (:url . "https://github.com/mrkkrp/kill-or-bury-alive"))]) + (kill-ring-search . [(20140422 1555) nil "incremental search for the kill ring" single ((:commit . "23535b4a01a1cb1574604e36c49614e84e85c883") (:authors ("Nikolaj Schumacher <bugs * nschum de>")) (:maintainer "Nikolaj Schumacher <bugs * nschum de>") (:keywords "convenience" "matching") (:url . "http://nschum.de/src/emacs/kill-ring-search/"))]) + (killer . [(20190128 10) nil "kill and delete text" single ((:commit . "ace0547944933440384ceeb5876b1f68c082d540") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "http://github.com/tarsius/killer"))]) + (kite . [(20130201 1938) ((json (1 2)) (websocket (0 93 1))) "WebKit inspector front-end" tar ((:commit . "7ed74d1147a6ddd152d3da65dc30df3517d53144") (:authors ("Julian Scheid" . "julians37@gmail.com")) (:maintainer "Julian Scheid" . "julians37@gmail.com") (:keywords "tools"))]) + (kite-mini . [(20160508 1106) ((dash (2 11 0)) (websocket (1 5))) "Remotely evaluate JavaScript in the WebKit debugger" tar ((:commit . "a68619dbc109c7989f3448426d8c1ee9e797c11f") (:authors ("Tung Dao" . "me@tungdao.com")) (:maintainer "Tung Dao" . "me@tungdao.com") (:keywords "webkit") (:url . "https://github.com/tungd/kite-mini.el"))]) + (kivy-mode . [(20210318 2106) nil "Emacs major mode for editing Kivy files" single ((:commit . "3894a454ee03ede25e920759e6ac2df040ff3431") (:authors ("Dean Serenevy" . "dean@serenevy.net")) (:maintainer "Dean Serenevy" . "dean@serenevy.net"))]) + (kiwix . [(20210219 51) ((emacs (24 4)) (request (0 3 0))) "Searching offline Wikipedia through Kiwix." tar ((:commit . "0c5e1619f079df822686cf42af5859111b6afd44") (:authors ("stardiviner" . "numbchild@gmail.com")) (:maintainer "stardiviner" . "numbchild@gmail.com") (:keywords "kiwix" "wikipedia") (:url . "https://github.com/stardiviner/kiwix.el"))]) + (kixtart-mode . [(20150611 1604) ((emacs (24))) "major mode for Kixtart scripting files" single ((:commit . "1c2356797e7b766bbaaa2b341176a8b10499cd79") (:authors ("Ryrun <https://github.com/ryrun>")) (:maintainer "Ryrun <https://github.com/ryrun>") (:keywords "languages") (:url . "https://github.com/ryrun/kixtart-mode"))]) + (klere-theme . [(20210320 1912) ((emacs (24))) "A dark theme with lambent color highlights and incremental grays" single ((:commit . "f9eacacc00455e6c42961ec41f24f864c2a05ace") (:authors ("Wamm K. D." . "jaft.r@outlook.com")) (:maintainer "Wamm K. D." . "jaft.r@outlook.com") (:url . "https://codeberg.org/WammKD/emacs-klere-theme"))]) + (know-your-http-well . [(20160208 2304) nil "Look up the meaning of HTTP headers, methods, relations, status codes" tar ((:commit . "3cc5ab6d2764ab7aacb1b6e026abaccbeb6c37f2"))]) + (kodi-remote . [(20190622 1325) ((request (0 2 0)) (let-alist (1 0 4)) (json (1 4)) (cl-lib (0 5)) (f (20190109 906))) "Remote Control for Kodi" single ((:commit . "f5e932036c16e2b61a63020e006fc601e38d181e") (:authors ("Stefan Huchler" . "stefan.huchler@mail.de")) (:maintainer "Stefan Huchler" . "stefan.huchler@mail.de") (:keywords "kodi" "tools" "convinience") (:url . "http://github.com/spiderbit/kodi-remote.el"))]) + (kolon-mode . [(20140122 1134) nil "Syntax highlighting for Text::Xslate's Kolon syntax" single ((:commit . "5af0955e280ae991862189ebecd3937c5fc8fb9f") (:authors ("Sam Tran")) (:maintainer "Sam Tran") (:keywords "xslate" "perl") (:url . "https://github.com/samvtran/kolon-mode"))]) + (kooten-theme . [(20161023 905) ((emacs (24 1))) "Dark color theme" single ((:commit . "d10197b4dd7af02cd14aeab2573c273a294798c3") (:authors ("Pascal van Kooten" . "kootenpv@gmail.com")) (:maintainer "Pascal van Kooten" . "kootenpv@gmail.com") (:keywords "themes") (:url . "http://github.com/kootenpv/emacs-kooten-theme"))]) + (korean-holidays . [(20190102 1558) nil "Korean holidays for calendar." single ((:commit . "3f90ed86f46f8e5533f23baa40e2513ac497ca2b") (:authors ("SeungKi Kim" . "tttuuu888@gmail.com")) (:maintainer "SeungKi Kim" . "tttuuu888@gmail.com") (:keywords "calendar") (:url . "https://github.com/tttuuu888/korean-holidays"))]) + (kosmos-theme . [(20170502 1850) ((emacs (24))) "Black and lightgray theme with not so much syntax highlighting." single ((:commit . "616456d2376a75dc31190ad65137d179fbad4336") (:authors ("Maxim Kim" . "habamax@gmail.com")) (:maintainer "Maxim Kim" . "habamax@gmail.com") (:url . "https://github.com/habamax/kosmos-theme"))]) + (kotlin-mode . [(20200925 1541) ((emacs (24 3))) "Major mode for kotlin" tar ((:commit . "0e4bafb31d1fc2a0a420a521c2723d5526646c0b") (:authors ("Shodai Yokoyama" . "quantumcars@gmail.com")) (:maintainer "Shodai Yokoyama" . "quantumcars@gmail.com") (:keywords "languages"))]) + (kpm-list . [(20170924 1352) nil "An emacs buffer list that tries to intelligently group together buffers." single ((:commit . "e0f5112e5ce8ec1b603f4428fa51681c68bb28f5") (:authors ("Kevin Mahoney")) (:maintainer "Kevin Mahoney") (:url . "https://github.com/KMahoney/kpm-list/"))]) + (kroman . [(20150827 2340) nil "Korean hangul romanization" single ((:commit . "90402b6ae40383e75d8ba97d66eee93eebf40f70") (:authors ("Zhang Kai Yu" . "yeannylam@gmail.com")) (:maintainer "Zhang Kai Yu" . "yeannylam@gmail.com") (:keywords "korean" "roman"))]) + (ksp-cfg-mode . [(20190414 2348) ((emacs (24)) (cl-lib (0 5))) "major mode for editing KSP CFG files" single ((:commit . "faec8bd8456c67276d065eb68c88a30efcef59ef") (:authors ("Emily Backes" . "lucca@accela.net")) (:maintainer "Emily Backes" . "lucca@accela.net") (:keywords "data") (:url . "http://github.com/lashtear/ksp-cfg-mode"))]) + (kubectx-mode . [(20200116 1918) ((emacs (24))) "Change kubectl context/namespace and show in mode line" single ((:commit . "f08687ae5403eb18bbeffc6dafdfde469bdb9a36") (:authors ("Terje Sannum" . "terje@offpiste.org")) (:maintainer "Terje Sannum" . "terje@offpiste.org") (:keywords "tools" "kubernetes") (:url . "https://github.com/terjesannum/emacs-kubectx-mode"))]) + (kubel . [(20210326 2053) ((transient (0 1 0)) (emacs (25 3)) (dash (2 12 0)) (s (1 2 0)) (yaml-mode (0 0 14))) "Control Kubernetes with limited permissions" single ((:commit . "91d1c8e97e4168fc49548c3449b4a60568c96790") (:authors ("Adrien Brochard")) (:maintainer "Adrien Brochard") (:keywords "kubernetes" "k8s" "tools" "processes") (:url . "https://github.com/abrochard/kubel"))]) + (kubel-evil . [(20201223 1657) ((kubel (1 0)) (evil (1 0)) (emacs (25 3))) "extension for kubel to provide evil keybindings" single ((:commit . "91d1c8e97e4168fc49548c3449b4a60568c96790") (:authors ("Marcel Patzwahl")) (:maintainer "Marcel Patzwahl") (:keywords "kubernetes" "k8s" "tools" "processes" "evil" "keybindings") (:url . "https://github.com/abrochard/kubel"))]) + (kubernetes . [(20210611 819) ((emacs (25 1)) (dash (2 12 0)) (magit (2 8 0)) (magit-popup (2 13 0))) "Magit-like porcelain for Kubernetes." tar ((:commit . "9e6a41ccefd4d1c03ac9ce82181b6f534720c1f7") (:authors ("Chris Barrett" . "chris+emacs@walrus.cool")) (:maintainer "Chris Barrett" . "chris+emacs@walrus.cool"))]) + (kubernetes-evil . [(20210611 447) ((kubernetes (0 15 0)) (evil (1 2 12))) "Kubernetes keybindings for evil-mode." single ((:commit . "9e6a41ccefd4d1c03ac9ce82181b6f534720c1f7") (:authors ("Chris Barrett" . "chris+emacs@walrus.cool")) (:maintainer "Chris Barrett" . "chris+emacs@walrus.cool"))]) + (kubernetes-helm . [(20190201 320) ((yaml-mode (0 0 13)) (emacs (25 3))) "extension for helm, the package manager for kubernetes" single ((:commit . "bdf9280899b5efab6d55ffd96bad716c5f8e75bc") (:authors ("Adrien Brochard")) (:maintainer "Adrien Brochard") (:keywords "kubernetes" "helm" "k8s" "tools" "processes") (:url . "https://github.com/abrochard/kubernetes-helm"))]) + (kubernetes-tramp . [(20181228 922) ((emacs (24)) (cl-lib (0 5))) "TRAMP integration for kubernetes containers" single ((:commit . "8713571b66940f8f3f496b55baa23cdf1df7a869") (:authors ("Giovanni Ruggiero" . "giovanni.ruggiero+github@gmail.com")) (:maintainer "Giovanni Ruggiero" . "giovanni.ruggiero+github@gmail.com") (:keywords "kubernetes" "convenience") (:url . "https://github.com/gruggiero/kubernetes-tramp"))]) + (kurecolor . [(20200113 2027) ((emacs (24 1)) (s (1 0))) "color editing goodies for Emacs" single ((:commit . "3fc84840cbbd75e646cafa2fd3a00004b55e37ec") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com"))]) + (kv . [(20140108 1534) nil "key/value data structure functions" single ((:commit . "721148475bce38a70e0b678ba8aa923652e8900e") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:keywords "lisp"))]) + (kwin . [(20150308 1812) nil "communicatewith the KWin window manager" single ((:commit . "d4f8f3593598b71ee596e0a87b2c1d6a912a9566") (:authors ("Simon Hafner")) (:maintainer "Simon Hafner") (:url . "http://github.com/reactormonk/kwin-minor-mode"))]) + (l . [(20210214 1130) ((seq (2 20))) "Compact syntax for short lambda" single ((:commit . "518203abc6cee13c73c2d91282354ed59f00f15e") (:keywords "extensions") (:url . "https://git.sr.ht/~tarsius/l"))]) + (laas . [(20210607 1851) ((emacs (26 3)) (auctex (11 88)) (aas (0 2)) (yasnippet (0 14))) "A bundle of as-you-type LaTeX snippets" single ((:commit . "9d6f4448347fcf48d0fed51eba16423c9254c212") (:maintainer "Yoav Marco" . "yoavm448@gmail.com") (:keywords "tools" "tex") (:url . "https://github.com/tecosaur/LaTeX-auto-activating-snippets"))]) + (lab-themes . [(20200815 2104) ((emacs (24))) "A custom theme carefully constructed in the LAB space" tar ((:commit . "9d7deb9635959d3a50ccb1082eb1207275f4b3e8") (:authors ("MetroWind" . "chris.corsair@gmail.com")) (:maintainer "MetroWind" . "chris.corsair@gmail.com") (:keywords "lisp") (:url . "https://github.com/MetroWind/lab-theme"))]) + (labburn-theme . [(20200822 2153) nil "A lab color space zenburn theme." single ((:commit . "4ef2892f56c973907361bc91495d14204744f678") (:authors ("Johannes Goslar")) (:maintainer "Johannes Goslar") (:keywords "theme" "zenburn") (:url . "https://github.com/ksjogo/labburn-theme"))]) + (laguna-theme . [(20200928 2159) nil "A theme that's easy on the eyes & focuses on importance." single ((:commit . "61b18f6362b94e42ea5ab19a6f2debc2bd917eda") (:authors ("Henry Newcomer" . "a.cliche.email@gmail.com")) (:maintainer "Henry Newcomer" . "a.cliche.email@gmail.com") (:url . "https://github.com/HenryNewcomer/laguna-theme"))]) + (lakota-input . [(20200823 2146) nil "Input modes for Lakota language orthographies" single ((:commit . "b74b9de284a0404a120bb15340def4dd2f9a4779") (:authors ("Grant Shangreaux" . "shshoshin@protonmail.com")) (:maintainer "Grant Shangreaux" . "shshoshin@protonmail.com") (:url . "https://git.sr.ht/~shoshin/lakota-input.git"))]) + (lambdapi-mode . [(20210520 1737) ((emacs (26 1)) (eglot (1 5)) (math-symbol-lists (1 2 1)) (highlight (20190710 1527))) "A major mode for editing Lambdapi source code" tar ((:commit . "bad5775c076124ca871fae0569f3993828d371ca") (:maintainer "Deducteam" . "dedukti-dev@inria.fr") (:keywords "languages") (:url . "https://github.com/Deducteam/lambdapi"))]) + (lammps-mode . [(20180801 1319) ((emacs (24 4))) "basic syntax highlighting for LAMMPS files" single ((:commit . "a5b68d7a59975770b56ee8f6e66fa4f703a72ffe") (:authors ("Aidan Thompson <athomps at sandia.gov>")) (:maintainer "Rohit Goswami <r95g10 at gmail.com>") (:keywords "languages" "faces") (:url . "https://github.com/lammps/lammps/tree/master/tools/emacs"))]) + (lang-refactor-perl . [(20131122 2127) nil "Simple refactorings, primarily for Perl" single ((:commit . "691bd69639de6b7af357e3b7143563ececd9c497") (:authors (nil . "Johan Lindstrom <buzzwordninja not_this_bit@googlemail.com>")) (:maintainer nil . "Johan Lindstrom <buzzwordninja not_this_bit@googlemail.com>") (:keywords "languages" "refactoring" "perl") (:url . "https://github.com/jplindstrom/emacs-lang-refactor-perl"))]) + (langdoc . [(20150218 645) ((cl-lib (0 2))) "Help to define help document mode for various languages" single ((:commit . "2c7223bacb116992d700ecb19a60df5c09c63424") (:authors ("Tomoya Tanjo" . "ttanjo@gmail.com")) (:maintainer "Tomoya Tanjo" . "ttanjo@gmail.com") (:keywords "convenience" "eldoc") (:url . "https://github.com/tom-tan/langdoc/"))]) + (langtool . [(20200529 230) ((cl-lib (0 3))) "Grammar check utility using LanguageTool" single ((:commit . "8276eccc5587bc12fd205ee58a7a982f0a136e41") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "docs") (:url . "https://github.com/mhayashi1120/Emacs-langtool"))]) + (langtool-ignore-fonts . [(20210526 2340) ((emacs (25 1)) (langtool (2 2 1))) "Force langtool to ignore certain fonts" single ((:commit . "c3291c85b733b9047653cbb1f525655394610bdb") (:authors ("Christopher Lloyd" . "cjl8zf@virginia.edu")) (:maintainer "Christopher Lloyd" . "cjl8zf@virginia.edu") (:url . "https://github.com/cjl8zf/langtool-ignore-fonts"))]) + (language-detection . [(20161123 1813) ((emacs (24)) (cl-lib (0 5))) "Automatic language detection from code snippets" single ((:commit . "54a6ecf55304fba7d215ef38a4ec96daff2f35a4") (:authors ("Andreas Jansson" . "andreas@jansson.me.uk")) (:maintainer "Andreas Jansson" . "andreas@jansson.me.uk") (:url . "https://github.com/andreasjansson/language-detection.el"))]) + (language-id . [(20210411 1332) ((emacs (24)) (cl-lib (0 5))) "Library to work with programming language identifiers" single ((:commit . "30a5bc267af7de167d0a835ead828016e6e7e14c") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "languages" "util") (:url . "https://github.com/lassik/emacs-language-id"))]) + (languagetool . [(20210611 2310) ((emacs (25 1)) (request (0 3 2))) "LanguageTool integration for grammar and spell check" tar ((:commit . "21ad874bc82cbc818cf0b34fc949a1e58efbb829") (:authors ("Joar Buitrago" . "jebuitragoc@unal.edu.co")) (:maintainer "Joar Buitrago" . "jebuitragoc@unal.edu.co") (:keywords "grammar" "text" "docs" "tools" "convenience" "checker") (:url . "https://github.com/PillFall/Emacs-LanguageTool.el"))]) + (lastfm . [(20201212 836) ((emacs (26 1)) (request (0 3 0)) (anaphora (1 0 4)) (memoize (1 1)) (elquery (0 1 0)) (s (1 12 0))) "Last.fm API for Emacs Lisp" single ((:commit . "276c30a16518e545c95b7d693bada3ec01ddd207") (:authors ("Mihai Olteanu" . "mihai_olteanu@fastmail.fm")) (:maintainer "Mihai Olteanu" . "mihai_olteanu@fastmail.fm") (:keywords "multimedia" "api") (:url . "https://github.com/mihaiolteanu/lastfm.el/"))]) + (lastpass . [(20201229 2109) ((emacs (24 4)) (seq (1 9)) (cl-lib (0 5))) "LastPass command wrapper" single ((:commit . "2366de7824b6c5f8e9ec6811d219dc06794e8630") (:authors ("Petter Storvik")) (:maintainer "Petter Storvik") (:keywords "extensions" "processes" "lpass" "lastpass") (:url . "https://github.com/storvik/emacs-lastpass"))]) + (latex-extra . [(20170817 147) ((auctex (11 86 1)) (cl-lib (0 5))) "Adds several useful functionalities to LaTeX-mode." single ((:commit . "82d99b8b0c2db20e5270749582e03bcc2443ffb5") (:authors ("Artur Malabarba" . "artur@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "artur@endlessparentheses.com") (:keywords "tex") (:url . "http://github.com/Malabarba/latex-extra"))]) + (latex-math-preview . [(20190123 802) nil "preview LaTeX mathematical expressions." single ((:commit . "90fd86da2d9514882146a5db40cb916fc533cf55") (:authors ("Takayuki YAMAGUCHI" . "d@ytak.info")) (:maintainer "Takayuki YAMAGUCHI" . "d@ytak.info") (:keywords "latex" "tex") (:url . "https://gitlab.com/latex-math-preview/latex-math-preview"))]) + (latex-pretty-symbols . [(20151112 1044) nil "Display many latex symbols as their unicode counterparts" single ((:commit . "83d5888147bb734a94dfd4847a11e975a7d86ba8") (:authors ("Erik Parmann" . "eparmann@gmail.com") ("Pål Drange")) (:maintainer "Erik Parmann" . "eparmann@gmail.com") (:keywords "convenience" "display") (:url . "https://bitbucket.org/mortiferus/latex-pretty-symbols.el"))]) + (latex-preview-pane . [(20181008 1822) nil "Makes LaTeX editing less painful by providing a updatable preview pane" tar ((:commit . "5297668a89996b50b2b62f99cba01cc544dbed2e") (:authors ("John L. Singleton" . "jsinglet@gmail.com")) (:maintainer "John L. Singleton" . "jsinglet@gmail.com") (:keywords "latex" "preview") (:url . "http://www.emacswiki.org/emacs/LaTeXPreviewPane"))]) + (latex-unicode-math-mode . [(20170123 1816) nil "Input method for Unicode math symbols" tar ((:commit . "eb4a5c9f9b00a58d2ca80f90782a851f4c8497b8") (:authors ("Christoph Dittmann" . "github@christoph-d.de")) (:maintainer "Christoph Dittmann" . "github@christoph-d.de") (:url . "https://github.com/Christoph-D/latex-unicode-math-mode"))]) + (latexdiff . [(20190827 1651) ((emacs (24 4))) "Latexdiff integration in Emacs" single ((:commit . "56d0b240867527d1b43d3ddec14059361929b971") (:authors ("Launay Gaby" . "gaby.launay@tutanota.com")) (:maintainer "Launay Gaby" . "gaby.launay@tutanota.com") (:keywords "tex" "vc" "tools" "git" "helm") (:url . "http://github.com/galaunay/latexdiff.el"))]) + (launch . [(20130619 2204) nil "launch files with OS-standard associated applications." single ((:commit . "e7c3b573fc05fe4d3d322389079909311542e799") (:authors ("Simon Law" . "sfllaw@sfllaw.ca")) (:maintainer "Simon Law" . "sfllaw@sfllaw.ca") (:keywords "convenience" "processes") (:url . "https://github.com/sfllaw/emacs-launch"))]) + (launch-mode . [(20170106 512) ((emacs (24 4))) "Major mode for launch-formatted text" tar ((:commit . "25ebd4ba77afcbe729901eb74923dbe9ae81c313") (:authors ("iory" . "ab.ioryz@gmail.com")) (:maintainer "iory" . "ab.ioryz@gmail.com") (:url . "https://github.com/iory/launch-mode"))]) + (launchctl . [(20210611 2243) ((emacs (24 1))) "Interface to launchctl on Mac OS X." single ((:commit . "c9b7e93f5ec6fa504dfb03d60571cf3e5dc38e12") (:authors ("Peking Duck <github.com/pekingduck>")) (:maintainer "Peking Duck <github.com/pekingduck>") (:keywords "tools" "convenience") (:url . "http://github.com/pekingduck/launchctl-el"))]) + (lavender-theme . [(20170808 1313) ((emacs (24 0))) "an Emacs 24 theme based on Lavender (tmTheme)" single ((:commit . "ef5e959b95d7fb8152137bc186c4c24e986c1e3c") (:authors ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))]) + (lavenderless-theme . [(20201222 1627) ((colorless-themes (0 2))) "A mostly colorless version of lavender-theme" single ((:commit . "c1ed1e12541cf05cc6c558d23c089c07e10b54d7") (:authors ("Thomas Letan" . "lthms@soap.coffee")) (:maintainer "Thomas Letan" . "lthms@soap.coffee") (:keywords "faces" "theme") (:url . "https://git.sr.ht/~lthms/colorless-themes.el"))]) + (lcb-mode . [(20160816 540) ((emacs (24))) "LiveCode Builder major mode" single ((:commit . "be0768e9aa6f9b8e76f2230f4f7f4d152a766b9a") (:authors ("Peter TB Brett" . "peter@peter-b.co.uk")) (:maintainer "Peter TB Brett" . "peter@peter-b.co.uk") (:keywords "languages") (:url . "https://github.com/peter-b/lcb-mode"))]) + (lcr . [(20210102 853) ((dash (2 12 0)) (emacs (25 1))) "lightweight coroutines" single ((:commit . "493424dab9f374c5521dca8714481b70cb3c3cfd") (:authors ("Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com")) (:maintainer "Jean-Philippe Bernardy" . "jeanphilippe.bernardy@gmail.com") (:keywords "tools") (:url . "https://github.com/jyp/lcr"))]) + (leaf . [(20210611 1550) ((emacs (24 1))) "Simplify your init.el configuration, extended use-package" single ((:commit . "a4fd520f5c31f54e0797155866e0b35df277664e") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "lisp" "settings") (:url . "https://github.com/conao3/leaf.el"))]) + (leaf-convert . [(20201012 41) ((emacs (26 1)) (leaf (3 6 0)) (leaf-keywords (1 1 0)) (ppp (2 1))) "Convert many format to leaf format" single ((:commit . "c5bce825e4a171076c8f93692111979bcb428cdc") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "tools") (:url . "https://github.com/conao3/leaf-convert.el"))]) + (leaf-defaults . [(20210301 118) ((emacs (26 1)) (leaf (4 1)) (leaf-keywords (1 1))) "Awesome leaf config collections" tar ((:commit . "96ce39d4f16736f1e654e24eac16a2603976c724") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "convenience") (:url . "https://github.com/conao3/leaf-defaults.el"))]) + (leaf-keywords . [(20210222 1243) ((emacs (24 4)) (leaf (3 5 0))) "Additional leaf.el keywords for external packages" tar ((:commit . "4146621f4ae80ef0c30160337119441c1f6334b6") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "lisp" "settings") (:url . "https://github.com/conao3/leaf-keywords.el"))]) + (leaf-manager . [(20200920 1643) ((emacs (26 1)) (leaf (4 1)) (leaf-convert (1 0)) (ppp (2 1))) "Configuration manager for leaf based init.el" single ((:commit . "b9aaa539677d1492cb16ee595c2e81bf29967475") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "convenience" "leaf") (:url . "https://github.com/conao3/leaf-manager.el"))]) + (leaf-tree . [(20210503 531) ((emacs (25 1)) (imenu-list (0 8))) "Interactive side-bar feature for init.el using leaf" single ((:commit . "8126baf45c881fd4a692c2d74f9cc2eb15170401") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "convenience" "leaf") (:url . "https://github.com/conao3/leaf-tree.el"))]) + (lean-mode . [(20210502 2049) ((emacs (24 3)) (dash (2 18 0)) (s (1 10 0)) (f (0 19 0)) (flycheck (30))) "A major mode for the Lean 3 language" tar ((:commit . "bf32bb97930ed67c5cbe0fe3d4a69dedcf68be44") (:authors ("Leonardo de Moura" . "leonardo@microsoft.com") ("Soonho Kong " . "soonhok@cs.cmu.edu") ("Gabriel Ebner " . "gebner@gebner.org") ("Sebastian Ullrich" . "sebasti@nullri.ch")) (:maintainer "Sebastian Ullrich" . "sebasti@nullri.ch") (:keywords "languages") (:url . "https://github.com/leanprover/lean-mode"))]) + (leanote . [(20161223 139) ((emacs (24 4)) (cl-lib (0 5)) (request (0 2)) (let-alist (1 0 3)) (pcache (0 4 0)) (s (1 10 0)) (async (1 9))) "A minor mode writing markdown leanote" single ((:commit . "d499e7b59bb1f1a2fabc0e4c26fb101ed62ebc7b") (:authors ("Aborn Jiang" . "aborn.jiang@gmail.com")) (:maintainer "Aborn Jiang" . "aborn.jiang@gmail.com") (:keywords "leanote" "note" "markdown") (:url . "https://github.com/aborn/leanote-emacs"))]) + (learn-ocaml . [(20210527 1449) ((emacs (25 1))) "Emacs frontend for learn-ocaml" single ((:commit . "b8ba2a0bf56b751f077f13137a1904d66061a4d0") (:url . "https://github.com/pfitaxel/learn-ocaml.el"))]) + (ledger-import . [(20210419 818) ((emacs (25 1)) (ledger-mode (3 1 1))) "Fetch OFX files from bank and push them to Ledger" single ((:commit . "f77adf79ce67524c3e08546448ac88ea1a665b64") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://gitlab.petton.fr/mpdel/libmpdel"))]) + (ledger-mode . [(20210516 2045) ((emacs (25 1))) "Helper code for use with the \"ledger\" command-line tool" tar ((:commit . "19b84dc7664ea069e1a9fd446daf699574c44986"))]) + (leerzeichen . [(20170422 1313) nil "Minor mode to display whitespace characters." single ((:commit . "5acf9855ecb2b2cd5da4402bb48df149e7525cc5") (:authors ("Felix Geller" . "fgeller@gmail.com")) (:maintainer "Felix Geller" . "fgeller@gmail.com") (:keywords "whitespace" "characters") (:url . "http://github.com/fgeller/leerzeichen.el"))]) + (leetcode . [(20210121 1600) ((emacs (26)) (dash (2 16 0)) (graphql (0 1 1)) (spinner (1 7 3)) (aio (1 0)) (log4e (0 3 3))) "An leetcode client." single ((:commit . "9c44791407c3f4f76d903ee43367547803ae9c32") (:authors ("Wang Kai" . "kaiwkx@gmail.com")) (:maintainer "Wang Kai" . "kaiwkx@gmail.com") (:keywords "extensions" "tools") (:url . "https://github.com/kaiwk/leetcode.el"))]) + (legalese . [(20200119 2248) nil "Add legalese to your program files" single ((:commit . "e465471d2d5a62d35073d93e0f8d40387a82e302") (:authors ("Jorgen Schaefer" . "forcer@forcix.cx")) (:maintainer "Jorgen Schaefer" . "forcer@forcix.cx") (:keywords "convenience") (:url . "https://github.com/jorgenschaefer/legalese"))]) + (lemon-mode . [(20130216 1304) nil "A major mode for editing lemon grammar files" single ((:commit . "155bfced6c9afc8072a0133d3d1baa54c6d67430") (:authors ("mooz" . "stillpedant@gmail.com")) (:maintainer "mooz" . "stillpedant@gmail.com") (:keywords "lemon"))]) + (lentic . [(20190102 2124) ((emacs (24 4)) (m-buffer (0 13)) (dash (2 5 0)) (f (0 17 2)) (s (1 9 0))) "One buffer as a view of another" tar ((:commit . "e6d013bf570bb235817f6c8f0abdd31d3b456d53") (:authors ("Phillip Lord" . "phillip.lord@russet.org.uk")) (:maintainer "Phillip Lord" . "phillip.lord@russet.org.uk"))]) + (lentic-server . [(20160717 2052) ((lentic (0 8)) (web-server (0 1 1))) "Web Server for Emacs Literate Source" single ((:commit . "8e809fafbb27a98f815b544d9d9ee15843eb6a36") (:authors ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) (:maintainer "Phillip Lord" . "phillip.lord@newcastle.ac.uk"))]) + (leo . [(20201122 2210) ((emacs (25 1))) "Interface for dict.leo.org" single ((:commit . "b9d8f6705dcec4fcefd4209c18a043c355988c3a") (:authors ("M.T. Enders <michael AT enders.io>")) (:maintainer "M.T. Enders <michael AT enders.io>") (:keywords "convenience" "translate") (:url . "https://github.com/mtenders/emacs-leo"))]) + (less-css-mode . [(20161001 453) nil "Major mode for editing LESS CSS files (lesscss.org)" single ((:commit . "c7fa3d56d83206b28657f2e56439dc62280a2bf2") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "less" "css" "mode") (:url . "https://github.com/purcell/less-css-mode"))]) + (letcheck . [(20160202 1948) nil "Check the erroneous assignments in let forms" single ((:commit . "edf188ca2f85349e971b83f164c6484264e79426") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:keywords "convenience") (:url . "https://github.com/Fuco1/letcheck"))]) + (letterbox-mode . [(20170702 125) ((emacs (24 3))) "hide sensitive text on a buffer" single ((:commit . "88c67a51d67216d569a28e8423200883fde096dd") (:authors ("Fernando Leboran" . "f.leboran@gmail.com")) (:maintainer "Fernando Leboran" . "f.leboran@gmail.com") (:keywords "password" "convenience") (:url . "http://github.com/pacha64/letterbox-mode"))]) + (leuven-theme . [(20210602 709) nil "Awesome Emacs color theme on white background" tar ((:commit . "b8b5076d643046008ea1496559acdd4ddfdb649a") (:authors ("Fabrice Niessen <(concat \"fniessen\" at-sign \"pirilampo.org\")>")) (:maintainer "Fabrice Niessen <(concat \"fniessen\" at-sign \"pirilampo.org\")>") (:keywords "color" "theme") (:url . "https://github.com/fniessen/emacs-leuven-theme"))]) + (levenshtein . [(20090830 1040) nil "Edit distance between two strings." single ((:commit . "070925197ebf6b704e6e00c4f2d2ec783f3df38c") (:authors ("Aaron S. Hawley <ashawley at uvm dot edu>,") ("Art Taylor")) (:maintainer "Aaron S. Hawley <ashawley at uvm dot edu>,") (:keywords "lisp"))]) + (lexbind-mode . [(20141027 1429) nil "Puts the value of lexical-binding in the mode line" single ((:commit . "fa0a6848c1cfd3fbf45db43dc2deef16377d887d") (:authors ("Andrew Kirkpatrick" . "ubermonk@gmail.com")) (:maintainer "Andrew Kirkpatrick" . "ubermonk@gmail.com") (:keywords "convenience" "lisp") (:url . "https://github.com/spacebat/lexbind-mode"))]) + (lexic . [(20210318 1315) ((emacs (26 3)) (dash (2 17 0)) (visual-fill-column (2 2))) "A major mode to find out more about words" single ((:commit . "4ded6be2ce3e8dadc5635a534827181a8c8ab602") (:authors ("pluskid" . "pluskid@gmail.com") ("gucong" . "gucong43216@gmail.com") ("TEC" . "tec@tecosaur.com")) (:maintainer "TEC" . "tec@tecosaur.com") (:url . "https://github.com/tecosaur/lexic"))]) + (lfe-mode . [(20210603 1241) nil "Lisp Flavoured Erlang mode" tar ((:commit . "1feb8af64c977946b6184b7d63b436c49dbeb52d"))]) + (libbcel . [(20191203 654) ((emacs (26 1)) (request (0 3 1))) "Library to connect to basecamp 3 API" tar ((:commit . "df466d31544c53d8550f9c08e58b70adc559c48c") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://gitlab.petton.fr/bcel/libbcel"))]) + (libelcouch . [(20200923 1836) ((emacs (26 1)) (request (0 3 0))) "Communication with CouchDB" single ((:commit . "5ae35266c9a2eb33f0c708bc8c0687339cee9133") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:keywords "tools") (:url . "https://gitlab.petton.fr/elcouch/libelcouch/"))]) + (liberime . [(20210526 623) ((emacs (25 1))) "Rime elisp binding" tar ((:commit . "4a6da0f6ab9b43651f3fcc73412e3480b9403caa") (:authors ("A.I.")) (:maintainer "A.I.") (:keywords "convenience" "chinese" "input-method" "rime") (:url . "https://github.com/merrickluo/liberime"))]) + (libgit . [(20200515 1759) ((emacs (25 1))) "Thin bindings to libgit2." tar ((:commit . "0ef8b13aef011a98b7da756e4f1ce3bb18e4d55a") (:authors ("Eivind Fonn" . "evfonn@gmail.com")) (:maintainer "Eivind Fonn" . "evfonn@gmail.com") (:keywords "git" "vc") (:url . "https://github.com/magit/libegit2"))]) + (libmpdee . [(20160117 2301) nil "Client end library for mpd, a music playing daemon" single ((:commit . "a6ca3b7d6687f3ba60996b9b5044ad1d3b228290") (:authors ("Ramkumar R. Aiyengar" . "andyetitmoves@gmail.com")) (:maintainer "Ramkumar R. Aiyengar" . "andyetitmoves@gmail.com") (:keywords "music" "mpd"))]) + (libmpdel . [(20210107 950) ((emacs (25 1))) "Communication with an MPD server" tar ((:commit . "9162a4b350c978f94dde6f75d60bc6a17e1dc18e") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:keywords "multimedia") (:url . "https://gitea.petton.fr/mpdel/libmpdel"))]) + (lice . [(20200607 103) nil "License And Header Template" tar ((:commit . "482e58ab83fff86ed754b00be27b62a219597e7c") (:authors ("Taiki Sugawara" . "buzz.taiki@gmail.com")) (:maintainer "Taiki Sugawara" . "buzz.taiki@gmail.com") (:keywords "template" "license" "tools") (:url . "https://github.com/buzztaiki/lice-el"))]) + (license-snippets . [(20201117 1619) ((emacs (26)) (yasnippet (0 8 0))) "LICENSE templates for yasnippet" tar ((:commit . "a729748b7d7f38a916fe61f23db6e7446c0a5e8f") (:authors ("Seong Yong-ju" . "sei40kr@gmail.com")) (:maintainer "Seong Yong-ju" . "sei40kr@gmail.com") (:keywords "tools") (:url . "https://github.com/sei40kr/license-snippets"))]) + (license-templates . [(20200906 2047) ((emacs (24 3)) (request (0 3 0))) "Create LICENSE using GitHub API" single ((:commit . "ef80eff8b7be117f9c48bdc6d9a62e56b0a93554") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/license-templates"))]) + (light-soap-theme . [(20150607 1445) ((emacs (24))) "Emacs 24 theme with a light background." single ((:commit . "76a787bd40c6b567ae68ced7f5d9f9f10725e00d"))]) + (ligo-mode . [(20210303 1751) ((emacs (27 1))) "A major mode for editing LIGO source code" single ((:commit . "0acf77e7a620b5cbce94103981020142905c21d0") (:authors ("LigoLang SASU")) (:maintainer "LigoLang SASU") (:keywords "languages") (:url . "https://gitlab.com/ligolang/ligo/-/tree/dev/tools/emacs"))]) + (line-reminder . [(20210531 743) ((emacs (24 4)) (indicators (0 0 4)) (fringe-helper (1 0 1))) "Line annotation for changed and saved lines" single ((:commit . "1856034d0ed8ce41a29a1ea051184ee7c2f3e276") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/line-reminder"))]) + (line-up-words . [(20180219 1024) nil "Align words in an intelligent way" single ((:commit . "68e59d0fff1eb76c7b1a72c438f344c251115e81") (:url . "https://github.com/janestreet/line-up-words"))]) + (lines-at-once . [(20180422 247) ((emacs (25))) "Insert and edit multiple lines at once" single ((:commit . "31bce4b79fe16251b7cf118f0d343b0b46f72360") (:authors ("Jiahao Li" . "jiahaowork@gmail.com")) (:maintainer "Jiahao Li" . "jiahaowork@gmail.com") (:keywords "abbrev" "tools") (:url . "https://github.com/jiahaowork/lines-at-once.el"))]) + (lingr . [(20100807 1731) nil "Lingr Client for GNU Emacs" single ((:commit . "4215a8704492d3c860097cbe2649936c22c196df") (:authors ("lugecy" . "lugecy@gmail.com")) (:maintainer "lugecy" . "lugecy@gmail.com") (:keywords "chat" "client" "internet") (:url . "http://github.com/lugecy/lingr-el"))]) + (linguistic . [(20181129 2116) nil "A package for basic linguistic analysis." tar ((:commit . "23e47e98cdb09ee61883669b6d8a11bf6449862c") (:authors ("Andrew Favia <drewlinguistics01 at gmail dot com>")) (:maintainer "Andrew Favia <drewlinguistics01 at gmail dot com>") (:keywords "linguistics" "text analysis" "matching") (:url . "https://github.com/andcarnivorous/linguistic"))]) + (link . [(20191111 446) nil "Hypertext links in text buffers" single ((:commit . "bdf0aa7761d1c1a3bc0652b2fdc4a54b3acdb06a") (:authors ("Torsten Hilbrich" . "torsten.hilbrich@gmx.net")) (:maintainer "Torsten Hilbrich" . "torsten.hilbrich@gmx.net") (:keywords "interface" "hypermedia"))]) + (link-hint . [(20210410 1506) ((avy (0 4 0)) (emacs (24 4))) "Use avy to open, copy, etc. visible links" single ((:commit . "ae73db6a5948c8d109fc1d570760bcafa3f07175") (:authors ("Fox Kiester" . "noct@posteo.net")) (:maintainer "Fox Kiester" . "noct@posteo.net") (:keywords "convenience" "url" "avy" "link" "links" "hyperlink") (:url . "https://github.com/noctuid/link-hint.el"))]) + (linkode . [(20200607 2152) nil "Generate a linkode snippet with region/buffer content" single ((:commit . "675e612e30b74764c57de4117d950ea803b15f74") (:authors ("Erick Navarro" . "erick@navarro.io")) (:maintainer "Erick Navarro" . "erick@navarro.io") (:url . "https://github.com/erickgnavar/linkode.el"))]) + (linphone . [(20130524 1109) nil "Emacs interface to Linphone" tar ((:commit . "99af3db941b7f4e5272bb48bff96c1ce4ceac302") (:authors ("Yoni Rabkin" . "yonirabkin@member.fsf.org")) (:maintainer "Yoni Rabkin" . "yonirabkin@member.fsf.org") (:keywords "comm") (:url . "https://github.com/zabbal/emacs-linphone"))]) + (linum-off . [(20160217 2137) nil "Provides an interface for turning line-numbering off" single ((:commit . "116e66ac259b183e0763b85616888316ab196822") (:authors ("Matthew L. Fidler, Florian Adamsky (see wiki)")) (:maintainer "Matthew L. Fidler") (:keywords "line" "numbering") (:url . "http://www.emacswiki.org/emacs/auto-indent-mode.el "))]) + (linum-relative . [(20180124 1047) nil "display relative line number in emacs." single ((:commit . "c74a6981b688a5e1e6b8e0809363963ff558ce4d") (:authors ("coldnew" . "coldnew.tw@gmail.com")) (:maintainer "coldnew" . "coldnew.tw@gmail.com") (:keywords "converience") (:url . "http://github.com/coldnew/linum-relative"))]) + (liquid-types . [(20151202 735) ((flycheck (0 13)) (dash (1 2)) (emacs (24 1)) (popup (0 5 2)) (pos-tip (0 5 0)) (flycheck-liquidhs (0 0 1)) (button-lock (1 0 2))) "show inferred liquid-types" single ((:commit . "cc4bacbbf204ef9cf0756f78dfebee2c6ae14d7b") (:authors ("Ranjit Jhala" . "jhala@cs.ucsd.edu")) (:maintainer "Ranjit Jhala" . "jhala@cs.ucsd.edu"))]) + (liso-theme . [(20160410 2029) nil "Eclectic Dark Theme for GNU Emacs" single ((:commit . "844688245eb860d23043455e165ee24503454c81") (:authors ("Vlad Piersec" . "vlad.piersec@gmail.com")) (:maintainer "Vlad Piersec" . "vlad.piersec@gmail.com") (:keywords "theme" "themes") (:url . "https://github.com/caisah/liso-theme"))]) + (lisp-butt-mode . [(20210215 2206) ((emacs (25))) "Slim Lisp Butts" single ((:commit . "2b719baf0ccba79e28fcb3c2633c4849d976ac23") (:authors ("Marco Wahl" . "marcowahlsoft@gmail.com")) (:maintainer "Marco Wahl" . "marcowahlsoft@gmail.com") (:keywords "lisp") (:url . "https://gitlab.com/marcowahl/lisp-butt-mode"))]) + (lisp-extra-font-lock . [(20181008 1921) nil "Highlight bound variables and quoted exprs." single ((:commit . "4605eccbe1a7fcbd3cacf5b71249435413b4db4f") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "languages" "faces") (:url . "https://github.com/Lindydancer/lisp-extra-font-lock"))]) + (lisp-local . [(20210605 1347) ((emacs (24 3))) "Allow different Lisp indentation in each buffer" single ((:commit . "22e221c9330d2b5dc07e8b2caa34c83ac7c20b0d") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "languages" "lisp") (:url . "https://github.com/lispunion/emacs-lisp-local"))]) + (lispxmp . [(20170926 23) nil "Automagic emacs lisp code annotation" single ((:commit . "7ad077b4ee91ce8a42f84eeddb9fc7ea4eac7814") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "lisp" "convenience") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/lispxmp.el"))]) + (lispy . [(20210121 926) ((emacs (24 3)) (ace-window (0 9 0)) (iedit (0 9 9)) (counsel (0 11 0)) (hydra (0 14 0)) (zoutline (0 1 0))) "vi-like Paredit" tar ((:commit . "38a7df4cbb16cfe3d62dc8ea98b50e2d9a572e58") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "lisp") (:url . "https://github.com/abo-abo/lispy"))]) + (lispyville . [(20200808 2240) ((lispy (0)) (evil (1 2 12)) (cl-lib (0 5)) (emacs (24 4))) "A minor mode for integrating evil with lispy." single ((:commit . "89316f01822b2135e52ca27fd308d207ef618052") (:authors ("Fox Kiester" . "noct@posteo.net")) (:maintainer "Fox Kiester" . "noct@posteo.net") (:keywords "vim" "evil" "lispy" "lisp" "parentheses") (:url . "https://github.com/noctuid/lispyville"))]) + (list-environment . [(20151227 256) nil "A tabulated process environment editor" single ((:commit . "b7ca30b05905047be2e55199a6475f8d98ce318b") (:authors ("Charles L.G. Comstock" . "dgtized@gmail.com")) (:maintainer "Charles L.G. Comstock" . "dgtized@gmail.com") (:keywords "processes" "unix"))]) + (list-packages-ext . [(20151115 1716) ((s (1 6 0)) (ht (1 5 0)) (persistent-soft (0 8 6))) "Extras for list-packages" single ((:commit . "b4dd644e4369c9aa66f5bb8895ea49ebbfd0a27a") (:authors ("Alessandro Piras" . "laynor@gmail.com")) (:maintainer "Alessandro Piras" . "laynor@gmail.com") (:keywords "convenience" "tools"))]) + (list-unicode-display . [(20181121 2316) ((emacs (24 3))) "Search for and list unicode characters by name" single ((:commit . "0ecc2402b258990e7a0cf7e60847712c69444070") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "convenience"))]) + (list-utils . [(20210111 1522) nil "List-manipulation utility functions" single ((:commit . "ca9654cd1418e874c876c6b3b7d4cd8339bfde77") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "extensions") (:url . "http://github.com/rolandwalker/list-utils"))]) + (lit-mode . [(20141123 1736) nil "Major mode for lit" single ((:commit . "c61c403afc8333a5649c5421ab1a6341dc1c7d92") (:authors ("Hector A Escobedo" . "ninjahector.escobedo@gmail.com")) (:maintainer "Hector A Escobedo" . "ninjahector.escobedo@gmail.com") (:keywords "languages" "tools"))]) + (litable . [(20200130 1329) ((dash (2 6 0))) "dynamic evaluation replacement with emacs" single ((:commit . "02247ca284cbc79f3afb783d62ed092bfc5b8d83") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:keywords "lisp"))]) + (litanize . [(20200211 621) ((emacs (24 1)) (enlive (0 0 1)) (s (1 12 0))) "Generate \"Latour Litanies\"" single ((:commit . "ba73259e35b4649884ba56542d3a55f43bd3b80b") (:authors ("nik gaffney" . "nik@fo.am")) (:maintainer "nik gaffney" . "nik@fo.am") (:keywords "tools" "latour litany" "alien phenomenology" "ontography" "metaphorism" "carpentry") (:url . "https://github.com/zzkt/litanizer"))]) + (litecoin-ticker . [(20160612 11) ((json (1 2))) "litecoin price in modeline" single ((:commit . "3d8047c736e4ee0b8638953f8cc63eaefad34106") (:authors ("Zhe Lei")) (:maintainer "Zhe Lei"))]) + (literal-string . [(20191023 733) ((emacs (25)) (edit-indirect (0 1 5))) "edit string literals in a dedicated buffer" single ((:commit . "afffa86e626798ee9f9188ea3be2d5ee6ad17c39") (:authors ("Joost Diepenmaat" . "joost@zeekat.nl")) (:maintainer "Joost Diepenmaat" . "joost@zeekat.nl") (:keywords "lisp" "tools" "docs") (:url . "https://github.com/joodie/literal-string-mode/"))]) + (literate-calc-mode . [(20210528 815) ((emacs (25 1)) (s (1 12 0))) "Inline results from calc" single ((:commit . "29bb40a7150b6cfe1a96948ae1f36e9c107eb759") (:authors ("Robin Schroer")) (:maintainer "Robin Schroer") (:keywords "calc" "languages" "tools") (:url . "https://github.com/sulami/literate-calc-mode.el"))]) + (literate-coffee-mode . [(20170211 1515) ((coffee-mode (0 5 0))) "major-mode for Literate CoffeeScript" single ((:commit . "55ce0305495f4a38c8063c4bd63deb1e1252373d") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-literate-coffee-mode"))]) + (literate-elisp . [(20210612 1056) ((emacs (26 1))) "load Emacs Lisp code blocks from Org files" single ((:commit . "1a6465d4190491ddf927698554b13352a7babb3a") (:authors ("Jingtao Xu" . "jingtaozf@gmail.com")) (:maintainer "Jingtao Xu" . "jingtaozf@gmail.com") (:keywords "lisp" "docs" "extensions" "tools") (:url . "https://github.com/jingtaozf/literate-elisp"))]) + (literate-starter-kit . [(20150730 1854) ((emacs (24 3))) "A literate starter kit to configure Emacs using Org-mode files." tar ((:commit . "6dce1d01781966c14558aa553cfc85008c06e115"))]) + (live-code-talks . [(20180907 1647) ((emacs (24)) (cl-lib (0 5)) (narrowed-page-navigation (0 1))) "Support for slides with live code in them" single ((:commit . "97f16a9ee4e6ff3e0f9291eaead772c66e3e12ae") (:authors ("David Raymond Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Raymond Christiansen" . "david@davidchristiansen.dk") (:keywords "docs" "multimedia"))]) + (live-preview . [(20201010 1948) ((emacs (24 4))) "Live preview by any shell command while editing" single ((:commit . "603a4a1759fbec92e7a1cabc249517c78e59ce7e") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "languages" "util") (:url . "https://github.com/lassik/emacs-live-preview"))]) + (live-py-mode . [(20210413 205) ((emacs (24 3))) "Live Coding in Python" tar ((:commit . "c191b149f93ed473f3900e506cfc762d53145237") (:authors ("Don Kirkby http://donkirkby.github.io")) (:maintainer "Don Kirkby http://donkirkby.github.io") (:keywords "live" "coding") (:url . "http://donkirkby.github.io/live-py-plugin/"))]) + (lively . [(20171005 754) nil "interactively updating text" single ((:commit . "348675828c6a81bfa1ac311ca465aad813542c1b") (:authors ("Luke Gorrie" . "luke@bup.co.nz")) (:maintainer "Steve Purcell" . "steve@sanityinc.com"))]) + (livereload . [(20170629 650) ((emacs (25)) (websocket (1 8))) "Livereload server" tar ((:commit . "1e501d7e46dbd476c2c7cc9d20b5ac9d41fb1955") (:authors ("João Távora" . "joaotavora@gmail.com")) (:maintainer "João Távora" . "joaotavora@gmail.com") (:keywords "convenience"))]) + (livescript-mode . [(20140613 421) nil "Major mode for editing LiveScript files" single ((:commit . "90a918d9686e256e6d4d439cc20f24dad8d3b804") (:authors ("Hisamatsu Yasuyuki" . "yas@null.net")) (:maintainer "Hisamatsu Yasuyuki" . "yas@null.net") (:keywords "languages" "livescript") (:url . "https://github.com/yhisamatsu/livescript-mode"))]) + (livid-mode . [(20131116 1344) ((skewer-mode (1 5 3)) (s (1 8 0))) "Live browser eval of JavaScript every time a buffer changes" single ((:commit . "dfe5212fa64738bc4138bfebf349fbc8bc237c26") (:authors ("Murphy McMahon")) (:maintainer "Murphy McMahon") (:url . "https://github.com/pandeiro/livid-mode"))]) + (ll-debug . [(20201211 2010) ((emacs (24 3))) "Low level debug tools" single ((:commit . "f551a7e1d5ecd64608db744d0f0e24aa0b8645fe") (:authors ("Claus Brunzema" . "mail@cbrunzema.de")) (:maintainer "Claus Brunzema" . "mail@cbrunzema.de") (:keywords "abbrev" "convenience" "tools" "c" "lisp") (:url . "https://github.com/replrep/ll-debug"))]) + (llama . [(20210525 2005) ((seq (2 20))) "Anonymous function literals" single ((:commit . "2694b2aeb1c87bb2ad8b0f611ca438c30f5eaeae") (:keywords "extensions") (:url . "https://git.sr.ht/~tarsius/llama"))]) + (lms . [(20201214 1852) ((emacs (25 1))) "Squeezebox / Logitech Media Server frontend" single ((:commit . "e6dae7465423a5304d0e38e92625383d07fe6f52") (:authors ("Iñigo Serna" . "inigoserna@gmx.com")) (:maintainer "Iñigo Serna" . "inigoserna@gmx.com") (:keywords "multimedia") (:url . "https://hg.serna.eu/emacs/lms"))]) + (load-bash-alias . [(20201229 1711) ((emacs (24 1)) (seq (2 16))) "Convert bash aliases into eshell ones" single ((:commit . "7ff80e4507a1dd71865440cf009bfe0c33323fc2") (:authors ("Davide Restivo" . "davide.restivo@yahoo.it")) (:maintainer "Davide Restivo" . "davide.restivo@yahoo.it") (:keywords "emacs" "bash" "eshell" "alias") (:url . "https://github.com/daviderestivo/load-bash-alias"))]) + (load-env-vars . [(20180511 2210) ((emacs (24))) "Load environment variables from files" single ((:commit . "3808520efaf9492033f6e11a9bffd68eabf02a0f") (:authors ("Jorge Dias" . "jorge@mrdias.com")) (:maintainer "Jorge Dias" . "jorge@mrdias.com") (:keywords "lisp") (:url . "https://github.com/diasjorge/emacs-load-env-vars"))]) + (load-relative . [(20201130 2202) nil "Relative file load (within a multi-file Emacs package)" tar ((:commit . "ff2a827144353d29d70392fd95c14c15df207011") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org") (:keywords "internal") (:url . "https://github.com/rocky/emacs-load-relative"))]) + (load-theme-buffer-local . [(20120702 2036) nil "Install emacs24 color themes by buffer." single ((:commit . "e606dec66f16a06140b9aad625a4fd52bca4f936") (:authors ("Victor Borja" . "vic.borja@gmail.com")) (:maintainer "Victor Borja" . "vic.borja@gmail.com") (:keywords "faces") (:url . "http://github.com/vic/color-theme-buffer-local"))]) + (loc-changes . [(20200722 1111) nil "keep track of positions even after buffer changes" single ((:commit . "0a55bcba684f78417e831eef2cc32da24a207f29") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org") (:url . "https://github.com/rocky/emacs-loc-changes"))]) + (loccur . [(20210224 2041) ((emacs (25 1))) "Perform an occur-like folding in current buffer" single ((:commit . "01b7afa62589432a98171074abb8c5a1e089034a") (:authors ("Alexey Veretennikov" . "alexey.veretennikov@gmail.com")) (:maintainer "Alexey Veretennikov" . "alexey.veretennikov@gmail.com") (:keywords "matching") (:url . "https://github.com/fourier/loccur"))]) + (lockfile-mode . [(20170625 507) nil "Major mode for .lock files" single ((:commit . "fcfef88460cb3cd67c4d83a1801d0326d282feac") (:authors ("Preetpal S. Sohal")) (:maintainer "Preetpal S. Sohal") (:url . "https://github.com/preetpalS/emacs-lockfile-mode"))]) + (lodgeit . [(20190802 1308) nil "Paste to a lodgeit powered pastebin" single ((:commit . "442637194d48a7105b7747b8d98772f5899f9e21") (:authors ("Eric Larson" . "eric@ionrock.org")) (:maintainer "Eric Larson" . "eric@ionrock.org") (:keywords "pastebin" "lodgeit") (:url . "https://github.com/ionrock/lodgeit-el"))]) + (log4e . [(20200420 745) nil "provide logging framework for elisp" single ((:commit . "7df0c1ff4656f8f993b87064b1567618eadb5546") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "log") (:url . "https://github.com/aki2o/log4e"))]) + (log4j-mode . [(20160108 1918) nil "major mode for viewing log files" single ((:commit . "26171b1e723502055e085393b0ecdcb6db406010") (:authors ("Johan Dykstrom" . "jody4711-sf@yahoo.se")) (:maintainer "Johan Dykstrom" . "jody4711-sf@yahoo.se") (:keywords "tools") (:url . "http://log4j-mode.sourceforge.net"))]) + (logalimacs . [(20131021 1829) ((popwin (0 6 2)) (popup (0 5 0)) (stem (20130120))) "Front-end to logaling-command for Ruby gems" single ((:commit . "8286e39502250fc6c3c6656a7f46a8eee8e9a713") (:authors ("Yuta Yamada <cokesboy\"at\"gmail.com>")) (:maintainer "Yuta Yamada <cokesboy\"at\"gmail.com>") (:keywords "translation" "logaling-command") (:url . "https://github.com/logaling/logalimacs"))]) + (logito . [(20201226 534) ((emacs (25 1))) "logging library for Emacs" single ((:commit . "d5934ce10ba3a70d3fcfb94d742ce3b9136ce124") (:authors ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainer "Yann Hodique" . "yann.hodique@gmail.com") (:keywords "lisp" "extensions"))]) + (lognav-mode . [(20191124 1011) ((emacs (24 3))) "Navigate Log Error Messages" single ((:commit . "7eb9cd2af5b47116fe475870b41dded55052c14c") (:authors ("Shawn Ellis" . "shawn.ellis17@gmail.com")) (:maintainer "Shawn Ellis" . "shawn.ellis17@gmail.com") (:keywords "log" "error" "lognav-mode" "convenience") (:url . "https://hg.osdn.net/view/lognav-mode/lognav-mode"))]) + (logpad . [(20201113 917) nil "Simulate Windows Notepad for logging." single ((:commit . "166543873e665936b468d9f120155cce515da3f8") (:authors ("Sven Knurr" . "git@tuxproject.de")) (:maintainer "Sven Knurr" . "git@tuxproject.de") (:keywords "files" "outlines" "notepad") (:url . "https://github.com/dertuxmalwieder/logpad.el"))]) + (logstash-conf . [(20210123 1949) nil "basic mode for editing logstash configuration" single ((:commit . "ebc4731c45709ad1e0526f4f4164020ae83cbeff") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) + (logview . [(20201014 2033) ((emacs (24 4)) (datetime (0 6 1)) (extmap (1 0))) "Major mode for viewing log files" single ((:commit . "5a543c53d04d32f0adcc023253888198e0b69589") (:authors ("Paul Pogonyshev" . "pogonyshev@gmail.com")) (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com") (:keywords "files" "tools") (:url . "https://github.com/doublep/logview"))]) + (lol-data-dragon . [(20200705 1822) ((emacs (25 1))) "Browse Champions of League of Legends on Data Dragon" single ((:commit . "0deec9867bd7ba96220ee2968a9b2a94fd474431") (:authors ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:keywords "games" "hypermedia") (:url . "https://github.com/xuchunyang/lol-data-dragon.el"))]) + (lolcat . [(20190527 1145) ((emacs (24 3))) "Rainbows and unicorns!" single ((:commit . "4855e587a3b9681c077dac4b9f166dd860f439a4") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:url . "https://github.com/xuchunyang/lolcat.el"))]) + (lolcode-mode . [(20111002 847) nil "Major mode for editing LOLCODE" single ((:commit . "1914f1ba87587ecf5f175eeb2144c28e9f039317") (:authors ("Bodil Stokke" . "lolcode@bodil.tv")) (:maintainer "Bodil Stokke" . "lolcode@bodil.tv") (:keywords "lolcode" "major" "mode") (:url . "http://github.com/bodil/lolcode-mode"))]) + (look-dired . [(20160729 2323) ((look-mode (1 0))) "Extensions to look-mode for dired buffers" single ((:commit . "9bfa4e5e6f3810705b6426c88493ea0bf6b15640") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:keywords "convenience") (:url . "https://github.com/vapniks/look-dired"))]) + (look-mode . [(20190212 2346) nil "quick file viewer for image and text file browsing" single ((:commit . "d686e4cfafeac24e07e3efdb9763472f78d878f4") (:authors ("Peter H. Mao <peter.mao@gmail.com>" . "petermao@jpl.nasa.gov")) (:maintainer "Peter H. Mao <peter.mao@gmail.com>" . "petermao@jpl.nasa.gov"))]) + (loop . [(20160813 1407) nil "friendly imperative loop structures" single ((:commit . "e22807f83a0890dc8a904c51ee0742c34efccc6c") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:keywords "loop" "while" "for each" "break" "continue"))]) + (loopy . [(20210612 214) ((emacs (27 1))) "A looping macro" tar ((:commit . "fc3613f0d596013e6f697d957ff2c01839e81db1") (:authors ("Earl Hyatt")) (:maintainer "Earl Hyatt") (:keywords "extensions") (:url . "https://github.com/okamsn/loopy"))]) + (loopy-dash . [(20210609 2317) ((emacs (25 1)) (loopy (0 6 1)) (dash (2))) "Dash destructuring for `loopy'" single ((:commit . "fc3613f0d596013e6f697d957ff2c01839e81db1") (:authors ("Earl Hyatt")) (:maintainer "Earl Hyatt") (:keywords "extensions") (:url . "https://github.com/okamsn/loopy"))]) + (lorem-ipsum . [(20190819 2042) nil "Insert dummy pseudo Latin text." single ((:commit . "da75c155da327c7a7aedb80f5cfe409984787049") (:authors ("Jean-Philippe Theberge" . "jphil21@sourceforge.net")) (:maintainer "Joe Schafer" . "joe@jschaf.com") (:keywords "tools" "language" "convenience"))]) + (lox-mode . [(20200619 1700) ((emacs (24 3))) "Major mode for the Lox programming language" single ((:commit . "b6935b3f5b131d2c1c7685cf6464274f7cd64943") (:authors ("Timmy Jose" . "zoltan.jose@gmail.com")) (:maintainer "Timmy Jose" . "zoltan.jose@gmail.com") (:keywords "languages" "lox") (:url . "https://github.com/timmyjose-projects/lox-mode"))]) + (lpy . [(20201027 1425) ((emacs (25 1)) (lispy (0 27 0))) "A lispy interface to Python" tar ((:commit . "076ce9acb68f6ac1b39127b634a91ffd865d13d8") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "python" "lisp") (:url . "https://github.com/abo-abo/lpy"))]) + (lsp-dart . [(20210608 2101) ((emacs (26 1)) (lsp-treemacs (0 3)) (lsp-mode (7 0 1)) (dap-mode (0 6)) (f (0 20 0)) (dash (2 14 1)) (pkg-info (0 4)) (dart-mode (1 0 5))) "Dart support lsp-mode" tar ((:commit . "49bb4d597e30c95d66a96739ea10c1c4f74ac649") (:keywords "languages" "extensions") (:url . "https://emacs-lsp.github.io/lsp-dart"))]) + (lsp-docker . [(20210529 621) ((emacs (25 1)) (dash (2 14 1)) (lsp-mode (6 2 1))) "LSP Docker integration" single ((:commit . "fa304ea402ac492e97bee14496a41afa8508cc5e") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainer "Ivan Yonchovski" . "yyoncho@gmail.com") (:keywords "languages" "langserver") (:url . "https://github.com/emacs-lsp/lsp-docker"))]) + (lsp-focus . [(20200906 1917) ((emacs (26 1)) (focus (0 1 1)) (lsp-mode (6 1))) "focus.el support for lsp-mode" single ((:commit . "d01f0af156e4e78dcb9fa8e080a652cf8f221d30") (:authors ("Vibhav Pant")) (:maintainer "Vibhav Pant") (:keywords "languages" "lsp-mode") (:url . "https://github.com/emacs-lsp/lsp-focus"))]) + (lsp-grammarly . [(20210523 403) ((emacs (27 1)) (lsp-mode (6 1)) (grammarly (0 3 0)) (request (0 3 0)) (s (1 12 0)) (ht (2 3))) "LSP Clients for Grammarly" single ((:commit . "f34f0d50a91a82ab9c49e2cf5ddcb42a98cc2ede") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/emacs-grammarly/lsp-grammarly"))]) + (lsp-haskell . [(20210209 2150) ((emacs (24 3)) (lsp-mode (3 0)) (haskell-mode (1 0))) "Haskell support for lsp-mode" single ((:commit . "7efbef3d206989faa8b691a4230a3ed872542187") (:keywords "haskell") (:url . "https://github.com/emacs-lsp/lsp-haskell"))]) + (lsp-intellij . [(20180831 2051) ((emacs (25 1)) (lsp-mode (4 1))) "intellij lsp client" single ((:commit . "cf30f0ac63bd0140e758840b8ab070e8313697b2") (:authors ("Ruin0x11" . "ipickering2@gmail.com")) (:maintainer "Ruin0x11" . "ipickering2@gmail.com") (:keywords "languages" "processes" "tools") (:url . "https://github.com/Ruin0x11/lsp-intellij"))]) + (lsp-ivy . [(20210518 2034) ((emacs (25 1)) (dash (2 14 1)) (lsp-mode (6 2 1)) (ivy (0 13 0))) "LSP ivy integration" single ((:commit . "bccd86028e669f5a1cad78364775fe7a0741ff93") (:keywords "languages" "debug") (:url . "https://github.com/emacs-lsp/lsp-ivy"))]) + (lsp-java . [(20210520 1747) ((emacs (25 1)) (lsp-mode (6 0)) (markdown-mode (2 3)) (dash (2 18 0)) (f (0 20 0)) (ht (2 0)) (request (0 3 0)) (treemacs (2 5)) (dap-mode (0 5))) "Java support for lsp-mode" tar ((:commit . "b6f14d8ae3cddcbacacf245aeef46e5407e5b401") (:keywords "languague" "tools") (:url . "https://github.com/emacs-lsp/lsp-java"))]) + (lsp-javacomp . [(20190124 1755) ((emacs (25 1)) (lsp-mode (3 0)) (s (1 2 0))) "Provide Java IDE features powered by JavaComp." single ((:commit . "82aa4ad6ca03a74565c35e855b318b1887bcd89b") (:keywords "java" "tools" "lsp") (:url . "https://github.com/tigersoldier/lsp-javacomp"))]) + (lsp-jedi . [(20210602 1925) ((emacs (25 1)) (lsp-mode (6 0))) "Lsp client plugin for Python Jedi Language Server" single ((:commit . "ab265f7fb26f4fa0385158a9f9d3649b606d2e23") (:authors ("Fred Campos" . "fred.tecnologia@gmail.com")) (:maintainer "Fred Campos") (:keywords "language-server" "tools" "python" "jedi" "ide") (:url . "http://github.com/fredcamps/lsp-jedi"))]) + (lsp-julia . [(20210530 2152) ((emacs (25 1)) (lsp-mode (6 3)) (julia-mode (0 3))) "Julia support for lsp-mode" tar ((:commit . "d4a7a27d6ac7c6831b4f493dd89f82fa0c75bdf5") (:authors ("Martin Wolke" . "vibhavp@gmail.com") ("Adam Beckmeyer" . "adam_git@thebeckmeyers.xyz") ("Guido Kraemer" . "gdkrmr@users.noreply.github.com")) (:maintainer "Adam Beckmeyer" . "adam_git@thebeckmeyers.xyz") (:keywords "languages" "tools") (:url . "https://github.com/non-Jedi/lsp-julia"))]) + (lsp-latex . [(20210608 1330) ((emacs (25 1)) (lsp-mode (6 0))) "LSP-mode client for LaTeX, on texlab" single ((:commit . "0e4c96a625bd83930cac338eb7a998c024a15f38") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com") (:keywords "languages" "tex") (:url . "https://github.com/ROCKTAKEY/lsp-latex"))]) + (lsp-ltex . [(20210405 1702) ((emacs (26 1)) (lsp-mode (6 1))) "LSP Clients for LTEX" single ((:commit . "0fd8baec7e5f92d74b8b80d02c926d32332d86bd") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/emacs-languagetool/lsp-ltex"))]) + (lsp-metals . [(20210529 752) ((emacs (26 1)) (scala-mode (1 1)) (lsp-mode (7 0)) (lsp-treemacs (0 2)) (dap-mode (0 3)) (dash (2 18 0)) (f (0 20 0)) (ht (2 0)) (treemacs (2 5))) "Scala Client settings" tar ((:commit . "4c11fe47ef3c71a2fc7cd67a055ea0bc5883a0c6") (:authors ("Ross A. Baker" . "ross@rossabaker.com") ("Evgeny Kurnevsky" . "kurnevsky@gmail.com")) (:maintainer "Ross A. Baker" . "ross@rossabaker.com") (:keywords "languages" "extensions") (:url . "https://github.com/emacs-lsp/lsp-metals"))]) + (lsp-mode . [(20210610 415) ((emacs (26 1)) (dash (2 18 0)) (f (0 20 0)) (ht (2 3)) (spinner (1 7 3)) (markdown-mode (2 3)) (lv (0))) "LSP mode" tar ((:commit . "2e99164f74d1a5baf106ee3cb6e84968642570bb") (:authors ("Vibhav Pant, Fangrui Song, Ivan Yonchovski")) (:maintainer "Vibhav Pant, Fangrui Song, Ivan Yonchovski") (:keywords "languages") (:url . "https://github.com/emacs-lsp/lsp-mode"))]) + (lsp-mssql . [(20191204 1150) ((emacs (25 1)) (lsp-mode (6 2)) (dash (2 14 1)) (f (0 20 0)) (ht (2 0)) (lsp-treemacs (0 1))) "MSSQL LSP bindings" tar ((:commit . "88319a61a06e27fc1d3ea2e7b853ec1692b4c166") (:authors ("Ivan Yonchovski" . "yyoncho@gmail.com")) (:maintainer "Ivan Yonchovski" . "yyoncho@gmail.com") (:keywords "data" "languages") (:url . "https://github.com/emacs-lsp/lsp-mssql"))]) + (lsp-origami . [(20210126 843) ((origami (1 0)) (lsp-mode (6 1))) "origami.el support for lsp-mode" single ((:commit . "bedea3d25552d6969e917a15a0acc3d333ddc742") (:authors ("Vibhav Pant")) (:maintainer "Vibhav Pant") (:keywords "languages" "lsp-mode") (:url . "https://github.com/emacs-lsp/lsp-origami"))]) + (lsp-p4 . [(20190127 1049) ((lsp-mode (3 0))) "P4 support for lsp-mode" tar ((:commit . "669460d93b87fb876df11b2b68229677e7ad1a26") (:authors ("Dmitri Makarov")) (:maintainer "Dmitri Makarov") (:keywords "lsp" "p4") (:url . "https://github.com/dmakarov/p4ls"))]) + (lsp-pascal . [(20200422 1610) ((emacs (24 4)) (lsp-mode (6 3))) "LSP client for Pascal" single ((:commit . "b132bdf66748e4abe0d4140f6d061b1ccd56082a") (:authors ("Arjan Adriaanse" . "arjan@adriaan.se")) (:maintainer "Arjan Adriaanse" . "arjan@adriaan.se") (:keywords "languages" "tools") (:url . "https://github.com/arjanadriaanse/lsp-pascal"))]) + (lsp-pyre . [(20190406 335) ((lsp-mode (6 0))) "lsp-mode client for python using pyre" single ((:commit . "e177b8f5efd1a955b5753aeb5d1894e6d21be35a") (:authors ("John Allen" . "oss@porcnick.com")) (:maintainer "John Allen" . "oss@porcnick.com") (:url . "https://github.com/jra3/lsp-pyre"))]) + (lsp-pyright . [(20210513 1022) ((emacs (26 1)) (lsp-mode (7 0)) (dash (2 18 0)) (ht (2 0))) "Python LSP client using Pyright" single ((:commit . "71a79760938d2132923fbff58dc25301892b1654") (:authors ("Arif Rezai, Vincent Zhang, Andrew Christianson")) (:maintainer "Arif Rezai, Vincent Zhang, Andrew Christianson") (:keywords "languages" "tools" "lsp") (:url . "https://github.com/emacs-lsp/lsp-pyright"))]) + (lsp-python-ms . [(20210513 1019) ((emacs (25 1)) (lsp-mode (6 1))) "The lsp-mode client for Microsoft python-language-server" single ((:commit . "4eb78c43046fceb53a66ccd24c85601bdb87ed17") (:authors ("Charl Botha")) (:maintainer "Andrew Christianson, Vincent Zhang") (:keywords "languages" "tools") (:url . "https://github.com/emacs-lsp/lsp-python-ms"))]) + (lsp-rescript . [(20210519 1101) ((lsp-mode (7 0 1)) (emacs (25 1)) (rescript-mode (0 1))) "LSP client configuration for lsp-mode and rescript-vscode" single ((:commit . "aac9673855314a1f34037eb785bccbd3f66d7695") (:authors ("John Lee")) (:maintainer "John Lee") (:keywords "languages") (:url . "https://github.com/jjlee/lsp-rescript"))]) + (lsp-sonarlint . [(20200821 1703) ((emacs (25)) (dash (2 12 0)) (lsp-mode (6 3)) (ht (2 3))) "Emacs Sonarlint lsp client" tar ((:commit . "ef32b6f734323698fc8ba28646a07515aaafea44") (:authors ("Fermin MF" . "fmfs@posteo.net")) (:maintainer "Fermin MF" . "fmfs@posteo.net") (:keywords "languages" "tools" "php" "javascript" "xml" "ruby" "html" "scala" "java" "python") (:url . "https://github.com/emacs-lsp/lsp-sonarlint"))]) + (lsp-sourcekit . [(20210404 1624) ((emacs (25 1)) (lsp-mode (5))) "sourcekit-lsp client for lsp-mode" single ((:commit . "ae4aa8705cc3a27ed86f1e7ee04d5c8f0522d8c0") (:authors ("Daniel Martín")) (:maintainer "Daniel Martín") (:keywords "languages" "lsp" "swift" "objective-c" "c++") (:url . "https://github.com/emacs-lsp/lsp-sourcekit"))]) + (lsp-tailwindcss . [(20210605 315) ((lsp-mode (3 0)) (emacs (24 3))) "A lsp-mode client for tailwindcss" single ((:commit . "77ebadcb7decd953c069b421a7ab18188295e4b6") (:authors ("A.I." . "merrick@luois.me")) (:maintainer "A.I." . "merrick@luois.me") (:keywords "language" "tools") (:url . "https://github.com/merrickluo/lsp-tailwindcss"))]) + (lsp-treemacs . [(20210502 1804) ((emacs (26 1)) (dash (2 18 0)) (f (0 20 0)) (ht (2 0)) (treemacs (2 5)) (lsp-mode (6 0))) "LSP treemacs" tar ((:commit . "f360d54fa68a00baec228d9582bc67c1a327d757") (:authors ("Ivan Yonchovski")) (:maintainer "Ivan Yonchovski") (:keywords "languages") (:url . "https://github.com/emacs-lsp/lsp-treemacs"))]) + (lsp-ui . [(20210604 1158) ((emacs (26 1)) (dash (2 18 0)) (lsp-mode (6 0)) (markdown-mode (2 3))) "UI modules for lsp-mode" tar ((:commit . "c4ffa7abf6706d591300c608c51d2b72178848ad") (:authors ("Sebastien Chapuis <sebastien@chapu.is>, Fangrui Song" . "i@maskray.me")) (:maintainer "Sebastien Chapuis <sebastien@chapu.is>, Fangrui Song" . "i@maskray.me") (:keywords "languages" "tools") (:url . "https://github.com/emacs-lsp/lsp-ui"))]) + (lua-mode . [(20201110 1250) ((emacs (24 3))) "a major-mode for editing Lua scripts" tar ((:commit . "2d9a468b94acd8480299d47449b53136060b7b23") (:authors ("2011-2013 immerrr" . "immerrr+lua@gmail.com") ("2010-2011 Reuben Thomas" . "rrt@sc3d.org") ("2006 Juergen Hoetzel" . "juergen@hoetzel.info") ("2004 various (support for Lua 5 and byte compilation)") ("2001 Christian Vogler" . "cvogler@gradient.cis.upenn.edu") ("1997 Bret Mogilefsky" . "mogul-lua@gelatinous.com") ("tcl-mode by Gregor Schmid" . "schmid@fb3-s7.math.tu-berlin.de") ("with tons of assistance from") ("Paul Du Bois" . "pld-lua@gelatinous.com") ("Aaron Smith" . "aaron-lua@gelatinous.com")) (:maintainer "2011-2013 immerrr" . "immerrr+lua@gmail.com") (:keywords "languages" "processes" "tools") (:url . "http://immerrr.github.com/lua-mode"))]) + (luarocks . [(20170430 2305) ((emacs (24)) (cl-lib (0 5))) "luarocks tools" single ((:commit . "cee27ba0716edf338077387969883226dd2b7484") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:keywords "convenience") (:url . "https://github.com/emacs-pe/luarocks.el"))]) + (lush-theme . [(20180816 2200) ((emacs (24))) "A dark theme with lush colors" single ((:commit . "645e1959143532df8f7ef90e1184e9556df18af7") (:authors ("Andre Richter" . "andre.o.richter@gmail.com")) (:maintainer "Andre Richter" . "andre.o.richter@gmail.com") (:keywords "theme" "dark" "strong colors") (:url . "https://github.com/andre-richter/emacs-lush-theme"))]) + (lusty-explorer . [(20200602 228) ((emacs (25 1))) "Dynamic filesystem explorer and buffer switcher" single ((:commit . "a746514ccd8df71fc920ba8ad0aa8dca58702631") (:keywords "convenience" "files" "matching" "tools") (:url . "https://github.com/sjbach/lusty-emacs"))]) + (lux-mode . [(20210607 1130) ((emacs (24 3))) "Major mode for editing lux files" single ((:commit . "d158bb78029705a6ee848f8e00c09ba1f3575564") (:authors ("Håkan Mattsson")) (:maintainer "Håkan Mattsson") (:url . "https://github.com/hawk/lux"))]) + (lv . [(20200507 1518) nil "Other echo area" single ((:commit . "2d553787aca1aceb3e6927e426200e9bb9f056f1") (:authors ("Oleh Krehel")) (:maintainer "Oleh Krehel"))]) + (lxc . [(20140410 2022) nil "lxc integration with Emacs" single ((:commit . "88bed56c954d1edd9ff5ce0ced2c02dcf9f71835") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:keywords "processes") (:url . "https://github.com/nicferrier/emacs-lxc"))]) + (lxc-tramp . [(20200414 1445) ((emacs (24)) (cl-lib (0 6))) "TRAMP integration for LXC containers" single ((:commit . "1585e55a5deb89e2f4e30a0ad9e0f121d1e0ebcb") (:authors ("montag451")) (:maintainer "montag451") (:keywords "lxc" "convenience") (:url . "https://github.com/montag451/lxc-tramp"))]) + (lxd-tramp . [(20181023 7) ((emacs (24 4)) (cl-lib (0 6))) "TRAMP integration for LXD containers" single ((:commit . "f335c76245f62b02cf67a9376eca6f3863c8a75a") (:authors ("Yc.S" . "onixie@gmail.com")) (:maintainer "Yc.S" . "onixie@gmail.com") (:keywords "lxd" "lxc" "convenience") (:url . "https://github.com/onixie/lxd-tramp.git"))]) + (lyrics . [(20180812 1841) ((emacs (25 1)) (seq (2 15))) "Show lyrics" single ((:commit . "d0b920be634a5be81ad49418cfaada0f0a57d6cd") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:keywords "convenience") (:url . "https://github.com/emacs-pe/lyrics.el"))]) + (m-buffer . [(20170407 2141) ((seq (2 14))) "List-Oriented, Functional Buffer Manipulation" tar ((:commit . "8681342aaffa187e5c54945ab91b812965a96d19") (:authors ("Phillip Lord" . "phillip.lord@russet.org.uk")) (:maintainer "Phillip Lord" . "phillip.lord@russet.rg.uk"))]) + (mac-pseudo-daemon . [(20200215 513) ((cl-lib (0 1))) "Daemon mode that plays nice with Mac OS." single ((:commit . "94240ebb716f11af8427b6295c3f44c0c43419d3") (:authors ("Ryan C. Thompson")) (:maintainer "Ryan C. Thompson") (:keywords "convenience" "osx" "mac") (:url . "https://github.com/DarwinAwardWinner/osx-pseudo-daemon"))]) + (maces-game . [(20170903 1551) ((dash (2 12 0)) (cl-lib (0 5)) (emacs (24))) "another anagram game." tar ((:commit . "c0fb795f5642467ea528d2f04d904547e8a77ecd") (:authors ("Pawel Bokota" . "pawelb.lnx@gmail.com")) (:maintainer "Pawel Bokota" . "pawelb.lnx@gmail.com") (:keywords "games" "word games" "anagram") (:url . "https://github.com/pawelbx/anagram-game"))]) + (macro-math . [(20130328 1604) nil "in-buffer mathematical operations" single ((:commit . "216e59371e9ee39c34117ba79b9acd78bb415750") (:authors ("Nikolaj Schumacher <bugs * nschum de>")) (:maintainer "Nikolaj Schumacher <bugs * nschum de>") (:keywords "convenience") (:url . "http://nschum.de/src/emacs/macro-math/"))]) + (macrostep . [(20161120 2106) ((cl-lib (0 5))) "interactive macro expander" tar ((:commit . "424e3734a1ee526a1bd7b5c3cd1d3ef19d184267") (:authors ("joddie" . "j.j.oddie@gmail.com")) (:maintainer "joddie" . "j.j.oddie@gmail.com") (:keywords "lisp" "languages" "macro" "debugging") (:url . "https://github.com/joddie/macrostep"))]) + (macrostep-geiser . [(20210324 2141) ((emacs (24 4)) (macrostep (0 9)) (geiser (0 12))) "Macrostep for `geiser'" single ((:commit . "8600fca05fd12a2e0ffe63238ddbfcb37c285dac") (:authors ("Nikita Bloshchanevich")) (:maintainer "Nikita Bloshchanevich") (:keywords "languages" "scheme") (:url . "https://github.com/nbfalcon/macrostep-geiser"))]) + (madhat2r-theme . [(20170203 30) ((emacs (24))) "dark color theme that is easy on the eyes" single ((:commit . "6b387f09de055cfcc15d74981cd4f32f8f9a7323") (:authors ("Micah Duke")) (:maintainer "Micah Duke") (:keywords "color" "theme") (:url . "https://github.com/madhat2r/madhat2r-theme"))]) + (mag-menu . [(20150505 1850) ((splitter (0 1 0))) "Intuitive keyboard-centric menu system" single ((:commit . "9b9277021cd09fb1dba64b1d2a00705d20914bd6") (:authors ("Steven Thomas")) (:maintainer "Steven Thomas") (:keywords "convenience") (:url . "https://github.com/chumpage/mag-menu"))]) + (magic-filetype . [(20180219 1552) ((emacs (24)) (s (1 9 0))) "Enhance filetype major mode" single ((:commit . "019494add5ff02dd36cb3f500142fc51125522cc") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "emulations" "vim" "ft" "file" "magic-mode") (:url . "https://github.com/zonuexe/magic-filetype.el"))]) + (magic-latex-buffer . [(20210306 422) ((cl-lib (0 5)) (emacs (25 1))) "Magically enhance LaTeX-mode font-locking for semi-WYSIWYG editing" single ((:commit . "903ec91872760e47c0e5715795f8465173615098") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://zk-phi.github.io/"))]) + (magik-mode . [(20200304 1323) nil "mode for editing Magik + some utils." tar ((:commit . "e54f934952cde3f96d6a131968295d993b3cf624") (:keywords "languages") (:url . "http://github.com/roadrunner1776/magik"))]) + (magit . [(20210609 2000) ((emacs (25 1)) (dash (20210330)) (git-commit (20210525)) (magit-section (20210525)) (transient (20210524)) (with-editor (20210524))) "A Git porcelain inside Emacs." tar ((:commit . "71f57c5582448be81b02ba53750dd2ea39ed0eaf") (:authors ("Marius Vollmer" . "marius.vollmer@gmail.com") ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "git" "tools" "vc") (:url . "https://github.com/magit/magit"))]) + (magit-annex . [(20210525 2331) ((cl-lib (0 3)) (magit (3 0 0))) "Control git-annex from Magit" single ((:commit . "17e5e60b59eac3cf5938c1b22c29458c0d694b0a") (:authors ("Kyle Meyer" . "kyle@kyleam.com") ("Rémi Vanicat" . "vanicat@debian.org")) (:maintainer "Kyle Meyer" . "kyle@kyleam.com") (:keywords "vc" "tools") (:url . "https://github.com/magit/magit-annex"))]) + (magit-circleci . [(20191209 2113) ((dash (2 16 0)) (transient (0 1 0)) (magit (2 90 0)) (emacs (25 3))) "CircleCI integration for Magit" single ((:commit . "2d4bdacf498ed3ff7d2c3574d346b2d24cbb12da") (:authors ("Adrien Brochard")) (:maintainer "Adrien Brochard") (:keywords "circleci" "continuous" "integration" "magit" "vc" "tools") (:url . "https://github.com/abrochard/magit-circleci"))]) + (magit-delta . [(20210104 1541) ((emacs (25 1)) (magit (20200426)) (xterm-color (2 0))) "Use Delta when displaying diffs in Magit" single ((:commit . "1164a6c3e501e944f1a6a2e91f15374a193bb8d3") (:authors ("Dan Davison" . "dandavison7@gmail.com")) (:maintainer "Dan Davison" . "dandavison7@gmail.com") (:url . "https://github.com/dandavison/magit-delta"))]) + (magit-diff-flycheck . [(20190524 551) ((magit (2)) (flycheck (31)) (seq (2)) (emacs (25 1))) "Report errors in diffs" single ((:commit . "28acf74f59e385865746cccf4b1e4c4025ae9433") (:authors ("Alex Ragone" . "ragonedk@gmail.com")) (:maintainer "Alex Ragone" . "ragonedk@gmail.com") (:keywords "convenience" "matching") (:url . "https://github.com/ragone/magit-diff-flycheck"))]) + (magit-filenotify . [(20151116 2340) ((magit (1 3 0)) (emacs (24 4))) "Refresh status buffer when git tree changes" single ((:commit . "c0865b3c41af20b6cd89de23d3b0beb54c8401a4") (:authors ("Rüdiger Sonderfeld" . "ruediger@c-plusplus.de")) (:maintainer "Rüdiger Sonderfeld" . "ruediger@c-plusplus.de") (:keywords "tools"))]) + (magit-find-file . [(20150702 830) ((magit (2 1 0)) (dash (2 8 0))) "completing-read over all files in Git" single ((:commit . "c3ea91bab37d10a814a829728ec972811f728d60") (:authors ("Bradley Wright" . "brad@intranation.com")) (:maintainer "Bradley Wright" . "brad@intranation.com") (:keywords "git") (:url . "https://github.com/bradleywright/magit-find-file.el"))]) + (magit-gerrit . [(20210414 1334) ((emacs (25 1)) (magit (2 90 1)) (transient (0 3 0))) "Magit plugin for Gerrit Code Review" single ((:commit . "31f5ce30e374716818df7deb0cdbf462ef67e679") (:authors ("Brian Fransioli" . "assem@terranpro.org")) (:maintainer "Brian Fransioli" . "assem@terranpro.org") (:url . "https://github.com/terranpro/magit-gerrit"))]) + (magit-gh-pulls . [(20191230 1944) ((emacs (24 4)) (gh (0 9 1)) (magit (2 12 0)) (pcache (0 2 3)) (s (1 6 1))) "GitHub pull requests extension for Magit" single ((:commit . "57f3a5158bbc7bfd169ee136fde351cce999e0ca") (:authors ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainer "Yann Hodique" . "yann.hodique@gmail.com") (:keywords "git" "tools") (:url . "https://github.com/sigma/magit-gh-pulls"))]) + (magit-gitflow . [(20170929 824) ((magit (2 1 0)) (magit-popup (2 2 0))) "gitflow extension for magit" single ((:commit . "cc41b561ec6eea947fe9a176349fb4f771ed865b") (:authors ("Jan Tatarik" . "Jan.Tatarik@gmail.com")) (:maintainer "Jan Tatarik" . "Jan.Tatarik@gmail.com") (:keywords "vc" "tools") (:url . "https://github.com/jtatarik/magit-gitflow"))]) + (magit-imerge . [(20210525 2326) ((emacs (24 4)) (magit (3 0 0))) "Magit extension for git-imerge" single ((:commit . "cf3b4646aa0205e8d7f47e45165fe6403d6440f5") (:authors ("Kyle Meyer" . "kyle@kyleam.com")) (:maintainer "Kyle Meyer" . "kyle@kyleam.com") (:keywords "vc" "tools") (:url . "https://github.com/magit/magit-imerge"))]) + (magit-lfs . [(20190831 118) ((emacs (24 4)) (magit (2 10 3)) (dash (2 13 0))) "Magit plugin for Git LFS" single ((:commit . "75bf6d3310eae24889589a09e96a4a855e1a11c4") (:authors ("Junyoung Clare Jang" . "jjc9310@gmail.com")) (:maintainer "Junyoung Clare Jang" . "jjc9310@gmail.com") (:keywords "magit" "git" "lfs" "tools" "vc") (:url . "https://github.com/ailrun/magit-lfs"))]) + (magit-libgit . [(20210525 814) ((emacs (26 1)) (magit (3 0 0)) (libgit (0))) "Libgit functionality" single ((:commit . "71f57c5582448be81b02ba53750dd2ea39ed0eaf") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "git" "tools" "vc") (:url . "https://github.com/magit/magit"))]) + (magit-org-todos . [(20180709 1950) ((magit (2 0 0)) (emacs (24))) "Add local todo items to the magit status buffer" single ((:commit . "9ffa3efb098434d837cab4bacd1601fdfc6fe999") (:authors ("Daniel Ma")) (:maintainer "Daniel Ma") (:keywords "org-mode" "magit" "tools") (:url . "http://github.com/danielma/magit-org-todos"))]) + (magit-p4 . [(20170414 1246) ((magit (2 1)) (magit-popup (2 1)) (p4 (12 0)) (cl-lib (0 5))) "git-p4 plug-in for Magit" single ((:commit . "cdc05f2d564409baac9ca15b1a2a0110a6ff12b7") (:authors ("Damian T. Dobroczy\\\\'nski" . "qoocku@gmail.com")) (:maintainer "Aleksey Fedotov" . "lexa@cfotr.com") (:keywords "vc" "tools") (:url . "https://github.com/qoocku/magit-p4"))]) + (magit-patch-changelog . [(20210607 1635) ((emacs (25 1)) (magit (2 91 0))) "Generate a patch according to emacs-mirror/CONTRIBUTE" single ((:commit . "5cd99a6336ad4b60e9e8ce766b8a9c0395289775") (:keywords "git" "tools" "vc") (:url . "https://github.com/dickmao/magit-patch-changelog"))]) + (magit-popup . [(20200719 1015) ((emacs (24 4)) (dash (2 13 0))) "Define prefix-infix-suffix command combos" tar ((:commit . "d8585fa39f88956963d877b921322530257ba9f5") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "bindings") (:url . "https://github.com/magit/magit-popup"))]) + (magit-rbr . [(20181009 2016) ((magit (2 13 0)) (emacs (24 3))) "Support for git rbr in Magit" single ((:commit . "029203b3e48537205052a058e964f058cd802c3c") (:authors ("Anatoly Fayngelerin" . "fanatoly+magitrbr@gmail.com")) (:maintainer "Anatoly Fayngelerin" . "fanatoly+magitrbr@gmail.com") (:keywords "git" "magit" "rbr" "tools") (:url . "https://github.com/fanatoly/magit-rbr"))]) + (magit-reviewboard . [(20200727 1748) ((emacs (25 2)) (magit (2 13 0)) (s (1 12 0)) (request (0 3 0))) "Show open Reviewboard reviews in Magit" single ((:commit . "aceedff88921f1dfef8a6b2fb18fe316fb7223a8") (:authors ("Jules Tamagnan" . "jtamagnan@gmail.com")) (:maintainer "Jules Tamagnan" . "jtamagnan@gmail.com") (:keywords "magit" "vc") (:url . "http://github.com/jtamagnan/magit-reviewboard"))]) + (magit-section . [(20210525 844) ((emacs (25 1)) (dash (20210330))) "Sections for read-only buffers" tar ((:commit . "71f57c5582448be81b02ba53750dd2ea39ed0eaf") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "tools") (:url . "https://github.com/magit/magit"))]) + (magit-stgit . [(20190313 1158) nil "No description available." single ((:commit . "8294f34e4927798d9db883cafe946a9041b7e331"))]) + (magit-svn . [(20210426 2114) ((emacs (25 1)) (magit (2 90 1)) (transient (0 3 2))) "Git-Svn extension for Magit" single ((:commit . "350493217afdb7637564e089f475909adecd9208") (:authors ("Phil Jackson" . "phil@shellarchive.co.uk")) (:maintainer "Phil Jackson" . "phil@shellarchive.co.uk") (:keywords "vc" "tools"))]) + (magit-tbdiff . [(20210525 2329) ((emacs (24 4)) (magit (3 0 0))) "Magit extension for range diffs" single ((:commit . "fef1b7772fe192c434089b67644ff93765e384d4") (:authors ("Kyle Meyer" . "kyle@kyleam.com")) (:maintainer "Kyle Meyer" . "kyle@kyleam.com") (:keywords "vc" "tools") (:url . "https://github.com/magit/magit-tbdiff"))]) + (magit-todos . [(20201101 2240) ((emacs (25 2)) (async (1 9 2)) (dash (2 13 0)) (f (0 17 2)) (hl-todo (1 9 0)) (magit (2 13 0)) (pcre2el (1 8)) (s (1 12 0))) "Show source file TODOs in Magit" single ((:commit . "78d24cf419138b543460f40509c8c1a168b52ca0") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "magit" "vc") (:url . "http://github.com/alphapapa/magit-todos"))]) + (magit-topgit . [(20160313 1954) ((emacs (24 4)) (magit (2 1 0))) "TopGit extension for Magit" single ((:commit . "11489ea798bc88d0ea5244bbf725285eedfefbef") (:authors ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainer "Robin Green" . "greenrd@greenrd.org") (:keywords "vc" "tools"))]) + (magit-vcsh . [(20190817 2014) ((magit (2 90 1)) (vcsh (0 4)) (emacs (24 4))) "Magit vcsh integration" single ((:commit . "fcff128cdbe3ef547dc64f2496cb6405b8ee21ca") (:authors ("Štěpán Němec" . "stepnem@gmail.com")) (:maintainer "Štěpán Němec" . "stepnem@gmail.com") (:keywords "vc" "files" "magit") (:url . "https://gitlab.com/stepnem/magit-vcsh-el"))]) + (magithub . [(20190512 2316) ((emacs (25)) (magit (2 12)) (s (1 12 0)) (ghub+ (0 3)) (git-commit (2 12)) (markdown-mode (2 3))) "Magit interfaces for GitHub" tar ((:commit . "9fb9c653d0dad3da7ccff3ae321fa6e54c08f41b") (:authors ("Sean Allred" . "code@seanallred.com")) (:maintainer "Sean Allred" . "code@seanallred.com") (:keywords "git" "tools" "vc") (:url . "https://github.com/vermiculus/magithub"))]) + (magma-mode . [(20200312 1306) ((emacs (24 3)) (cl-lib (0 3)) (dash (2 6 0)) (f (0 17 1))) "Mode for editing Magma source code" tar ((:commit . "0d810239be625b3f8a82f4e27ffd311fc2e1841e") (:url . "https://github.com/ThibautVerron/magma-mode"))]) + (magnatune . [(20151030 1935) ((dash (2 9 0)) (s (1 9 0))) "browse magnatune's music catalog" tar ((:commit . "605b01505ba30589c77ebb4c96834b5072ccbdd4"))]) + (magrant . [(20210514 1322) ((emacs (25 1)) (dash (2 17 0)) (s (1 12 0)) (tablist (0 70)) (transient (0 2 0)) (friendly-shell-command (0 2 3))) "Transient Interface to Vagrant" tar ((:commit . "79661be21cc8e9faf1ac93adb1f86f9b7a8b110d") (:keywords "processes" "terminals") (:url . "https://github.com/p3r7/magrant"))]) + (majapahit-theme . [(20160817 1848) nil "Color theme with a dark and light versions" tar ((:commit . "77c96df7619666b2102d90d452eeadf04adc89a6"))]) + (major-mode-hydra . [(20210221 834) ((dash (2 18 0)) (pretty-hydra (0 2 2)) (emacs (25))) "Major mode keybindings managed by Hydra" single ((:commit . "84c1929a5153be169ca5c36737439d51dffde505") (:authors ("Jerry Peng" . "pr2jerry@gmail.com")) (:maintainer "Jerry Peng" . "pr2jerry@gmail.com") (:url . "https://github.com/jerrypnz/major-mode-hydra.el"))]) + (major-mode-icons . [(20200127 512) ((emacs (24 3)) (powerline (2 4)) (xpm (1 0 4)) (all-the-icons (2 3 0))) "Display icon for major-mode on mode-line" tar ((:commit . "b36eae2e976bad3c431b082c64b1a724a2ba1fe6") (:keywords "frames" "multimedia") (:url . "http://github.com/stardiviner/major-mode-icons"))]) + (make-color . [(20140625 1150) nil "Alternative to picking color - update fg/bg color by pressing r/g/b/... keys" single ((:commit . "5ca1383ca9228bca82120b238bdc119f302b75c0") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "color") (:url . "https://github.com/alezost/make-color.el"))]) + (make-it-so . [(20190625 1036) ((swiper (0 8 0)) (emacs (24))) "Transform files with Makefile recipes." tar ((:commit . "b73dfb640588123c9eece230ad72b37604f5c126") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "make" "dired") (:url . "https://github.com/abo-abo/make-it-so"))]) + (makefile-executor . [(20201119 1500) ((emacs (24 3)) (dash (2 11 0)) (f (0 11 0)) (s (1 10 0))) "Commands for conveniently running makefile targets" single ((:commit . "d0a34c355fb80a8616ae7ed5eebbda8507aa14ac") (:authors ("Lowe Thiderman" . "lowe.thiderman@gmail.com")) (:maintainer "Lowe Thiderman" . "lowe.thiderman@gmail.com") (:keywords "processes") (:url . "https://github.com/thiderman/makefile-executor.el"))]) + (makey . [(20131231 1430) ((cl-lib (0 2))) "interactive commandline mode" single ((:commit . "a61781e69d3b451551e269446e1c5f624ab81137") (:authors ("Mickey Petersen" . "mickey@masteringemacs.org")) (:maintainer "Mickey Petersen" . "mickey@masteringemacs.org"))]) + (malinka . [(20171202 1021) ((s (1 9 0)) (dash (2 4 0)) (f (0 11 0)) (cl-lib (0 3)) (rtags (0 0)) (projectile (0 11 0))) "A C/C++ project configuration package for Emacs" single ((:commit . "d4aa517c7a9022eae16c758c7efdb3a0403542d7") (:authors ("Lefteris Karapetsas" . "lefteris@refu.co")) (:maintainer "Lefteris Karapetsas" . "lefteris@refu.co") (:keywords "c" "c++" "project-management") (:url . "https://github.com/LefterisJP/malinka"))]) + (mallard-mode . [(20131204 425) nil "Major mode for editing Mallard files" tar ((:commit . "c48170c1ace4959abcc5fb1df0d4cb149cff44c1") (:authors ("Jaromir Hradilek" . "jhradilek@gmail.com")) (:maintainer "Jaromir Hradilek" . "jhradilek@gmail.com") (:keywords "xml" "mallard") (:url . "https://github.com/jhradilek/emacs-mallard-mode"))]) + (mallard-snippets . [(20131023 1851) ((yasnippet (0 8 0)) (mallard-mode (0 1 1))) "Yasnippets for Mallard" tar ((:commit . "70c5293f10722f2ace73bdf74d9a18f95b040edc") (:authors ("Jaromir Hradilek" . "jhradilek@gmail.com")) (:maintainer "Jaromir Hradilek" . "jhradilek@gmail.com") (:keywords "snippets" "mallard") (:url . "https://github.com/jhradilek/emacs-mallard-snippets"))]) + (malyon . [(20161208 2125) ((cl-lib (0 5))) "mode to execute Z-code files version 3, 5, 8" single ((:commit . "0d9882650720b4a791556f5e2d917388965d6fc0") (:authors ("Peter Ilberg <peter.ilberg@gmail.com>, Christopher Madsen <cjm@cjmweb.net>, Erik Selberg" . "erik@selberg.org")) (:maintainer "Christopher Madsen <cjm@cjmweb.net>, Erik Selberg" . "erik@selberg.org") (:keywords "games" "emulations") (:url . "https://github.com/speedenator/malyon"))]) + (man-commands . [(20151221 2221) ((cl-lib (0 5))) "Add interactive commands for every manpages installed in your computer." single ((:commit . "f4ba0c3790855d7544dff92d470d212f24de1d9d") (:authors ("Nathaniel Flath" . "nflath@gmail.com")) (:maintainer "Nathaniel Flath" . "nflath@gmail.com") (:url . "http://github.com/nflath/man-commands"))]) + (manage-minor-mode . [(20210108 1832) ((emacs (24 3))) "Manage your minor-modes easily" single ((:commit . "f4b37fffec7b6608a597e6a3f6900634802807b4") (:authors ("Shingo Fukuyama - http://fukuyama.co")) (:maintainer "Jen-Chieh Shen" . "jcs090218@gmail.com") (:keywords "tools" "minor-mode" "manage" "emacs") (:url . "https://github.com/ShingoFukuyama/manage-minor-mode"))]) + (manage-minor-mode-table . [(20200717 809) ((emacs (25 1)) (manage-minor-mode (1 1))) "Manage minor-modes in table" single ((:commit . "d377094c4ff5e93321e12f53892113083148bdaf") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/manage-minor-mode-table"))]) + (mandm-theme . [(20191112 1832) nil "An M&M color theme." single ((:commit . "4e6ce4f222c1fa175d56e926628f37caa5f398ce") (:authors ("Christian Hopps" . "chopps@gmail.com")) (:maintainer "Christian Hopps" . "chopps@gmail.com") (:url . "https://github.com/choppsv1/emacs-mandm-theme.git"))]) + (mandoku . [(20180403 1106) ((org (8)) (github-clone (20150705 1705))) "A tool to access repositories of premodern Chinese texts" tar ((:commit . "d65dbaa329ecf931f4142be72862972ea6a24e63") (:authors ("Christian Wittern" . "cwittern@gmail.com")) (:maintainer "Christian Wittern" . "cwittern@gmail.com") (:keywords "convenience") (:url . "http://www.mandoku.org"))]) + (mandoku-tls . [(20171118 240) ((emacs (24 4)) (mandoku (20170301)) (github-clone (0 2)) (hydra (0 13 6)) (helm (1 7 0)) (org (9 0)) (helm-charinfo (20170601))) "A tool to access the TLS database" single ((:commit . "ffeebf5bd451ac1806ddfe1744fbbd036a56f902") (:authors ("Christian Wittern" . "cwittern@gmail.com")) (:maintainer "Christian Wittern" . "cwittern@gmail.com") (:keywords "convenience") (:url . "https://github.com/mandoku/mandoku-tls"))]) + (map-progress . [(20190128 16) ((cl-lib (0 6 1))) "mapping macros that report progress" single ((:commit . "1fb916159cd054c233ce3c80d9d01adfae640297") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "https://github.com/tarsius/map-progress"))]) + (map-regexp . [(20190128 18) ((cl-lib (0 6 1))) "map over matches of a regular expression" single ((:commit . "ae2d1c22f786ad987aef3e319925e80160a887a0") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "https://github.com/tarsius/map-regexp"))]) + (marcopolo . [(20160421 1004) ((s (1 9 0)) (dash (2 9 0)) (pkg-info (0 5 0)) (request (0 1 0))) "Emacs client to the Docker HUB/Registry API" tar ((:commit . "9193aabdf12223087b5ed58f1507d5d8a24a4381") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "docker") (:url . "https://github.com/nlamirault/marcopolo"))]) + (marginalia . [(20210605 1213) ((emacs (26 1))) "Enrich existing commands with completion annotations" single ((:commit . "4c6272ffc4836de052c8b06f681b0e700cb01602") (:authors ("Omar Antolín Camarena <omar@matem.unam.mx>, Daniel Mendler" . "mail@daniel-mendler.de")) (:maintainer "Omar Antolín Camarena <omar@matem.unam.mx>, Daniel Mendler" . "mail@daniel-mendler.de") (:url . "https://github.com/minad/marginalia"))]) + (mark-multiple . [(20121118 1554) nil "Sorta lets you mark several regions at once." tar ((:commit . "f6a53c7c5283d640ae718f4548b0fda78877a375") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "marking" "library"))]) + (mark-thing-at . [(20201219 231) ((emacs (26)) (choice-program (0 13))) "Mark a pattern at the current point" single ((:commit . "a622d128afc8d2d67de897666a1e2eccba8d7818") (:authors ("Paul Landes")) (:maintainer "Paul Landes") (:keywords "mark" "point" "lisp") (:url . "https://github.com/plandes/mark-thing-at"))]) + (mark-tools . [(20130614 1025) nil "Some simple tools to access the mark-ring in Emacs" single ((:commit . "a11b61effa90bd0abc876d12573674d36fc17f0c") (:authors ("Alex Bennée" . "alex@bennee.com")) (:maintainer "Alex Bennée" . "alex@bennee.com") (:url . "https://github.com/stsquad/emacs-mark-tools"))]) + (markdown-changelog . [(20200120 2253) ((emacs (26)) (dash (2 13 0))) "Maintain changelog entries" single ((:commit . "1a2c3a4c3e4196f2b5dbb145b01b4bc435a93a96") (:authors ("Paul Landes")) (:maintainer "Paul Landes") (:keywords "markdown" "changelog" "files") (:url . "https://github.com/plandes/markdown-changelog"))]) + (markdown-mode . [(20210530 1825) ((emacs (25 1))) "Major mode for Markdown-formatted text" single ((:commit . "58f2d22526ac1e4abd4ee1afff8624d2dd3123d3") (:authors ("Jason R. Blevins" . "jblevins@xbeta.org")) (:maintainer "Jason R. Blevins" . "jblevins@xbeta.org") (:keywords "markdown" "github flavored markdown" "itex") (:url . "https://jblevins.org/projects/markdown-mode/"))]) + (markdown-preview-eww . [(20160111 1502) ((emacs (24 4))) "Realtime preview by eww" single ((:commit . "5853f836425c877c8a956501f0adda137ef1d3b7") (:authors ("niku" . "niku@niku.name")) (:maintainer "niku" . "niku@niku.name") (:url . "https://github.com/niku/markdown-preview-eww"))]) + (markdown-preview-mode . [(20210516 936) ((emacs (24 4)) (websocket (1 6)) (markdown-mode (2 0)) (cl-lib (0 5)) (web-server (0 1 1))) "markdown realtime preview minor mode." tar ((:commit . "dde87b96de9e81dd01d174da67ef68687b3a5eb5") (:authors ("Igor Shymko" . "igor.shimko@gmail.com")) (:maintainer "Igor Shymko" . "igor.shimko@gmail.com") (:keywords "markdown" "gfm" "convenience") (:url . "https://github.com/ancane/markdown-preview-mode"))]) + (markdown-toc . [(20210515 902) ((s (1 9 0)) (dash (2 11 0)) (markdown-mode (2 1))) "A simple TOC generator for markdown file" tar ((:commit . "86a4a2b092b0f23b9edb3ee0ab7da483b7f10a5b") (:authors (nil . "Antoine R. Dumont (@ardumont)")) (:maintainer nil . "Antoine R. Dumont (@ardumont)") (:keywords "markdown" "toc" "tools") (:url . "http://github.com/ardumont/markdown-toc"))]) + (markdownfmt . [(20160609 1241) ((emacs (24))) "Format markdown using markdownfmt" single ((:commit . "187a74eb4fd9e8520ce08da42d1d292b9af7f2b7") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "markdown") (:url . "https://github.com/nlamirault/emacs-markdownfmt"))]) + (markless . [(20190306 1002) ((emacs (24 4))) "Major mode for Markless documents" single ((:commit . "75fdef45df96978e9326ea4d9bf4e534a250c4c0") (:authors ("Nicolas Hafner" . "shinmera@tymoon.eu")) (:maintainer "Nicolas Hafner" . "shinmera@tymoon.eu") (:keywords "languages" "wp") (:url . "http://github.com/shirakumo/markless.el/"))]) + (markup . [(20170420 1129) ((cl-lib (0 5))) "Simple markup generation helpers." single ((:commit . "876da2d3f23473475bb0fd0a1480ae11d2671291") (:authors ("Arthur Leonard Andersen" . "leoc.git@gmail.com")) (:maintainer "Arthur Leonard Andersen" . "leoc.git@gmail.com") (:keywords "convenience" "markup" "html") (:url . "http://github.com/leoc/markup.el"))]) + (markup-faces . [(20141110 817) nil "collection of faces for markup language modes" single ((:commit . "98a807ed82473eb41c6a201ed7ef816d6bcd67b0") (:authors ("Florian Kaufmann" . "sensorflo@gmail.com")) (:maintainer "Florian Kaufmann" . "sensorflo@gmail.com") (:keywords "wp" "faces") (:url . "https://github.com/sensorflo/markup-faces"))]) + (marmalade-client . [(20141231 2007) ((web (0 5 2)) (kv (0 0 19)) (gh (0 8 0))) "client for marmalade API from emacs" tar ((:commit . "f315dea57e4fbebd9ee0668c0bafd4c45c7b754a") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:keywords "lisp") (:url . "https://github.com/nicferrier/emacs-marmalade-upload"))]) + (marquee-header . [(20200720 1034) ((emacs (25 1))) "Code interface for displaying marquee in header" single ((:commit . "d8e83b837bacdd45d274be42fe2d172fd1cbbba2") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/marquee-header"))]) + (marshal . [(20201223 1853) ((emacs (25 1)) (ht (2 0))) "eieio extension for automatic (un)marshalling" single ((:commit . "490496d974d03906f784707ecc2e0ac36ed84b96") (:authors ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainer "Yann Hodique" . "yann.hodique@gmail.com") (:keywords "extensions") (:url . "https://github.com/sigma/marshal.el"))]) + (maruo-macro-mode . [(20160616 1349) ((emacs (24 3))) "Major mode for editing Hidemaru/Maruo macro script" single ((:commit . "8fc9a38ad051eafa8eb94038711acc52c5d1d8d5") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "programming" "editor" "macro"))]) + (masm-mode . [(20200308 1450) ((emacs (25 1))) "MASM x86 and x64 assembly major mode" single ((:commit . "626b9255c2bb967a53d1d50be0b98a1bcae3250c") (:authors ("YiGeeker" . "zyfchinese@yeah.net")) (:maintainer "YiGeeker" . "zyfchinese@yeah.net") (:keywords "languages") (:url . "https://github.com/YiGeeker/masm-mode"))]) + (mastodon . [(20190305 344) ((emacs (24 4))) "Client for Mastodon" tar ((:commit . "5095797ef32b922d2a624fa6beb970b5e9cf5ca0") (:authors ("Johnson Denen" . "johnson.denen@gmail.com")) (:maintainer "Johnson Denen" . "johnson.denen@gmail.com") (:url . "https://github.com/jdenen/mastodon.el"))]) + (material-theme . [(20201224 916) ((emacs (24 1))) "A Theme based on the colors of the Google Material Design" tar ((:commit . "67a496c937542f6ee7c4a2164d23f0296ef3a645") (:authors ("Christoph Paulik" . "cpaulik@gmail.com")) (:maintainer "Christoph Paulik" . "cpaulik@gmail.com") (:keywords "themes") (:url . "http://github.com/cpaulik/emacs-material-theme"))]) + (math-preview . [(20210219 1431) ((emacs (26 1)) (dash (2 18 0)) (s (1 12 0))) "Preview TeX math equations inline" single ((:commit . "08aa7c47ffc85c9cba1c9812e1c14250cc4192e4") (:authors ("Matsievskiy S.V.")) (:maintainer "Matsievskiy S.V.") (:keywords "convenience") (:url . "https://gitlab.com/matsievskiysv/math-preview"))]) + (math-symbol-lists . [(20200131 2333) nil "Lists of Unicode math symbols and latex commands" tar ((:commit . "1cf7e2885f3352f55852ee9eba26c7cb5a7cd74b") (:authors ("Vitalie Spinu" . "spinuvit@gmail.com")) (:maintainer "Vitalie Spinu" . "spinuvit@gmail.com") (:keywords "unicode" "symbols" "mathematics") (:url . "https://github.com/vspinu/math-symbol-lists"))]) + (math-symbols . [(20201005 2313) nil "Math Symbol Input methods and conversion tools" tar ((:commit . "091b81cb40ceaff97614999ffe85b572ace182f0") (:authors ("KAWABATA, Taichi <kawabata.taichi_at_gmail.com>")) (:maintainer "KAWABATA, Taichi <kawabata.taichi_at_gmail.com>") (:keywords "i18n" "languages" "tex") (:url . "https://github.com/kawabata/math-symbols"))]) + (matlab-mode . [(20210504 1439) nil "Major mode for MATLAB(R) dot-m files" tar ((:commit . "c5824936cc7c2d24aeaac40010669f4eec89a239"))]) + (maude-mode . [(20200725 2035) ((emacs (25))) "Emacs mode for the programming language Maude" single ((:commit . "008f372631a1efe15be033792cfb1686b1736aeb") (:authors ("Ellef Gjelstad <ellefg+maude*ifi.uio.no>")) (:maintainer "Rudi Schlatte" . "rudi@constantly.at") (:keywords "languages" "maude") (:url . "https://github.com/rudi/abs-mode"))]) + (maven-test-mode . [(20141220 557) ((s (1 9)) (emacs (24))) "Utilities for navigating test files and running maven test tasks." single ((:commit . "a19151861df2ad8ae4880a2e7c86ddf848cb569a") (:authors ("Renan Ranelli")) (:maintainer "Renan Ranelli") (:keywords "java" "maven" "test") (:url . "http://github.com/rranelli/maven-test-mode"))]) + (maxframe . [(20170120 1705) nil "maximize the emacs frame based on display size" single ((:commit . "f7048ce95443f2c06cb6b140814451e3a037103a") (:authors ("Ryan McGeary")) (:maintainer "Ryan McGeary") (:keywords "display" "frame" "window" "maximize"))]) + (maxima . [(20210526 1525) ((emacs (25 1)) (s (1 11 0)) (test-simple (1 3 0))) "Major mode for Maxima" tar ((:commit . "74e10d5dedb16f74efc28299c98dd7db9a4392d6") (:authors ("William F. Schelter") ("Jay Belanger") ("Fermin Munoz")) (:maintainer "Fermin Munoz" . "fmfs@posteo.net") (:keywords "maxima" "tools" "math") (:url . "https://gitlab.com/sasanidas/maxima"))]) + (mb-url . [(20191006 1930) ((cl-lib (0))) "Multiple Backends for Emacs URL package." tar ((:commit . "7230902e1f844e0a1388f741e9ae6260cda3de69") (:authors ("ZHANG Weiyi" . "dochang@gmail.com")) (:maintainer "ZHANG Weiyi" . "dochang@gmail.com"))]) + (mbe . [(20151126 1134) ((emacs (24)) (cl-lib (0 5))) "Macros by Example" single ((:commit . "bb10aa8f26bb7e9b1d5746934c94edb00402940c") (:authors ("Ian Price" . "ianprice90@googlemail.com")) (:maintainer "Ian Price" . "ianprice90@googlemail.com") (:keywords "tools" "macros") (:url . "https://github.com/ijp/mbe.el"))]) + (mbo70s-theme . [(20170808 1315) ((emacs (24 0))) "70s style palette, with similarities to mbo theme" single ((:commit . "bed3db8965708ed4e9482b224a9b084765c052f2") (:authors ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))]) + (mbsync . [(20200128 1053) nil "run mbsync to fetch mails" single ((:commit . "d3c81da81ce5b154c0d048047a47277338721a70") (:authors ("Dimitri Fontaine" . "dim@tapoueh.org")) (:maintainer "Dimitri Fontaine" . "dim@tapoueh.org") (:url . "https://github.com/dimitri/mbsync-el"))]) + (mc-calc . [(20200420 1836) ((emacs (24 4)) (multiple-cursors (1 2 1))) "Combine multiple-cursors and calc" single ((:commit . "74a046a5728919a4d1135ca62738326b0dde278c") (:authors (nil . "Frank Roland hatheroldev@fgmail.com>")) (:maintainer nil . "Frank Roland hatheroldev@fgmail.com>") (:keywords "convenience") (:url . "https://github.com/hatheroldev/mc-calc"))]) + (mc-extras . [(20181109 1735) ((multiple-cursors (1 2 1))) "Extra functions for multiple-cursors mode." tar ((:commit . "053abc52181b8718559d7361a587bbb795faf164") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:keywords "editing" "cursors") (:url . "https://github.com/knu/mc-extras.el"))]) + (md-readme . [(20191112 1943) nil "Markdown-formatted READMEs for your ELisp" tar ((:commit . "ca99f44de11fab18d1f50d4b1722f2ceee3c814d") (:authors ("Thomas Kappler" . "tkappler@gmail.com")) (:maintainer "Thomas Kappler" . "tkappler@gmail.com") (:keywords "lisp" "help" "readme" "markdown" "header" "documentation" "github") (:url . "http://github.com/thomas11/md-readme/tree/master"))]) + (md4rd . [(20201203 545) ((emacs (25 1)) (hierarchy (0 7 0)) (request (0 3 0)) (cl-lib (0 6 1)) (dash (2 12 0)) (s (1 12 0)) (tree-mode (1 0 0))) "Mode for reddit (browse it)." single ((:commit . "8ed075874425c4aa1081608dd66f46e5dfa333c0") (:authors ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com") (:keywords "ahungry" "reddit" "browse" "news") (:url . "https://github.com/ahungry/md4rd"))]) + (mediawiki . [(20200718 1529) nil "mediawiki frontend" single ((:commit . "932497604fd417964e4f04614e28d96f4eee028e") (:authors ("Mark A. Hershberger" . "mah@everybody.org")) (:maintainer "Mark A. Hershberger" . "mah@everybody.org") (:keywords "mediawiki" "wikipedia" "network" "wiki") (:url . "https://github.com/hexmode/mediawiki-el"))]) + (meghanada . [(20210505 652) ((emacs (24 3)) (yasnippet (0 6 1)) (company (0 9 0)) (flycheck (0 23))) "A better java development mode" tar ((:commit . "6c57e8a0ae27e2929bb12572cf33059cd4ecbc04") (:authors ("Yutaka Matsubara" . "yutaka.matsubara@gmail.com")) (:maintainer "Yutaka Matsubara" . "yutaka.matsubara@gmail.com") (:keywords "languages" "java") (:url . "https://github.com/mopemope/meghanada-emacs"))]) + (melancholy-theme . [(20201129 2137) nil "No description available." single ((:commit . "8756bb394bcaceb813fc1d315271338224e88295"))]) + (mellow-theme . [(20170808 1317) ((emacs (24 0))) "an Emacs 24 theme based on Mellow (tmTheme)" single ((:commit . "2bdf18f05f5212b6f269d9a94afe2cf201766891") (:authors ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))]) + (melpa-upstream-visit . [(20130720 1033) ((s (1 6 0))) "A set of kludges to visit a melpa-hosted package's homepage" single ((:commit . "7310c74fdead3c0f86ad6eff76cf989e63f70f66") (:authors ("Alessandro Piras" . "laynor@gmail.com")) (:maintainer "Alessandro Piras" . "laynor@gmail.com") (:keywords "convenience"))]) + (memento-mori . [(20190628 2147) ((emacs (24)) (cl-lib (0 5))) "Reminder of mortality" single ((:commit . "b99c5ff526079fc5a1e1be097534855da176bc2b") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "help") (:url . "https://github.com/lassik/emacs-memento-mori"))]) + (memoize . [(20200103 2036) nil "Memoization functions" single ((:commit . "51b075935ca7070f62fae1d69fe0ff7d8fa56fdd") (:authors ("Christopher Wellons" . "mosquitopsu@gmail.com")) (:maintainer "Christopher Wellons" . "mosquitopsu@gmail.com") (:url . "https://github.com/skeeto/emacs-memoize"))]) + (memolist . [(20150804 1721) ((markdown-mode (22 0)) (ag (0 45))) "memolist.el is Emacs port of memolist.vim." single ((:commit . "c437a32d3955f859d9bbcbadf0911bbe27d877ff") (:authors ("mikanfactory <k952i4j14x17_at_gmail.com>")) (:maintainer "mikanfactory") (:keywords "markdown" "memo") (:url . "http://github.com/mikanfactory/emacs-memolist"))]) + (mentor . [(20201121 1649) ((xml-rpc (1 6 12)) (seq (1 11)) (cl-lib (0 5)) (async (1 9 3))) "Frontend for the rTorrent bittorrent client" tar ((:commit . "aa1eb8a8e7d8c5e5564b08f82130eed0943826bb") (:authors ("Stefan Kangas" . "stefankangas@gmail.com")) (:maintainer "Stefan Kangas" . "stefankangas@gmail.com") (:keywords "comm" "processes" "bittorrent"))]) + (meow . [(20210612 304) ((emacs (26 3)) (dash (2 12 0)) (cl-lib (0 6 1)) (s (1 12 0))) "Modal Editing On Wheel" tar ((:commit . "08831345e1deda543dc4f5af46c05ed50fa756a8") (:authors ("Shi Tianshu")) (:maintainer "Shi Tianshu") (:keywords "convenience" "modal-editing") (:url . "https://www.github.com/DogLooksGood/meow"))]) + (merlin . [(20210408 1014) ((emacs (25 1))) "Mode for Merlin, an assistant for OCaml" tar ((:commit . "7d929be2e9c1ae1a32e680591c5a224a96198e47") (:authors ("Frédéric Bour <frederic.bour(_)lakaban.net>")) (:maintainer "Frédéric Bour <frederic.bour(_)lakaban.net>") (:keywords "ocaml" "languages") (:url . "https://github.com/ocaml/merlin"))]) + (merlin-ac . [(20210409 1323) ((emacs (25 1)) (merlin (3)) (auto-complete (1 5))) "Merlin and auto-complete integration." single ((:commit . "7d929be2e9c1ae1a32e680591c5a224a96198e47") (:authors ("Simon Castellan <simon.castellan(_)iuwt.fr>") ("Frédéric Bour <frederic.bour(_)lakaban.net>") ("Thomas Refis <thomas.refis(_)gmail.com>")) (:maintainer "Simon Castellan <simon.castellan(_)iuwt.fr>") (:keywords "ocaml" "languages") (:url . "http://github.com/ocaml/merlin"))]) + (merlin-company . [(20210409 1323) ((emacs (25 1)) (merlin (3)) (company (0 9))) "Merlin and company mode integration." single ((:commit . "7d929be2e9c1ae1a32e680591c5a224a96198e47") (:authors ("Simon Castellan <simon.castellan(_)iuwt.fr>") ("Frédéric Bour <frederic.bour(_)lakaban.net>") ("Thomas Refis <thomas.refis(_)gmail.com>")) (:maintainer "Simon Castellan <simon.castellan(_)iuwt.fr>") (:keywords "ocaml" "languages") (:url . "http://github.com/ocaml/merlin"))]) + (merlin-eldoc . [(20190830 517) ((emacs (24 4)) (merlin (3 0))) "eldoc for OCaml and Reason" single ((:commit . "db7fab1eddfe34781b7e79694f8923b285698032") (:authors ("Louis Roché" . "louis@louisroche.net")) (:maintainer "Louis Roché" . "louis@louisroche.net") (:keywords "merlin" "ocaml" "languages" "eldoc") (:url . "https://github.com/khady/merlin-eldoc"))]) + (merlin-iedit . [(20210409 1323) ((emacs (25 1)) (merlin (3)) (iedit (0 9))) "Merlin and iedit integration." single ((:commit . "7d929be2e9c1ae1a32e680591c5a224a96198e47") (:authors ("Simon Castellan <simon.castellan(_)iuwt.fr>") ("Frédéric Bour <frederic.bour(_)lakaban.net>") ("Thomas Refis <thomas.refis(_)gmail.com>")) (:maintainer "Simon Castellan <simon.castellan(_)iuwt.fr>") (:keywords "ocaml" "languages") (:url . "http://github.com/ocaml/merlin"))]) + (mermaid-mode . [(20210505 1635) ((f (0 20 0)) (emacs (25 3))) "major mode for working with mermaid graphs" single ((:commit . "562ffe86cad91627e2b94b8684818562c3ad2b5d") (:authors ("Adrien Brochard")) (:maintainer "Adrien Brochard") (:keywords "mermaid" "graphs" "tools" "processes") (:url . "https://github.com/abrochard/mermaid-mode"))]) + (meson-mode . [(20210513 1354) ((emacs (26 1))) "Major mode for the Meson build system files" tar ((:commit . "69fdb63b59ec7d1acd427cb7de7219c18af46f40") (:authors ("Michal Sojka" . "sojkam1@fel.cvut.cz")) (:maintainer "Michal Sojka" . "sojkam1@fel.cvut.cz") (:keywords "languages" "tools") (:url . "https://github.com/wentasah/meson-mode"))]) + (message-attachment-reminder . [(20200428 124) ((emacs (24 1))) "Remind if missing attachment" single ((:commit . "ce506b27b15cc39a47c58ff795026eaea8632e2f") (:authors ("Alex Murray" . "murray.alex@gmail.com")) (:maintainer "Alex Murray" . "murray.alex@gmail.com") (:url . "https://github.com/alexmurray/message-attachment-reminder"))]) + (messages-are-flowing . [(20191029 954) nil "visible indication when composing \"flowed\" emails" single ((:commit . "d582a564a63b7b90764ffc5c618bc5300225d0ab") (:authors ("Magnus Henoch" . "magnus.henoch@gmail.com")) (:maintainer "Magnus Henoch" . "magnus.henoch@gmail.com") (:keywords "mail"))]) + (meta-presenter . [(20190414 1720) nil "A simple multi-file presentation tool for Emacs" single ((:commit . "704a2e0f2a3e6bb72578e00eccb772dfcf0670fc") (:authors ("Mohammed Ismail Ansari" . "team.terminal@gmail.com")) (:maintainer "Mohammed Ismail Ansari" . "team.terminal@gmail.com") (:keywords "productivity" "presentation") (:url . "http://ismail.teamfluxion.com"))]) + (metal-archives . [(20210223 1638) ((emacs (26 3)) (alert (1 2)) (ht (2 3)) (request (0 2 2))) "List future releases using Metal-Archives API" single ((:commit . "a218d63b990365edeef6a2394f72d1f2286aeeae") (:authors ("Sébastien Le Maguer" . "lemagues@tcd.ie")) (:maintainer "Sébastien Le Maguer" . "lemagues@tcd.ie") (:keywords "lisp" "calendar") (:url . "https://github.com/seblemaguer/metal-archives.el"))]) + (metal-archives-shopping-list . [(20201229 949) ((emacs (26 3)) (org-ml (5 5 2)) (alert (1 2)) (ht (2 3)) (metal-archives (0 1))) "Add shopping list generation support to metal-archives" single ((:commit . "a218d63b990365edeef6a2394f72d1f2286aeeae") (:authors ("Sébastien Le Maguer" . "lemagues@tcd.ie")) (:maintainer "Sébastien Le Maguer" . "lemagues@tcd.ie") (:keywords "org" "calendar") (:url . "https://github.com/seblemaguer/metal-archives.el"))]) + (metalheart-theme . [(20160710 641) ((emacs (24))) "Low-contrast theme with a dark blue-green background." single ((:commit . "ec98ea2c11dc1213dae8cbe1fe0cee73ca138bb2") (:authors ("Martin Haesler")) (:maintainer "Martin Haesler"))]) + (metamorph . [(20201025 2357) ((emacs (24 4)) (ov (1 0 6))) "Transform your buffers with lisp" single ((:commit . "ec74c733d78c995af69ed24aa5b8a3d84e0c1b29") (:authors ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainer "Adam Niederer" . "adam.niederer@gmail.com") (:keywords "metaprogramming" "wp") (:url . "http://github.com/AdamNiederer/metamorph"))]) + (metascript-mode . [(20150709 57) ((emacs (24 3))) "Major mode for the Metascript programming language" single ((:commit . "edb361c7b0e5de231e5334a17b90652fb1df78f9") (:keywords "languages" "metascript" "mjs") (:url . "http://github.com/metascript/metascript-mode"))]) + (metaweblog . [(20210422 326) ((emacs (26 3))) "An XML-RPC MetaWeblog and WordPress API client." single ((:commit . "543813e0acceb55653d876302a5d5741879fb717") (:authors ("Puneeth Chaganti" . "punchagan+org2blog@gmail.com")) (:maintainer "Grant Rettke" . "grant@wisdomandwonder.com") (:keywords "comm") (:url . "https://github.com/org2blog/org2blog"))]) + (metrics-tracker . [(20210207 1100) ((emacs (24 4)) (seq (2 3))) "Generate reports of personal metrics from diary entries" single ((:commit . "e0ddd7a17da899fa85b1d49f1260042f8caa0612") (:authors ("Ian Martins" . "ianxm@jhu.edu")) (:maintainer "Ian Martins" . "ianxm@jhu.edu") (:keywords "calendar") (:url . "https://github.com/ianxm/emacs-tracker"))]) + (metronome . [(20200502 1748) ((emacs (25 1))) "A simple metronome" tar ((:commit . "18257ecdd7b3d816104e83a5f0f96e676cc9fbfc") (:authors ("Jonathan Gregory <jgrg at autistici dot org>")) (:maintainer "Jonathan Gregory <jgrg at autistici dot org>") (:url . "https://gitlab.com/jagrg/metronome"))]) + (mew . [(20210416 33) nil "Messaging in the Emacs World" tar ((:commit . "380d6059fa9f102e736969d086749980820a9e0e") (:authors ("Kazu Yamamoto" . "Kazu@Mew.org")) (:maintainer "Kazu Yamamoto" . "Kazu@Mew.org"))]) + (mexican-holidays . [(20210604 1421) nil "Mexico holidays for Emacs calendar." single ((:commit . "8e28907ea69f2c0ed9aad9f3b99664ca147379d0") (:authors ("Saúl Gutiérrez" . "me@sggc.me")) (:maintainer "Saúl Gutiérrez" . "me@sggc.me") (:keywords "calendar") (:url . "https://github.com/sggutier/mexican-holidays"))]) + (meyvn . [(20210606 1501) ((emacs (25 1)) (cider (0 23)) (projectile (2 1)) (s (1 12)) (dash (2 17)) (parseedn (0 1 0)) (geiser (0 12))) "Meyvn client" single ((:commit . "ddba1d60d6729bbeeefd0f76dac4e6c20e848f67") (:authors ("Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com")) (:maintainer "Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com") (:url . "https://github.com/danielsz/meyvn-el"))]) + (mgmtconfig-mode . [(20210131 2152) ((emacs (24 3))) "mgmt configuration management language" single ((:commit . "48fa796ab1669dc275b8c99238fff6c83ad2fcc6") (:authors ("Peter Oliver" . "mgmtconfig@mavit.org.uk")) (:maintainer "Mgmt contributors <https://github.com/purpleidea/mgmt>") (:keywords "languages") (:url . "https://github.com/purpleidea/mgmt/misc/emacs"))]) + (mhc . [(20201227 406) ((calfw (20150703))) "Message Harmonized Calendaring system." tar ((:commit . "1cd9cbc7f8cfe40833d1af726644ae45a3d07dc0") (:authors ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainer "Yoshinari Nomura" . "nom@quickhack.net") (:keywords "calendar") (:url . "http://www.quickhack.net/mhc"))]) + (mic-paren . [(20170731 1907) nil "advanced highlighting of matching parentheses" single ((:commit . "d0410c7d805c9aaf51a1bcefaaef092bed5824c4") (:authors ("Mikael Sjödin" . "mic@docs.uu.se") ("Klaus Berndl " . "berndl@sdm.de") ("Jonathan Kotta" . "jpkotta@gmail.com")) (:maintainer "ttn") (:keywords "languages" "faces" "parenthesis" "matching"))]) + (micgoline . [(20160415 326) ((emacs (24 3)) (powerline (2 3))) "powerline mode, color schemes from microsoft and google's logo." single ((:commit . "837504263bb1711203b0f7efecd6b7b5f272fae0") (:authors ("yzprofile" . "yzprofiles@gmail.com")) (:maintainer "yzprofile" . "yzprofiles@gmail.com") (:keywords "mode-line" "powerline" "theme") (:url . "https://github.com/yzprofile/micgoline"))]) + (midje-mode . [(20170809 403) ((cider (0 1 4)) (clojure-mode (1 0))) "Minor mode for running Midje tests in emacs" tar ((:commit . "10ad5b6084cd03d5cd268b486a7c3c246d85535f"))]) + (migemo . [(20200913 12) ((cl-lib (0 5))) "Japanese incremental search through dynamic pattern expansion" single ((:commit . "f756cba3d5268968da361463c2e29b3a659a3de7") (:authors ("Satoru Takabayashi" . "satoru-t@is.aist-nara.ac.jp")) (:maintainer "Satoru Takabayashi" . "satoru-t@is.aist-nara.ac.jp") (:url . "https://github.com/emacs-jp/migemo"))]) + (milkode . [(20140927 529) nil "Command line search and direct jump with Milkode" single ((:commit . "ba97e2aeefa1d9d0b3835bf08edd0de248b0c513") (:authors ("ongaeshi")) (:maintainer "ongaeshi") (:keywords "milkode" "search" "grep" "jump" "keyword"))]) + (mimetypes . [(20201115 1605) ((emacs (25 1))) "Guess a file's mimetype by extension" single ((:commit . "1663054ce266ed25e47ec707c19f619d33225903") (:authors ("Craig Niles <niles.c at gmail.com>")) (:maintainer "Craig Niles <niles.c at gmail.com>") (:url . "https://github.com/cniles/emacs-mimetypes"))]) + (minesweeper . [(20200416 2342) nil "play minesweeper in Emacs" single ((:commit . "d4248e3c9b3e9e7277cb9e6d081330611898f334") (:authors ("Zachary Kanfer" . "zkanfer@gmail.com")) (:maintainer "Zachary Kanfer" . "zkanfer@gmail.com") (:keywords "game" "fun" "minesweeper" "inane" "diversion") (:url . "https://hg.sr.ht/~zck/minesweeper"))]) + (mingus . [(20190106 1443) ((libmpdee (2 1))) "MPD Interface" tar ((:commit . "4223be618f57f10f18114a74393a71955b568884") (:authors ("Niels Giesen <pft on #emacs>")) (:maintainer "Niels Giesen <pft on #emacs>") (:keywords "multimedia" "elisp" "music" "mpd") (:url . "https://github.com/pft/mingus"))]) + (mini-frame . [(20210212 2041) ((emacs (26 1))) "Show minibuffer in child frame on read-from-minibuffer" single ((:commit . "41afb3d79cd269726e955ef0896dc077562de0f5") (:authors ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainer "Andrii Kolomoiets" . "andreyk.mad@gmail.com") (:keywords "frames") (:url . "https://github.com/muffinmad/emacs-mini-frame"))]) + (mini-header-line . [(20170621 1221) ((emacs (24 4))) "a minimal header-line" single ((:commit . "73b6724e0a26c4528d93768191c8aa59e6bce2e5") (:authors ("Johannes Goslar")) (:maintainer "Johannes Goslar") (:keywords "header-line" "mode-line") (:url . "https://github.com/ksjogo/mini-header-line"))]) + (mini-modeline . [(20210312 452) ((emacs (25 1)) (dash (2 12 0))) "Display modeline in minibuffer" single ((:commit . "3e67b8e59d46659df4b37dedf75485a366c93600") (:authors ("Kien Nguyen" . "kien.n.quang@gmail.com")) (:maintainer "Kien Nguyen" . "kien.n.quang@gmail.com") (:keywords "convenience" "tools") (:url . "https://github.com/kiennq/emacs-mini-modeline"))]) + (minibuf-isearch . [(20151226 1943) nil "incremental search on minibuffer history" single ((:commit . "2846c6ac369ee623dad4cd3c8a7a6d9078965516") (:authors ("Keiichiro Nagano" . "knagano@sodan.org") ("Hideyuki SHIRAI " . "shirai@meadowy.org")) (:maintainer "Keiichiro Nagano" . "knagano@sodan.org") (:keywords "minibuffer" "history" "incremental search"))]) + (minibuffer-complete-cycle . [(20130813 1645) nil "Cycle through the *Completions* buffer" single ((:commit . "3df80135887d0169e02294a948711f6dfeca4a6f") (:authors ("Akinori MUSHA" . "knu@iDaemons.org") ("Kevin Rodgers" . "ihs_4664@yahoo.com")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:keywords "completion") (:url . "https://github.com/knu/minibuffer-complete-cycle"))]) + (minibuffer-cua . [(20130906 1134) nil "Make CUA mode's S-up/S-down work in minibuffer" single ((:commit . "adc4979a64f8b36e05960e9afa0746dfa9e2e4c7") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:keywords "completion" "editing") (:url . "https://github.com/knu/minibuffer-cua.el"))]) + (miniedit . [(20100419 1745) nil "Enhanced editing for minibuffer fields." single ((:commit . "e12bf659c3eb92dd8a4cb77642dc0865c54667a3"))]) + (minimal-session-saver . [(20140508 2041) nil "Very lean session saver" single ((:commit . "cf654ac549850746dc21091746e4bcc1aef7668e") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "tools" "frames" "project") (:url . "http://github.com/rolandwalker/minimal-session-saver"))]) + (minimal-theme . [(20190113 2132) nil "A light/dark minimalistic Emacs 24 theme." tar ((:commit . "221b43aad320d226863892dfe4d85465e8eb81ce") (:authors ("Anler Hp <anler86 [at] gmail.com>")) (:maintainer "Anler Hp <anler86 [at] gmail.com>") (:keywords "color" "theme" "minimal") (:url . "http://github.com/ikame/minimal-theme"))]) + (minions . [(20210603 2150) ((emacs (25 2))) "A minor-mode menu for the mode line" single ((:commit . "aed285155dc8f073d766e752520ec599e77ce8b7") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/tarsius/minions"))]) + (minitest . [(20200506 308) ((dash (1 0 0))) "An Emacs mode for ruby minitest files" tar ((:commit . "ddd152c990a528ad09a696bfad23afa4330ea4d7") (:authors ("Arthur Neves")) (:maintainer "Arthur Neves") (:url . "https://github.com/arthurnn/minitest-emacs"))]) + (minizinc-mode . [(20180201 1450) ((emacs (24 1))) "Major mode for MiniZinc code" single ((:commit . "2512521ba7f8e263a06db88df663fc6b3cca7e16") (:keywords "languages" "minizinc") (:url . "http://github.com/m00nlight/minizinc-mode"))]) + (minor-mode-hack . [(20170926 34) nil "Change priority of minor-mode keymaps" single ((:commit . "9688994e23ccb2de568225ef125b41c46e5667c3") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "lisp") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/minor-mode-hack.el"))]) + (minsk-theme . [(20200306 1220) ((emacs (24))) "Minsk, a theme in deep muted greens" single ((:commit . "e4dcdec3a4472a507d6b249ae2194dacaa885ecb") (:authors ("Jean Lo" . "jlpaca@users.noreply.github.com")) (:maintainer "Jean Lo" . "jlpaca@users.noreply.github.com") (:keywords "theme" "faces") (:url . "https://github.com/jlpaca/minsk-theme"))]) + (mip-mode . [(20151127 617) nil "virtual projects for emacs." single ((:commit . "7c88c383b4c7ed0a4c1dc397735f365c1fcb461c") (:authors ("Eeli Reilin" . "gaudecker@fea.st")) (:maintainer "Eeli Reilin" . "gaudecker@fea.st") (:keywords "workspaces" "workspace" "project" "projects" "mip-mode"))]) + (mips-mode . [(20180502 1457) nil "Major-mode for MIPS assembly" single ((:commit . "75152fc78baa762af4f83602f6cb3c8b9bcebca3") (:authors ("Henrik Lissner <http://github/hlissner>")) (:maintainer "Henrik Lissner" . "henrik@lissner.net") (:keywords "languages" "mips" "assembly") (:url . "https://github.com/hlissner/emacs-mips-mode"))]) + (mix . [(20210605 1015) ((emacs (25 1))) "Mix Major Mode. Build Elixir using Mix" single ((:commit . "bfe61ed4e7dd8cfc0bb2603fbac3eb44b32438bf") (:authors ("Ayrat Badykov" . "ayratin555@gmail.com")) (:maintainer "Ayrat Badykov" . "ayratin555@gmail.com") (:keywords "tools") (:url . "https://github.com/ayrat555/mix.el"))]) + (mixed-pitch . [(20210304 1900) ((emacs (24 3))) "Use a variable pitch, keeping fixed pitch where it's sensible" single ((:commit . "519e05f74825abf04b7d2e0e38ec040d013a125a") (:authors ("J. Alexander Branham" . "branham@utexas.edu")) (:maintainer "J. Alexander Branham" . "branham@utexas.edu") (:url . "https://gitlab.com/jabranham/mixed-pitch"))]) + (mkdown . [(20140517 1418) ((markdown-mode (2 0))) "Pretty Markdown previews based on mkdown.com" tar ((:commit . "8e23de82719af6c5b53b52b3308a02b3a1fb872e") (:authors ("Andrew Tulloch")) (:maintainer "Andrew Tulloch") (:keywords "markdown") (:url . "https://github.com/ajtulloch/mkdown.el"))]) + (mlscroll . [(20210601 2158) ((emacs (27 1))) "A scroll bar for the modeline" single ((:commit . "5545418bf0d8456677abc0145a2db08d6d519ba2") (:authors ("J.D. Smith")) (:maintainer "J.D. Smith") (:keywords "convenience") (:url . "https://github.com/jdtsmith/mlscroll"))]) + (mmm-jinja2 . [(20170313 1420) ((mmm-mode (0 5 4))) "MMM submode class for Jinja2 Templates" single ((:commit . "c8cb763174fa2fb61b9a0e5e0ff8cb0210f8492f") (:authors ("Ben Hayden" . "hayden767@gmail.com")) (:maintainer "Ben Hayden" . "hayden767@gmail.com") (:url . "https://github.com/glynnforrest/mmm-jinja2"))]) + (mmm-mode . [(20200908 2236) ((cl-lib (0 2))) "Allow Multiple Major Modes in a buffer" tar ((:commit . "0d00cdf4d02cc166304f6967a20fa22e2eaf208b") (:authors ("Michael Abraham Shulman" . "viritrilbia@gmail.com")) (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru") (:keywords "convenience" "faces" "languages" "tools") (:url . "https://github.com/purcell/mmm-mode"))]) + (mmt . [(20210321 1829) ((emacs (24 5)) (cl-lib (0 3))) "Missing macro tools for Emacs Lisp" single ((:commit . "05cdbb643469676b91a44badecf84deccb50f262") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:keywords "macro" "emacs-lisp") (:url . "https://github.com/mrkkrp/mmt"))]) + (mo-git-blame . [(20160129 1759) nil "An interactive, iterative 'git blame' mode for Emacs" single ((:commit . "254a675eb794cdbbdef9fa2b4b7bb510b70089c0") (:authors ("Moritz Bunkus" . "moritz@bunkus.org")) (:maintainer "Moritz Bunkus" . "moritz@bunkus.org") (:keywords "tools"))]) + (mo-vi-ment-mode . [(20181217 206) nil "Provide vi-like cursor movement that's easy on the fingers" single ((:commit . "e8b525ffc5faa31d36ecc5496b40f0f5c3603c08") (:authors ("Ajay MT" . "ajay.tatachar@gmail.com")) (:maintainer "Ajay MT" . "ajay.tatachar@gmail.com") (:keywords "convenience"))]) + (mobdebug-mode . [(20140110 346) ((lua-mode (20130419)) (emacs (24))) "Major mode for MobDebug" single ((:commit . "e1d483bc4e341c762bc5c0a8c52306a8d01ea0da") (:authors ("Shihpin Tseng" . "deftsp@gmail.com")) (:maintainer "Shihpin Tseng" . "deftsp@gmail.com") (:url . "https://github.com/deftsp/mobdebug-mode"))]) + (mocha . [(20200729 1130) ((js2-mode (20150909)) (f (0 18))) "Run Mocha or Jasmine tests" single ((:commit . "6a72fa20e7be6e55c09b1bc9887ee09c5df28e45") (:authors ("Al Scott")) (:maintainer "Al Scott") (:keywords "javascript" "mocha" "jasmine") (:url . "http://github.com/scottaj/mocha.el"))]) + (mocha-snippets . [(20190417 1931) ((yasnippet (0 8 0))) "Yasnippets for the Mocha JS Testing Framework" tar ((:commit . "44998ea42136a6912ce80061909db1c4c77c8ed8") (:authors ("Charles Lowell" . "cowboyd@frontside.io")) (:maintainer "Charles Lowell" . "cowboyd@frontside.io") (:keywords "test" "javascript"))]) + (mocker . [(20210115 157) ((emacs (25 1))) "mocking framework for emacs" single ((:commit . "5b01b3cc51388faf1ba823683c3600790099c84c") (:authors ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainer "Yann Hodique" . "yann.hodique@gmail.com") (:keywords "lisp" "testing"))]) + (modalka . [(20210318 1748) ((emacs (24 4))) "Modal editing your way" single ((:commit . "0accefac11451b9c9196a56223b5fe1e26d75e6e") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:keywords "modal" "editing") (:url . "https://github.com/mrkkrp/modalka"))]) + (mode-icons . [(20200920 2031) ((emacs (24)) (cl-lib (0 5))) "Show icons for modes" tar ((:commit . "82cfba411c544c862a0854f682494a437642c957") (:authors ("Tom Willemse" . "tom@ryuslash.org")) (:maintainer "Tom Willemse" . "tom@ryuslash.org") (:keywords "multimedia") (:url . "http://ryuslash.org/projects/mode-icons.html"))]) + (mode-line-bell . [(20181029 516) nil "Flash the mode line instead of ringing the bell" single ((:commit . "26ac7d97abdeb762ceaeab6b892f3ed7e3412494") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "convenience"))]) + (mode-line-debug . [(20210525 2014) nil "show status of `debug-on-error' in the mode-line" single ((:commit . "41184eb66a3205abcc32a885780004207df86dbd") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience" "lisp") (:url . "https://github.com/tarsius/mode-line-debug"))]) + (mode-line-idle . [(20210215 2345) ((emacs (26 1))) "Evaluate mode line content when idle" single ((:commit . "8454a5ef404c6f4fe954a10da6ce4fd4311decfa") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-mode-line-idle"))]) + (modern-cpp-font-lock . [(20210405 1155) nil "Font-locking for \"Modern C++\"" single ((:commit . "43c6b68ff58fccdf9deef11674a172e4eaa8455c") (:authors ("Ludwig PACIFICI" . "ludwig@lud.cc")) (:maintainer "Ludwig PACIFICI" . "ludwig@lud.cc") (:keywords "languages" "c++" "cpp" "font-lock") (:url . "https://github.com/ludwigpacifici/modern-cpp-font-lock"))]) + (modern-fringes . [(20200321 1817) nil "Replaces default fringe bitmaps with better looking ones" single ((:commit . "108daba8407dc8acf140157e7f49137c397a0af7") (:authors ("Quen Jankosky" . "quen.jankosky@gmail.com")) (:maintainer "Quen Jankosky" . "quen.jankosky@gmail.com") (:keywords "themes" "fringes" "convenience") (:url . "http://github.com/specialbomb/emacs-modern-fringes"))]) + (modern-sh . [(20200904 1838) ((emacs (25 1)) (hydra (0 15 0)) (eval-in-repl (0 9 7))) "Minor mode for editing shell script" single ((:commit . "05430398a5070245c4358e6a1b7e49a154da174e") (:keywords "languages" "programming") (:url . "https://github.com/damon-kwok/modern-sh"))]) + (modtime-skip-mode . [(20140128 2201) nil "Minor mode for disabling modtime and supersession checks on files." single ((:commit . "c0e49523aa26b2263a8693691ac775988015f592") (:authors ("Jordon Biondo" . "biondoj@mail.gvsu.edu")) (:maintainer "Jordon Biondo" . "biondoj@mail.gvsu.edu") (:url . "http://www.github.com/jordonbiondo/modtime-skip-mode"))]) + (modular-config . [(20200824 442) ((emacs (24 3))) "Organize your config into small and loadable modules" single ((:commit . "c0a6d3dac1aa176deb8417c77dfeac06e9f18e1f") (:authors ("Sidharth Arya" . "sidhartharya10@gmail.com")) (:maintainer "Sidharth Arya" . "sidhartharya10@gmail.com") (:keywords "startup" "lisp" "tools") (:url . "https://github.com/SidharthArya/modular-config.el"))]) + (modus-themes . [(20210610 1039) ((emacs (26 1))) "Highly accessible themes (WCAG AAA)" tar ((:commit . "0c5e2e7cc997fc86f3b519f219c62df6e159e8e5") (:authors ("Protesilaos Stavrou" . "info@protesilaos.com")) (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com") (:keywords "faces" "theme" "accessibility") (:url . "https://gitlab.com/protesilaos/modus-themes"))]) + (moe-theme . [(20210308 1053) nil "A colorful eye-candy theme. Moe, moe, kyun!" tar ((:commit . "b23975ba57a68f69551424552f484227db8a7b97") (:authors ("kuanyui" . "azazabc123@gmail.com")) (:maintainer "kuanyui" . "azazabc123@gmail.com") (:keywords "themes") (:url . "https://github.com/kuanyui/moe-theme.el"))]) + (molar-mass . [(20210519 1342) ((emacs (24 3))) "Calculates molar mass of a molecule" single ((:commit . "838db1486a2dc5a3774eb195d62fbcdef71a63f7") (:authors ("Sergi Ruiz Trepat")) (:maintainer "Sergi Ruiz Trepat") (:keywords "convenience" "chemistry") (:url . "https://github.com/sergiruiztrepat/molar-mass.el"))]) + (molecule . [(20180527 743) ((emacs (25 1))) "Simple wrapper for molecule" single ((:commit . "2ef72b81d9aa24ea782b71a061a3abdad6cae162") (:authors (": drymer <drymer [ AT ] autistici.org>")) (:maintainer ": drymer <drymer [ AT ] autistici.org>") (:keywords ":" "languages" "terminals") (:url . "https://git.daemons.it/drymer/molecule.el"))]) + (molokai-theme . [(20151016 1545) nil "molokai theme with Emacs theme engine" single ((:commit . "04a44f21184b6a26caae4f2c92db9019d883309c") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/alloy-d/color-theme-molokai"))]) + (mongo . [(20150315 1219) nil "MongoDB driver for Emacs Lisp" tar ((:commit . "595529ddd70ecb9fab8b11daad2c3929941099d6") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainer "Tomohiro Matsuyama" . "m2ym.pub@gmail.com") (:keywords "convenience"))]) + (monitor . [(20161018 1144) ((dash (2 13 0))) "Utilities for monitoring expressions." tar ((:commit . "63f4643a0ee81616dbb692b8b03bae21df2283e2") (:authors ("Ben Moon" . "software@guiltydolphin.com")) (:maintainer "Ben Moon" . "software@guiltydolphin.com") (:keywords "lisp" "monitor" "utility") (:url . "https://github.com/guiltydolphin/monitor"))]) + (monkeytype . [(20210110 513) ((emacs (25 1)) (scrollable-quick-peek (0 1 0))) "Mode for speed typing" single ((:commit . "f64b1580f8516ddbf5f71688fb9ace2cd1631b41") (:authors ("Pablo Barrantes" . "xjpablobrx@gmail.com")) (:maintainer "Pablo Barrantes" . "xjpablobrx@gmail.com") (:keywords "games") (:url . "https://github.com/jpablobr/emacs-monkeytype"))]) + (monky . [(20210417 12) nil "Control Hg from Emacs." tar ((:commit . "72c7cd21b7b995c476e938fd0b92a494aa25c3a7") (:authors ("Anantha kumaran" . "ananthakumaran@gmail.com")) (:maintainer "Anantha kumaran" . "ananthakumaran@gmail.com") (:keywords "tools") (:url . "http://github.com/ananthakumaran/monky"))]) + (monochrome-theme . [(20140326 1050) nil "A dark Emacs 24 theme for your focused hacking sessions" tar ((:commit . "bfca67fe7365310bc47ae9ca96c417caada54896") (:authors ("Xavier Noria" . "fxn@hashref.com")) (:maintainer "Xavier Noria" . "fxn@hashref.com"))]) + (monokai-alt-theme . [(20170630 2048) ((emacs (24))) "Theme with a dark background. Based on sublime monokai theme." single ((:commit . "f342b6afc31f929be0626eca2d696ee9fab78011") (:authors ("Dmytro Koval")) (:maintainer "Dmytro Koval") (:url . "https://github.com/dawidof/emacs-monokai-theme"))]) + (monokai-pro-theme . [(20210206 1820) nil "A simple theme based on the Monokai Pro Sublime color schemes" tar ((:commit . "d0489741a80d818713c290a1a4bdd985877228bb") (:authors ("Kaleb Elwert" . "belak@coded.io")) (:maintainer "Kaleb Elwert" . "belak@coded.io") (:url . "https://github.com/belak/emacs-monokai-pro-theme"))]) + (monokai-theme . [(20201229 1001) nil "A fruity color theme for Emacs." single ((:commit . "c5a7978bfc2ad2aa90882e6b2583668dc7b3e1a5") (:authors ("Kelvin Smith" . "oneKelvinSmith@gmail.com")) (:maintainer "Kelvin Smith" . "oneKelvinSmith@gmail.com") (:url . "http://github.com/oneKelvinSmith/monokai-emacs"))]) + (monotropic-theme . [(20181015 1230) ((emacs (24))) "Monotropic Theme" single ((:commit . "36df566aa8225e303f6c9d90c00740dd678a415e") (:authors ("caffo")) (:maintainer "caffo") (:url . "https://github.com/caffo/monotropic-theme"))]) + (monroe . [(20201013 1754) nil "Yet another client for nREPL" single ((:commit . "cae86f640df5faf44690bfac591ad464981293a0") (:authors ("Sanel Zukan" . "sanelz@gmail.com")) (:maintainer "Sanel Zukan" . "sanelz@gmail.com") (:keywords "languages" "clojure" "nrepl" "lisp") (:url . "http://www.github.com/sanel/monroe"))]) + (mood-line . [(20200722 2327) ((emacs (25 1))) "A minimal mode-line inspired by doom-modeline" single ((:commit . "64cbd61c3d9ebf8eb7e1b6366279e32382405f90") (:authors ("Jessie Hildebrandt <jessieh.net>")) (:maintainer "Jessie Hildebrandt <jessieh.net>") (:keywords "mode-line" "faces") (:url . "https://gitlab.com/jessieh/mood-line"))]) + (mood-one-theme . [(20210221 18) ((emacs (24 4))) "A dark color scheme inspired by the Doom One theme." single ((:commit . "42e402a89473458f55a71c5bbe785575e9a927ba") (:authors ("Jessie Hildebrandt <jessieh.net>")) (:maintainer "Jessie Hildebrandt <jessieh.net>") (:keywords "mode-line" "faces") (:url . "https://gitlab.com/jessieh/mood-one-theme"))]) + (moody . [(20210522 1100) ((emacs (25 3))) "Tabs and ribbons for the mode line" single ((:commit . "392c77174ace6c57921f237f41eaa4c3a83ac303") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/tarsius/moody"))]) + (moom . [(20210324 825) ((emacs (25 1))) "Commands to control frame position and size" tar ((:commit . "f94cf84138a81212ffe856599834f7824a1b6e95") (:authors ("Takaaki ISHIKAWA <takaxp at ieee dot org>")) (:maintainer "Takaaki ISHIKAWA <takaxp at ieee dot org>") (:keywords "frames" "faces" "convenience") (:url . "https://github.com/takaxp/Moom"))]) + (moonscript . [(20170831 2226) ((cl-lib (0 5)) (emacs (24))) "Major mode for editing MoonScript code" tar ((:commit . "56f90471e2ced2b0a177aed4d8c2f854797e9cc7") (:authors ("@GriffinSchneider, @k2052, @EmacsFodder")) (:maintainer "@GriffinSchneider, @k2052, @EmacsFodder"))]) + (moonshot . [(20200210 2356) ((emacs (25 1)) (cl-lib (0 5)) (f (0 18)) (s (1 11 0)) (projectile (2 0 0)) (counsel (0 11 0)) (realgud (1 5 1)) (seq (2 20)) (levenshtein (1 0))) "Run executable file, debug and build commands on project" single ((:commit . "c9f363b1b5f2b92006e03116580540dadb7364ea") (:authors ("Jong-Hyouk Yun" . "ageldama@gmail.com")) (:maintainer "Jong-Hyouk Yun" . "ageldama@gmail.com") (:keywords "convenience" "files" "processes" "tools" "unix") (:url . "https://github.com/ageldama/moonshot"))]) + (morganey-mode . [(20170118 934) ((emacs (24 4))) "Major mode for editing Morganey files" single ((:commit . "5cf3870432a2aeb69d373abe63b3be1f325f6d21") (:authors ("Alexey Kutepov" . "reximkut@gmail.com")) (:maintainer "Alexey Kutepov" . "reximkut@gmail.com") (:url . "https://github.com/morganey-lang/morganey-mode"))]) + (morlock . [(20180318 2023) nil "more font-lock keywords for elisp" single ((:commit . "b883d48024ddfffebe2d0dd69f5ed54c617f8834") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "convenience") (:url . "https://github.com/tarsius/morlock"))]) + (mosey . [(20180614 1649) ((emacs (24 4))) "Mosey around your buffers" single ((:commit . "2e3ac9d334fa2937ed5267193dfd25d8e1f14dc2") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "convenience") (:url . "http://github.com/alphapapa/mosey.el"))]) + (most-used-words . [(20200808 931) ((emacs (24 3))) "Display most used words in buffer" single ((:commit . "f712879493660c3c3ee3793470b8f8939b79c2b0") (:authors ("Udyant Wig" . "udyant.wig@gmail.com")) (:maintainer "Udyant Wig" . "udyant.wig@gmail.com") (:keywords "convenience" "wp") (:url . "https://github.com/udyantw/most-used-words"))]) + (mote-mode . [(20160123 29) ((ruby-mode (1 1))) "Mote minor mode" single ((:commit . "666c6641addbd3b337a7aa01fd2742ded2f41b83") (:authors ("Leandro López (inkel)" . "inkel.ar@gmail.com")) (:maintainer "Leandro López (inkel)" . "inkel.ar@gmail.com") (:url . "http://inkel.github.com/mote-mode/"))]) + (motion-mode . [(20140920 156) ((flymake-easy (0 7)) (flymake-cursor (1 0 2))) "major mode for RubyMotion enviroment" tar ((:commit . "4c94180e3ecea611a61240a0c0cd48f1032c4a55") (:authors ("Satoshi Namai")) (:maintainer "Satoshi Namai") (:url . "https://github.com/ainame/motion-mode"))]) + (mouse-slider-mode . [(20161021 1914) ((emacs (24 3)) (cl-lib (0 3))) "scale numbers dragged under the mouse" single ((:commit . "b3c19cd231edecce76787c5a9bbe5e4046d91f88") (:authors ("Christopher Wellons" . "mosquitopsu@gmail.com")) (:maintainer "Christopher Wellons" . "mosquitopsu@gmail.com") (:url . "https://github.com/skeeto/mouse-slider-mode"))]) + (move-dup . [(20210127 1938) ((emacs (25 1))) "Eclipse-like moving and duplicating lines or rectangles" single ((:commit . "5906503e0b9b832b1d5062c9cd27cf72a2ce4817") (:authors ("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com")) (:maintainer "Jimmy Yuen Ho Wong" . "wyuenho@gmail.com") (:keywords "convenience" "text" "edit") (:url . "https://github.com/wyuenho/move-dup"))]) + (move-text . [(20170909 330) nil "Move current line or region with M-up or M-down." single ((:commit . "bfc255110ad05732a43cf25d6a0e3b4a6710b58c") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com") (:keywords "edit") (:url . "https://github.com/emacsfodder/move-text"))]) + (mowedline . [(20161122 235) nil "elisp utilities for using mowedline" single ((:commit . "6121b7d4aacd18f7b24da226e61dbae054e50a7c") (:authors ("John Foerch" . "jjfoerch@earthlink.net")) (:maintainer "John Foerch" . "jjfoerch@earthlink.net"))]) + (moz . [(20150805 1706) nil "Lets current buffer interact with inferior mozilla." single ((:commit . "ab3e79914445039ceb62f7f2dc342358fec3492e") (:authors ("Massimiliano Mirra, <bard [at] hyperstruct [dot] net>")) (:maintainer "Massimiliano Mirra, <bard [at] hyperstruct [dot] net>") (:url . "http://github.com/bard/mozrepl/raw/master/chrome/content/moz.el"))]) + (moz-controller . [(20151209 206) ((moz (0))) "Control Firefox from Emacs" single ((:commit . "46f665c03574fa922de767fc29795e0db4a7c5c6") (:authors ("任文山 (Ren Wenshan) <renws1990 at gmail.com>")) (:maintainer "任文山 (Ren Wenshan) <renws1990 at gmail.com>") (:url . "https://github.com/RenWenshan/emacs-moz-controller"))]) + (mozc . [(20210306 1053) nil "minor mode to input Japanese with Mozc" single ((:commit . "d031469630c70188c20598c0f3a3c3c46c6c7a14") (:keywords "mule" "multilingual" "input method"))]) + (mozc-cand-posframe . [(20200208 750) ((emacs (26 1)) (posframe (0 5 0)) (mozc (20180101 800)) (s (1 12))) "Posframe frontend for mozc.el" single ((:commit . "1d07d5055381008ccbb29b97315d140e09a7ee95") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:keywords "i18n" "tooltip") (:url . "https://github.com/akirak/mozc-posframe"))]) + (mozc-im . [(20160412 22) ((mozc (0))) "Mozc with input-method-function interface." single ((:commit . "df614a1076c28a11551fb3e822868bae47e855a5") (:authors ("Daisuke Kobayashi" . "d5884jp@gmail.com")) (:maintainer "Daisuke Kobayashi" . "d5884jp@gmail.com") (:keywords "i18n" "extentions"))]) + (mozc-popup . [(20150224 34) ((popup (0 5 2)) (mozc (0))) "Mozc with popup" single ((:commit . "f0684b875a7427ec08f8df13939a486e5d5cf420") (:authors ("Daisuke Kobayashi" . "d5884jp@gmail.com")) (:maintainer "Daisuke Kobayashi" . "d5884jp@gmail.com") (:keywords "i18n" "extentions"))]) + (mozc-temp . [(20160228 840) ((emacs (24)) (dash (2 10 0)) (mozc (0))) "Use mozc temporarily" single ((:commit . "90a6eb1db8fa1283b944432cfb83739286b37f92") (:authors ("Hiroki YAMAKAWA" . "s06139@gmail.com")) (:maintainer "Hiroki YAMAKAWA" . "s06139@gmail.com") (:url . "https://github.com/HKey/mozc-temp"))]) + (mpages . [(20150710 1404) nil "An Emacs buffer for quickly writing your Morning Pages" single ((:commit . "39a72a0931ab1cdbfdf0ab9f412dc12d43a3829f") (:authors ("Sean Levin")) (:maintainer "Sean Levin") (:url . "https://github.com/slevin/mpages"))]) + (mpdel . [(20210107 1303) ((emacs (25 1)) (libmpdel (1 2 0)) (navigel (0 7 0))) "Play and control your MPD music" tar ((:commit . "6682446c6263a79e79c55cf32c0efb066245feec") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:keywords "multimedia") (:url . "https://gitea.petton.fr/mpdel/mpdel"))]) + (mpdmacs . [(20201118 350) ((emacs (25 1)) (elmpd (0 1))) "A lightweight MPD client" single ((:commit . "174ffbc1e8ef31339867e3d9b29fe8468b636a7c") (:authors ("Michael Herstine" . "sp1ff@pobox.com")) (:maintainer "Michael Herstine" . "sp1ff@pobox.com") (:keywords "comm") (:url . "https://github.com/sp1ff/mpdmacs"))]) + (mpmc-queue . [(20180303 2029) ((emacs (26 0)) (queue (0 2 0))) "a multiple-producer-multiple-consumer queue" single ((:commit . "df07d6bef7468edb1d73ef73b8331b94d0e5d0ca") (:authors ("Sho Mizoe" . "sho.mizoe@gmail.com")) (:maintainer "Sho Mizoe" . "sho.mizoe@gmail.com") (:keywords "lisp" "async") (:url . "https://github.com/smizoe/mpmc-queue"))]) + (mpv . [(20210207 1140) ((cl-lib (0 5)) (emacs (24)) (json (1 3)) (org (8 0))) "control mpv for easy note-taking" single ((:commit . "2d24187f7bdb0495c90d5109a730742e735636ba") (:authors ("Johann Klähn" . "kljohann@gmail.com")) (:maintainer "Johann Klähn" . "kljohann@gmail.com") (:keywords "tools" "multimedia") (:url . "https://github.com/kljohann/mpv.el"))]) + (mqr . [(20180527 1204) ((emacs (24 4))) "Multi-dimensional query and replace" single ((:commit . "4ade19d4620b8b61340290bf63fa56d5e493859f") (:authors ("Tino Calancha" . "tino.calancha@gmail.com")) (:maintainer "Tino Calancha" . "tino.calancha@gmail.com") (:keywords "convenience" "extensions" "lisp") (:url . "https://github.com/calancha/multi-replace"))]) + (mqtt-mode . [(20180611 1735) ((emacs (25)) (dash (2 12 0))) "client for interaction with MQTT servers" single ((:commit . "613e70e9b9940e635e779994b5c83f86eb62c8e6") (:authors ("Andreas Müller" . "code@0x7.ch")) (:maintainer "Andreas Müller" . "code@0x7.ch") (:keywords "tools") (:url . "https://github.com/andrmuel/mqtt-mode"))]) + (msgpack . [(20200323 515) ((emacs (25 1))) "Read and write MessagePack object" single ((:commit . "90e3086f259549b1667a3c5b9aa2d70aaeaa4d3d") (:authors ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:keywords "lisp") (:url . "https://github.com/xuchunyang/msgpack.el"))]) + (msvc . [(20210503 1856) ((emacs (24)) (cl-lib (0 5)) (cedet (1 0)) (ac-clang (2 0 0))) "Microsoft Visual C/C++ mode" tar ((:commit . "122dc9cb7f145f12dac7b117a48fceb38b279432") (:authors ("yaruopooner [https://github.com/yaruopooner]")) (:maintainer "yaruopooner [https://github.com/yaruopooner]") (:keywords "languages" "completion" "syntax check" "mode" "intellisense") (:url . "https://github.com/yaruopooner/msvc"))]) + (mtg-deck-mode . [(20180613 2010) ((emacs (25 1))) "Major mode to edit MTG decks" tar ((:commit . "8265b8ed17fcd4406760c19aa6ee9c76068b1ab0") (:authors ("Mattias Bengtsson" . "mattias.jc.bengtsson@gmail.com")) (:maintainer "Mattias Bengtsson" . "mattias.jc.bengtsson@gmail.com") (:keywords "data" "mtg" "magic") (:url . "https://github.com/mattiasb/mtg-deck-mode"))]) + (mu-cite . [(20190803 439) ((flim (1 14 9))) "A library to provide MIME features." tar ((:commit . "b2c83bbce4646d100b942f0f0de0877a8d47298c") (:authors ("MORIOKA Tomohiko" . "tomo@m17n.org") ("Shuhei KOBAYASHI" . "shuhei@aqua.ocn.ne.jp")) (:maintainer "Katsumi Yamaoka" . "yamaoka@jpl.org") (:keywords "mail" "news" "citation"))]) + (mu2tex . [(20200512 704) nil "Convert plain text molecule names and units to TeX" single ((:commit . "4b84cdac955cb36a8c44a2be48f3310252e3d3ad") (:authors ("Carsten Dominik" . "carsten.dominik@gmail.com")) (:maintainer "Carsten Dominik" . "carsten.dominik@gmail.com") (:keywords "tex") (:url . "https://github.com/cdominik/mu2tex"))]) + (mu4e-alert . [(20190418 558) ((alert (1 2)) (s (1 10 0)) (ht (2 0)) (emacs (24 3))) "Desktop notification for mu4e" single ((:commit . "91f0657c5b245a9de57aa38391221fb5d141d9bd") (:authors ("Iqbal Ansari" . "iqbalansari02@yahoo.com")) (:maintainer "Iqbal Ansari" . "iqbalansari02@yahoo.com") (:keywords "mail" "convenience") (:url . "https://github.com/iqbalansari/mu4e-alert"))]) + (mu4e-conversation . [(20190609 812) ((emacs (25 1))) "Show a complete thread in a single buffer" single ((:commit . "ccf85002b18fee54051dbfaf8d3931ca2a07db24") (:authors ("Pierre Neidhardt" . "mail@ambrevar.xyz")) (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz") (:keywords "mail" "convenience" "mu4e") (:url . "https://gitlab.com/Ambrevar/mu4e-conversation"))]) + (mu4e-jump-to-list . [(20200913 1558) ((emacs (24 4)) (cl-lib (0 5))) "mu4e jump-to-list extension" single ((:commit . "a9a3a1d371451d12e0ec24e456c7d90ccacd9cdd") (:authors ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainer "Yuri D'Elia" . "wavexx@thregr.org") (:keywords "mu4e" "mail" "convenience") (:url . "https://gitlab.com/wavexx/mu4e-jump-to-list.el"))]) + (mu4e-maildirs-extension . [(20201028 921) ((dash (0 0 0))) "Show mu4e maildirs summary in mu4e-main-view" single ((:commit . "1167bc6e08996f866e73e9a02f563fd21ac317fd") (:authors ("Andreu Gil Pàmies" . "agpchil@gmail.com")) (:maintainer "Andreu Gil Pàmies" . "agpchil@gmail.com") (:url . "http://github.com/agpchil/mu4e-maildirs-extension"))]) + (mu4e-marker-icons . [(20210124 514) ((emacs (26 1)) (all-the-icons (4 0 0))) "Display icons for mu4e markers" single ((:commit . "e5c4f9b14eab69a0a28f108c6fee3390e19bd080") (:keywords "mail") (:url . "https://github.com/stardiviner/mu4e-marker-icons"))]) + (mu4e-overview . [(20200824 1549) ((emacs (26))) "Show overview of maildir" single ((:commit . "7daaa35a6d78feb83167e780a9c23da719c9051b") (:authors ("Michał Krzywkowski" . "k.michal@zoho.com")) (:maintainer "Michał Krzywkowski" . "k.michal@zoho.com") (:keywords "mail" "tools") (:url . "https://github.com/mkcms/mu4e-overview"))]) + (mu4e-query-fragments . [(20200913 1558) ((emacs (24 4))) "mu4e query fragments extension" single ((:commit . "6a81d43fcbdc51c2fc47d88f4fd8f25d8f906b79") (:authors ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainer "Yuri D'Elia" . "wavexx@thregr.org") (:keywords "mu4e" "mail" "convenience") (:url . "https://gitlab.com/wavexx/mu4e-query-fragments.el"))]) + (mu4e-views . [(20210601 1402) ((emacs (26 1)) (xwidgets-reuse (0 2)) (ht (2 2)) (esxml (20210323 1102))) "View emails in mu4e using xwidget-webkit" single ((:commit . "c7f2398612218407e72b174f02b26cf2916eba22") (:authors ("Boris Glavic" . "lordpretzel@gmail.com")) (:maintainer "Boris Glavic" . "lordpretzel@gmail.com") (:keywords "mail") (:url . "https://github.com/lordpretzel/mu4e-views"))]) + (muban . [(20180415 1219) ((emacs (25))) "Lightweight template expansion tool" single ((:commit . "fd052645bcaa3cca8cede1c587a0b05ab5bd66b2") (:authors ("Jiahao Li" . "jiahaowork@gmail.com")) (:maintainer "Jiahao Li" . "jiahaowork@gmail.com") (:keywords "abbrev" "tools") (:url . "https://github.com/jiahaowork/muban.el"))]) + (mugur . [(20210503 1516) ((emacs (26 1)) (s (1 12 0)) (anaphora (1 0 4)) (dash (2 18 1)) (cl-lib (1 0))) "Configurator for QMK compatible keyboards" single ((:commit . "b84752c391c5fe515960f77c80d08f313df57f33") (:authors ("Mihai Olteanu" . "mihai_olteanu@fastmail.fm")) (:maintainer "Mihai Olteanu" . "mihai_olteanu@fastmail.fm") (:keywords "multimedia") (:url . "https://github.com/mihaiolteanu/mugur"))]) + (multi . [(20131013 1544) ((emacs (24))) "Clojure-style multi-methods for emacs lisp" single ((:commit . "0987ab71692717ed457cb3984de184db9185806d") (:authors ("Christina Whyte" . "kurisu.whyte@gmail.com")) (:maintainer "Christina Whyte" . "kurisu.whyte@gmail.com") (:keywords "multimethod" "generic" "predicate" "dispatch") (:url . "http://github.com/kurisuwhyte/emacs-multi"))]) + (multi-compile . [(20210604 140) ((emacs (24)) (dash (2 12 1))) "Multi target interface to compile." single ((:commit . "948ee25878c509d0f9ba8715b209eae79143b76e") (:authors ("Kvashnin Vladimir" . "reangd@gmail.com")) (:maintainer "Kvashnin Vladimir" . "reangd@gmail.com") (:keywords "tools" "compile" "build") (:url . "https://github.com/ReanGD/emacs-multi-compile"))]) + (multi-line . [(20170822 226) ((emacs (24 3)) (s (1 9 0)) (cl-lib (0 5)) (dash (2 12 0)) (shut-up (0 3 2))) "multi-line statements" tar ((:commit . "d5ae863ced0adeb7032ada398005f27a6c669d79") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:keywords "multi" "line" "length" "whitespace" "programming" "tools" "convenience" "files") (:url . "https://github.com/IvanMalison/multi-line"))]) + (multi-project . [(20210105 1229) ((emacs (25))) "Find files, compile, and search for multiple projects." single ((:commit . "f71a56978a57ee5b08e75d01a5d6ec75f20cedba") (:authors ("Shawn Ellis" . "shawn.ellis17@gmail.com")) (:maintainer "Shawn Ellis" . "shawn.ellis17@gmail.com") (:keywords "convenience" "project" "management") (:url . "https://hg.osdn.net/view/multi-project/multi-project"))]) + (multi-run . [(20210108 336) ((emacs (24)) (window-layout (1 4))) "Efficiently manage multiple remote nodes" tar ((:commit . "13d4d923535b5e8482b13ff76185203075fb26a3") (:authors ("Sagar Jha")) (:maintainer "Sagar Jha") (:keywords "multiple shells" "multi-run" "remote nodes") (:url . "https://www.github.com/sagarjha/multi-run"))]) + (multi-term . [(20200514 428) nil "Managing multiple terminal buffers in Emacs." single ((:commit . "017c77c550115936860e2ea71b88e585371475d5") (:authors ("Andy Stewart" . "lazycat.manatee@gmail.com")) (:maintainer "Andy Stewart" . "lazycat.manatee@gmail.com") (:keywords "term" "terminal" "multiple buffer") (:url . "http://www.emacswiki.org/emacs/download/multi-term.el"))]) + (multi-vterm . [(20201203 1500) ((emacs (26 3)) (vterm (0 0)) (project (0 3 0))) "Like multi-term.el but for vterm" single ((:commit . "8f385a0aa1ad7a279acc9276913955ef165e7ac7") (:keywords "terminals" "processes") (:url . "https://github.com/suonlight/multi-libvterm"))]) + (multi-web-mode . [(20130824 354) nil "multiple major mode support for web editing" tar ((:commit . "ad1c8d1c870334052d244c7ae3636cb7b9357b7c") (:authors ("Fabián E. Gallina" . "fabian@anue.biz")) (:maintainer "Fabián E. Gallina" . "fabian@anue.biz") (:keywords "convenience" "languages" "wp") (:url . "https://github.com/fgallina/multi-web-mode"))]) + (multicolumn . [(20150202 2251) nil "Creating and managing multiple side-by-side windows." single ((:commit . "c7a3afecd470859b2e60aa7c554d6e4d436df7fa") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:url . "https://github.com/Lindydancer/multicolumn"))]) + (multifiles . [(20130615 2133) nil "View and edit parts of multiple files in one buffer" single ((:commit . "dddfe64b8e1c1cd1f9ccc1f03405477fc0d53897") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "multiple" "files"))]) + (multiple-cursors . [(20210323 1128) ((cl-lib (0 5))) "Multiple cursors for Emacs." tar ((:commit . "616fbdd3696f99d85660ad57ebbb0c44d6c7f426") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "editing" "cursors") (:url . "https://github.com/magnars/multiple-cursors.el"))]) + (multistate . [(20210124 2014) ((emacs (25 1)) (ht (2 3))) "Multistate mode" single ((:commit . "a7ab9dc7aac0b6d6d2f872de4e0d1b8550834a9b") (:authors ("Matsievskiy S.V.")) (:maintainer "Matsievskiy S.V.") (:keywords "convenience") (:url . "https://gitlab.com/matsievskiysv/multistate"))]) + (multitran . [(20200201 55) ((emacs (24)) (cl-lib (0 5))) "Interface to multitran" single ((:commit . "475e2a92795dbed1aa3b1c5eba2c6c779cac4508") (:authors ("Zajcev Evgeny" . "zevlg@yandex.ru")) (:maintainer "Zajcev Evgeny" . "zevlg@yandex.ru") (:keywords "dictionary" "hypermedia"))]) + (mustache . [(20210224 710) ((ht (0 9)) (s (1 3 0)) (dash (1 2 0))) "Mustache templating library in emacs lisp" single ((:commit . "6fcb31f5075edc5fc70c63426b2aef91352ca80f") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:keywords "convenience" "mustache" "template") (:url . "https://github.com/Wilfred/mustache.el"))]) + (mustache-mode . [(20141024 1432) nil "A major mode for editing Mustache files." single ((:commit . "bf9897eb287ca47ced65d7d4e07ea61ea0aec39f") (:authors ("Tony Gentilcore") ("Chris Wanstrath") ("Daniel Hackney")) (:maintainer "Tony Gentilcore"))]) + (mustang-theme . [(20170719 946) nil "port of vim's mustang theme" single ((:commit . "dda6d04803f1c9b196b620ef564e7768fee15de2") (:authors ("martin haesler")) (:maintainer "martin haesler") (:url . "http://github.com/mswift42/mustang-theme"))]) + (mustard-theme . [(20170808 1319) ((emacs (24 0))) "an Emacs 24 theme based on Mustard (tmTheme)" single ((:commit . "3b15d992c79590d7ea2503004e2a863b57e274b5") (:authors ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))]) + (mutant . [(20160124 1353) ((emacs (24 4)) (dash (2 1 0))) "An interface for the Mutant testing tool" single ((:commit . "de9cdefe48c880128a8f62c6699d7416e9c8ced1") (:authors ("Pedro Lambert")) (:maintainer "Pedro Lambert") (:keywords "mutant" "testing") (:url . "http://github.com/p-lambert/mutant.el"))]) + (mutt-mode . [(20191102 2330) ((emacs (24))) "major mode for editing mutt configuration" single ((:commit . "1d495de49e6f536459b00d5396a2f5ce5ad4757b") (:authors ("Felix Weilbach" . "felix.weilbach@t-online.de")) (:maintainer "Felix Weilbach" . "felix.weilbach@t-online.de") (:keywords "languages") (:url . "https://gitlab.com/flexw/mutt-mode"))]) + (mvn . [(20181002 1617) nil "helpers for compiling with maven" single ((:commit . "223723d9ceeb2878b884e83abb8ca74ad2e42081") (:authors ("Andrew Gwozdziewycz" . "git@apgwoz.com")) (:maintainer "Andrew Gwozdziewycz" . "git@apgwoz.com") (:keywords "compilation" "maven" "java") (:url . "https://github.com/apgwoz/mvn-el"))]) + (mw-thesaurus . [(20210224 449) ((emacs (25)) (request (0 3 0)) (dash (2 16 0))) "Merriam-Webster Thesaurus" single ((:commit . "96f02694bc28f31c2a280a05d47e6ff589f525f3") (:authors ("Ag Ibragimov")) (:maintainer "Ag Ibragimov") (:keywords "wp" "matching") (:url . "https://github.com/agzam/mw-thesaurus.el"))]) + (mwim . [(20181110 1900) nil "Switch between the beginning/end of line or code" single ((:commit . "b4f3edb4c0fb8f8b71cecbf8095c2c25a8ffbf85") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "convenience") (:url . "https://github.com/alezost/mwim.el"))]) + (mxf-view . [(20180501 740) ((emacs (25))) "Simple MXF viewer" single ((:commit . "6ca3cc93d995fac5fc4d72275e1e984e9857ffcb") (:authors ("Tomotaka SUWA" . "tomotaka.suwa@gmail.com")) (:maintainer "Tomotaka SUWA" . "tomotaka.suwa@gmail.com") (:keywords "data" "multimedia") (:url . "https://github.com/t-suwa/mxf-view"))]) + (myanmar-input-methods . [(20160106 1537) nil "Emacs Input Method for Myanmar" single ((:commit . "9d4e0d6358c61bde7a2274e430ef71683faea32e") (:authors ("Ye Lin Kyaw" . "yelinkyaw@gmail.com")) (:maintainer "Ye Lin Kyaw" . "yelinkyaw@gmail.com") (:keywords "myanmar" "unicode" "keyboard") (:url . "http://github.com/yelinkyaw/emacs-myanmar-input-methods"))]) + (mybigword . [(20201030 1253) ((emacs (25 1))) "Vocabulary builder using Zipf to extract English big words" tar ((:commit . "4c1386252444df2ade734e02078069a06f3f0f97") (:authors ("Chen Bin <chenbin DOT sh AT gmail.com>")) (:maintainer "Chen Bin <chenbin DOT sh AT gmail.com>") (:keywords "convenience") (:url . "https://github.com/redguardtoo/mybigword"))]) + (mykie . [(20150808 2205) ((emacs (24 3)) (cl-lib (0 5))) "Command multiplexer: Register multiple functions to a keybind" tar ((:commit . "7676f0e883af1d1054e404e97691f3c13aba196f") (:authors ("Yuta Yamada <cokesboy\"at\"gmail.com>")) (:maintainer "Yuta Yamada <cokesboy\"at\"gmail.com>") (:keywords "emacs" "configuration" "keybind") (:url . "https://github.com/yuutayamada/mykie-el"))]) + (mynt-mode . [(20150512 2049) ((virtualenvwrapper (20131514))) "Minor mode to work with the mynt static site generator" single ((:commit . "23d4489167bfa899634548cb41ed32fdeb3600c9") (:authors ("Christian Brassat")) (:maintainer "Christian Brassat") (:keywords "convenience") (:url . "https://github.com/crshd/mynt-mode"))]) + (myrddin-mode . [(20191225 2120) ((emacs (24 3))) "Major mode for editing Myrddin source files" single ((:commit . "51c0a2cb9dfc9526cd47e71313f5a745c99cadcc") (:authors ("Jakob L. Kreuze" . "zerodaysfordays@sdf.lonestar.org")) (:maintainer "Jakob L. Kreuze" . "zerodaysfordays@sdf.lonestar.org") (:keywords "languages") (:url . "https://git.sr.ht/~jakob/myrddin-mode"))]) + (mysql-to-org . [(20200602 2019) ((emacs (24 3)) (s (1 11 0))) "Minor mode to output the results of mysql queries to org tables" single ((:commit . "f3afc506f8b0d037238e49290de4b028c6ad9dd1") (:authors ("Tijs Mallaerts" . "tijs.mallaerts@gmail.com")) (:maintainer "Tijs Mallaerts" . "tijs.mallaerts@gmail.com"))]) + (myterminal-controls . [(20190426 421) ((emacs (24))) "Quick toggle controls at a key-stroke" single ((:commit . "733cdd7ab4f172b6dca09720fc5ae7dbc248c822") (:authors ("Mohammed Ismail Ansari" . "team.terminal@gmail.com")) (:maintainer "Mohammed Ismail Ansari" . "team.terminal@gmail.com") (:keywords "convenience" "shortcuts") (:url . "http://ismail.teamfluxion.com"))]) + (n4js . [(20150714 231) ((emacs (24)) (cypher-mode (0))) "Neo4j Shell" single ((:commit . "3991ed8975151d5e8d568e952362df810f7ffab7") (:authors ("TruongTx" . "me@truongtx.me")) (:maintainer "TruongTx" . "me@truongtx.me") (:keywords "neo4j" "shell" "comint") (:url . "https://github.com/tmtxt/n4js.el"))]) + (name-this-color . [(20151014 2030) ((emacs (24)) (cl-lib (0 5)) (dash (2 11 0))) "Match RGB codes to names easily and precisely" single ((:commit . "e37cd1291d5d68d4c8d6386eab9cb9d94fd3bcfa") (:keywords "lisp" "color" "hex" "rgb" "shade" "name") (:url . "https://github.com/knl/name-this-color.el"))]) + (named-timer . [(20181120 2224) ((emacs (24 4))) "Simplified timer management for Emacs Lisp" single ((:commit . "d8baeada19b56176c66aed5fa220751e3de11cb8") (:authors ("Ryan C. Thompson")) (:maintainer "Ryan C. Thompson") (:keywords "tools") (:url . "https://github.com/DarwinAwardWinner/emacs-named-timer"))]) + (nameframe . [(20171107 56) nil "Manage frames by name." single ((:commit . "aafb8c5c5fbe0510e2f5d5b6b6b5dd0b73abe5d8") (:authors ("John Del Rosario" . "john2x@gmail.com")) (:maintainer "John Del Rosario" . "john2x@gmail.com") (:url . "https://github.com/john2x/nameframe"))]) + (nameframe-perspective . [(20170406 119) ((nameframe (0 4 1 -2)) (perspective (1 12))) "Nameframe integration with perspective.el" single ((:commit . "aafb8c5c5fbe0510e2f5d5b6b6b5dd0b73abe5d8") (:authors ("John Del Rosario" . "john2x@gmail.com")) (:maintainer "John Del Rosario" . "john2x@gmail.com") (:url . "https://github.com/john2x/nameframe"))]) + (nameframe-projectile . [(20160928 403) ((nameframe (0 4 1 -2)) (projectile (0 13 0))) "Nameframe integration with Projectile" single ((:commit . "aafb8c5c5fbe0510e2f5d5b6b6b5dd0b73abe5d8") (:authors ("John Del Rosario" . "john2x@gmail.com")) (:maintainer "John Del Rosario" . "john2x@gmail.com") (:url . "https://github.com/john2x/nameframe"))]) + (nameless . [(20190429 1202) ((emacs (24 4))) "Hide package namespace in your emacs-lisp code" single ((:commit . "a3a1ce3ec0c5724bcbfe553d831bd4f6b3fe863a") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") (:keywords "convenience" "lisp") (:url . "https://github.com/Malabarba/nameless"))]) + (names . [(20180321 1155) ((emacs (24 1)) (cl-lib (0 5))) "Namespaces for emacs-lisp. Avoid name clobbering without hiding symbols." tar ((:commit . "d8baba5360e5253938a25d3e005455b6d2d86971") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") (:keywords "extensions" "lisp") (:url . "https://github.com/Malabarba/names"))]) + (namespaces . [(20130326 2250) nil "An implementation of namespaces for Elisp, with an emphasis on immutabilty." single ((:commit . "3d02525d9b9a5ae6e7be3adefd880121436e6270") (:authors ("Chris Barrett")) (:maintainer "Chris Barrett") (:url . "https://github.com/chrisbarrett/elisp-namespaces"))]) + (nand2tetris . [(20171201 1813) ((emacs (24))) "Major mode for HDL files in the nand2tetris course" tar ((:commit . "33acee34d24b1c6a87db833b7d23449cf858f64f") (:authors ("Diego Berrocal" . "cestdiego@gmail.com")) (:maintainer "Diego Berrocal" . "cestdiego@gmail.com") (:keywords "nand2tetris" "hdl") (:url . "http://www.github.com/CestDiego/nand2tetris.el/"))]) + (nand2tetris-assembler . [(20171201 1813) ((nand2tetris (1 1 0))) "Assembler For the Nand2tetris Course" single ((:commit . "33acee34d24b1c6a87db833b7d23449cf858f64f") (:authors ("Diego Berrocal" . "cestdiego@gmail.com")) (:maintainer "Diego Berrocal" . "cestdiego@gmail.com") (:keywords "nand2tetris-assembler" "hdl") (:url . "http://www.github.com/CestDiego/nand2tetris-assembler.el/"))]) + (nanowrimo . [(20151105 228) nil "Track progress for nanowrimo" single ((:commit . "b1d41458926ccb39cefbb1bb74aefe4f02fd349f") (:authors ("Ivan Andrus <darthandrus at gmail.com>")) (:maintainer "Ivan Andrus <darthandrus at gmail.com>") (:url . "https://bitbucket.org/gvol/nanowrimo-mode"))]) + (naquadah-theme . [(20190225 1427) nil "A theme based on Tango color set" single ((:commit . "430c3b7bd51922cb616b3f60301f4e2604816ed8"))]) + (narrow-reindent . [(20150722 1906) ((emacs (24 4))) "Defines a minor mode to left-align narrowed regions." single ((:commit . "87466aac4dbeb79597124dd077bf5c704872fd3d") (:authors ("J David Smith" . "emallson@atlanis.net")) (:maintainer "J David Smith" . "emallson@atlanis.net") (:url . "https://github.com/emallson/narrow-reindent.el"))]) + (narrowed-page-navigation . [(20150109 519) ((emacs (24)) (cl-lib (0 5))) "A minor mode for showing one page at a time" single ((:commit . "b215adbac4873f56fbab65772062f0f5be8058a1") (:authors ("David Raymond Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Raymond Christiansen" . "david@davidchristiansen.dk") (:keywords "outlines"))]) + (nash-mode . [(20160830 1212) nil "Nash major mode" single ((:commit . "2cd96535eb7d669a94306183e95ee37333872c1a") (:authors ("Tiago Natel de Moura")) (:maintainer "Tiago Natel de Moura") (:keywords "nash" "languages") (:url . "https://github.com/tiago4orion/nash-mode.el"))]) + (nasm-mode . [(20190410 342) ((emacs (24 3))) "NASM x86 assembly major mode" single ((:commit . "65ca6546fc395711fac5b3b4299e76c2303d43a8") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/nasm-mode"))]) + (native-complete . [(20210315 2048) ((emacs (25 1))) "Shell completion using native complete mechanisms" single ((:commit . "cf142e84eaa4dd91bc75d96a5d26dab5e38eba4c") (:authors ("Troy Hinckley" . "troy.hinckley@gmail.com")) (:maintainer "Troy Hinckley" . "troy.hinckley@gmail.com") (:url . "https://github.com/CeleritasCelery/emacs-native-shell-complete"))]) + (nav . [(20120507 707) nil "Emacs mode for filesystem navigation" tar ((:commit . "c5eb234c063f435dbdcd1f8bdc46cfc68c973ebe") (:authors ("Issac Trotts" . "issactrotts@google.com")) (:maintainer "Issac Trotts" . "issactrotts@google.com"))]) + (nav-flash . [(20210510 2035) nil "Briefly highlight the current line" single ((:commit . "d76314802273153c2c38156250d75f95ca352482") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "extensions" "navigation" "interface") (:url . "http://github.com/rolandwalker/nav-flash"))]) + (navi-mode . [(20201220 1727) ((outshine (2 0)) (outorg (2 0))) "major-mode for easy buffer-navigation" single ((:commit . "cf97e1e338815ad3a4d0bbbf4ff6dd1a4e322ca8") (:maintainer "Adam Porter" . "adam@alphapapa.net") (:url . "https://github.com/alphapapa/navi"))]) + (navi2ch . [(20200130 36) nil "Navigator for 2ch for Emacsen" tar ((:commit . "7811dba052f679bd920a1f648d621a6fecace10f") (:authors ("Taiki SUGAWARA" . "taiki@users.sourceforge.net")) (:maintainer "Taiki SUGAWARA" . "taiki@users.sourceforge.net") (:keywords "network" "2ch"))]) + (navigel . [(20200202 1214) ((emacs (25 1)) (tablist (1 0))) "Facilitate the creation of tabulated-list based UIs" single ((:commit . "0a2d624d6b49f8363badc5ba8699b7028ef85632") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://gitlab.petton.fr/DamienCassou/navigel"))]) + (navorski . [(20141203 1824) ((s (1 9 0)) (dash (1 5 0)) (multi-term (0 8 14))) "Helping you live in the terminal, like Viktor did." single ((:commit . "698c1c62da70164aebe9a7a5d034778fbc30ea5b") (:authors ("Roman Gonzalez <romanandreg@gmail.com>, Tavis Rudd" . "tavis@birdseye-sw.com")) (:maintainer "Roman Gonzalez" . "romanandreg@gmail.com") (:keywords "terminal"))]) + (naysayer-theme . [(20200405 123) ((emacs (24))) "The naysayer color theme" single ((:commit . "9d0bef898f31368cd30e063d53d443dee29683b0") (:authors ("Nick Aversano" . "nickav@users.noreply.github.com")) (:maintainer "Nick Aversano" . "nickav@users.noreply.github.com") (:url . "https://github.com/nickav/naysayer-theme.el"))]) + (ncl-mode . [(20180129 703) ((emacs (24))) "Major Mode for editing NCL scripts and other goodies" tar ((:commit . "602292712a9e6b7e7c25155978999e77d06b7338") (:authors ("Yagnesh Raghava Yakkala" . "hi@yagnesh.org")) (:maintainer "Yagnesh Raghava Yakkala" . "hi@yagnesh.org") (:keywords "ncl" "major mode" "ncl-mode" "atmospheric science.") (:url . "https://github.com/yyr/ncl-mode"))]) + (nclip . [(20130617 2015) nil "Network (HTTP) Clipboard" tar ((:commit . "af88e38b1f04be02bf2e57affc662dbd0f828e67") (:authors ("Marian Schubert" . "marian.schubert@gmail.com")) (:maintainer "Marian Schubert" . "marian.schubert@gmail.com") (:keywords "nclip" "clipboard" "network") (:url . "http://www.github.com/maio/nclip.el"))]) + (neato-graph-bar . [(20181130 1649) ((emacs (24 3))) "Neat-o graph bars CPU/memory etc." single ((:commit . "a7ae35afd67911e8924f36e646bce0d3e3c1bbe6") (:authors ("Robert Cochran" . "robert-git@cochranmail.com")) (:maintainer "Robert Cochran" . "robert-git@cochranmail.com") (:url . "https://gitlab.com/RobertCochran/neato-graph-bar"))]) + (nemerle . [(20161029 2023) nil "major mode for editing nemerle programs" single ((:commit . "db4bc9078f1b6238da32df1519c1957e74b6834a") (:authors ("Jacek Sliwerski (rzyjontko)" . "rzyj@o2.pl")) (:maintainer "Jacek Sliwerski (rzyjontko)" . "rzyj@o2.pl") (:keywords "nemerle" "mode" "languages"))]) + (neon-mode . [(20180406 1156) nil "Simple major mode for editing neon files" single ((:commit . "99d15e46beaf1e7d71e39a00cce810df1f33229d") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "conf"))]) + (neotree . [(20200324 1946) ((cl-lib (0 5))) "A tree plugin like NerdTree for Vim" tar ((:commit . "98fe21334affaffe2334bf7c987edaf1980d2d0b") (:authors ("jaypei" . "jaypei97159@gmail.com")) (:maintainer "jaypei" . "jaypei97159@gmail.com") (:url . "https://github.com/jaypei/emacs-neotree"))]) + (nerdtab . [(20180811 339) ((emacs (24 5))) "Keyboard-oriented tabs" single ((:commit . "74ccc14d7956712e477a34b4a733284e8b3832a6") (:authors ("Yuan Fu" . "casouri@gmail.com")) (:maintainer "Yuan Fu" . "casouri@gmail.com") (:keywords "convenience") (:url . "https://github.com/casouri/nerdtab"))]) + (netease-music . [(20210411 603) ((names (0 5)) (emacs (25))) "listen netease music" single ((:commit . "db7f1eef2d8544983509db679be1cbe6a5678071") (:authors ("hiro方圆" . "wfy11235813@gmail.com")) (:maintainer "hiro方圆" . "wfy11235813@gmail.com") (:keywords "multimedia" "chinese" "music") (:url . "https://github.com/nicehiro/netease-music"))]) + (netherlands-holidays . [(20150202 1617) nil "Netherlands holidays for Emacs calendar." single ((:commit . "26236178cdd650df9958bf5a086e184096559f00") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "calendar") (:url . "https://github.com/abo-abo/netherlands-holidays"))]) + (netrunner . [(20160910 2332) ((popup (0 5 3)) (company (0 9 0)) (helm (1 9 5))) "Create Android: Netrunner decklists using Company, Helm and org-mode" single ((:commit . "c64672992175c8c1073c0f56c2e471839db71a0f") (:authors ("Erik Sjöstrand")) (:maintainer "Erik Sjöstrand") (:keywords "games") (:url . "http://github.com/Kungsgeten/netrunner"))]) + (network-watch . [(20171123 1146) ((emacs (24 3))) "Support for intermittent network connectivity" single ((:commit . "958dd0d419e4f9402648a86b754091ba346e01b8") (:authors ("Juan Amiguet Vercher" . "jamiguet@gmail.com")) (:maintainer "Juan Amiguet Vercher" . "jamiguet@gmail.com") (:keywords "unix" "tools" "hardware" "lisp") (:url . "https://github.com/jamiguet/network-watch"))]) + (neuron-mode . [(20210227 1737) ((emacs (26 3)) (f (0 20 0)) (s (1 12 0)) (markdown-mode (2 3)) (company (0 9 13))) "Major mode for editing zettelkasten notes using neuron" single ((:commit . "a968a923aad07ab15fb35deb79ac95581a427b4c") (:authors ("felko <http://github/felko>")) (:maintainer "felko <http://github/felko>") (:keywords "outlines") (:url . "https://github.com/felko/neuron-mode"))]) + (never-comment . [(20140104 2207) nil "Never blocks are comment" single ((:commit . "74ded8f1e7f23240f5f6032d0451fb0a51733bc4") (:authors ("Scott Frazer")) (:maintainer "Toon Claes") (:url . "http://stackoverflow.com/a/4554658/89376"))]) + (newlisp-mode . [(20160226 1545) nil "newLISP editing mode for Emacs" single ((:commit . "ac23be40c81a360988ab803d365f1510733f6db4") (:authors ("KOBAYASHI Shigeru <shigeru.kb[at]gmail.com>")) (:maintainer "KOBAYASHI Shigeru <shigeru.kb[at]gmail.com>") (:keywords "language" "lisp" "newlisp") (:url . "https://github.com/kosh04/newlisp-mode"))]) + (nexus . [(20140114 1305) nil "REST Client for Nexus Maven Repository servers" tar ((:commit . "c46f499951b90839aa8683779fe43d8f01672a60") (:authors ("Juergen Hoetzel" . "juergen@archlinux.org")) (:maintainer "Juergen Hoetzel" . "juergen@archlinux.org") (:keywords "comm"))]) + (ng2-mode . [(20201203 1925) ((typescript-mode (0 1))) "Major modes for editing Angular 2" tar ((:commit . "d341f177c6e4fb9d99b8639943ab5fc9184e2715") (:authors ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainer "Adam Niederer" . "adam.niederer@gmail.com") (:keywords "typescript" "angular" "angular2" "template") (:url . "http://github.com/AdamNiederer/ng2-mode"))]) + (nginx-mode . [(20170612 437) nil "major mode for editing nginx config files" single ((:commit . "a2bab83c2eb233d57d76b236e7c141c2ccc97005") (:authors ("Andrew J Cosgriff" . "andrew@cosgriff.name")) (:maintainer "Andrew J Cosgriff" . "andrew@cosgriff.name") (:keywords "languages" "nginx"))]) + (niceify-info . [(20160416 1244) nil "improve usability of Info pages" single ((:commit . "38df5062bc3b99d1074cab3e788b5ed66732111c"))]) + (niconama . [(20170910 1501) ((emacs (24)) (request (20170131 1747)) (cl-lib (0 5))) "Tools for Niconico Live Broadcast" single ((:commit . "96e7553e50e6bf7b58aac50f52c9b0b8edb41c56") (:keywords "comm") (:url . "https://github.com/NOBUTOKA/niconama.el"))]) + (night-owl-theme . [(20200622 1943) ((emacs (24))) "A color theme for the night owls out there" single ((:commit . "4b9b5cb4fead9c5f145ba399d172c7e6bf577121") (:authors ("Aaron Jensen" . "aaronjensen@gmail.com")) (:maintainer "Aaron Jensen" . "aaronjensen@gmail.com") (:url . "http://github.com/aaronjensen/night-owl-theme"))]) + (nikki . [(20210227 1707) ((emacs (24 3))) "A simple diary mode" single ((:commit . "b2ea20d04a061df88d72bd8dd0412a6e7876458d") (:authors ("Taiki Harada" . "thdev994@gmail.com")) (:maintainer "Taiki Harada" . "thdev994@gmail.com") (:keywords "convenience") (:url . "https://github.com/th994/nikki"))]) + (nikola . [(20170703 2021) ((async (1 5)) (emacs (24 3))) "Simple wrapper for nikola" single ((:commit . "964715ac30943c9d6976999cad208dc60d09def0") (:authors (": drymer <drymer [ AT ] autistici.org>")) (:maintainer ": drymer <drymer [ AT ] autistici.org>") (:keywords ":" "nikola") (:url . ": https://git.daemons.it/drymer/nikola.el"))]) + (nim-mode . [(20191219 847) ((emacs (24 4)) (epc (0 1 1)) (let-alist (1 0 1)) (commenter (0 5 1)) (flycheck-nimsuggest (0 8 1))) "A major mode for the Nim programming language" tar ((:commit . "d832d6b1fb5e69fedcdddf442d62251dd0f1f489") (:authors ("Simon Hafner")) (:maintainer "Simon Hafner" . "hafnersimon@gmail.com") (:keywords "nim" "languages"))]) + (nimbus-theme . [(20210318 1654) ((emacs (24 1))) "An awesome dark theme" single ((:commit . "7e9ad5a617a26641988445503e235c68fa21b611") (:authors ("Marcin Swieczkowski" . "marcin.swieczkowski@gmail.com") ("See README.md for full list of contributors.")) (:maintainer "Marcin Swieczkowski" . "marcin.swieczkowski@gmail.com") (:keywords "faces") (:url . "https://github.com/m-cat/nimbus-theme"))]) + (ninja-mode . [(20181024 1439) ((emacs (24))) "Major mode for editing .ninja files" single ((:commit . "d68f107f7a80d552d764c8cd0545955be02debe2"))]) + (nix-buffer . [(20180212 1518) ((f (0 17 3)) (emacs (24 4))) "Set up buffer environments with nix" single ((:commit . "db57cda36e7477bdc7ef5a136357b971b1d4d099") (:authors ("Shea Levy")) (:maintainer "Shea Levy") (:url . "https://github.com/shlevy/nix-buffer/tree/master/"))]) + (nix-env-install . [(20200812 1305) ((emacs (25 1))) "Install packages using nix-env" single ((:commit . "79c34bc117ba1cebeb67fab32c364951d2ec37a0") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:keywords "processes" "tools") (:url . "https://github.com/akirak/nix-env-install"))]) + (nix-haskell-mode . [(20190615 135) ((emacs (25)) (haskell-mode (16 0)) (nix-mode (1 3 0))) "haskell-mode integrations for Nix" single ((:commit . "68efbcbf949a706ecca6409506968ed2ef928a20") (:authors ("Matthew Bauer" . "mjbauer95@gmail.com")) (:maintainer "Matthew Bauer" . "mjbauer95@gmail.com") (:keywords "nix" "haskell" "languages" "processes") (:url . "https://github.com/matthewbauer/nix-haskell"))]) + (nix-mode . [(20210523 326) ((emacs (25 1))) "Major mode for editing .nix files" tar ((:commit . "e4844f7a711c8d7dceb82b6b841a1e8485e12586") (:maintainer "Matthew Bauer" . "mjbauer95@gmail.com") (:keywords "nix" "languages" "tools" "unix") (:url . "https://github.com/NixOS/nix-mode"))]) + (nix-modeline . [(20210405 742) ((emacs (25 1))) "Info about in-progress Nix evaluations on your modeline" single ((:commit . "ecda866b960321bb82deac26af45918e172ef0ba") (:authors ("Jordan Mulcahey" . "snhjordy@gmail.com")) (:maintainer "Jordan Mulcahey" . "snhjordy@gmail.com") (:keywords "processes" "unix" "tools") (:url . "https://github.com/ocelot-project/nix-modeline"))]) + (nix-sandbox . [(20210325 1622) ((dash (2 12 1)) (s (1 10 0))) "Utility functions to work with nix-shell sandboxes" single ((:commit . "053a2d5110ce05b7f99bcc2ac4804b70cbe87916") (:authors ("Sven Keidel" . "svenkeidel@gmail.com")) (:maintainer "Sven Keidel" . "svenkeidel@gmail.com") (:url . "https://github.com/travisbhartwell/nix-emacs"))]) + (nix-update . [(20190124 1935) ((emacs (25))) "Update \"fetch\" blocks in .nix expressions" single ((:commit . "fc6c39c2da3fcfa62f4796816c084a6389c8b6e7") (:authors ("John Wiegley" . "johnw@newartisans.com")) (:maintainer "John Wiegley" . "johnw@newartisans.com") (:keywords "nix") (:url . "https://github.com/jwiegley/nix-update-el"))]) + (nixos-options . [(20160209 1841) ((emacs (24))) "Interface for browsing and completing NixOS options." single ((:commit . "053a2d5110ce05b7f99bcc2ac4804b70cbe87916") (:authors ("Diego Berrocal" . "cestdiego@gmail.com") ("Travis B. Hartwell" . "nafai@travishartwell.net")) (:maintainer "Diego Berrocal" . "cestdiego@gmail.com") (:keywords "unix") (:url . "http://www.github.com/travisbhartwell/nix-emacs/"))]) + (nixpkgs-fmt . [(20200327 2302) ((emacs (24)) (reformatter (0 3))) "Reformat Nix using nixpkgs-fmt" single ((:commit . "0df268136d14f27770fa5bb3bdb991e987337cf4") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "languages") (:url . "https://github.com/purcell/emacs-nixpkgs-fmt"))]) + (nlinum-hl . [(20190301 2117) ((emacs (24 4)) (nlinum (1 7)) (cl-lib (0 5))) "heal nlinum's line numbers" single ((:commit . "dc6b365a58e06c7d637a76a31c71a40b20da8b56") (:authors ("Henrik Lissner <http://github/hlissner>")) (:maintainer "Henrik Lissner" . "henrik@lissner.net") (:keywords "nlinum" "highlight" "current" "line" "faces") (:url . "https://github.com/hlissner/emacs-nlinum-hl"))]) + (nlinum-relative . [(20160526 708) ((emacs (24 4)) (nlinum (1 5))) "Relative line number with nlinum" single ((:commit . "5b9950c97ba79a6f0683e38b13da23f39e01031c") (:authors ("codefalling" . "code.falling@gmail.com")) (:maintainer "codefalling" . "code.falling@gmail.com") (:keywords "convenience"))]) + (nndiscourse . [(20210219 1949) ((emacs (25 1)) (dash (20210210)) (anaphora (1 0 4)) (rbenv (0 0 3)) (json-rpc (20200417))) "Gnus backend for Discourse" tar ((:commit . "c6074af3b60ef7af7d9c45b8ad1daa21296a5e04") (:keywords "news") (:url . "https://github.com/dickmao/nndiscourse"))]) + (nnhackernews . [(20210219 1948) ((emacs (25 2)) (request (20190819)) (dash (20210210)) (anaphora (20180618))) "Gnus backend for Hacker News" single ((:commit . "b5a221b63c8b311d50807fdfab4ae6b965844f06") (:keywords "news") (:url . "https://github.com/dickmao/nnhackernews"))]) + (nnir-est . [(20180710 2103) nil "Gnus nnir interface for HyperEstraier" single ((:commit . "6d0d5c8e33f4e4ccbc22350324c0990d2676fb5a") (:authors ("KAWABATA, Taichi <kawabata.taichi_at_gmail.com>")) (:maintainer "KAWABATA, Taichi <kawabata.taichi_at_gmail.com>") (:keywords "mail") (:url . "https://github.com/kawabata/nnir-est"))]) + (nnreddit . [(20201130 39) ((emacs (25 1)) (virtualenvwrapper (20190223)) (json-rpc (20200417)) (dash (20190401)) (anaphora (20180618)) (request (20190819))) "Gnus Backend For Reddit" tar ((:commit . "cf6bc58bff8bb8e2e3c4d681d2657b561573b2dc") (:keywords "news") (:url . "https://github.com/dickmao/nnreddit"))]) + (nntwitter . [(20210104 1423) ((emacs (25 1)) (dash (20190401)) (anaphora (20180618)) (request (20190819))) "Gnus Backend For Twitter" tar ((:commit . "174eb3bdb1339872b62fe2bf0c27d9a3eb142d27") (:keywords "news") (:url . "https://github.com/dickmao/nntwitter"))]) + (no-emoji . [(20180515 1837) ((emacs (24))) "Show :emoji-name: instead of emoji characters" single ((:commit . "ebceeab50dbfe4d60235180a57633745dbc18c77") (:authors ("Peter" . "craven@gmx.net")) (:maintainer "Peter" . "craven@gmx.net") (:keywords "extensions") (:url . "https://github.com/ecraven/no-emoji"))]) + (no-littering . [(20210605 1753) ((cl-lib (0 5))) "help keeping ~/.emacs.d clean" single ((:commit . "a6c8e0575766eb573a7add103836d578bd205962") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/emacscollective/no-littering"))]) + (no-spam . [(20190724 1854) ((emacs (25 1))) "Add repeat delays to commands" single ((:commit . "860860e4a0d59bd15c8e092dc42f5f7f769a428e") (:authors ("Daniel Phan" . "daniel.phan36@gmail.com")) (:maintainer "Daniel Phan" . "daniel.phan36@gmail.com") (:keywords "keyboard" "tools") (:url . "https://github.com/mamapanda/no-spam"))]) + (noaa . [(20210606 2050) ((emacs (27 1)) (request (0 2 0)) (dash (2 14 1))) "Get NOAA weather data" single ((:commit . "e2a4870fd5f8e37956d9317b74317d99f17b87ad") (:authors ("David Thompson")) (:maintainer "David Thompson") (:keywords "calendar") (:url . "https://github.com/thomp/noaa"))]) + (noccur . [(20191015 719) nil "Run multi-occur on project/dired files" single ((:commit . "fa91647a305e89561d3dbe53da002fff49abe0bb") (:authors ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainer "Nicolas Petton" . "petton.nicolas@gmail.com") (:keywords "convenience"))]) + (nocomments-mode . [(20170213 2037) nil "Minor mode that makes comments invisible." single ((:commit . "5a41a20cc44dfe4a9ea584354ed6dbc15dd92f46") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:url . "https://github.com/Lindydancer/nocomments-mode"))]) + (noctilux-theme . [(20161113 1442) ((emacs (24))) "Dark theme inspired by LightTable" single ((:commit . "a3265a1be7f4d73f44acce6d968ca6f7add1f2ca") (:authors ("Simon Manning" . "simon@ecksdee.org")) (:maintainer "Simon Manning" . "simon@ecksdee.org") (:url . "https://github.com/sjrmanning/noctilux-theme"))]) + (node-resolver . [(20140930 1723) ((cl-lib (0 5))) "hook to install node modules in background" single ((:commit . "ef9d0486907a746a80b02ffc6208a09c168a9f7c") (:authors ("Dave Justice")) (:maintainer "Dave Justice") (:keywords "convenience" "nodejs" "javascript" "npm") (:url . "https://github.com/meandavejustice/node-resolver.el"))]) + (nodejs-repl . [(20200802 1310) nil "Run Node.js REPL" single ((:commit . "3b841055cad00f442e4a9159b1056f59411b6646") (:authors ("Takeshi Arabiki")) (:maintainer "Takeshi Arabiki"))]) + (nodemcu-mode . [(20180501 2225) ((emacs (25))) "Minor mode for NodeMCU" single ((:commit . "8effd9f3df40b6b92a2f05e4d54750b624afc4a7") (:authors ("Andreas Müller" . "code@0x7.ch")) (:maintainer "Andreas Müller" . "code@0x7.ch") (:keywords "tools") (:url . "https://github.com/andrmuel/nodemcu-mode"))]) + (noflet . [(20141102 1454) nil "locally override functions" single ((:commit . "7ae84dc3257637af7334101456dafe1759c6b68a") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:keywords "lisp") (:url . "https://github.com/nicferrier/emacs-noflet"))]) + (nofrils-acme-theme . [(20180620 1248) ((emacs (24))) "Port of \"No Frils Acme\" Vim theme." tar ((:commit . "98ad7bfaff1d85b33dc162645670285b067c6f92") (:authors ("Eric Sessoms" . "esessoms@protonmail.com")) (:maintainer "Eric Sessoms" . "esessoms@protonmail.com") (:url . "https://gitlab.com/esessoms/nofrils-theme"))]) + (nord-theme . [(20200620 1122) ((emacs (24))) "An arctic, north-bluish clean and elegant theme" single ((:commit . "4f5b64605709d5803285953026137e905756c35f") (:authors ("Arctic Ice Studio" . "development@arcticicestudio.com")) (:maintainer "Arctic Ice Studio" . "development@arcticicestudio.com") (:url . "https://github.com/arcticicestudio/nord-emacs"))]) + (nordless-theme . [(20201222 1627) ((colorless-themes (0 2))) "A mostly colorless version of nord-theme" single ((:commit . "c1ed1e12541cf05cc6c558d23c089c07e10b54d7") (:authors ("Thomas Letan" . "lthms@soap.coffee")) (:maintainer "Thomas Letan" . "lthms@soap.coffee") (:keywords "faces" "theme") (:url . "https://git.sr.ht/~lthms/colorless-themes.el"))]) + (northcode-theme . [(20180423 1649) ((emacs (24))) "A dark theme focused on blue and orange colors." single ((:commit . "4d3750461ba25ec45321318b5f1af4e8fdf16147") (:authors ("Andreas Larsen" . "andreas@northcode.no")) (:maintainer "Andreas Larsen" . "andreas@northcode.no") (:url . "https://github.com/Northcode/northcode-theme.el"))]) + (nothing-theme . [(20200504 402) ((emacs (24 1))) "Monochrome theme" single ((:commit . "d2514bb9707f66dda0d60f40f465e79914c50946") (:authors ("Jared Gorski," . "jaredgorski6@gmail.com")) (:maintainer "Jared Gorski," . "jaredgorski6@gmail.com") (:url . "https://github.com/jaredgorski/nothing.el"))]) + (notmuch . [(20210605 1839) nil "run notmuch within emacs" tar ((:commit . "6f0f83660e222cfdd05b05ad134763a7ab26f097") (:url . "https://notmuchmail.org"))]) + (notmuch-bookmarks . [(20200322 1925) ((seq (2 20)) (emacs (26 1)) (notmuch (0 29 3))) "Add bookmark handling for notmuch buffers" single ((:commit . "ec8edfdbd1ac475530591d73a570ded5c18ed86a") (:authors ("Jörg Volbers" . "joerg@joergvolbers.de")) (:maintainer "Jörg Volbers" . "joerg@joergvolbers.de") (:keywords "mail") (:url . "https://github.com/publicimageltd/notmuch-bookmarks"))]) + (notmuch-labeler . [(20131230 1719) ((notmuch (0))) "Improve notmuch way of displaying labels" tar ((:commit . "d65d1129555d368243df4770ecc1e7ccb88efc58") (:authors ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainer "Damien Cassou" . "damien.cassou@gmail.com") (:keywords "emacs" "package" "elisp" "notmuch" "emails") (:url . "https://github.com/DamienCassou/notmuch-labeler"))]) + (notmuch-maildir . [(20210416 1043) ((emacs (26)) (notmuch (0 30))) "Visualize maildirs as a tree" single ((:commit . "e34c470521e83c3100f0d6eb9e7402ae35e19321") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "mail") (:url . "https://git.sr.ht/~tarsius/notmuch-maildir"))]) + (nov . [(20210323 1105) ((dash (2 12 0)) (esxml (0 3 6)) (emacs (24 4))) "Featureful EPUB reader mode" single ((:commit . "b3c7cc28e95fe25ce7b443e5f49e2e45360944a3") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:keywords "hypermedia" "multimedia" "epub") (:url . "https://depp.brause.cc/nov.el"))]) + (nova-theme . [(20210512 1802) ((emacs (24 3))) "A dark, pastel color theme" single ((:commit . "1498f756a4c1c9ea9740cd3208f74d071283b930") (:authors ("Muir Manders" . "muir+emacs@mnd.rs")) (:maintainer "Muir Manders" . "muir+emacs@mnd.rs") (:keywords "theme" "dark" "nova" "pastel" "faces") (:url . "https://github.com/muirmanders/emacs-nova-theme"))]) + (noxml-fold . [(20170823 1357) nil "Fold away XML things." single ((:commit . "46c7f6a008672213238a9f8d7a416ce80916aa62") (:authors ("Patrick McAllister" . "pma@rdorte.org")) (:maintainer "Patrick McAllister" . "pma@rdorte.org") (:keywords "xml" "folding") (:url . "https://github.com/paddymcall/noxml-fold"))]) + (npm . [(20210601 1122) ((emacs (25 1)) (transient (0 1 0)) (jest (20200625))) "Run your npm workflows" tar ((:commit . "d14d654c025d8f75f678503c98cd8682e69341cd") (:authors ("Shane Kennedy")) (:maintainer "Shane Kennedy") (:keywords "tools") (:url . "https://github.com/shaneikennedy/npm.el"))]) + (npm-mode . [(20190616 2025) ((emacs (24 1))) "minor mode for working with npm projects" single ((:commit . "3ee7c0bad5b7a041d4739ef3aaa06a3dc764e5eb") (:authors ("Allen Gooch" . "allen.gooch@gmail.com")) (:maintainer "Allen Gooch" . "allen.gooch@gmail.com") (:keywords "convenience" "project" "javascript" "node" "npm") (:url . "https://github.com/mojochao/npm-mode"))]) + (nrepl-eval-sexp-fu . [(20201007 2311) ((highlight (0 0 0)) (smartparens (0 0 0)) (thingatpt (0 0 0))) "Tiny functionality enhancements for evaluating sexps." single ((:commit . "2d6ad728b1ba290974a2ae1f232a5a96810a135b") (:authors ("Takeshi Banse" . "takebi@laafc.net")) (:maintainer "Takeshi Banse" . "takebi@laafc.net") (:keywords "lisp" "highlight" "convenience"))]) + (nrepl-sync . [(20140807 1554) ((cider (0 6))) "connect to nrepl port and eval .sync.clj." single ((:commit . "bab53a2361526d63a24cda176d07a1247bf5b399") (:authors ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) (:maintainer "Phillip Lord" . "phillip.lord@newcastle.ac.uk") (:url . "https://github.com/phillord/lein-sync"))]) + (nroam . [(20210325 2015) ((emacs (26 1)) (org-roam (1 2 3)) (org (9 4 4))) "Org-roam backlinks within org-mode buffers" tar ((:commit . "a5508d9958c2148c04ec32d7b3a9f72423e4b0aa") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr") (:keywords "outlines" "convenience") (:url . "https://github.com/NicolasPetton/nroam"))]) + (ns-auto-titlebar . [(20181022 2154) ((emacs (24 4))) "Set the MacOS transparent titlebar to match theme" single ((:commit . "60273e764bf8d95abc40dd2fdc23af87ea9ee33b") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "frames") (:url . "https://github.com/purcell/ns-auto-titlebar"))]) + (nsis-mode . [(20190615 1827) nil "NSIS-mode" tar ((:commit . "0a2e6ece2fe682dced4d31688b38bb472a877cdf") (:authors ("Matthew L. Fidler")) (:maintainer "Matthew L. Fidler") (:keywords "nsis") (:url . "http://github.com/mlf176f2/nsis-mode"))]) + (nswbuff . [(20210129 850) ((emacs (25 1))) "Quick switching between buffers." single ((:commit . "2aa3a96abbc76f007923f3fbb19a5246e29ae500") (:authors ("David Ponce" . "david@dponce.com") ("Kahlil (Kal) HODGSON" . "dorge@tpg.com.au") ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm") (:keywords "extensions" "convenience") (:url . "https://github.com/joostkremers/nswbuff"))]) + (nu-mode . [(20190404 2032) ((undo-tree (0 6 5)) (ace-window (0)) (lv (0)) (avy (0)) (which-key (0)) (transpose-frame (0))) "Modern Emacs Prompts Based Keybinding." tar ((:commit . "d5fb4d26d1b0bb383ea2827cc5af5dfb2a269d2b"))]) + (nubox . [(20170619 910) nil "Nubox color theme (dark, light and tty versions)" tar ((:commit . "1ccb8035ae42727ba6bdd5c1106fbceddeeed370") (:authors ("Martijn Terpstra" . "bigmartijn@gmail.com")) (:maintainer "Martijn Terpstra" . "bigmartijn@gmail.com") (:keywords "faces"))]) + (number . [(20170901 1312) nil "Working with numbers at point." single ((:commit . "bbc278d34dbcca83e70e3be855ec98b23debfb99"))]) + (number-lock . [(20160830 200) nil "Enter symbols on your number keys without pressing shift" single ((:commit . "74417b1238953bf485961a0dd7d20f5c36ae25ea") (:authors ("Liu233w" . "wwwlsmcom@outlook.com")) (:maintainer "Liu233w" . "wwwlsmcom@outlook.com") (:keywords "convenience") (:url . "https://github.com/Liu233w/number-lock.el"))]) + (numbers . [(20170802 1134) ((emacs (24))) "Display information and trivia about numbers" single ((:commit . "dd02508b788a13b7d4dbcc4923fa23134b783ab3") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "games" "trivia" "maths" "numbers") (:url . "https://github.com/davep/numbers.el"))]) + (nummm-mode . [(20131117 1014) nil "Display the number of minor modes instead of their names" single ((:commit . "81951e12032274543c5f7a585b29bd93961e94e4") (:authors ("Andreu Gil" . "agpchil@gmail.com")) (:maintainer "Andreu Gil" . "agpchil@gmail.com") (:url . "http://github.com/agpchil/nummm-mode"))]) + (numpydoc . [(20210523 1746) ((emacs (25 1)) (s (1 12 0)) (dash (2 18 0))) "NumPy style docstring insertion" single ((:commit . "dcbc06429084e209f081a8c6318b46c1c9ff7309") (:authors ("Doug Davis" . "ddavis@ddavis.io")) (:maintainer "Doug Davis" . "ddavis@ddavis.io") (:keywords "convenience") (:url . "https://github.com/douglasdavis/numpydoc.el"))]) + (nv-delete-back . [(20170224 1249) ((emacs (24))) "backward delete like modern text editors" single ((:commit . "b17cb826f14c18c2875d112574edb5e4f46f5296") (:authors ("Nicolas Vaughan <n.vaughan [at] oxon.org>")) (:maintainer "Nicolas Vaughan <n.vaughan [at] oxon.org>") (:keywords "lisp"))]) + (nvm . [(20210217 744) ((s (1 8 0)) (dash (2 18 0)) (f (0 14 0))) "Manage Node versions within Emacs" single ((:commit . "6f47fac1bc42526a7474488f560d064c08f8dd6e") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "node" "nvm") (:url . "http://github.com/rejeep/nvm.el"))]) + (nyan-mode . [(20200526 1054) nil "Nyan Cat shows position in current buffer in mode-line." tar ((:commit . "06e67ab2c490756d3eeed4a68aba7c33e508a5d5") (:authors ("Jacek \"TeMPOraL\" Zlydach" . "temporal.pl@gmail.com")) (:maintainer "Jacek \"TeMPOraL\" Zlydach" . "temporal.pl@gmail.com") (:keywords "nyan" "cat" "lulz" "scrolling" "pop tart cat" "build something amazing") (:url . "https://github.com/TeMPOraL/nyan-mode/"))]) + (nyx-theme . [(20170910 1307) ((emacs (24))) "Dark theme" single ((:commit . "afe2b8c3b5421b4c292d182dcf77079b278e93d8") (:authors ("Guido Schmidt")) (:maintainer "Guido Schmidt" . "guido.schmidt.2912@gmail.com") (:keywords "themes" "dark-theme") (:url . "https://github.com/GuidoSchmidt/emacs-nyx-theme"))]) + (nz-holidays . [(20190415 703) nil "New Zealand public holidays for calendar." single ((:commit . "afc875cf40789fa45a4a811685b0a7c4f239392f") (:authors ("Sod Oscarfono" . "sod@oscarfono.com")) (:maintainer "Sod Oscarfono" . "sod@oscarfono.com") (:keywords "calendar") (:url . "https://github.com/techquila/nz-holidays"))]) + (oauth . [(20130128 151) nil "Oauth library." tar ((:commit . "ee4744ad76a1560281b0c4944575a3bd598c6458") (:authors ("Peter Sanford <peter AT petersdanceparty.com>")) (:maintainer "Peter Sanford <peter AT petersdanceparty.com>") (:keywords "comm"))]) + (oauth2-request . [(20210215 657) ((emacs (26 1)) (oauth2 (0 14)) (request (0 3))) "OAuth2 request package interface" single ((:commit . "86ff048635e002b00e23d6bed2ec6f36c17bca8e") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "convenience") (:url . "https://github.com/conao3/oauth2-request.el"))]) + (ob-ammonite . [(20190813 59) ((s (1 12 0)) (ammonite-term-repl (0 1)) (xterm-color (1 7))) "org-babel for scala evaluation in Ammonite." single ((:commit . "39937dff395e70aff76a4224fa49cf2ec6c57cca") (:authors ("zwild" . "judezhao@outlook.com")) (:maintainer "zwild" . "judezhao@outlook.com") (:keywords "tools" "ammnite" "org-mode" "scala" "org-babel") (:url . "https://github.com/zwild/ob-ammonite"))]) + (ob-applescript . [(20190709 1607) nil "Org-babel functions for AppleScript" single ((:commit . "2b07b77b75bd02f2102f62e6d52ffdd0f921439a") (:authors ("Stig Brautaset")) (:maintainer "Stig Brautaset") (:keywords "literate programming" "reproducible research" "mac") (:url . "http://github.com/stig/ob-applescript.el"))]) + (ob-async . [(20210428 2052) ((async (1 9)) (org (9 0 1)) (emacs (24 4)) (dash (2 14 1))) "Asynchronous org-babel src block execution" single ((:commit . "9aac486073f5c356ada20e716571be33a350a982") (:authors ("Andrew Stahlman" . "andrewstahlman@gmail.com")) (:maintainer "Andrew Stahlman" . "andrewstahlman@gmail.com") (:keywords "tools") (:url . "https://github.com/astahlman/ob-async"))]) + (ob-axiom . [(20190623 2052) ((emacs (24 2)) (axiom-environment (20171021))) "An org-babel backend for the axiom-environment system" single ((:commit . "ac8228a702290732ba12c5d13b38576a57afb0d6") (:authors ("Paul Onions")) (:maintainer "Paul Onions") (:keywords "axiom" "openaxiom" "fricas"))]) + (ob-blockdiag . [(20210412 1541) nil "org-babel functions for blockdiag evaluation" single ((:commit . "c3794bf7bdb8fdb3db90db41619dda4e7d3dd7b9") (:authors ("Dmitry Moskowski")) (:maintainer "Dmitry Moskowski") (:keywords "tools" "convenience") (:url . "https://github.com/corpix/ob-blockdiag.el"))]) + (ob-browser . [(20170720 1918) ((org (8))) "Render HTML in org-mode blocks." tar ((:commit . "a347d9df1c87b7eb660be8723982c7ad2563631a") (:authors ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainer "Kris Jenkins" . "krisajenkins@gmail.com") (:keywords "org" "babel" "browser" "phantomjs") (:url . "https://github.com/krisajenkins/ob-browser"))]) + (ob-cfengine3 . [(20191011 1721) nil "Org Babel functions for CFEngine 3" single ((:commit . "195ba4694a0ec18d3fb89342e8e0988b382a5b1a") (:authors ("Nick Anderson" . "nick@cmdln.org")) (:maintainer "Nick Anderson" . "nick@cmdln.org") (:keywords "tools" "convenience") (:url . "https://github.com/nickanderson/ob-cfengine3"))]) + (ob-clojurescript . [(20180406 1828) ((emacs (24 4)) (org (9 0))) "org-babel functions for ClojureScript evaluation" single ((:commit . "17ee1558aa94c7b0246fd03f684884122806cfe7") (:authors ("Larry Staton Jr.")) (:maintainer "Larry Staton Jr.") (:keywords "literate programming" "reproducible research") (:url . "https://gitlab.com/statonjr/ob-clojurescript"))]) + (ob-coffee . [(20170725 1424) ((org (8))) "org-babel functions for coffee-script evaluation" tar ((:commit . "7f0b330273e8af7777de87a75fe52a89798e4548") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainer "ZHOU Feng" . "zf.pascal@gmail.com") (:keywords "org" "babel" "coffee-script") (:url . "http://github.com/zweifisch/ob-coffee"))]) + (ob-coffeescript . [(20180126 719) ((emacs (24 4))) "org-babel functions for coffee-script evaluation, and fully implementation!" single ((:commit . "5a5bb04aea9c2a6eab5b05f90f5c7cb6de7b4261") (:authors ("Brantou" . "brantou89@gmail.com")) (:maintainer "Brantou" . "brantou89@gmail.com") (:keywords "coffee-script" "literate programming" "reproducible research") (:url . "https://github.com/brantou/ob-coffeescript"))]) + (ob-crystal . [(20180126 718) ((emacs (24 3))) "org-babel functions for Crystal evaluation" tar ((:commit . "d84c1adee4b269cdba06a97caedb8071561a09af") (:authors ("Brantou" . "brantou89@gmail.com")) (:maintainer "Brantou" . "brantou89@gmail.com") (:keywords "crystal" "literate programming" "reproducible research") (:url . "https://github.com/brantou/ob-crystal"))]) + (ob-cypher . [(20200521 936) ((s (1 9 0)) (cypher-mode (0 0 6)) (dash (2 10 0)) (dash-functional (1 2 0))) "query neo4j using cypher in org-mode blocks" single ((:commit . "da9f97339474a48d759fc128cee610c0bc9ae6c0") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainer "ZHOU Feng" . "zf.pascal@gmail.com") (:keywords "org" "babel" "cypher" "neo4j") (:url . "http://github.com/zweifisch/ob-cypher"))]) + (ob-dao . [(20170816 1558) ((org (8))) "Org Babel Functions for Dao" single ((:commit . "fa92f62a63c684d689f57e790e5dd614c5bba270") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:keywords "literate programming" "reproducible research" "org" "babel" "dao") (:url . "https://github.com/xuchunyang/ob-dao"))]) + (ob-dart . [(20170106 1624) nil "org-babel functions for Dart evaluation" single ((:commit . "04d63b922a5469506560ca0c00678e57131e0269") (:authors ("Milan Zimmermann")) (:maintainer "Milan Zimmermann") (:keywords "literate programming" "reproducible research" "emacs" "org" "babel" "dart") (:url . "http://github.org/mzimmerm/ob-dart"))]) + (ob-deno . [(20201019 101) ((emacs (26 1))) "Babel Functions for Javascript/TypeScript with Deno" single ((:commit . "f1129d20fe9931f1c0b62c4af781f5489abd957f") (:authors ("HIGASHI Taiju")) (:maintainer "HIGASHI Taiju") (:keywords "literate programming" "reproducible research" "javascript" "typescript" "tools") (:url . "https://github.com/taiju/ob-deno"))]) + (ob-diagrams . [(20160407 1237) nil "org-babel functions for diagrams evaluation" single ((:commit . "ed6649616325ca5b2d2109f74aded8bcb8aa5186") (:authors ("Daniel Bergey")) (:maintainer "Daniel Bergey") (:keywords "literate programming" "reproducible research") (:url . "http://orgmode.org"))]) + (ob-elixir . [(20170725 1419) ((org (8))) "org-babel functions for elixir evaluation" single ((:commit . "8990a8178b2f7bd93504a9ab136622aab6e82e32") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainer "ZHOU Feng" . "zf.pascal@gmail.com") (:keywords "org" "babel" "elixir") (:url . "http://github.com/zweifisch/ob-elixir"))]) + (ob-elm . [(20200528 1857) ((emacs (26 1)) (org (9 3))) "Org-babel functions for elm evaluation" single ((:commit . "d3a9fbc2f56416894c9aed65ea9a20cc1d98f15d") (:authors ("Bonface M. K.")) (:maintainer "Bonface M. K.") (:keywords "languages" "tools") (:url . "https://www.bonfacemunyoki.com"))]) + (ob-elvish . [(20180427 1900) nil "org-babel functions for Elvish shell" single ((:commit . "369181ceae1190bf971c71aebf9fc6133bd98c39") (:authors ("Diego Zamboni" . "diego@zzamboni.org")) (:maintainer "Diego Zamboni" . "diego@zzamboni.org") (:keywords "literate programming" "elvish" "shell" "languages" "processes" "tools") (:url . "https://github.com/zzamboni/ob-elvish"))]) + (ob-ess-julia . [(20210414 1444) ((ess (20201004 1522)) (julia-mode (0 4))) "Org babel support for Julia language" tar ((:commit . "147e9e7fe55c41dd77171417e92af40db3530b84") (:authors ("Frédéric Santos")) (:maintainer "Frédéric Santos") (:keywords "languages") (:url . "https://github.com/frederic-santos/ob-ess-julia"))]) + (ob-fsharp . [(20170618 1429) ((emacs (25)) (fsharp-mode (1 9 8))) "Org-Babel F#" single ((:commit . "0b2fdd9bb4f38af8b5cf4914627af52f5b43d9f7") (:authors ("Jürgen Hötzel" . "juergen@archlinux.org")) (:maintainer "Jürgen Hötzel" . "juergen@archlinux.org") (:keywords "literate programming" "reproducible research") (:url . "https://github.com/juergenhoetzel/ob-fsharp"))]) + (ob-go . [(20190201 2040) nil "org-babel functions for go evaluation" tar ((:commit . "2067ed55f4c1d33a43cb3f6948609d240a8915f5") (:authors ("K. Adam Christensen")) (:maintainer "K. Adam Christensen") (:keywords "golang" "go" "literate programming" "reproducible research") (:url . "http://orgmode.org"))]) + (ob-graphql . [(20201222 1515) ((emacs (24 4)) (graphql-mode (20191024 1221)) (request (0 3 2))) "Org-Babel execution backend for GraphQL source blocks" single ((:commit . "7c35419f9eec5dc44967cbcfa13c7135b9a96bfc") (:authors ("Jeremy Dormitzer" . "jeremy.dormitzer@gmail.com")) (:maintainer "Jeremy Dormitzer" . "jeremy.dormitzer@gmail.com") (:url . "https://github.com/jdormit/ob-graphql"))]) + (ob-html-chrome . [(20181219 1042) ((emacs (24 4)) (f (0 20 0)) (s (1 7 0))) "HTML code blocks converted to PNG using Chrome" single ((:commit . "7af6e4a24ed0aaf67751bdf752c7ca0ba02bb8d4") (:authors (nil . "Nik Clayton nik@ngo.org.uk")) (:maintainer nil . "Nik Clayton nik@ngo.org.uk") (:keywords "languages" "org" "org-babel" "chrome" "html") (:url . "http://github.com/nikclayton/ob-html-chrome"))]) + (ob-http . [(20180707 1448) ((s (1 9 0)) (cl-lib (0 5))) "http request in org-mode babel" tar ((:commit . "b1428ea2a63bcb510e7382a1bf5fe82b19c104a7") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainer "ZHOU Feng" . "zf.pascal@gmail.com") (:url . "http://github.com/zweifisch/ob-http"))]) + (ob-hy . [(20180702 540) ((emacs (24 4))) "org-babel functions for Hy-lang evaluation" tar ((:commit . "a42ecaf440adc03e279afe43ee5ef6093ddd542a") (:authors ("Brantou" . "brantou89@gmail.com")) (:maintainer "Brantou" . "brantou89@gmail.com") (:keywords "hy" "literate programming" "reproducible research") (:url . "https://github.com/brantou/ob-hy"))]) + (ob-ipython . [(20180224 953) ((s (1 9 0)) (dash (2 10 0)) (dash-functional (1 2 0)) (f (0 17 2)) (emacs (24))) "org-babel functions for IPython evaluation" tar ((:commit . "7147455230841744fb5b95dcbe03320313a77124") (:authors ("Greg Sexton" . "gregsexton@gmail.com")) (:maintainer "Greg Sexton" . "gregsexton@gmail.com") (:keywords "literate programming" "reproducible research") (:url . "http://www.gregsexton.org"))]) + (ob-julia-vterm . [(20210418 2306) ((emacs (26 1)) (julia-vterm (0 10))) "Babel Functions for Julia in VTerm" single ((:commit . "3e7ff901687c320869c5e17e3273185af68e8cd6") (:authors ("Shigeaki Nishina")) (:maintainer "Shigeaki Nishina") (:keywords "julia" "org" "outlines" "literate programming" "reproducible research") (:url . "https://github.com/shg/ob-julia-vterm.el"))]) + (ob-kotlin . [(20180823 1321) ((org (8))) "org-babel functions for kotlin evaluation" single ((:commit . "96e420cbd2e9ea8a77043e5dcaebdfc6da17492a") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainer "ZHOU Feng" . "zf.pascal@gmail.com") (:keywords "org" "babel" "kotlin") (:url . "http://github.com/zweifisch/ob-kotlin"))]) + (ob-latex-as-png . [(20200629 1013) ((emacs (26 1)) (org (9 1))) "Org-babel functions for latex-as-png evaluation" single ((:commit . "a20e3fedbac4034de4ab01436673a0f8845de1df") (:authors ("Musa Al-hassy" . "alhassy@gmail.com")) (:maintainer "Musa Al-hassy" . "alhassy@gmail.com") (:keywords "literate programming" "reproducible research" "org" "convenience") (:url . "https://github.com/alhassy/ob-latex-as-png"))]) + (ob-lfe . [(20170725 1420) ((org (8))) "org-babel functions for lfe evaluation" single ((:commit . "f7780f58e650b4d29dfd834c662b1d354b620a8e") (:authors ("ZHOU Feng" . "zf.pascal@gmail.com")) (:maintainer "ZHOU Feng" . "zf.pascal@gmail.com") (:keywords "org" "babel" "lfe" "lisp" "erlang") (:url . "http://github.com/zweifisch/ob-lfe"))]) + (ob-mermaid . [(20200320 1504) nil "org-babel support for mermaid evaluation" single ((:commit . "cca09b64eff689d8bb15a77de9d4c7fe9845a1f9") (:authors ("Alexei Nunez" . "alexeirnunez@gmail.com")) (:maintainer "Alexei Nunez" . "alexeirnunez@gmail.com") (:keywords "lisp") (:url . "https://github.com/arnm/ob-mermaid"))]) + (ob-ml-marklogic . [(20190312 1314) nil "org-babel functions for MarkLogic evaluation" tar ((:commit . "d5660ad14f29e17cd26ae92eeb585b24030e9570") (:authors ("Norman Walsh" . "ndw@nwalsh.com")) (:maintainer "Norman Walsh" . "ndw@nwalsh.com") (:keywords "marklogic" "xquery" "javascript" "sparql") (:url . "http://github.com/ndw/ob-ml-marklogic"))]) + (ob-mongo . [(20170720 1919) ((org (8))) "Execute mongodb queries within org-mode blocks." single ((:commit . "371bf19c7c10eab2f86424f8db8ab685997eb5aa") (:authors ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainer "Kris Jenkins" . "krisajenkins@gmail.com") (:keywords "org" "babel" "mongo" "mongodb") (:url . "https://github.com/krisajenkins/ob-mongo"))]) + (ob-napkin . [(20200816 1245) ((emacs (26 1))) "Babel functions for Napkin" single ((:commit . "7af5e8af08da8455c489909afbd9528a61f570e7") (:authors ("Hans Jang")) (:maintainer "Hans Jang") (:keywords "tools" "literate programming" "reproducible research" "napkin" "plantuml") (:url . "https://github.com/pinetr2e/ob-napkin"))]) + (ob-nim . [(20210601 1807) ((cl-lib (0 5))) "Babel Functions for nim" single ((:commit . "6fd060a3ecd38be37e4ec2261cd65760a3c35a91") (:authors ("Lompik")) (:maintainer "Lompik") (:keywords "literate programming" "reproducible research"))]) + (ob-prolog . [(20190410 2130) nil "org-babel functions for prolog evaluation." single ((:commit . "331899cfe345c934026c70b78352d320f7d8e239") (:authors ("Bjarte Johansen")) (:maintainer "Bjarte Johansen") (:keywords "literate programming" "reproducible research") (:url . "https://github.com/ljos/ob-prolog"))]) + (ob-restclient . [(20200316 759) ((restclient (0))) "org-babel functions for restclient-mode" single ((:commit . "0ebfc7c5ebf96d2fe1a476439831363a5a43b9b6") (:authors ("Alf Lervåg")) (:maintainer "Alf Lervåg") (:keywords "literate programming" "reproducible research") (:url . "https://github.com/alf/ob-restclient.el"))]) + (ob-reticulate . [(20210214 2229) ((org (9 4)) (emacs (24 4))) "Babel Functions for reticulate" single ((:commit . "8109fb02fb6339b1cf9290df29fc0c1109a33c04") (:authors ("Jack Kamm")) (:maintainer "Jack Kamm") (:keywords "literate programming" "reproducible research" "r" "python" "statistics" "languages" "outlines" "processes") (:url . "https://github.com/jackkamm/ob-reticulate"))]) + (ob-rust . [(20210204 244) nil "Org-babel functions for Rust" tar ((:commit . "30fe7e7181f44443d02e905dda77f83ec4944e76") (:authors ("Mican Zhang")) (:maintainer "Mican Zhang") (:keywords "rust" "languages" "org" "babel") (:url . "https://github.com/micanzhang/ob-rust"))]) + (ob-sagemath . [(20191106 828) ((sage-shell-mode (0 0 8)) (s (1 8 0)) (emacs (24))) "org-babel functions for SageMath evaluation" tar ((:commit . "79645bce0c25a650bae61e550434bed836995dce") (:authors ("Sho Takemori" . "stakemorii@gmail.com")) (:maintainer "Sho Takemori" . "stakemorii@gmail.com") (:keywords "sagemath" "org-babel") (:url . "https://github.com/stakemori/ob-sagemath"))]) + (ob-sml . [(20130829 1843) ((sml-mode (6 4))) "org-babel functions for template evaluation" single ((:commit . "958165c92b6cff6cada5c85c8ae5887806b8451b") (:authors ("David Nolen")) (:maintainer "David Nolen") (:keywords "literate programming" "reproducible research") (:url . "http://orgmode.org"))]) + (ob-sql-mode . [(20190421 1539) ((emacs (24 4))) "SQL code blocks evaluated by sql-mode" single ((:commit . "b31a016585324ad91f1742ff6205bcb76f3ece6e") (:authors (nil . "Nik Clayton nik@google.com")) (:maintainer nil . "Nik Clayton nik@google.com") (:keywords "languages" "org" "org-babel" "sql") (:url . "http://github.com/nikclayton/ob-sql-mode"))]) + (ob-svgbob . [(20190911 300) ((emacs (24))) "Babel Functions for svgbob" single ((:commit . "5747f96fb4fdb8711546b3313df9412177eb3c1a") (:authors ("Marcio Giaxa" . "i@mgxm.me")) (:maintainer "Marcio Giaxa" . "i@mgxm.me") (:keywords "tools" "files") (:url . "https://github.com/mgxm/ob-svgbob"))]) + (ob-swift . [(20170921 1325) ((org (8))) "org-babel functions for swift evaluation" single ((:commit . "ed478ddbbe41ce5373efde06b4dd0c3663c9055f") (:authors ("Feng Zhou" . "zf.pascal@gmail.com")) (:maintainer "Feng Zhou" . "zf.pascal@gmail.com") (:keywords "org" "babel" "swift") (:url . "http://github.com/zweifisch/ob-swift"))]) + (ob-tmux . [(20190708 1202) ((emacs (25 1)) (seq (2 3)) (s (1 9 0))) "Babel Support for Interactive Terminal" single ((:commit . "3687ed7b874bdfe14617f5d14492887cb0836a85") (:authors ("Allard Hendriksen")) (:maintainer "Allard Hendriksen") (:keywords "literate programming" "interactive shell" "tmux") (:url . "https://github.com/ahendriksen/ob-tmux"))]) + (ob-translate . [(20170720 1919) ((google-translate (0 11)) (org (8))) "Translation of text blocks in org-mode." single ((:commit . "9d9054a51bafd5a29a8135964069b4fa3a80b169") (:authors ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainer "Kris Jenkins" . "krisajenkins@gmail.com") (:keywords "org" "babel" "translate" "translation") (:url . "https://github.com/krisajenkins/ob-translate"))]) + (ob-typescript . [(20190910 946) ((emacs (24)) (org (8 0))) "org-babel functions for typescript evaluation" single ((:commit . "0b2766b9d136cd6d81f4c15f1ad4b28542f484b9") (:authors ("KURASHIKI Satoru")) (:maintainer "KURASHIKI Satoru") (:keywords "literate programming" "reproducible research" "typescript") (:url . "https://github.com/lurdan/ob-typescript"))]) + (ob-uart . [(20170521 858) nil "org-babel support for UART communication" single ((:commit . "90daeac90a9e75c20cdcf71234c67b812110c50e") (:authors ("Andreas Müller")) (:maintainer "Andreas Müller") (:keywords "tools" "comm" "org-mode" "uart" "literate programming" "reproducible development") (:url . "https://www.0x7.ch"))]) + (oberon . [(20120715 909) nil "Major mode for editing Oberon/Oberon-2 program texts" single ((:commit . "fb57d18ce13835a8a69b6bafecdd9193ca9a59a3") (:authors ("Karl Landström" . "karl@karllandstrom.se")) (:maintainer "Karl Landström" . "karl@karllandstrom.se") (:keywords "oberon" "oberon-2" "languages" "oop"))]) + (obfusurl . [(20170809 1524) ((cl-lib (0 5))) "Obfuscate URLs so they aren't spoilers" single ((:commit . "7a5a41905000ce2ec1fd72509a5567e5fd9f47e5") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "convenience" "web" "text") (:url . "https://github.com/davep/obfusurl.el"))]) + (objc-font-lock . [(20141021 1822) nil "Highlight Objective-C method calls." single ((:commit . "34b457d577f97ca94b8792d025f9a909c7610612") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "languages" "faces") (:url . "https://github.com/Lindydancer/objc-font-lock"))]) + (objed . [(20200911 1435) ((emacs (25)) (cl-lib (0 5))) "Navigate and edit text objects." tar ((:commit . "70f9fb5e0aa1627b0afc7c6b3d0aea9bac70a210") (:authors ("Clemens Radermacher" . "clemera@posteo.net")) (:maintainer "Clemens Radermacher" . "clemera@posteo.net") (:keywords "convenience") (:url . "https://github.com/clemera/objed"))]) + (obsidian-theme . [(20170719 948) nil "port of the eclipse obsidian theme" single ((:commit . "f45efb2ebe9942466c1db6abbe2d0e6847b785ea") (:authors ("martin haesler")) (:maintainer "martin haesler") (:url . "http://github.com/mswift42/obsidian-theme"))]) + (ocamlformat . [(20210601 901) ((emacs (24 3))) "Utility functions to format ocaml code" single ((:commit . "c0660a44ce22fa7e60ba42589b958788996077e5") (:keywords "languages" "ocaml") (:url . "https://github.com/ocaml-ppx/ocamlformat"))]) + (occidental-theme . [(20130312 1958) nil "Custom theme for faces based on Adwaita" single ((:commit . "fd2db7256d4f78c43d99c3cddb1c39106d479816") (:authors ("William Stevenson" . "yhvh2000@gmail.com") ("Erik Timan" . "dev@timan.info")) (:maintainer "William Stevenson" . "yhvh2000@gmail.com") (:url . "http://github.com/olcai/occidental-theme"))]) + (occur-context-resize . [(20210121 50) nil "dynamically resize context around matches in occur-mode" single ((:commit . "9d62a5b5c39ab7921dfc12dd0ab139b38dd16582") (:authors ("Charles L.G. Comstock" . "dgtized@gmail.com")) (:maintainer "Charles L.G. Comstock" . "dgtized@gmail.com") (:keywords "matching") (:url . "https://github.com/dgtized/occur-context-resize.el"))]) + (occur-x . [(20130610 1343) nil "Extra functionality for occur" single ((:commit . "352f5fab207d8a1d3dd048073ff127a83e97c82b") (:authors ("Juan-Leon Lahoz" . "juanleon1@gmail.com")) (:maintainer "Juan-Leon Lahoz" . "juanleon1@gmail.com") (:keywords "occur" "search" "convenience"))]) + (oceanic-theme . [(20161015 819) nil "Oceanic theme." single ((:commit . "a92ee9b470843c923e6cdcafdd65106ff994d04d") (:authors ("Tengfei Guo")) (:maintainer "Tengfei Guo") (:keywords "oceanic" "color" "theme") (:url . "https://github.com/terry3/oceanic-theme"))]) + (ocodo-svg-modelines . [(20150516 1419) ((svg-mode-line-themes (0))) "A collection of beautiful SVG modelines" tar ((:commit . "c7b0789a177219f117c4de5659ecfa8622958c40") (:authors ("ocodo" . "what.is.ocodo@gmail.com")) (:maintainer "ocodo" . "what.is.ocodo@gmail.com") (:url . "https://github.com/ocodo/ocodo-svg-modelines"))]) + (ocp-indent . [(20190726 1452) nil "automatic indentation with ocp-indent" single ((:commit . "9e26c0a2699b7076cebc04ece59fb354eb84c11c") (:keywords "ocaml" "languages") (:url . "http://www.typerex.org/ocp-indent.html"))]) + (octicons . [(20151101 340) ((cl-lib (0 5))) "octicons utility" tar ((:commit . "a61e561966ffd8faa3b48ce5b3a4eec10c59708b") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-octicons"))]) + (octo-mode . [(20161008 1229) ((emacs (24))) "Major mode for Octo assembly language" single ((:commit . "bd4db7e5e3275b24c74e6a23c11d04f54e9feca5") (:authors ("John Olsson" . "john@cryon.se")) (:maintainer "John Olsson" . "john@cryon.se") (:keywords "languages") (:url . "https://github.com/cryon/octo-mode"))]) + (octopress . [(20190123 107) nil "A lightweight wrapper for Jekyll and Octopress." tar ((:commit . "f2c92d5420f14fc9167c7de1873836510e652de2") (:authors ("Aaron Bieber" . "aaron@aaronbieber.com")) (:maintainer "Aaron Bieber" . "aaron@aaronbieber.com") (:keywords "octopress" "blog") (:url . "https://github.com/aaronbieber/octopress.el"))]) + (oer-reveal . [(20210521 1311) ((emacs (24 4)) (org-re-reveal (3 1 0))) "OER with reveal.js, plugins, and org-re-reveal" tar ((:commit . "fe1feb913bf69b1e854053e3f07026c14c6c91dc") (:authors ("Jens Lechtenbörger")) (:maintainer "Jens Lechtenbörger") (:keywords "hypermedia" "tools" "slideshow" "presentation" "oer") (:url . "https://gitlab.com/oer/oer-reveal"))]) + (offlineimap . [(20150916 1158) nil "Run OfflineIMAP from Emacs" single ((:commit . "cc3e067e6237a1eb7b21c575a41683b1febb47f1") (:authors ("Julien Danjou" . "julien@danjou.info")) (:maintainer "Julien Danjou" . "julien@danjou.info") (:url . "http://julien.danjou.info/offlineimap-el.html"))]) + (oj . [(20200811 517) ((emacs (26 1)) (quickrun (2 2))) "Competitive programming tools client for AtCoder, Codeforces" single ((:commit . "2dd65324ac9833e07eaed5fb04acebafc6d5cbd2") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "convenience") (:url . "https://github.com/conao3/oj.el"))]) + (olc . [(20200818 1221) ((emacs (25 1))) "Open location code library" tar ((:commit . "d2dc62dbc3cf6460cc12bd96857a988bc80ac37e") (:authors ("David Byers" . "david.byers@liu.se")) (:maintainer "David Byers" . "david.byers@liu.se") (:keywords "extensions" "lisp") (:url . "https://gitlab.liu.se/davby02/olc"))]) + (old-norse-input . [(20170816 1842) ((emacs (24))) "An input method for Old Norse" single ((:commit . "c2e21ee72c3768e9152aff6baf12a19cde1d0c53") (:authors ("David Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Christiansen" . "david@davidchristiansen.dk") (:keywords "languages") (:url . "https://github.com/david-christiansen/emacs-old-norse-input"))]) + (oldlace-theme . [(20150705 1300) ((emacs (24))) "Emacs 24 theme with an 'oldlace' background." single ((:commit . "5c6f437203b0783b36a7aff4a578de4a0c8c4ee6") (:authors ("martin haesler")) (:maintainer "martin haesler"))]) + (olivetti . [(20210510 100) ((emacs (24 4))) "Minor mode for a nice writing environment" single ((:commit . "4a0719021625ece4def8f18d28f86a681bee7d28") (:authors ("Paul W. Rankin" . "pwr@bydasein.com")) (:maintainer "Paul W. Rankin" . "pwr@bydasein.com") (:keywords "wp" "text") (:url . "https://github.com/rnkn/olivetti"))]) + (om-mode . [(20140915 2110) nil "Insert Om component template with life cycle." single ((:commit . "cdc0c2912321f8438b0f3449ba8aca50ec150bba") (:authors ("Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com")) (:maintainer "Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com") (:keywords "clojurescript"))]) + (omni-kill . [(20171016 2140) nil "Kill all the things" single ((:commit . "904549c8fd6ac3cf22b5d7111ca8944e179cffea") (:authors ("Adrien Becchis" . "adriean.khisbe@live.fr")) (:maintainer "Adrien Becchis" . "adriean.khisbe@live.fr") (:keywords "convenience" "editing" "tools"))]) + (omni-log . [(20200304 2229) ((emacs (24)) (ht (2 0)) (s (1 6 1)) (dash (2 13 0))) "Logging utilities" tar ((:commit . "0a240660ccdd0b6588b4e3c322743b5ab1161338") (:authors ("Adrien Becchis" . "adriean.khisbe@live.fr")) (:maintainer "Adrien Becchis" . "adriean.khisbe@live.fr") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/AdrieanKhisbe/omni-log.el"))]) + (omni-quotes . [(20200304 2341) ((dash (2 8)) (omni-log (0 4 0)) (f (0 19 0)) (s (1 11 0)) (ht (2 1))) "Random quotes displayer" tar ((:commit . "cfc7b7f01628a5d57384820d1096de4541e67cdf") (:authors ("Adrien Becchis" . "adriean.khisbe@live.fr")) (:maintainer "Adrien Becchis" . "adriean.khisbe@live.fr") (:keywords "convenience") (:url . "https://github.com/AdrieanKhisbe/omni-quotes.el"))]) + (omni-scratch . [(20171009 2151) nil "Easy and mode-specific draft buffers" single ((:commit . "9eee3161e5cb6df58618548a2173f4da7d194814") (:authors ("Adrien Becchis" . "adriean.khisbe@live.fr")) (:maintainer "Adrien Becchis" . "adriean.khisbe@live.fr") (:keywords "convenience" "languages" "tools") (:url . "https://github.com/AdrieanKhisbe/omni-scratch.el"))]) + (omni-tags . [(20170426 2109) ((pcre2el (1 7)) (cl-lib (0 5))) "Highlight and Actions for 'Tags'" tar ((:commit . "8f0f6c302fab900b7681e5c039f90850cbbabd33") (:authors ("Adrien Becchis" . "adriean.khisbe@live.fr")) (:maintainer "Adrien Becchis" . "adriean.khisbe@live.fr") (:keywords "convenience") (:url . "http://github.com/AdrieanKhisbe/omni-tags.el"))]) + (omnibox . [(20180423 49) ((emacs (26 1)) (dash (2 13)) (frame-local (0 0 1))) "Selection package" single ((:commit . "8ee75c71c20c438ebc43ba24ef6f543633d118f3") (:authors ("Sebastien Chapuis" . "sebastien@chapu.is")) (:maintainer "Sebastien Chapuis" . "sebastien@chapu.is") (:keywords "completion" "selection" "convenience" "frames") (:url . "https://github.com/sebastiencs/omnibox"))]) + (omnisharp . [(20201220 906) ((emacs (24 4)) (flycheck (30)) (dash (2 12 0)) (auto-complete (1 4)) (popup (0 5 1)) (csharp-mode (0 8 7)) (cl-lib (0 5)) (s (1 10 0)) (f (0 19 0))) "Omnicompletion (intellisense) and more for C#" tar ((:commit . "5fad6835bee15792774183164dd423ba18cf1e01") (:authors ("Mika Vilpas and others")) (:maintainer "Mika Vilpas and others") (:keywords "languages" "csharp" "c#" "ide" "auto-complete" "intellisense") (:url . "https://github.com/Omnisharp/omnisharp-emacs"))]) + (omtose-phellack-theme . [(20161111 2120) nil "A dark theme, with cold bluish touch." tar ((:commit . "66f99633e199e65bd28641626435e8e59246529a"))]) + (on-parens . [(20180202 2241) ((dash (2 10 0)) (emacs (24)) (evil (1 1 6)) (smartparens (1 6 3))) "smartparens wrapper to fit with evil-mode/vim normal-state" single ((:commit . "7a41bc02bcffd265f8a69ed4b4e0df3c3009aaa4") (:authors ("William G Hatch")) (:maintainer "William G Hatch") (:keywords "evil" "smartparens"))]) + (on-screen . [(20160302 950) ((cl-lib (0))) "guide your eyes while scrolling" single ((:commit . "206468aa4de299ad26c2db12b757f5ad7290912f") (:authors ("Michael Heerdegen" . "michael_heerdegen@web.de")) (:maintainer "Michael Heerdegen" . "michael_heerdegen@web.de") (:keywords "convenience") (:url . "https://github.com/michael-heerdegen/on-screen.el"))]) + (one-themes . [(20200720 1444) ((emacs (24))) "One Colorscheme" tar ((:commit . "0e77d31f9fc0cd55f3d92ec0db79513d616b2efd") (:authors ("Balaji Sivaraman" . "balaji@balajisivaraman.com")) (:maintainer "Balaji Sivaraman" . "balaji@balajisivaraman.com") (:url . "http://github.com/balajisivaraman/emacs-one-themes"))]) + (one-time-pad-encrypt . [(20160329 1513) nil "One time pad encryption within file" single ((:commit . "87cc1f124024ce3d277299ca0ac703f182937d9f") (:authors ("Garvin Guan" . "garvin.guan@gmail.com")) (:maintainer "Garvin Guan" . "garvin.guan@gmail.com") (:keywords "convenience") (:url . "https://github.com/garvinguan/emacs-one-time-pad/"))]) + (opam . [(20150719 1220) ((emacs (24 1))) "OPAM tools" single ((:commit . "4d589de5765728f56af7078fae328b6792de8600") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com") (:keywords "convenience") (:url . "https://github.com/lunaryorn/opam.el"))]) + (open-in-msvs . [(20170123 2228) nil "Open current file:line:column in Microsoft Visual Studio" tar ((:commit . "e0d071c83188ad5db8f3297d6ce784b4ed554a04") (:authors ("Evgeny Panasyuk")) (:maintainer "Evgeny Panasyuk") (:keywords "convenience" "usability" "integration" "visual studio" "msvs" "ide") (:url . "https://github.com/evgeny-panasyuk/open-in-msvs"))]) + (open-junk-file . [(20161210 1114) nil "Open a junk (memo) file to try-and-error" single ((:commit . "558bec7372b0fed4c4cb6074ab906535fae615bd") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "convenience" "tools") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/open-junk-file.el"))]) + (opencc . [(20170722 816) ((emacs (24 4))) "中文简繁转换 <-> 中文簡繁轉換 (Convert Chinese with OpenCC)" single ((:commit . "8c539f72669ba9a99d8b5198db5ea930897ad1b9") (:authors ("徐春阳" . "mail@xuchunyang.me")) (:maintainer "徐春阳" . "mail@xuchunyang.me") (:keywords "chinese") (:url . "https://github.com/xuchunyang/emacs-opencc"))]) + (opencl-mode . [(20201025 1656) nil "Syntax coloring for opencl kernels" single ((:commit . "15091eff92c33ee0d1ece40eb99299ef79fee92d") (:authors ("Salmane Bah" . "salmane.bah@u-bordeaux.fr")) (:maintainer "Salmane Bah" . "salmane.bah@u-bordeaux.fr") (:keywords "c" "opencl") (:url . "https://github.com/salmanebah/opencl-mode"))]) + (opener . [(20161207 1810) ((request (0 2 0)) (emacs (24)) (cl-lib (0 5))) "opening urls as buffers" tar ((:commit . "c384f67278046fdcd220275fdd212ab85672cbeb") (:authors ("Tim Reddehase" . "tr@rightsrestricted.com")) (:maintainer "Tim Reddehase" . "tr@rightsrestricted.com") (:keywords "url" "http" "files") (:url . "https://github.com/0robustus1/opener.el"))]) + (openfoam . [(20210508 1903) ((emacs (25 1))) "OpenFOAM files and directories" single ((:commit . "1623aa8d9f72128cc007f84b108d2f6c6205c330") (:authors ("Ralph Schleicher" . "rs@ralph-schleicher.de")) (:maintainer "Ralph Schleicher" . "rs@ralph-schleicher.de") (:keywords "languages") (:url . "https://github.com/ralph-schleicher/emacs-openfoam"))]) + (opensource . [(20160926 1616) ((s (1 11 0)) (dash (2 12 1)) (pkg-info (0 6 0)) (request (0 2 0))) "Client for Opensource API" tar ((:commit . "4c15049079878fcd386cca5dba20b99296a1de84") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "opensource") (:url . "https://github.com/OpenSourceOrg/el-opensourceorg"))]) + (openstack-cgit-browse-file . [(20130819 927) nil "Browse the current file in OpenStack cgit" single ((:commit . "244219288b9aef41155044697bb114b7af83ab8f") (:authors ("Chmouel Boudjnah" . "chmouel@chmouel.com")) (:maintainer "Chmouel Boudjnah" . "chmouel@chmouel.com") (:keywords "convenience" "vc" "git" "cgit" "gerrit" "openstack") (:url . "https://github.com/chmouel/openstack-cgit-browse-file"))]) + (openwith . [(20120531 2136) nil "Open files with external programs" single ((:commit . "1dc89670822966fab6e656f6519fdd7f01e8301a") (:authors ("Markus Triska" . "markus.triska@gmx.at")) (:maintainer "Markus Triska" . "markus.triska@gmx.at") (:keywords "files" "processes") (:url . "https://bitbucket.org/jpkotta/openwith"))]) + (operate-on-number . [(20150707 623) nil "Operate on number at point with arithmetic functions" single ((:commit . "ceb3be565a29326c1098244fac0c50606723a56e") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:keywords "editing") (:url . "https://github.com/knu/operate-on-number.el"))]) + (orca . [(20210105 1749) ((emacs (24 3)) (zoutline (0 1 0))) "Org Capture" single ((:commit . "c50b98da70d08b27ad1751c57bc7edcf27cd1d79") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "org" "convenience") (:url . "https://github.com/abo-abo/orca"))]) + (orderless . [(20210610 45) ((emacs (26 1))) "Completion style for matching regexps in any order" tar ((:commit . "f7be0fb8ee7f609ddd7bd8635e4491ce1833c063") (:authors ("Omar Antolín Camarena" . "omar@matem.unam.mx")) (:maintainer "Omar Antolín Camarena" . "omar@matem.unam.mx") (:keywords "extensions") (:url . "https://github.com/oantolin/orderless"))]) + (ordinal . [(20210519 1442) ((emacs (24 3))) "Convert number to ordinal number notation" single ((:commit . "a7f378306290b6807fb6b87cee3ef79b31cec711") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "lisp") (:url . "https://github.com/zonuexe/ordinal.el"))]) + (org-ac . [(20170401 1307) ((auto-complete-pcmp (0 0 1)) (log4e (0 2 0)) (yaxception (0 1))) "Some auto-complete sources for org-mode" single ((:commit . "41e3ef8e4039619d0370c23c66730b3b2e9e32ed") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "org" "completion") (:url . "https://github.com/aki2o/org-ac"))]) + (org-agenda-property . [(20140626 2116) ((emacs (24 2))) "Display org properties in the agenda buffer." single ((:commit . "3b469f3e93de0036547f3631cd0366d53f7584c8") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com") (:keywords "calendar") (:url . "http://github.com/Bruce-Connor/org-agenda-property"))]) + (org-alert . [(20180524 133) ((s (1 10 0)) (dash (2 11 0)) (alert (1 2))) "Notify org deadlines via notify-send" single ((:commit . "f87bff4acbd839acb4d2245b56b2c3d21f950911") (:authors ("Stephen Pegoraro" . "spegoraro@tutive.com")) (:maintainer "Stephen Pegoraro" . "spegoraro@tutive.com") (:keywords "org" "org-mode" "notify" "notifications" "calendar") (:url . "https://github.com/groksteve/org-alert"))]) + (org-analyzer . [(20191001 1717) nil "org-analyzer is a tool that extracts time tracking data from org files." tar ((:commit . "19da62aa4dcf1090be8f574f6f2d4c7e116163a8") (:authors ("Robert Krahn" . "robert@kra.hn")) (:maintainer "Robert Krahn" . "robert@kra.hn") (:keywords "calendar") (:url . "https://github.com/rksm/clj-org-analyzer"))]) + (org-anki . [(20210603 1352) ((emacs (24 4)) (request (0 3 2))) "Synchronize org-mode entries to Anki" single ((:commit . "b21ed382b1ba5b541bf54006d309b9f783a446e4") (:authors ("Markus Läll" . "markus.l2ll@gmail.com")) (:maintainer "Markus Läll" . "markus.l2ll@gmail.com") (:keywords "outlines" "flashcards" "memory") (:url . "https://github.com/eyeinsky/org-anki"))]) + (org-appear . [(20210605 904) ((emacs (25 1)) (org (9 3))) "Auto-toggle Org elements" single ((:commit . "cf87546d6458d36492a89661a1e097e5596aa26a") (:authors ("Alice Istleyeva" . "awth13@gmail.com")) (:maintainer "Alice Istleyeva" . "awth13@gmail.com") (:url . "https://github.com/awth13/org-appear"))]) + (org-attach-screenshot . [(20210221 1336) ((emacs (24 3))) "Screenshots integrated with org attachment dirs" single ((:commit . "6a5d5f8fd7cda1200cf088f415b9983e89a03075") (:authors ("Derek Feichtinger" . "derek.feichtinger@psi.ch")) (:maintainer "Derek Feichtinger" . "derek.feichtinger@psi.ch") (:keywords "org" "multimedia") (:url . "https://github.com/dfeich/org-screenshot"))]) + (org-auto-tangle . [(20210214 917) ((emacs (24 1)) (async (1 9 3))) "Automatically and Asynchronously tangles org files on save" single ((:commit . "ea2ca74a68eb44d935b7240ffc8f19c8a4db334a") (:authors ("Yilkal Argaw")) (:maintainer "Yilkal Argaw") (:keywords "outlines") (:url . "https://github.com/yilkalargaw/org-auto-tangle"))]) + (org-autolist . [(20170924 1901) nil "Improved list management in org-mode" single ((:commit . "c82d1e83e982b5f0c106b8800e5b0cfd5f73fdc1") (:authors ("Calvin Young")) (:maintainer "Calvin Young") (:keywords "lists" "checklists" "org-mode") (:url . "https://github.com/calvinwyoung/org-autolist"))]) + (org-babel-eval-in-repl . [(20201206 1540) ((eval-in-repl (0 9 2)) (matlab-mode (3 3 6)) (ess (16 10)) (emacs (24))) "Eval org-mode babel code blocks in various REPLs." tar ((:commit . "3591f062873de2d64cc6f83b3555d030506e6ee7") (:authors ("Takeshi Teshima" . "diadochos.developer@gmail.com")) (:maintainer "Takeshi Teshima" . "diadochos.developer@gmail.com") (:keywords "literate programming" "reproducible research" "async execution") (:url . "https://github.com/diadochos/org-babel-eval-in-repl"))]) + (org-beautify-theme . [(20170908 2218) nil "A sub-theme to make org-mode more beautiful." single ((:commit . "df6a1114fda313e1689363e196c8284fbe2a2738") (:authors ("Jonathan Arkell" . "jonnay@jonnay.net")) (:maintainer "Jonathan Arkell" . "jonnay@jonnay.net") (:keywords "org" "theme"))]) + (org-board . [(20200619 1016) nil "bookmarking and web archival system for Org mode." single ((:commit . "1393bd46d11a81328ed4fb8471831415a3efe224") (:authors ("Charles A. Roelli " . "charles@aurox.ch")) (:maintainer "Charles A. Roelli " . "charles@aurox.ch") (:keywords "org" "bookmarks" "archives") (:url . "https://github.com/scallywag/org-board"))]) + (org-bookmark-heading . [(20200103 514) ((emacs (24 4)) (f (0 17 2))) "Emacs bookmark support for org-mode" single ((:commit . "38a2813f72ff65f3ae91e2ebb23e0bbb42a8d1df") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "hypermedia" "outlines") (:url . "http://github.com/alphapapa/org-bookmark-heading"))]) + (org-books . [(20210408 1913) ((enlive (0 0 1)) (s (1 11 0)) (helm (2 9 2)) (helm-org (1 0)) (dash (2 14 1)) (org (9 3)) (emacs (25))) "Reading list management with Org mode and helm" single ((:commit . "9f4ec4a981bfc5eebff993c3ad49a4bed26aebd1") (:authors ("Abhinav Tushar" . "abhinav@lepisma.xyz")) (:maintainer "Abhinav Tushar" . "abhinav@lepisma.xyz") (:keywords "outlines") (:url . "https://github.com/lepisma/org-books"))]) + (org-brain . [(20210515 1814) ((emacs (25 1)) (org (9 2))) "Org-mode concept mapping" single ((:commit . "a9ca42cb8d1325a4e928716384a0bdb53ea2ad41") (:authors ("Erik Sjöstrand" . "sjostrand.erik@gmail.com")) (:maintainer "Erik Sjöstrand" . "sjostrand.erik@gmail.com") (:keywords "outlines" "hypermedia") (:url . "http://github.com/Kungsgeten/org-brain"))]) + (org-bullets . [(20200317 1740) nil "Show bullets in org-mode as UTF-8 characters" single ((:commit . "767f55feb58b840a5a04eabfc3fbbf0d257c4792") (:authors ("sabof")) (:maintainer "D. Williams" . "d.williams@posteo.net") (:url . "https://github.com/integral-dw/org-bullets"))]) + (org-caldav . [(20200510 2030) ((org (7))) "Sync org files with external calendar through CalDAV" single ((:commit . "8569941a0a5a9393ba51afc8923fd7b77b73fa7a") (:authors ("David Engster" . "deng@randomsample.de")) (:maintainer "David Engster" . "deng@randomsample.de") (:keywords "calendar" "caldav"))]) + (org-capture-pop-frame . [(20160518 1008) ((emacs (24 4))) "Run org-capture in a new pop frame" single ((:commit . "b16fd712de62cf0d1f9befd03be6ab5983cb3301") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:url . "https://github.com/tumashu/org-capture-pop-frame.git"))]) + (org-category-capture . [(20200329 313) ((org (9 0 0)) (emacs (24))) "Contextualy capture of org-mode TODOs." single ((:commit . "96a57a43555e24e5e0d81e79f0fbb47001c41bac") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:keywords "org-mode" "todo" "tools" "outlines") (:url . "https://github.com/IvanMalison/org-projectile"))]) + (org-chef . [(20210508 110) ((org (0)) (emacs (24))) "Cookbook and recipe management with org-mode." tar ((:commit . "a97232b4706869ecae16a1352487a99bc3cf97af") (:authors ("Calvin Beck" . "hobbes@ualberta.ca")) (:maintainer "Calvin Beck" . "hobbes@ualberta.ca") (:keywords "convenience" "abbrev" "outlines" "org" "food" "recipes" "cooking") (:url . "https://github.com/Chobbes/org-chef"))]) + (org-cliplink . [(20201126 1020) ((emacs (24 4))) "insert org-mode links from the clipboard" tar ((:commit . "13e0940b65d22bec34e2de4bc8cba1412a7abfbc") (:authors ("Alexey Kutepov" . "reximkut@gmail.com")) (:maintainer "Alexey Kutepov" . "reximkut@gmail.com") (:url . "http://github.com/rexim/org-cliplink"))]) + (org-clock-convenience . [(20200705 1527) ((cl-lib (0 5)) (org (8)) (emacs (24 3))) "convenience functions for org time tracking" single ((:commit . "efc9773a8dedf834cf4a78fb6f5f8fffe55ef8eb") (:authors ("Derek Feichtinger <dfeich.gmail.com>")) (:maintainer "Derek Feichtinger <dfeich.gmail.com>") (:keywords "org") (:url . "https://github.com/dfeich/org-clock-convenience"))]) + (org-clock-csv . [(20201222 1506) ((org (8 3)) (s (1 0))) "Export `org-mode' clock entries to CSV format." single ((:commit . "af94b58c2e179a5bcc938f339e93de0eee3da99c") (:authors ("Aaron Jacobs" . "atheriel@gmail.com")) (:maintainer "Aaron Jacobs" . "atheriel@gmail.com") (:keywords "calendar" "data" "org") (:url . "https://github.com/atheriel/org-clock-csv"))]) + (org-clock-split . [(20200331 526) ((emacs (24))) "Split clock entries" single ((:commit . "39e1d2912a7a7223e2356a5fc4dff03507ae084d") (:authors ("Justin Taft <https://github.com/justintaft>")) (:maintainer "Justin Taft <https://github.com/justintaft>") (:keywords "calendar") (:url . "https://github.com/justintaft/emacs-org-clock-split"))]) + (org-clock-today . [(20191204 1558) ((emacs (25))) "Show total clocked time of the current day in the mode line" single ((:commit . "e326a45b60e0fd4ca057f1d1dc3e99a516a5aa2f") (:authors ("Tijs Mallaerts" . "tijs.mallaerts@gmail.com")) (:maintainer "Tijs Mallaerts" . "tijs.mallaerts@gmail.com") (:url . "https://github.com/mallt/org-clock-today-mode"))]) + (org-commentary . [(20160802 637) ((dash (2 0)) (emacs (24 4)) (org (8 0))) "generate or update conventional library headers using Org mode files" tar ((:commit . "821ccb994811359c42f4e3d459e0e88849d42b75") (:authors ("Sergei Maximov" . "s.b.maximov@gmail.com")) (:maintainer "Sergei Maximov" . "s.b.maximov@gmail.com") (:keywords "convenience" "docs" "tools") (:url . "https://github.com/smaximov/org-commentary"))]) + (org-context . [(20210216 1526) nil "Contextual capture and agenda commands for Org-mode" single ((:commit . "a08f1f607f819791b9b95ad4f91c5eaa9fdbb091") (:authors ("Sylvain Rousseau <thisirs at gmail dot com>")) (:maintainer "Sylvain Rousseau <thisirs at gmail dot com>") (:keywords "org" "capture" "agenda" "convenience") (:url . "https://github.com/thisirs/org-context"))]) + (org-cua-dwim . [(20120203 534) nil "Org-mode and Cua mode compatibility layer" single ((:commit . "a55d6c7009fc0b22f1110c07de629acc955c85e4") (:authors ("Matthew L. Fidler")) (:maintainer "Matthew L. Fidler") (:keywords "org-mode" "cua-mode"))]) + (org-d20 . [(20210212 139) ((s (1 11 0)) (seq (2 19)) (dash (2 12 0)) (emacs (24))) "minor mode for d20 tabletop roleplaying games" single ((:commit . "e6149dcfbb6302d10109dd792fd0ffae7bfe2595") (:authors ("Sean Whitton" . "spwhitton@spwhitton.name")) (:maintainer "Sean Whitton" . "spwhitton@spwhitton.name") (:keywords "outlines" "games") (:url . "https://spwhitton.name/tech/code/org-d20/"))]) + (org-dashboard . [(20171223 1924) ((cl-lib (0 5))) "Visually summarize progress in org files" single ((:commit . "02c0699771d199075a286e4502340ca6e7c9e831") (:authors ("Massimiliano Mirra" . "hyperstruct@gmail.com")) (:maintainer "Massimiliano Mirra" . "hyperstruct@gmail.com") (:keywords "outlines" "calendar") (:url . "http://github.com/bard/org-dashboard"))]) + (org-doing . [(20161017 1620) nil "Keep track of what you're doing" tar ((:commit . "07ddbfc238cba31e4990c9b52e9a2757b39111da") (:authors ("Rudolf Olah")) (:maintainer "Rudolf Olah") (:keywords "tools" "org") (:url . "https://github.com/omouse/org-doing"))]) + (org-dotemacs . [(20190903 2024) ((org (7 9 3)) (cl-lib (0 5))) "Store your emacs config as an org file, and choose which bits to load." single ((:commit . "ee59739c2d59151fe7d7d3034e87c7691120a5be") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:keywords "local") (:url . "https://github.com/vapniks/org-dotemacs"))]) + (org-download . [(20210118 958) ((emacs (24 3)) (async (1 2))) "Image drag-and-drop for Org-mode." single ((:commit . "947ca223643d28e189480e607df68449c15786cb") (:authors ("Oleh Krehel")) (:maintainer "Oleh Krehel") (:keywords "multimedia" "images" "screenshots" "download") (:url . "https://github.com/abo-abo/org-download"))]) + (org-dp . [(20180311 923) ((cl-lib (0 5))) "Declarative Local Programming with Org Elements" tar ((:commit . "e720f1c155a795a5b65a04790ad195c413449716") (:authors ("Thorsten Jolitz <tjolitz AT gmail DOT com>")) (:maintainer "Thorsten Jolitz <tjolitz AT gmail DOT com>") (:url . "https://github.com/tj64/org-dp"))]) + (org-drill . [(20210427 2003) ((emacs (25 3)) (seq (2 14)) (org (9 3)) (persist (0 3))) "Self-testing using spaced repetition" single ((:commit . "bf8fe812d44a3ce3e84361fb39b8ef28ca10fd0c") (:authors ("Paul Sexton" . "eeeickythump@gmail.com")) (:maintainer "Phillip Lord" . "phillip.lord@russet.org.uk") (:keywords "games" "outlines" "multimedia") (:url . "https://gitlab.com/phillord/org-drill/issues"))]) + (org-drill-table . [(20180115 1009) ((s (1 7 0)) (dash (2 2 0)) (cl-lib (0 3)) (org (8 2)) (emacs (24 1))) "Generate drill cards from org tables" single ((:commit . "2729aaa42c1e2720d9bf7bcc125e92dcf48b7f7d") (:authors ("Chris Barrett" . "chris.d.barrett@me.com")) (:maintainer "Chris Barrett" . "chris.d.barrett@me.com"))]) + (org-dropbox . [(20150114 509) ((dash (2 2)) (names (20150000)) (emacs (24))) "move Dropbox notes from phone into org-mode datetree" single ((:commit . "75dab6d6f0438a7a8a18ccf3a5d55f50bf531f6e") (:authors ("Heikki Lehvaslaiho" . "heikki.lehvaslaiho@gmail.com")) (:maintainer "Heikki Lehvaslaiho" . "heikki.lehvaslaiho@gmail.com") (:keywords "dropbox" "android" "notes" "org-mode") (:url . "https://github.com/heikkil/org-dropbox"))]) + (org-easy-img-insert . [(20160915 2008) ((emacs (24 4))) "An easier way to add images from the web in org mode" single ((:commit . "9f8aaa7f68ff1f0d8d7b1e9b618abb15002f971e") (:authors ("Tashrif Sanil" . "tashrifsanil@kloke-source.com")) (:maintainer "Tashrif Sanil" . "tashrifsanil@kloke-source.com") (:keywords "convenience" "hypermedia" "files") (:url . "https://github.com/tashrifsanil/org-easy-img-insert"))]) + (org-edit-latex . [(20170908 1522) ((emacs (24 4)) (auctex (11 90))) "Edit embedded LaTeX in a dedicated buffer" single ((:commit . "1f228310ef2f3f2959a527f6d99e42ce977384c8") (:authors ("James Wong" . "jianwang.academic@gmail.com")) (:maintainer "James Wong" . "jianwang.academic@gmail.com") (:keywords "org" "latex") (:url . "https://github.com/et2010/org-edit-latex"))]) + (org-ehtml . [(20210428 1547) ((web-server (20140109 2200)) (emacs (24 3))) "Export Org-mode files as editable web pages" tar ((:commit . "b4f97edf4150870b84d7ee8508088c0d375eaa83") (:authors ("Eric Schulte" . "schulte.eric@gmail.com")) (:maintainer "Eric Schulte" . "schulte.eric@gmail.com") (:keywords "org" "web-server" "javascript" "html"))]) + (org-elisp-help . [(20161122 55) ((cl-lib (0 5)) (org (9 0))) "org links to emacs-lisp documentation" single ((:commit . "3e33ab1a2933dd7f2782ef91d667a37f12d633ab") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "org" "remember" "lisp") (:url . "https://github.com/tarsius/org-elisp-help"))]) + (org-elp . [(20210329 1535) ((emacs (27 1))) "Preview latex equations in org mode while editing" single ((:commit . "36b5ab2ed3fa3b5917f058e3acf8dff2df69efae") (:authors ("Yilun Guan")) (:maintainer "Yilun Guan") (:keywords "lisp" "tex" "org") (:url . "https://github.com/guanyilun/org-elp"))]) + (org-emms . [(20181010 1114) ((emacs (24))) "Play multimedia files from org-mode" single ((:commit . "07a8917f3d628c32e5de1dbd118ac08203772533") (:authors ("Jonathan Gregory <jgrg at autistici dot org>")) (:maintainer "Jonathan Gregory <jgrg at autistici dot org>") (:keywords "multimedia") (:url . "https://gitlab.com/jagrg/org-emms"))]) + (org-evil . [(20180620 1517) ((dash (2 13 0)) (evil (0)) (monitor (0)) (org (0))) "Evil extensions for Org." tar ((:commit . "3b4620edc606412ef75c0b5aa637af22486eb126") (:authors ("Ben Moon" . "software@guiltydolphin.com")) (:maintainer "Ben Moon" . "software@guiltydolphin.com") (:keywords "convenience" "evil" "org") (:url . "https://github.com/guiltydolphin/org-evil"))]) + (org-fancy-priorities . [(20210427 900) nil "Display org priorities as custom strings" single ((:commit . "44532ab8c25eb2c0028eecca7acd9e8ea8e2ff30") (:authors ("Harry Bournis" . "harrybournis@gmail.com")) (:maintainer "Harry Bournis" . "harrybournis@gmail.com") (:keywords "convenience" "faces" "outlines") (:url . "https://github.com/harrybournis/org-fancy-priorities"))]) + (org-fragtog . [(20210514 1608) ((emacs (24 3)) (org (9 3 2))) "Auto-toggle Org LaTeX fragments" single ((:commit . "bed49744ed27ff205539a14fd51e2977852c49e5") (:authors ("Benjamin Levy" . "blevy@protonmail.com")) (:maintainer "Benjamin Levy" . "blevy@protonmail.com") (:url . "https://github.com/io12/org-fragtog"))]) + (org-gamedb . [(20210525 2338) ((emacs (25 1))) "Track video games in org-mode with giantbomb.com's API" single ((:commit . "f283b6f6a7e8ad090405be57202caa3d3c424447") (:authors ("repelliuss <https://github.com/repelliuss>")) (:maintainer "repelliuss" . "repelliuss@gmail.com") (:keywords "outlines" "org" "games" "convenience" "api") (:url . "https://github.com/repelliuss/org-gamedb"))]) + (org-gcal . [(20210421 2203) ((request (20190901)) (request-deferred (20181129)) (alert (0)) (persist (0)) (emacs (26))) "Org sync with Google Calendar" tar ((:commit . "4c2616a4f85adc77b91aa054bb10e76b06f706d5") (:authors ("myuhe <yuhei.maeda_at_gmail.com>")) (:maintainer "Raimon Grau" . "raimonster@gmail.com") (:keywords "convenience") (:url . "https://github.com/kidd/org-gcal.el"))]) + (org-generate . [(20200815 736) ((emacs (26 1)) (org (9 3)) (mustache (0 23))) "Generate template files/folders from org document" single ((:commit . "98825efb73c4537f05f653ce40e639a220d2ee5d") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "convenience") (:url . "https://github.com/conao3/org-generate.el"))]) + (org-gnome . [(20150614 1457) ((alert (1 2)) (telepathy (0 1)) (gnome-calendar (0 1))) "Orgmode integration with the GNOME desktop" single ((:commit . "122e14cf6f8104150a65246a9a7c10e1d7939862") (:authors ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainer "Nicolas Petton" . "petton.nicolas@gmail.com") (:keywords "org" "gnome"))]) + (org-grep . [(20151202 1229) ((cl-lib (0 5))) "Kind of M-x rgrep adapted for Org mode." single ((:commit . "5bdd04c0f53b8a3d656f36ea17bba3df7f0cb684") (:authors ("François Pinard" . "pinard@iro.umontreal.ca")) (:maintainer "François Pinard" . "pinard@iro.umontreal.ca") (:url . "https://github.com/pinard/org-grep"))]) + (org-gtd . [(20201112 253) ((emacs (26 1)) (org-edna (1 0 2)) (f (0 20 0)) (org (9 3 1)) (org-agenda-property (1 3 1))) "An implementation of GTD" single ((:commit . "034edc545335ecc0da20b4f1bb4aa9f048454afe") (:authors ("Aldric Giacomoni" . "trevoke@gmail.com")) (:maintainer "Aldric Giacomoni" . "trevoke@gmail.com") (:url . "https://github.com/Trevoke/org-gtd.el"))]) + (org-id-cleanup . [(20210326 1711) ((org (9 3)) (dash (2 12)) (emacs (26 3))) "Interactively find, present and maybe clean up unused IDs of org-id" single ((:commit . "2cb87624238281b438cda67ed375c56403524489") (:authors ("Marc Ihm" . "1@2484.de")) (:maintainer "Marc Ihm" . "1@2484.de") (:url . "https://github.com/marcIhm/org-id-cleanup"))]) + (org-if . [(20150920 1513) nil "Interactive Fiction Authoring System for Org-Mode." tar ((:commit . "fab602cc1bbee7a4e99c0083e129219d3f9ed2e8") (:authors ("Philip Woods" . "elzairthesorcerer@gmail.com")) (:maintainer "Philip Woods" . "elzairthesorcerer@gmail.com") (:keywords "if" "org-if" "org org-mode"))]) + (org-index . [(20210602 358) ((org (9 3)) (dash (2 12)) (s (1 12)) (emacs (26 3))) "A personal adaptive index for org" single ((:commit . "40716a4cfd36304b4a16977020b1e82870faec15") (:authors ("Marc Ihm" . "1@2484.de")) (:maintainer "Marc Ihm" . "1@2484.de") (:url . "https://github.com/marcIhm/org-index"))]) + (org-inline-pdf . [(20210119 529) ((emacs (25 1)) (org (9 4))) "Inline PDF previewing for Org" single ((:commit . "b2dfbf41efac55edacde8a8a6bd0275418de6454") (:authors ("Shigeaki Nishina")) (:maintainer "Shigeaki Nishina") (:keywords "org" "outlines" "hypermedia") (:url . "https://github.com/shg/org-inline-pdf.el"))]) + (org-iv . [(20171001 1022) ((impatient-mode (1 0 0)) (org (8 0)) (cl-lib (0 5))) "a tool used to view html (in browser) generated by org-file once the org-file changes" tar ((:commit . "7f2bb1b32647655fd9d6684f6f09dcc66b61b0cd") (:authors ("kuangdash" . "kuangdash@163.com")) (:maintainer "kuangdash" . "kuangdash@163.com") (:url . "https://github.com/kuangdash/org-iv"))]) + (org-jira . [(20210608 150) ((emacs (24 5)) (cl-lib (0 5)) (request (0 2 0)) (dash (2 14 1))) "Syncing between Jira and Org-mode." tar ((:commit . "7ebc76ff9f8432bafb6a1471b74737b1111042fa") (:maintainer "Matthew Carter" . "m@ahungry.com") (:keywords "ahungry" "jira" "org" "bug" "tracker") (:url . "https://github.com/ahungry/org-jira"))]) + (org-journal . [(20210326 1207) ((emacs (25 1)) (org (9 1))) "a simple org-mode based journaling mode" single ((:commit . "5f253a880e1919ef4b98f0d91f271a8b522eaae5") (:authors ("Bastian Bechtold") ("Christian Schwarzgruber")) (:maintainer "Bastian Bechtold") (:url . "http://github.com/bastibe/org-journal"))]) + (org-journal-list . [(20190221 2052) ((emacs (25))) "Org mode Journal List" single ((:commit . "2b26d00181bb49bff64b31ad020490acd1b6ae02") (:authors ("Huy Tran" . "huytd189@gmail.com")) (:maintainer "Huy Tran" . "huytd189@gmail.com") (:url . "https://github.com/huytd/org-journal-list"))]) + (org-kanban . [(20210315 28) ((s (0)) (dash (2 17 0)) (emacs (24 4)) (org (9 1))) "kanban dynamic block for org-mode." single ((:commit . "198ffa2066aadcdd9530dcc9b82cb5626c49e257") (:authors ("Christian Köstlin" . "christian.koestlin@gmail.com")) (:maintainer "Christian Köstlin" . "christian.koestlin@gmail.com") (:keywords "org-mode" "org" "kanban" "tools") (:url . "http://github.com/gizmomogwai/org-kanban"))]) + (org-kindle . [(20200906 944) ((emacs (25)) (cl-lib (0 5)) (seq (2 20))) "Send org link file to ebook reader." single ((:commit . "5fde4a53f062612b2a118c53ff0196a128b80d6d") (:keywords "org" "link" "ebook" "kindle" "epub" "azw3" "mobi") (:url . "https://github.com/stardiviner/org-kindle"))]) + (org-latex-impatient . [(20210409 2251) ((emacs (26)) (s (1 8 0)) (posframe (0 8 0)) (org (9 3)) (dash (2 17 0))) "Preview org-latex Fragments Instantly via MathJax" single ((:commit . "39f22dc98cb8268af67c6df71778ec5784d2b683") (:authors ("Sheng Yang" . "styang@fastmail.com")) (:maintainer "Sheng Yang" . "styang@fastmail.com") (:keywords "tex" "tools") (:url . "https://github.com/yangsheng6810/org-latex-instant-preview"))]) + (org-link-beautify . [(20210222 227) ((emacs (27 1)) (all-the-icons (4 0 0))) "Beautify Org Links" single ((:commit . "1995e0cd87eb7f3e9274a7a3053639f1c0f847cf") (:keywords "hypermedia") (:url . "https://github.com/stardiviner/org-link-beautify"))]) + (org-link-travis . [(20140405 2327) ((org (7))) "Insert/Export the link of Travis CI on org-mode" single ((:commit . "596615ad8373d9090bd4138da683524f0ad0bda5") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "org") (:url . "https://github.com/aki2o/org-link-travis"))]) + (org-linkotron . [(20200112 2235) ((emacs (26 1)) (org (9 3))) "Org-mode link selector" tar ((:commit . "d0adc5247b205bc73d2f1a83d4a512d2be541eb5") (:authors ("Per Weijnitz" . "per.weijnitz@gmail.com")) (:maintainer "Per Weijnitz" . "per.weijnitz@gmail.com") (:keywords "hypermedia" "org") (:url . "https://gitlab.com/perweij/org-linkotron"))]) + (org-listcruncher . [(20210503 802) ((seq (2 3)) (emacs (26 1))) "Planning tool - Parse Org mode lists into table" single ((:commit . "50c06445a837c6677da035f72dbe0f973d9e10a7") (:authors ("Derek Feichtinger" . "dfeich@gmail.com")) (:maintainer "Derek Feichtinger" . "dfeich@gmail.com") (:keywords "convenience") (:url . "https://github.com/dfeich/org-listcruncher"))]) + (org-make-toc . [(20200409 1436) ((emacs (26 1)) (dash (2 12)) (s (1 10 0)) (org (9 0))) "Automatic tables of contents for Org files" single ((:commit . "26fbd6a7e1e7f8e473fe3a5f74faec715c3a05aa") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "org" "convenience") (:url . "http://github.com/alphapapa/org-make-toc"))]) + (org-mime . [(20210309 1028) ((emacs (25 1)) (cl-lib (0 5))) "org html export for text/html MIME emails" single ((:commit . "eb21c02ba8f97fe69c14dc657a7883b982664649") (:authors ("Eric Schulte")) (:maintainer "Chen Bin (redguardtoo)") (:keywords "mime" "mail" "email" "html") (:url . "http://github.com/org-mime/org-mime"))]) + (org-mind-map . [(20180826 2340) ((emacs (24)) (dash (1 8 0)) (org (8 2 10))) "Creates a directed graph from org-mode files" single ((:commit . "95347b2f9291f5c5eb6ebac8e726c03634c61de3") (:authors ("Ted Wiles" . "theodore.wiles@gmail.com")) (:maintainer "Ted Wiles" . "theodore.wiles@gmail.com") (:keywords "orgmode" "extensions" "graphviz" "dot") (:url . "https://github.com/theodorewiles/org-mind-map"))]) + (org-ml . [(20210328 1655) ((emacs (26 1)) (org (9 3)) (dash (2 17)) (s (1 12))) "Functional Org Mode API" tar ((:commit . "9d8c26d12c972a60b94bcc3b364d857db997cfa3") (:authors ("Nathan Dwarshuis" . "ndwar@yavin4.ch")) (:maintainer "Nathan Dwarshuis" . "ndwar@yavin4.ch") (:keywords "org-mode" "outlines") (:url . "https://github.com/ndwarshuis/org-ml"))]) + (org-mobile-sync . [(20180606 524) ((emacs (24 3 50)) (org (8 0))) "automatically sync org-mobile on changes" single ((:commit . "06764b943a528827df1e2acc6bc7806cc2c1351f") (:authors ("steckerhalter")) (:maintainer "steckerhalter") (:keywords "org-mode" "org" "mobile" "sync" "todo") (:url . "https://framagit.org/steckerhalter/org-mobile-sync"))]) + (org-mru-clock . [(20210408 1259) ((emacs (26 1))) "Clock in/out of tasks with completion and persistent history" single ((:commit . "229461b92ff89fd96cd7730df9fd589a8b0ef949") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org") (:keywords "convenience" "calendar") (:url . "https://github.com/unhammer/org-mru-clock"))]) + (org-msg . [(20210518 2355) ((emacs (24 4)) (htmlize (1 54))) "Org mode to send and reply to email in HTML." single ((:commit . "4c92c627b6cfb234fd257b714a5dbfc72d7af8d2") (:authors ("Jérémy Compostella" . "jeremy.compostella@gmail.com")) (:maintainer "Jérémy Compostella" . "jeremy.compostella@gmail.com") (:keywords "extensions" "mail") (:url . "https://github.com/jeremy-compostella/org-msg"))]) + (org-multi-wiki . [(20210324 1820) ((emacs (26 1)) (dash (2 12)) (s (1 12)) (org-ql (0 5)) (org (9 3))) "Multiple wikis based on Org mode" single ((:commit . "bf8039aadddaf02569fab473f766071ef7e63563") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:keywords "org" "outlines" "files") (:url . "https://github.com/akirak/org-multi-wiki"))]) + (org-multiple-keymap . [(20191017 1920) ((org (8 2 4)) (emacs (24)) (cl-lib (0 5))) "Set keymap to elements, such as timestamp and priority." single ((:commit . "4eb8aa0aada012b2346cc7f0c55e07783141a2c3") (:authors ("myuhe <yuhei.maeda_at_gmail.com>")) (:maintainer "myuhe") (:keywords "convenience" "org-mode") (:url . "https://github.com/myuhe/org-multiple-keymap.el"))]) + (org-notebook . [(20170322 452) ((emacs (24)) (org (8)) (cl-lib (0 5))) "Ease the use of org-mode as a notebook" single ((:commit . "86042d866bf441e2c9bb51f995e5994141b78517") (:authors ("Paul Elder" . "paul.elder@amanokami.net")) (:maintainer "Paul Elder" . "paul.elder@amanokami.net") (:keywords "convenience" "tools"))]) + (org-noter . [(20191020 1212) ((emacs (24 4)) (cl-lib (0 6)) (org (9 0))) "A synchronized, Org-mode, document annotator" single ((:commit . "9ead81d42dd4dd5074782d239b2efddf9b8b7b3d") (:authors (nil . "Gonçalo Santos (aka. weirdNox@GitHub)")) (:maintainer nil . "Gonçalo Santos (aka. weirdNox@GitHub)") (:keywords "lisp" "pdf" "interleave" "annotate" "external" "sync" "notes" "documents" "org-mode") (:url . "https://github.com/weirdNox/org-noter"))]) + (org-noter-pdftools . [(20210118 1611) ((emacs (26 1)) (org (9 4)) (pdf-tools (0 8)) (org-pdftools (1 0)) (org-noter (1 4 1))) "Integration between org-pdftools and org-noter" single ((:commit . "a5b61bca3f8c91b0859bb0df1a929f9a31a57b99") (:authors ("Alexander Fu Xi" . "fuxialexander@gmail.com")) (:maintainer "Alexander Fu Xi" . "fuxialexnader@gmail.com") (:keywords "convenience") (:url . "https://github.com/fuxialexander/org-pdftools"))]) + (org-notifications . [(20210310 1149) ((emacs (25 1)) (org (9 0)) (sound-wav (0 2)) (alert (1 2)) (seq (2 21))) "Creates notifications for org-mode entries" tar ((:commit . "41a8a6b57e11a5b676b03925d473066655364808") (:authors ("doppelc")) (:maintainer "doppelc") (:keywords "outlines") (:url . "https://github.com/doppelc/org-notifications"))]) + (org-octopress . [(20170821 415) ((org (9 0)) (orglue (0 1)) (ctable (0 1 1))) "Compose octopress articles using org-mode." tar ((:commit . "38598ef98d04076a8eb78d549907ddfde8d3a652") (:authors ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainer "Yoshinari Nomura" . "nom@quickhack.net") (:keywords "org" "jekyll" "octopress" "blog"))]) + (org-onenote . [(20171008 500) ((oauth2 (0 11)) (request (0 2 0)) (org (8 2 10))) "export org-mode document to onenote." single ((:commit . "5ce5cf4edb143180e0b185ac26826d39ae5bc929") (:authors ("Frei Zhang" . "ifree0@gmail.com")) (:maintainer "Frei Zhang" . "ifree0@gmail.com") (:keywords "tools" "docs" "org-mode" "onenote") (:url . "https://github.com/ifree/org-onenote"))]) + (org-outline-numbering . [(20180705 1501) ((emacs (24)) (org (8 3)) (cl-lib (0 6)) (ov (1 0 6))) "Show outline numbering as overlays in org-mode" single ((:commit . "22014917dd7e751c46fa13e1e836c2d0265ce82f") (:authors ("Anders Johansson")) (:maintainer "Anders Johansson") (:keywords "wp" "convenience") (:url . "https://gitlab.com/andersjohansson/org-outline-numbering"))]) + (org-outlook . [(20160705 1338) nil "Outlook org" tar ((:commit . "ec32d8d9d8ffd17e6de4de0b52fc3f5ad9b4cc0d") (:authors ("Matthew L. Fidler")) (:maintainer "Matthew L. Fidler") (:keywords "org-outlook") (:url . "https://github.com/mlf176f2/org-outlook.el"))]) + (org-page . [(20170807 224) ((ht (1 5)) (simple-httpd (1 4 6)) (mustache (0 22)) (htmlize (1 47)) (org (8 0)) (dash (2 0 0)) (cl-lib (0 5)) (git (0 1 1))) "a static site generator based on org mode" tar ((:commit . "b25c3ef41da233306c157634c1f0b019d8b6adc0") (:authors ("Kelvin Hu <ini DOT kelvin AT gmail DOT com>")) (:maintainer "Kelvin Hu <ini DOT kelvin AT gmail DOT com>") (:keywords "org-mode" "convenience" "beautify") (:url . "https://github.com/kelvinh/org-page"))]) + (org-parser . [(20200417 301) ((emacs (25 1)) (dash (2 12 0)) (ht (2 1))) "parse org files into structured datatypes." single ((:commit . "fd4cb7035ff649378cc968b1ec2c386b5c565706") (:keywords "files" "outlines" "tools") (:url . "https://hg.sr.ht/~zck/org-parser"))]) + (org-pdftools . [(20210118 1611) ((emacs (26 1)) (org (9 3 6)) (pdf-tools (0 8)) (org-noter (1 4 1))) "Support for links to documents in pdfview mode" single ((:commit . "a5b61bca3f8c91b0859bb0df1a929f9a31a57b99") (:authors ("Alexander Fu Xi" . "fuxialexander@gmail.com")) (:maintainer "Alexander Fu Xi" . "fuxialexnader@gmail.com") (:keywords "convenience") (:url . "https://github.com/fuxialexander/org-pdftools"))]) + (org-picklink . [(20210210 516) ((emacs (24 4))) "Pick a headline link from org-agenda" single ((:commit . "bfdc22b436482752be41c5d6f6f37dca76b1c7c3") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:keywords "convenience") (:url . "https://github.com/tumashu/org-picklink"))]) + (org-pivotal . [(20200607 1505) ((a (0 1 1)) (dash (2 14 1)) (dash-functional (1 2 0)) (emacs (26 1)) (request (0 3 0))) "Sync Pivotal Tracker to org buffer" tar ((:commit . "125e70f9a682751e4ed7c3a350b2794af9600f47") (:authors ("Huy Duong" . "qhuyduong@hotmail.com")) (:maintainer "Huy Duong" . "qhuyduong@hotmail.com") (:url . "https://github.com/org-pivotal/org-pivotal"))]) + (org-pomodoro . [(20190530 1445) ((alert (0 5 10)) (cl-lib (0 5))) "Pomodoro implementation for org-mode." tar ((:commit . "aa07c11318f91219336197e62c47bc7a3d090479") (:authors ("Arthur Leonard Andersen" . "leoc.git@gmail.com")) (:maintainer "Arthur Leonard Andersen" . "leoc.git@gmail.com") (:url . "https://github.com/lolownia/org-pomodoro"))]) + (org-present . [(20200204 1647) ((org (7))) "Minimalist presentation minor-mode for Emacs org-mode." single ((:commit . "9709ca2d04a59959354222ac4d3f8b750785739a") (:authors ("Ric Lister")) (:maintainer "Ric Lister") (:url . "https://github.com/rlister/org-present"))]) + (org-present-remote . [(20191206 533) ((org-present (9)) (elnode (0 9)) (emacs (25))) "A web-based remote control for org-present" single ((:commit . "dc3be74c544efc4723f5f64f54b4c74b523f0bbd") (:authors ("Duncan Bayne" . "duncan@bayne.id.au")) (:maintainer "Duncan Bayne" . "duncan@bayne.id.au") (:keywords "comm" "docs") (:url . "https://gitlab.com/duncan-bayne/org-present-remote"))]) + (org-pretty-tags . [(20201110 1020) ((emacs (25))) "Surrogates for tags" single ((:commit . "5c7521651b35ae9a7d3add4a66ae8cc176ae1c76") (:authors ("Marco Wahl" . "marcowahlsoft@gmail.com")) (:maintainer "Marco Wahl" . "marcowahlsoft@gmail.com") (:keywords "reading" "outlines") (:url . "https://gitlab.com/marcowahl/org-pretty-tags"))]) + (org-preview-html . [(20180625 619) ((org (8 0)) (emacs (24 4))) "automatically use eww to preview the current org file on save" single ((:commit . "8ba7ecd7ac624f33b3e2395f477bbff4f1ec4efe") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "convenience" "eww" "org") (:url . "https://github.com/lujun9972/org-preview-html"))]) + (org-projectile . [(20190130 1439) ((projectile (0 11 0)) (dash (2 10 0)) (emacs (24)) (s (1 9 0)) (org-category-capture (0 0 0))) "Repository todo management for org-mode" single ((:commit . "96a57a43555e24e5e0d81e79f0fbb47001c41bac") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:keywords "org-mode" "projectile" "todo" "tools" "outlines") (:url . "https://github.com/IvanMalison/org-projectile"))]) + (org-projectile-helm . [(20180601 1822) ((org-projectile (1 0 0)) (helm (2 3 1)) (emacs (25))) "helm functions for org-projectile" single ((:commit . "96a57a43555e24e5e0d81e79f0fbb47001c41bac") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:keywords "org" "projectile" "todo" "helm" "outlines") (:url . "https://github.com/IvanMalison/org-projectile"))]) + (org-protocol-jekyll . [(20170328 1639) ((cl-lib (0 5))) "Jekyll's handler for org-protocol" single ((:commit . "dec064a42d6dfe81dfde7ba59ece5ca103ac6334") (:authors ("Vladimir S. Ivanov" . "ivvl82@gmail.com")) (:maintainer "Vladimir S. Ivanov" . "ivvl82@gmail.com"))]) + (org-ql . [(20210608 1617) ((emacs (26 1)) (dash (2 18 1)) (f (0 17 2)) (map (2 1)) (org (9 0)) (org-super-agenda (1 2)) (ov (1 0 6)) (peg (1 0)) (s (1 12 0)) (transient (0 1)) (ts (0 2 -1))) "Org Query Language, search command, and agenda-like view" tar ((:commit . "3c7a93d71f7c480d37cfc9f34cc7675e24a97932") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "hypermedia" "outlines" "org" "agenda") (:url . "https://github.com/alphapapa/org-ql"))]) + (org-radiobutton . [(20210519 1225) ((dash (2 13 0)) (emacs (24))) "Radiobutton for org-mode lists." single ((:commit . "4ba26bbd26102c45c234bc6ce9a8e9c655c6a0a2") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "outlines") (:url . "https://github.com/Fuco1/org-radiobutton"))]) + (org-random-todo . [(20190214 2057) ((emacs (24 3)) (alert (1 3))) "show a random TODO (with alert) every so often" single ((:commit . "a019c7186ec60c8c7c3657914cdce029811cf4e0") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org") (:keywords "org" "todo" "notification" "calendar") (:url . "https://github.com/unhammer/org-random-todo"))]) + (org-randomnote . [(20200110 1407) ((f (0 19 0)) (dash (2 12 0)) (org (0))) "Find a random note in your Org-Mode files" single ((:commit . "ea8cf4385970637efffff8f79e14576ba6d7ad13") (:authors ("Michael Fogleman" . "michaelwfogleman@gmail.com")) (:maintainer "Michael Fogleman" . "michaelwfogleman@gmail.com") (:url . "http://github.com/mwfogleman/org-randomnote"))]) + (org-re-reveal . [(20210507 1615) ((emacs (24 4)) (org (8 3)) (htmlize (1 34))) "Org export to reveal.js presentations" tar ((:commit . "4538c06fab9a7259aa1fb40e93a43dcfacef27c1") (:keywords "tools" "outlines" "hypermedia" "slideshow" "presentation" "oer") (:url . "https://gitlab.com/oer/org-re-reveal"))]) + (org-re-reveal-ref . [(20210104 1650) ((emacs (25 1)) (org-ref (1 1 1)) (org-re-reveal (0 9 3))) "Citations and bibliography for org-re-reveal" tar ((:commit . "2379e224d6acfdba3ee6f0de72805cdfa6b8e0f8") (:authors ("Jens Lechtenbörger")) (:maintainer "Jens Lechtenbörger") (:keywords "hypermedia" "tools" "slideshow" "presentation" "bibliography") (:url . "https://gitlab.com/oer/org-re-reveal-ref"))]) + (org-recent-headings . [(20201213 747) ((emacs (26 1)) (org (9 0 5)) (dash (2 13 0)) (dash-functional (1 2 0)) (frecency (0 1)) (s (1 12 0))) "Jump to recently used Org headings" single ((:commit . "5da516a1586675992c0122ed32978c18dda06318") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "hypermedia" "outlines" "org") (:url . "http://github.com/alphapapa/org-recent-headings"))]) + (org-recur . [(20191216 2353) ((emacs (24)) (org (9 0))) "Recurring org-mode tasks" single ((:commit . "4f25a5be2eaaedb84c78abf9457b9745a9396bcb") (:authors ("Marcin Swieczkowski" . "marcin.swieczkowski@gmail.com")) (:maintainer "Marcin Swieczkowski" . "marcin.swieczkowski@gmail.com") (:url . "https://github.com/m-cat/org-recur"))]) + (org-redmine . [(20160711 1114) nil "Redmine tools using Emacs OrgMode" single ((:commit . "e77d013bc3784947c46a5c53f03cd7d3c68552fc") (:authors ("Wataru MIYAGUNI" . "gonngo@gmail.com")) (:maintainer "Wataru MIYAGUNI" . "gonngo@gmail.com") (:keywords "redmine" "org") (:url . "https://github.com/gongo/org-redmine"))]) + (org-ref . [(20210510 1614) ((dash (2 11 0)) (htmlize (1 51)) (helm (1 5 5)) (helm-bibtex (2 0 0)) (ivy (0 8 0)) (hydra (0 13 2)) (key-chord (0)) (s (1 10 0)) (f (0 18 0)) (pdf-tools (0 7)) (bibtex-completion (0))) "citations, cross-references and bibliographies in org-mode" tar ((:commit . "8aa2bb45268f660956151547533689d4ec30378d") (:authors ("John Kitchin" . "jkitchin@andrew.cmu.edu")) (:maintainer "John Kitchin" . "jkitchin@andrew.cmu.edu") (:keywords "org-mode" "cite" "ref" "label") (:url . "https://github.com/jkitchin/org-ref"))]) + (org-repo-todo . [(20171228 119) nil "Simple repository todo management with org-mode" single ((:commit . "f73ebd91399c5760ad52c6ad9033de1066042003") (:authors ("justin talbott" . "justin@waymondo.com")) (:maintainer "justin talbott" . "justin@waymondo.com") (:keywords "convenience") (:url . "https://github.com/waymondo/org-repo-todo"))]) + (org-reverse-datetree . [(20210531 1929) ((emacs (26 1)) (dash (2 12)) (org (9 3))) "Create reverse date trees in org-mode" single ((:commit . "e7a7109e4c34811d471bf685b710234564a556f6") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:keywords "outlines") (:url . "https://github.com/akirak/org-reverse-datetree"))]) + (org-review . [(20160907 537) nil "schedule reviews for Org entries" single ((:commit . "058e75b7f28d2ad2390290fe17a63d98ef5ab763") (:authors ("Alan Schmitt" . "alan.schmitt@polytechnique.org")) (:maintainer "Alan Schmitt" . "alan.schmitt@polytechnique.org") (:keywords "org" "review") (:url . "https://github.com/brabalan/org-review"))]) + (org-rich-yank . [(20201115 823) ((emacs (24 4))) "Paste with org-mode markup and link to source" single ((:commit . "56d698c2614025538f456479c79073ef40399bc3") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org") (:keywords "convenience" "hypermedia" "org") (:url . "https://github.com/unhammer/org-rich-yank"))]) + (org-roam . [(20210609 1221) ((emacs (26 1)) (dash (2 13)) (f (0 17 2)) (s (1 12 0)) (org (9 3)) (emacsql (3 0 0)) (emacsql-sqlite3 (1 0 2))) "Roam Research replica with Org-mode" tar ((:commit . "756f6215b672e267f986a3d6e494f5309825b91a") (:authors ("Jethro Kuan" . "jethrokuan95@gmail.com")) (:maintainer "Jethro Kuan" . "jethrokuan95@gmail.com") (:keywords "org-mode" "roam" "convenience") (:url . "https://github.com/org-roam/org-roam"))]) + (org-roam-bibtex . [(20210602 2113) ((emacs (27 2)) (org-roam (1 2 2)) (bibtex-completion (2 0 0)) (org-ref (1 1 1))) "Org Roam meets BibTeX" tar ((:commit . "f7b5be2ce0b43dd4d842484fc0ec37fdc8526907") (:authors ("Mykhailo Shevchuk" . "mail@mshevchuk.com") ("Leo Vivier" . "leo.vivier+dev@gmail.com")) (:maintainer "Mykhailo Shevchuk" . "mail@mshevchuk.com") (:keywords "bib" "hypermedia" "outlines" "wp") (:url . "https://github.com/org-roam/org-roam-bibtex"))]) + (org-roam-server . [(20210521 1055) ((org-roam (1 2 1)) (org (9 3)) (emacs (26 1)) (dash (2 17 0)) (simple-httpd (1 5 1)) (s (1 12 0)) (f (0 20 0))) "Org Roam Database Visualizer" tar ((:commit . "a0f82bf41e318d4ef606a26f54054262ed6c3441") (:authors ("Göktuğ Karakaşlı" . "karakasligk@gmail.com")) (:maintainer "Göktuğ Karakaşlı" . "karakasligk@gmail.com") (:url . "https://github.com/goktug97/org-roam-server"))]) + (org-rtm . [(20160214 1236) ((rtm (0 1))) "Simple import/export from rememberthemilk to org-mode" single ((:commit . "adc42ad1fbe92ab447ccc9553780f4456f2508d2") (:authors ("Philipp Middendorf" . "pmidden@secure.mailbox.org")) (:maintainer "Philipp Middendorf" . "pmidden@secure.mailbox.org") (:keywords "outlines" "data") (:url . "https://github.com/pmiddend/org-rtm"))]) + (org-runbook . [(20210502 1732) ((emacs (26 1)) (seq (2 3)) (f (0 20 0)) (s (1 12 0)) (dash (2 17 0)) (mustache (0 24)) (ht (0 9)) (ivy (0 8 0))) "Org mode for runbooks" tar ((:commit . "3206b4ea40614ba87a1b12f66ad0f84354bcdafb") (:authors ("Tyler Dodge")) (:maintainer "Tyler Dodge") (:keywords "convenience" "processes" "terminals" "files") (:url . "https://github.com/tyler-dodge/org-runbook"))]) + (org-scrum . [(20200131 1129) ((emacs (24 5)) (org (8 2)) (seq (2 3)) (cl-lib (1 0))) "org mode extensions for scrum planning and reporting" single ((:commit . "f7a46bc4bc85305f0c2b72565170ea0e007c42fd") (:authors ("Ian Martins" . "ianxm@jhu.edu")) (:maintainer "Ian Martins" . "ianxm@jhu.edu") (:url . "https://github.com/ianxm/emacs-scrum"))]) + (org-seek . [(20161217 502) ((emacs (24 3)) (ag (0 48))) "Searching Org-mode files with search tools." single ((:commit . "1f51e6634e3b9a6a29d335d0d14370a6ffef2265") (:authors ("stardiviner" . "numbchild@gmail.com")) (:maintainer "stardiviner" . "numbchild@gmail.com") (:keywords "org" "search" "ag" "pt") (:url . "https://github.com/stardiviner/org-seek.el"))]) + (org-shoplist . [(20210514 1041) ((emacs (25))) "Eat the world" single ((:commit . "1c534662719222e315d970e2fa871d222f80ea87") (:authors ("lordnik22")) (:maintainer "lordnik22") (:keywords "extensions" "matching") (:url . "https://github.com/lordnik22"))]) + (org-sidebar . [(20201114 507) ((emacs (26 1)) (s (1 10 0)) (dash (2 13)) (dash-functional (1 2 0)) (org (9 0)) (org-ql (0 2)) (org-super-agenda (1 0))) "Helpful sidebar for Org buffers" single ((:commit . "1b37069e47d1ea4745eacdf2dec2bdad756ee235") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "hypermedia" "outlines" "org" "agenda") (:url . "https://github.com/alphapapa/org-sidebar"))]) + (org-snooze . [(20181229 1424) ((emacs (24 4))) "Snooze your code, doc and feed" single ((:commit . "8799adc14a20f3489063d279ff69312de3180bf9") (:authors ("Bill Xue")) (:maintainer "Bill Xue") (:keywords "extensions") (:url . "https://github.com/xueeinstein/org-snooze.el"))]) + (org-special-block-extras . [(20210228 212) ((s (1 12 0)) (dash (2 18 0)) (emacs (26 1)) (org (9 1))) "30 new custom blocks & 34 link types for Org-mode" single ((:commit . "143146d5bab10e32d4a24f4c3e5e30905b0f3176") (:authors ("Musa Al-hassy" . "alhassy@gmail.com")) (:maintainer "Musa Al-hassy" . "alhassy@gmail.com") (:keywords "org" "blocks" "colors" "convenience") (:url . "https://alhassy.github.io/org-special-block-extras"))]) + (org-sql . [(20210404 1839) ((emacs (27 1)) (s (1 12)) (f (0 20 0)) (dash (2 17)) (org-ml (5 6 1))) "Org-Mode SQL converter" single ((:commit . "71b6e01ff94be4c68cfeb17a34518bf1f118cf95") (:authors ("Nathan Dwarshuis" . "natedwarshuis@gmail.com")) (:maintainer "Nathan Dwarshuis" . "natedwarshuis@gmail.com") (:keywords "org-mode" "data") (:url . "https://github.com/ndwarshuis/org-sql"))]) + (org-starter . [(20210314 1558) ((emacs (25 1)) (dash (2 18))) "A basic configuration framework for org mode" single ((:commit . "786257e682bf147022d5b19e6df6e7c9939193af") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:url . "https://github.com/akirak/org-starter"))]) + (org-starter-swiper . [(20201202 144) ((emacs (25 1)) (swiper (0 11)) (org-starter (0 2 4))) "Swiper for org-starter" single ((:commit . "786257e682bf147022d5b19e6df6e7c9939193af") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:url . "https://github.com/akirak/org-starter"))]) + (org-static-blog . [(20210606 1806) ((emacs (24 3))) "a simple org-mode based static blog generator" single ((:commit . "0bd38b604405ba8e6ba00dd32ce4773eb02eb901") (:authors ("Bastian Bechtold")) (:maintainer "Bastian Bechtold") (:url . "https://github.com/bastibe/org-static-blog"))]) + (org-sticky-header . [(20201223 143) ((emacs (24 4)) (org (8 3 5))) "Show off-screen Org heading at top of window" single ((:commit . "79136b8c54c48547ba8a07a72a9790cb8e23ecbd") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "hypermedia" "outlines" "org") (:url . "http://github.com/alphapapa/org-sticky-header"))]) + (org-super-agenda . [(20201211 918) ((emacs (26 1)) (s (1 10 0)) (dash (2 13)) (org (9 0)) (ht (2 2)) (ts (0 2))) "Supercharge your agenda" tar ((:commit . "f5e80e4d0da6b2eeda9ba21e021838fa6a495376") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "hypermedia" "outlines" "org" "agenda") (:url . "http://github.com/alphapapa/org-super-agenda"))]) + (org-superstar . [(20210216 1925) ((org (9 1 9)) (emacs (26 1))) "Prettify headings and plain lists in Org mode" single ((:commit . "9d64c42e5029910153ec74cb9b5747b074281140") (:authors ("D. Williams" . "d.williams@posteo.net")) (:maintainer "D. Williams" . "d.williams@posteo.net") (:keywords "faces" "outlines") (:url . "https://github.com/integral-dw/org-superstar-mode"))]) + (org-sync . [(20181204 23) ((cl-lib (0 5)) (org (8 2)) (emacs (24))) "Synchronize Org documents with External Issue Trackers" tar ((:commit . "e34a385fa9e658c8341a0a6e6bc3472d4d536bb8") (:authors ("Aurelien Aptel <aurelien dot aptel at gmail dot com>")) (:maintainer "Andrei Beliankou" . "arbox@yandex.ru") (:keywords "org" "synchronization" "issue tracking" "github" "redmine") (:url . "https://github.com/arbox/org-sync"))]) + (org-sync-snippets . [(20210111 1726) ((org (8 3 5)) (emacs (24 3)) (f (0 17 3))) "Export snippets to org-mode and vice versa" single ((:commit . "88f995dea188b8a645a3388c42b62a2bb88953d3") (:authors ("Adrien Brochard")) (:maintainer "Adrien Brochard") (:keywords "snippet" "org-mode" "yasnippet" "tools") (:url . "https://github.com/abrochard/org-sync-snippets"))]) + (org-table-comment . [(20120209 1851) nil "Org table comment modes." single ((:commit . "33b9966c33ecbc3e27cca67c2f2cdea04364d74e") (:authors ("Matthew L. Fidler <matthew dot fidler at gmail . com>")) (:maintainer "Matthew L. Fidler") (:keywords "org-mode" "orgtbl") (:url . "http://github.com/mlf176f2/org-table-comment.el"))]) + (org-table-sticky-header . [(20190924 506) ((org (8 2 10)) (emacs (24 4))) "Sticky header for org-mode tables" single ((:commit . "b65442857128ab04724aaa301e60aa874a31a798") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions"))]) + (org-tag-beautify . [(20210527 1130) ((emacs (26 1)) (org-pretty-tags (0 2 2)) (all-the-icons (4 0 0))) "Beautify Org Mode tags" single ((:commit . "20193bf9b07efba03fdd5ffb2852cd43fcd88051") (:keywords "hypermedia") (:url . "https://github.com/stardiviner/org-tag-beautify"))]) + (org-tanglesync . [(20200127 1616) ((emacs (24 4))) "Syncing org src blocks with tangled external files" single ((:commit . "af83a73ae542d5cb3c9d433cbf2ce1d4f4259117") (:authors ("Mehmet Tekman")) (:maintainer "Mehmet Tekman") (:keywords "outlines") (:url . "https://github.com/mtekman/org-tanglesync.el"))]) + (org-tfl . [(20170923 1218) ((org (0 16 2)) (cl-lib (0 5)) (emacs (24 1))) "Transport for London meets Orgmode" tar ((:commit . "f0d7d39106a1de5457f5160cddd98ab892b61066") (:authors ("storax (David Zuber), <zuber [dot] david [at] gmx [dot] de>")) (:maintainer "storax (David Zuber), <zuber [dot] david [at] gmx [dot] de>") (:keywords "org" "tfl") (:url . "https://github.com/storax/org-tfl"))]) + (org-themis . [(20160122 404) ((cl-lib (0 4))) "Experimental project management mode for org-mode" single ((:commit . "78aadbbe22b1993be5c4accd0d3f91a4e85c9a3c") (:maintainer "Zachary Elliott" . "contact@zell.io") (:keywords "org-mode" "elisp" "project") (:url . "http://github.com/zellio/org-themis"))]) + (org-time-budgets . [(20200715 1016) ((alert (0 5 10)) (cl-lib (0 5))) "Define time budgets and display clocked time." single ((:commit . "1d6bfc323013bbf725167842d9e097fad805de03") (:authors ("Arthur Leonard Andersen" . "leoc.git@gmail.com")) (:maintainer "Arthur Leonard Andersen" . "leoc.git@gmail.com"))]) + (org-timeline . [(20210210 2306) ((dash (2 13 0)) (emacs (24 3))) "Add graphical view of agenda to agenda buffer." single ((:commit . "af1b44e18048278a116da89faf138310f09c74c6") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "calendar") (:url . "https://github.com/Fuco1/org-timeline/"))]) + (org-toodledo . [(20150301 1113) ((request-deferred (0 2 0)) (emacs (24)) (cl-lib (0 5))) "Toodledo integration for Emacs Org mode" tar ((:commit . "2c91a92bd07ae4a546771b018a6faa0e06399968") (:authors ("Christopher J. White" . "emacs@grierwhite.com")) (:maintainer "Christopher J. White" . "emacs@grierwhite.com") (:keywords "outlines" "data"))]) + (org-tracktable . [(20161118 1329) ((emacs (24)) (cl-lib (0 5))) "Track your writing progress in an org-table" single ((:commit . "8e0e60a582a034bd66d5efb72d513140b7d4d90a") (:authors ("tty-tourist" . "andreasrasholm@protonmail.com")) (:maintainer "tty-tourist" . "andreasrasholm@protonmail.com") (:keywords "org" "writing") (:url . "https://github.com/tty-tourist/org-tracktable"))]) + (org-transform-tree-table . [(20200413 1959) ((dash (2 10 0)) (s (1 3 0))) "Transform org-mode tree with properties to a table, and the other way around" single ((:commit . "d84e7fb87bf2d5fc2be252500de0cddf20facf4f") (:authors (nil . "Johan Lindstrom <buzzwordninja not_this_bit@googlemail.com>")) (:maintainer nil . "Johan Lindstrom <buzzwordninja not_this_bit@googlemail.com>") (:keywords "org-mode" "table" "org-table" "tree" "csv" "convert") (:url . "https://github.com/jplindstrom/emacs-org-transform-tree-table"))]) + (org-tree-slide . [(20210224 1213) ((emacs (24 4))) "A presentation tool for org-mode" single ((:commit . "9d2ba1df456d8d7c6372c8c294dbe3ee81540b33") (:authors ("Takaaki ISHIKAWA <takaxp at ieee dot org>")) (:maintainer "Takaaki ISHIKAWA <takaxp at ieee dot org>") (:keywords "convenience" "org-mode" "presentation" "narrowing") (:url . "https://github.com/takaxp/org-tree-slide"))]) + (org-tree-slide-pauses . [(20201215 146) ((emacs (24 5)) (org-tree-slide (2 8 4))) "Bring the pause command from Beamer to org-tree-slide" single ((:commit . "f02af7102e9ecef7c3dac0d376d85bbb8c4de4cc") (:authors ("cnngimenez")) (:maintainer "cnngimenez") (:keywords "convenience" "org-mode" "presentation") (:url . "https://github.com/cnngimenez/org-tree-slide-pauses"))]) + (org-treescope . [(20200503 1609) ((emacs (24 3)) (org (9 2 3)) (org-ql (0 5 -1)) (dash (2 17 0))) "Time scoping sparse trees within org" tar ((:commit . "905029a9e2ce6ed325bb8e10f59dc589c181d148") (:authors ("Mehmet Tekman")) (:maintainer "Mehmet Tekman") (:keywords "outlines") (:url . "https://github.com/mtekman/org-treescope.el"))]) + (org-treeusage . [(20200418 1904) ((emacs (26 1)) (dash (2 17 0)) (org (9 1 6))) "Examine the usage of org headings in a tree-like manner" tar ((:commit . "fe4323bc500e2d949848c75e8f59340971b35562") (:authors ("Mehmet Tekman")) (:maintainer "Mehmet Tekman") (:keywords "outlines") (:url . "https://github.com/mtekman/org-treeusage.el"))]) + (org-trello . [(20210314 1901) ((emacs (24 3)) (request-deferred (0 2 0)) (deferred (0 4 0)) (s (1 11 0)) (dash (2 18 0))) "Minor mode to synchronize org-mode buffer and trello board" tar ((:commit . "9c1c94dff1a46631669023286078b887d077c305") (:authors ("Antoine R. Dumont (@ardumont)" . "antoine.romain.dumont@gmail.com")) (:maintainer "Antoine R. Dumont (@ardumont)" . "antoine.romain.dumont@gmail.com") (:keywords "org-mode" "trello" "sync" "org-trello") (:url . "https://github.com/org-trello/org-trello"))]) + (org-variable-pitch . [(20210414 1844) ((emacs (25))) "Minor mode for variable pitch text in org mode." single ((:commit . "246120647e28a27506ca0894ba98e371086881fd") (:authors ("Göktuğ Kayaalp" . "self@gkayaalp.com")) (:maintainer "Göktuğ Kayaalp" . "self@gkayaalp.com") (:keywords "faces") (:url . "https://dev.gkayaalp.com/elisp/index.html#ovp"))]) + (org-vcard . [(20210208 305) nil "org-mode support for vCard export and import." tar ((:commit . "f4b7445550deb30e170a25fc42541e99730e21d0") (:authors ("Alexis" . "flexibeast@gmail.com") ("Will Dey" . "will123dey@gmail.com")) (:maintainer "Alexis" . "flexibeast@gmail.com") (:keywords "outlines" "org" "vcard") (:url . "https://github.com/flexibeast/org-vcard"))]) + (org-wc . [(20200731 2244) nil "Count words in org mode trees." single ((:commit . "dbbf794e4ec6c4080d945f43338185e34a4a582d") (:authors ("Simon Guest")) (:maintainer "Simon Guest"))]) + (org-web-tools . [(20201212 1058) ((emacs (25 1)) (org (9 0)) (dash (2 12)) (esxml (0 3 4)) (s (1 10 0)) (request (0 3 0))) "Display and capture web content with Org-mode" tar ((:commit . "b94a07add8558ef7b0666173dbb8a2554f1d41a6") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "hypermedia" "outlines" "org" "web") (:url . "http://github.com/alphapapa/org-web-tools"))]) + (org-wild-notifier . [(20210330 304) ((alert (1 2)) (async (1 9 3)) (dash (2 18 0)) (emacs (24 4))) "Customizable org-agenda notifications" single ((:commit . "772806f9d46fb93cabe9409c7a559eb7b9cda3d3") (:authors ("Artem Khramov" . "akhramov+emacs@pm.me")) (:maintainer "Artem Khramov" . "akhramov+emacs@pm.me") (:keywords "notification" "alert" "org" "org-agenda" "agenda") (:url . "https://github.com/akhramov/org-wild-notifier.el"))]) + (org-working-set . [(20210320 1019) ((org (9 3)) (dash (2 12)) (s (1 12)) (emacs (26 3))) "Manage and visit a small set of org-nodes." single ((:commit . "f5512304dccc152816f9957f5627c814bcb0f683") (:authors ("Marc Ihm" . "1@2484.de")) (:maintainer "Marc Ihm" . "1@2484.de") (:url . "https://github.com/marcIhm/org-working-set"))]) + (org-wunderlist . [(20191017 1917) ((request-deferred (0 2 0)) (alert (1 1)) (emacs (24)) (cl-lib (0 5)) (org (8 2 4)) (s (1 9 0))) "Org sync with Wunderlist" single ((:commit . "1a084bb49be4b5a1066db9cd9b7da2f8efab293f") (:authors ("myuhe <yuhei.maeda_at_gmail.com>")) (:maintainer "myuhe") (:keywords "convenience") (:url . "https://github.com/myuhe/org-wunderlist.el"))]) + (org2blog . [(20210422 339) ((htmlize (1 54)) (hydra (0 15 0)) (xml-rpc (1 6 12)) (metaweblog (1 1 1))) "Blog from Org mode to WordPress" tar ((:commit . "543813e0acceb55653d876302a5d5741879fb717") (:authors ("Puneeth Chaganti" . "punchagan+org2blog@gmail.com")) (:maintainer "Grant Rettke" . "grant@wisdomandwonder.com") (:keywords "comm" "convenience" "outlines" "wp") (:url . "https://github.com/org2blog/org2blog"))]) + (org2ctex . [(20200331 550) ((emacs (24 4))) "Export org to ctex (a latex macro for Chinese)" single ((:commit . "2e40aa5e78b0562516f46f689e7b74cdf451cc2a") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:url . "https://github.com/tumashu/org2ctex"))]) + (org2elcomment . [(20170324 945) ((org (8 3 4))) "Convert Org file to Elisp comments" single ((:commit . "c88a75d9587c484ead18f7adf08592b09c1cceb0") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions"))]) + (org2issue . [(20190531 941) ((org (8 0)) (emacs (24 4)) (ox-gfm (0 1)) (gh (0 1)) (s (20160405 920))) "export org to github issue" single ((:commit . "910b98c858762fd14b11d261626c5e979dde0833") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "convenience" "github" "org") (:url . "https://github.com/lujun9972/org2issue"))]) + (org2jekyll . [(20210220 1845) ((dash (2 18 0)) (s (1 9 0))) "Minor mode to publish org-mode post to jekyll without specific yaml" tar ((:commit . "e469373e0c656cec475c145037be1902d2622f09") (:authors ("Antoine R. Dumont (@ardumont)" . "antoine.romain.dumont@gmail.com")) (:maintainer "Antoine R. Dumont (@ardumont)" . "antoine.romain.dumont@gmail.com") (:keywords "org-mode" "jekyll" "blog" "publish") (:url . "https://github.com/ardumont/org2jekyll"))]) + (org2web . [(20210203 324) ((cl-lib (1 0)) (ht (1 5)) (mustache (0 22)) (htmlize (1 47)) (org (8 0)) (dash (2 0 0)) (el2org (0 10)) (simple-httpd (0 1))) "A static site generator based on org mode." tar ((:commit . "6f5c5f0cc5c877ac3a383782bbe8751264d807b6") (:authors ("Feng Shu <tumashu AT 163.com>") ("Jorge Javier Araya Navarro <elcorreo AT deshackra.com>") ("Kelvin Hu <ini DOT kelvin AT gmail DOT com>")) (:maintainer "Feng Shu <tumashu AT 163.com>") (:keywords "org-mode" "convenience" "beautify") (:url . "https://github.com/tumashu/org2web"))]) + (organic-green-theme . [(20201216 2240) nil "Low-contrast green color theme." single ((:commit . "0ed99a9c0cf14be0a1f491518821f0e9b7e88b88"))]) + (organize-imports-java . [(20210121 606) ((emacs (25 1)) (f (0 20 0)) (s (1 12 0)) (dash (2 14 1)) (ht (2 2))) "Automatically organize imports in Java code" tar ((:commit . "50c11af264505b026aed77d6b67a132f7d4f7e6b") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/organize-imports-java"))]) + (orgbox . [(20180827 218) ((org (8 0)) (cl-lib (0 5))) "Mailbox-like task scheduling Org." single ((:commit . "3982f56efd67ec016389cad82ce5a44f619b36a9") (:authors ("Yasuhito Takamiya" . "yasuhito@gmail.com")) (:maintainer "Yasuhito Takamiya" . "yasuhito@gmail.com") (:keywords "org") (:url . "https://github.com/yasuhito/orgbox"))]) + (orgit . [(20210525 1956) ((emacs (25 1)) (magit (3 0)) (org (9 4))) "support for Org links to Magit buffers" single ((:commit . "26242895ef1642bf30c63683fb224fdba25e0853") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/magit/orgit"))]) + (orgit-forge . [(20210525 1957) ((emacs (25 1)) (forge (0 2)) (magit (3 0)) (org (9 4)) (orgit (1 7))) "Org links to Forge issue buffers" single ((:commit . "ea2a1cf9d337901b413e9df258b8e07af55c00f6") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/magit/orgit-forge"))]) + (orglink . [(20200719 917) ((emacs (24 3)) (org (9 3)) (seq (2 20))) "use Org Mode links in other modes" single ((:commit . "2f1939488204f67d2a427f224b45596361b402b1") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "hypertext") (:url . "https://github.com/tarsius/orglink"))]) + (orglue . [(20200411 311) ((org (9 3)) (epic (0 2))) "more functionality to org-mode." tar ((:commit . "9d5a8e24be9acb8c55bb4d6aa8b98e30e2677401") (:authors ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainer "Yoshinari Nomura" . "nom@quickhack.net") (:keywords "org"))]) + (orgnav . [(20170608 1713) ((helm (2 7 0)) (s (1 11 0)) (dash (1 11 0)) (emacs (24))) "Org tree navigation using helm" tar ((:commit . "9e2cac9c1a67af5f0080e60022e821bf7b70312d") (:authors ("Facet Framer" . "facet@facetframer.com")) (:maintainer "Facet Framer" . "facet@facetframer.com") (:keywords "convenience" "outlines") (:url . "http://github.com/facetframer/orgnav"))]) + (orgstrap . [(20201129 604) ((emacs (24 4))) "Bootstrap an Org file using file local variables" single ((:commit . "5aec071702c21dcc777e75b575d3875141688e46") (:authors ("Tom Gillespie")) (:maintainer "Tom Gillespie") (:keywords "lisp" "org" "org-mode" "bootstrap") (:url . "https://github.com/tgbugs/orgstrap"))]) + (orgtbl-aggregate . [(20210315 1415) nil "Create an aggregated Org table from another one" tar ((:commit . "639ec296ccca4e2f7405e9ef72506fad609f2167") (:keywords "org" "table" "aggregation" "filtering"))]) + (orgtbl-ascii-plot . [(20200411 711) nil "ascii-art bar plots in org-mode tables" single ((:commit . "59618630205fc8c0fcc74fb34c4581d9712a5181") (:authors ("Thierry Banel tbanelwebmin at free dot fr") ("Michael Brand")) (:maintainer "Thierry Banel tbanelwebmin at free dot fr") (:keywords "org" "table" "ascii" "plot"))]) + (orgtbl-join . [(20210225 923) ((cl-lib (0 5))) "join columns from another table" tar ((:commit . "f411d38de5e36f65336a37e43cfe9a5125b6543a") (:authors ("Thierry Banel tbanelwebmin at free dot fr")) (:maintainer "Thierry Banel tbanelwebmin at free dot fr") (:keywords "org" "table" "join" "filtering"))]) + (orgtbl-show-header . [(20141023 837) nil "Show the header of the current column in the minibuffer" single ((:commit . "112d54a44682f065318ed0c9c89a8f5b8907342a") (:authors ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainer "Damien Cassou" . "damien.cassou@gmail.com"))]) + (origami . [(20200331 1019) ((s (1 9 0)) (dash (2 5 0)) (emacs (24)) (cl-lib (0 5))) "Flexible text folding" tar ((:commit . "e558710a975e8511b9386edc81cd6bdd0a5bda74") (:authors ("Greg Sexton" . "gregsexton@gmail.com")) (:maintainer "Greg Sexton" . "gregsexton@gmail.com") (:keywords "folding") (:url . "https://github.com/gregsexton/origami.el"))]) + (origami-predef . [(20200615 1044) ((emacs (24 3)) (origami (1 0))) "Apply folding when finding (opening) files" single ((:commit . "cc363f4b2fd20021ab330fc989369e2658457f93") (:authors ("Álvaro González Sotillo" . "alvarogonzalezsotillo@gmail.com")) (:maintainer "Álvaro González Sotillo" . "alvarogonzalezsotillo@gmail.com") (:keywords "convenience" "folding") (:url . "https://github.com/alvarogonzalezsotillo/origami-predef"))]) + (ormolu . [(20200930 1406) ((emacs (24)) (reformatter (0 4))) "Format Haskell source code using the \"ormolu\" program" single ((:commit . "c40264fb34affeedd260f5da2f7737baee90a780") (:authors ("Vasiliy Yorkin" . "vasiliy.yorkin@gmail.com")) (:maintainer "Vasiliy Yorkin") (:keywords "files" "tools") (:url . "https://github.com/vyorkin/ormolu.el"))]) + (orthodox-christian-new-calendar-holidays . [(20210507 1619) nil "Feasts (NS)" single ((:commit . "c0ba49bb01d037ce8800aa04db06f454ef043cb6") (:authors ("Carson Chittom" . "carson@wistly.net")) (:maintainer "Carson Chittom" . "carson@wistly.net") (:keywords "calendar") (:url . "https://github.com/cmchittom/orthodox-christian-new-calendar-holidays"))]) + (osa . [(20200522 2103) ((emacs (25 1))) "OSA (JavaScript / AppleScript) bridge" tar ((:commit . "615ca9eef4131a23d9971691fa0d0f20fe59d01b") (:authors ("xristos" . "xristos@sdf.org")) (:maintainer "xristos" . "xristos@sdf.org") (:keywords "extensions") (:url . "https://github.com/atomontage/osa"))]) + (osa-chrome . [(20201122 1639) ((emacs (25 1)) (osa (1 0))) "Google Chrome remote tab control" tar ((:commit . "9148e21cf2e91b357f5ea3a349975e8b89c8d5e4") (:authors ("xristos" . "xristos@sdf.org")) (:maintainer "xristos" . "xristos@sdf.org") (:keywords "comm") (:url . "https://github.com/atomontage/osa-chrome"))]) + (osx-browse . [(20140508 2041) ((string-utils (0 3 2)) (browse-url-dwim (0 6 6))) "Web browsing helpers for OS X" single ((:commit . "44ded7cc3a7ee426c1c3257fae534c121f7e752e") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "hypermedia" "external") (:url . "http://github.com/rolandwalker/osx-browse"))]) + (osx-clipboard . [(20141012 717) nil "Use the OS X clipboard from terminal Emacs" single ((:commit . "e46dd31327a3f92f77b013b4c9b1e5fdd0e5c73d") (:authors ("Jon Oddie <jonxfield at gmail.com>")) (:maintainer "Jon Oddie <jonxfield at gmail.com>") (:url . "https://github.com/joddie/osx-clipboard-mode"))]) + (osx-dictionary . [(20210309 115) ((cl-lib (0 5))) "Interface for OSX Dictionary.app" tar ((:commit . "4d4cc19fdd4ac8408bd5acc7694e7a7096b1e3b3") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:keywords "mac" "dictionary") (:url . "https://github.com/xuchunyang/osx-dictionary.el"))]) + (osx-lib . [(20191121 1440) ((emacs (24 4))) "Basic function for Apple/OSX." single ((:commit . "01cba80ccc20412759f87b8f7531580bb04ec9c1") (:authors ("Raghav Kumar Gautam" . "raghav@apache.org")) (:maintainer "Raghav Kumar Gautam" . "raghav@apache.org") (:keywords "apple" "applescript" "osx" "finder" "emacs" "elisp" "vpn" "speech") (:url . "https://github.com/raghavgautam/osx-lib"))]) + (osx-location . [(20200304 2209) ((emacs (24 1))) "Watch and respond to changes in geographical location on OS X" tar ((:commit . "18fcc306caa575c5afdeaf091aa1a9b003daa52a") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "convenience" "calendar") (:url . "https://github.com/purcell/osx-location"))]) + (osx-org-clock-menubar . [(20150205 2111) nil "simple menubar integration for org-clock" tar ((:commit . "9964d2a97cc2fb6570dc4116da44f73bd8eb7cb3") (:authors ("Jordon Biondo" . "jordonbiondo@gmail.com")) (:maintainer "Jordon Biondo" . "jordonbiondo@gmail.com") (:keywords "org" "osx") (:url . "https://github.com/jordonbiondo/osx-org-clock-menubar"))]) + (osx-plist . [(20200212 1724) ((emacs (25 1))) "Apple plist file parser" single ((:commit . "46d52aa186ea50a35c1780977bf0aa261bd53922") (:authors ("Theresa O'Connor" . "tess@oconnor.cx")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com") (:keywords "convenience") (:url . "https://github.com/gonewest818/osx-plist"))]) + (osx-pseudo-daemon . [(20200215 513) nil "Daemon mode that plays nice with OSX." single ((:commit . "94240ebb716f11af8427b6295c3f44c0c43419d3") (:authors ("Ryan C. Thompson")) (:maintainer "Ryan C. Thompson") (:keywords "convenience" "osx") (:url . "https://github.com/DarwinAwardWinner/osx-pseudo-daemon"))]) + (osx-trash . [(20210419 2229) ((emacs (24 1))) "System trash for OS X" tar ((:commit . "af74a2055a15bf4182d8196600f7decd66eec634") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com") (:keywords "files" "convenience" "tools" "unix") (:url . "https://github.com/lunaryorn/osx-trash.el"))]) + (otama . [(20160404 1032) nil "Org-table Manipulator" single ((:commit . "c114fd8006762f891bc120a7c0ea213872e7ab31") (:authors ("Yoshinari Nomura" . "nom@quickhack.net")) (:maintainer "Yoshinari Nomura" . "nom@quickhack.net") (:keywords "database" "org-mode"))]) + (other-emacs-eval . [(20180408 1348) ((emacs (25 1)) (async (1 9 2))) "Evaluate the Emacs Lisp expression in other Emacs" single ((:commit . "8ace5acafef65daabf0c6619eff60733d7f5d792") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:keywords "tools") (:url . "https://github.com/xuchunyang/other-emacs-eval"))]) + (outline-magic . [(20180619 1819) nil "outline mode extensions for Emacs" single ((:commit . "2a5f07417b696cf7541d435c43bafcc64817636b") (:authors ("Carsten Dominik" . "dominik@science.uva.nl")) (:maintainer "Thorsten Jolitz <tjolitz AT gmail DOT com>") (:keywords "outlines"))]) + (outline-minor-faces . [(20210530 1259) ((emacs (25 1))) "Headings faces for outline-minor-mode" single ((:commit . "942bd43ea7099984e9ebccf48db70af345d4b6bf") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "outlines") (:url . "https://github.com/tarsius/outline-minor-faces"))]) + (outline-toc . [(20200401 1208) nil "Sidebar showing a \"table of contents\"." single ((:commit . "81d373633b40628cc3a6b6fb534fd7730076bcdb") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:keywords "convenience" "outlines") (:url . "https://github.com/abingham/outline-toc.el"))]) + (outlook . [(20180428 1430) ((emacs (24 4))) "send emails in MS Outlook style" tar ((:commit . "359683aff91b38bd1398a6ed4058a06f09a02d65") (:authors ("Andrew Savonichev")) (:maintainer "Andrew Savonichev") (:keywords "mail") (:url . "https://github.com/asavonic/outlook.el"))]) + (outorg . [(20190720 2002) ((emacs (24 4))) "Org-style comment editing" single ((:commit . "ef0f86f4b893b30be8bcf8b43a5ec357a6c70f07") (:maintainer "Adam Porter" . "adam@alphapapa.net") (:url . "https://github.com/alphapapa/outorg"))]) + (outrespace . [(20190724 1553) ((emacs (24 4))) "Some c++ namespace utility functions" single ((:commit . "d8c1619ec81fd3f4e728212a3526cd13bc2b0147") (:authors ("Dan Harms" . "danielrharms@gmail.com")) (:maintainer "Dan Harms" . "danielrharms@gmail.com") (:keywords "tools" "c++" "namespace") (:url . "https://github.com/articuluxe/outrespace.git"))]) + (outshine . [(20191112 1414) ((outorg (2 0)) (cl-lib (0 5))) "outline with outshine outshines outline" tar ((:commit . "9334b555aaf1426a9e405a57b80809a1615627b3") (:authors ("Thorsten Jolitz")) (:maintainer "Thibault Polge" . "thibault@thb.lt") (:keywords "convenience" "outlines" "org") (:url . "https://github.com/alphapapa/outshine"))]) + (ov . [(20200326 1042) ((emacs (24 3))) "Overlay library for Emacs Lisp" single ((:commit . "c5b9aa4e1b00d702eb2caedd61c69a22a5fa1fab") (:authors ("Shingo Fukuyama - http://fukuyama.co")) (:maintainer "Shingo Fukuyama - http://fukuyama.co") (:keywords "convenience" "overlay") (:url . "https://github.com/ShingoFukuyama/ov.el"))]) + (overcast-theme . [(20200425 1601) ((emacs (24))) "A dark but vibrant color theme for Emacs" single ((:commit . "e02b835a08919ead079d7221d513348ac02ba92e") (:authors ("Mohammed Ismail Ansari" . "team.terminal@gmail.com")) (:maintainer "Mohammed Ismail Ansari" . "team.terminal@gmail.com") (:keywords "theme") (:url . "http://ismail.teamfluxion.com"))]) + (overseer . [(20180226 619) ((emacs (24)) (dash (2 10 0)) (pkg-info (0 4)) (f (0 18 1))) "Ert-runner Integration Into Emacs" single ((:commit . "02d49f582e80e36b4334c9187801c5ecfb027789") (:authors ("Samuel Tonini" . "tonini.samuel@gmail.com")) (:maintainer "Samuel Tonini" . "tonini.samuel@gmail.com") (:url . "http://www.github.com/tonini/overseer.el"))]) + (ovpn-mode . [(20210403 440) ((emacs (25)) (cl-lib (0 5))) "an openvpn management mode" single ((:commit . "4492098c771d094dd0661a5bc6906f65fb530825") (:authors ("Bas Alberts" . "bas@anti.computer")) (:maintainer "Bas Alberts" . "bas@anti.computer") (:keywords "comm") (:url . "https://github.com/anticomputer/ovpn-mode"))]) + (owcmd . [(20200517 2039) ((emacs (26 3))) "Run a single command in the other window" single ((:commit . "05fb8f8f81838b5888fdec8b3947096dd2222e61") (:authors ("Jacob First" . "jacob.first@member.fsf.org")) (:maintainer "Jacob First" . "jacob.first@member.fsf.org") (:keywords "convenience") (:url . "https://github.com/fishyfriend/owcmd"))]) + (owdriver . [(20200410 1901) ((smartrep (0 0 3)) (log4e (0 2 0)) (yaxception (0 2 0))) "Quickly perform various actions on other windows" single ((:commit . "3c52a7b11c8275fdb2e4cf98f68f2a48ad09a3ae") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "convenience") (:url . "https://github.com/aki2o/owdriver"))]) + (ox-asciidoc . [(20181230 620) ((org (8 1))) "AsciiDoc Back-End for Org Export Engine" single ((:commit . "efb74df1179702e19ce531f84993ac5b5039075f") (:authors ("Yasushi SHOJI" . "yasushi.shoji@gmail.com")) (:maintainer "Yasushi SHOJI" . "yasushi.shoji@gmail.com") (:keywords "org" "asciidoc") (:url . "https://github.com/yashi/org-asciidoc"))]) + (ox-bb . [(20210222 2002) ((emacs (24 4)) (org (8 0))) "BBCode Back-End for Org Export Engine" single ((:commit . "545d2e1547fdc48a5757152d19233effa11d9ee2") (:authors ("Christian Garbs" . "mitch@cgarbs.de")) (:maintainer "Christian Garbs" . "mitch@cgarbs.de") (:keywords "bbcode" "org" "export" "outlines") (:url . "https://github.com/mmitch/ox-bb"))]) + (ox-bibtex-chinese . [(20170723 309) ((emacs (24 4))) "Let ox-bibtex work well for Chinese users" tar ((:commit . "2ad2364399229144110db7ef6365ad0461d6a38c") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:url . "https://github.com/tumashu/ox-bibtex-chinese.git"))]) + (ox-clip . [(20210528 2059) ((org (8 2)) (htmlize (0))) "Cross-platform formatted copying for org-mode" single ((:commit . "05a14d56bbffe569d86f20b49ae31ed2ac7d1101") (:authors ("John Kitchin" . "jkitchin@andrew.cmu.edu")) (:maintainer "John Kitchin" . "jkitchin@andrew.cmu.edu") (:keywords "org-mode") (:url . "https://github.com/jkitchin/ox-clip"))]) + (ox-epub . [(20181101 1854) ((emacs (24 3)) (org (9))) "Export org mode projects to EPUB" single ((:commit . "c9629ef4b4bc40d51afefd8c0bb2c683931e6409") (:authors ("Mark Meyer" . "mark@ofosos.org")) (:maintainer "Mark Meyer" . "mark@ofosos.org") (:keywords "hypermedia") (:url . "http://github.com/ofosos/org-epub"))]) + (ox-gemini . [(20210102 1517) ((emacs (26 1))) "Output gemini formatted documents from org-mode" single ((:commit . "d88c10bcb10fc463fa5a2f6e29c8c94b75a314c0") (:authors ("Justin Abrahms" . "justin@abrah.ms")) (:maintainer "Justin Abrahms" . "justin@abrah.ms") (:keywords "lisp" "gemini") (:url . "https://git.sr.ht/~abrahms/ox-gemini"))]) + (ox-gfm . [(20170628 2102) nil "Github Flavored Markdown Back-End for Org Export Engine" single ((:commit . "99f93011b069e02b37c9660b8fcb45dab086a07f") (:authors ("Lars Tveito")) (:maintainer "Lars Tveito") (:keywords "org" "wp" "markdown" "github"))]) + (ox-haunt . [(20200202 229) ((emacs (24 3)) (org (9 0))) "Haunt-flavored HTML backend for the Org export engine" single ((:commit . "f3c8fda6fee78f45a259e5d218a519dfd11c00c7") (:authors ("Jakob L. Kreuze" . "zerodaysfordays@sdf.lonestar.org")) (:maintainer "Jakob L. Kreuze" . "zerodaysfordays@sdf.lonestar.org") (:keywords "convenience" "hypermedia" "wp") (:url . "https://git.sr.ht/~jakob/ox-haunt"))]) + (ox-html5slide . [(20131228 606) ((org (8 0))) "Export org-mode to HTML5 slide." single ((:commit . "4703dfbd9d79161509def673d2c1e118d722a58f") (:authors ("coldnew" . "coldnew.tw@gmail.com")) (:maintainer "coldnew" . "coldnew.tw@gmail.com") (:keywords "html" "presentation") (:url . "http://github.com/coldnew/org-html5slide"))]) + (ox-hugo . [(20210518 108) ((emacs (24 4)) (org (9 0))) "Hugo Markdown Back-End for Org Export Engine" tar ((:commit . "074c3abf0a6aa5d671da1a39a20137140ba41d24") (:keywords "org" "markdown" "docs") (:url . "https://ox-hugo.scripter.co"))]) + (ox-impress-js . [(20150412 1716) ((org (8))) "impress.js Back-End for Org Export Engine" tar ((:commit . "91c6d2af6af308ade352a03355c4fb551b238c6b") (:authors ("Takumi Kinjo <takumi dot kinjo at gmail dot org>")) (:maintainer "Takumi Kinjo <takumi dot kinjo at gmail dot org>") (:keywords "outlines" "hypermedia" "calendar" "wp") (:url . "https://github.com/kinjo/org-impress-js.el"))]) + (ox-ioslide . [(20161015 1338) ((emacs (24 1)) (org (8 0)) (cl-lib (0 5)) (f (0 17 2)) (makey (0 3))) "Export org-mode to Google I/O HTML5 slide." tar ((:commit . "6555680be5364c8ddd2bf446865cb1a82adb6b9e") (:authors ("coldnew" . "coldnew.tw@gmail.com")) (:maintainer "coldnew" . "coldnew.tw@gmail.com") (:keywords "html" "presentation") (:url . "http://github.com/coldnew/org-ioslide"))]) + (ox-jekyll-md . [(20180831 1732) nil "Export Jekyll on Markdown articles using org-mode." single ((:commit . "ff7b81733354c2b427293e531bb51647fa84fc88") (:authors ("Elsa Gonsiorowski" . "gonsie@me.com")) (:maintainer "Elsa Gonsiorowski" . "gonsie@me.com") (:keywords "org" "jekyll"))]) + (ox-jira . [(20201202 1658) ((org (8 3))) "JIRA Backend for Org Export Engine" single ((:commit . "0bd966ba241a2458d5097e256543eceee50d462c") (:authors ("Stig Brautaset" . "stig@brautaset.org")) (:maintainer "Stig Brautaset" . "stig@brautaset.org") (:keywords "outlines" "hypermedia" "wp") (:url . "https://github.com/stig/ox-jira.el"))]) + (ox-json . [(20191225 750) ((emacs (24)) (org (9)) (s (1 12))) "JSON export backend for Org mode" single ((:commit . "11609b0a4125d1cc6a1149748eeddeeff4e5df63") (:authors ("Jared Lumpe" . "mjlumpe@gmail.com")) (:maintainer "Jared Lumpe" . "mjlumpe@gmail.com") (:keywords "outlines") (:url . "https://github.com/jlumpe/ox-json"))]) + (ox-latex-subfigure . [(20200326 919) ((emacs (24 4)) (org (9 0))) "Subfigure for latex export" single ((:commit . "c4487689309dddff3228603754b69ab381cfa5dc") (:authors ("Quang Linh LE" . "linktohack@gmail.com")) (:maintainer "Quang Linh LE" . "linktohack@gmail.com") (:keywords "convenience" "ox" "latex" "subfigure" "org" "org-mode") (:url . "http://github.com/linktohack/ox-latex-subfigure"))]) + (ox-leanpub . [(20201129 2027) ((org (9 1)) (ox-gfm (1 0)) (emacs (26 1)) (s (1 12 0))) "Export Org documents to Leanpub book format" tar ((:commit . "e79c4c4429f64fe61cfa673dcd33273bba30f9db") (:authors ("Diego Zamboni" . "diego@zzamboni.org")) (:maintainer "Diego Zamboni" . "diego@zzamboni.org") (:keywords "files" "org" "leanpub") (:url . "https://gitlab.com/zzamboni/ox-leanpub"))]) + (ox-mdx-deck . [(20181115 1847) ((emacs (24)) (ox-hugo (0 7))) "org-mode to mdx-deck exporter" single ((:commit . "2e46ac76f7ac279c371474cbbf39634bbe40f4c7") (:authors ("Joshua Wolfe")) (:maintainer "Joshua Wolfe") (:keywords "lisp" "org" "ox" "mdx" "deck") (:url . "https://github.com/WolfeCub/ox-mdx-deck/"))]) + (ox-mediawiki . [(20180105 2154) ((cl-lib (0 5)) (s (1 9 0))) "Mediawiki Back-End for Org Export Engine" single ((:commit . "a9327150293e370e500ba55bddfe5fc435c6bf9b") (:authors ("Tom Alexander" . "tomalexander@paphus.com")) (:maintainer "Tom Alexander" . "tomalexander@paphus.com") (:keywords "org" "wp" "mediawiki") (:url . "https://github.com/tomalexander/orgmode-mediawiki"))]) + (ox-minutes . [(20180202 1734) ((emacs (24 4))) "Plain text backend for Org for Meeting Minutes" single ((:commit . "27c29f3fdb9181322ae56f8bace8d95e621230e5") (:authors ("Kaushal Modi" . "kaushal.modi@gmail.com")) (:maintainer "Kaushal Modi" . "kaushal.modi@gmail.com") (:keywords "org" "exporter" "notes") (:url . "https://github.com/kaushalmodi/ox-minutes"))]) + (ox-nikola . [(20151114 1116) ((emacs (24 4)) (org (8 2 4)) (ox-rst (0 2))) "Export Nikola articles using org-mode." single ((:commit . "5bcbc1a38f6619f62294194f13ca0cd4ca14dd48") (:authors ("IGARASHI Masanao" . "syoux2@gmail.com")) (:maintainer "IGARASHI Masanao" . "syoux2@gmail.com") (:keywords "org" "nikola") (:url . "https://github.com/masayuko/ox-nikola"))]) + (ox-pandoc . [(20180510 1338) ((org (8 2)) (emacs (24)) (dash (2 8)) (ht (2 0)) (cl-lib (0 5))) "org exporter for pandoc." single ((:commit . "aa37dc7e94213d4ebedb85c384c1ba35007da18e") (:authors ("KAWABATA, Taichi" . "kawabata.taichi@gmail.com")) (:maintainer "KAWABATA, Taichi" . "kawabata.taichi@gmail.com") (:keywords "tools") (:url . "https://github.com/kawabata/ox-pandoc"))]) + (ox-pukiwiki . [(20150124 1716) ((org (8 1))) "Pukiwiki Back-End for Org Export Engine" single ((:commit . "bdbde2c294f5d3de11f08a3fe19f01175d2e011a") (:authors ("Yasushi SHOJI" . "yasushi.shoji@gmail.com")) (:maintainer "Yasushi SHOJI" . "yasushi.shoji@gmail.com") (:keywords "org" "pukiwiki") (:url . "https://github.com/yashi/org-pukiwiki"))]) + (ox-qmd . [(20210529 1012) ((emacs (24 4)) (org (8 0))) "Qiita Markdown Back-End for Org Export Engine" single ((:commit . "7e69c04626f8d35756f3b049bd7836fb751f7734") (:authors ("0x60DF" . "0x60DF@gmail.com")) (:maintainer "0x60DF" . "0x60DF@gmail.com") (:keywords "wp") (:url . "https://github.com/0x60df/ox-qmd"))]) + (ox-report . [(20210604 1436) ((emacs (24 4)) (org-msg (0))) "Export your org file to minutes report PDF file" single ((:commit . "9354a9687f7175d26c854204878b2fe545c069b5") (:authors ("Matthias David" . "matthias@gnu.re")) (:maintainer "Matthias David" . "matthias@gnu.re") (:keywords "org" "outlines" "report" "exporter" "meeting" "minutes") (:url . "https://github.com/DarkBuffalo/ox-report"))]) + (ox-reveal . [(20210515 1007) ((org (8 3))) "reveal.js Presentation Back-End for Org Export Engine" single ((:commit . "826b01beb434d38e415d3001908baf5994c6d669") (:authors ("Yujie Wen <yjwen.ty at gmail dot com>")) (:maintainer "Yujie Wen <yjwen.ty at gmail dot com>") (:keywords "outlines" "hypermedia" "slideshow" "presentation"))]) + (ox-rfc . [(20201218 1356) ((emacs (24 3)) (org (8 3))) "RFC Back-End for Org Export Engine" tar ((:commit . "1a49535cf927cd52ffa05c815b890888c4addf86") (:authors ("Christian Hopps" . "chopps@devhopps.com")) (:maintainer "Christian Hopps" . "chopps@devhopps.com") (:keywords "org" "rfc" "wp" "xml") (:url . "https://github.com/choppsv1/org-rfc-export"))]) + (ox-rst . [(20200815 1511) ((emacs (25 1)) (org (8 3))) "Export reStructuredText using org-mode." single ((:commit . "99fa790da55b57a3f2e9aa187493ba434a64250e") (:authors ("Masanao Igarashi" . "syoux2@gmail.com")) (:maintainer "Masanao Igarashi" . "syoux2@gmail.com") (:keywords "org" "rst" "rest" "restructuredtext") (:url . "https://github.com/msnoigrs/ox-rst"))]) + (ox-slack . [(20200108 1546) ((emacs (24)) (org (9 1 4)) (ox-gfm (1 0))) "Slack Exporter for org-mode" single ((:commit . "89cedb9da6ea08b78bc1fe77d6a39aa078172c1e") (:authors ("Matt Price")) (:maintainer "Matt Price") (:keywords "org" "slack" "outlines") (:url . "https://github.com/titaniumbones/ox-slack"))]) + (ox-slimhtml . [(20210330 1941) ((emacs (24)) (cl-lib (0 6))) "a minimal HTML org export backend" single ((:commit . "72cffc4292c82d5f3a24717ed386a953862485d8") (:authors ("Elo Laszlo <hello at bald dot cat>")) (:maintainer "Elo Laszlo <hello at bald dot cat>") (:keywords "files"))]) + (ox-spectacle . [(20181211 953) ((org (8 3))) "spectacle.js Presentation Back-End for Org Export Engine" single ((:commit . "9d3ec9a6326289074d8620e97d65e3105307ff51") (:authors ("imfine" . "lorniu@gmail.com")) (:maintainer "imfine" . "lorniu@gmail.com") (:keywords "presentation"))]) + (ox-ssh . [(20201217 317) ((emacs (24 4))) "SSH Config Backend for Org Export Engine" single ((:commit . "1b39849e3a315de95543eb3cf69c42fa33a8f5cd") (:authors ("Dante Catalfamo")) (:maintainer "Dante Catalfamo") (:keywords "outlines" "org" "ssh") (:url . "https://github.com/dantecatalfamo/ox-ssh"))]) + (ox-textile . [(20180502 947) ((org (8 1))) "Textile Back-End for Org Export Engine" single ((:commit . "b179abaa6616604c6efe32cb509e62ad46e7374e") (:authors ("Yasushi SHOJI" . "yasushi.shoji@gmail.com")) (:maintainer "Yasushi SHOJI" . "yasushi.shoji@gmail.com") (:keywords "org" "textile") (:url . "https://github.com/yashi/org-textile"))]) + (ox-tiddly . [(20200927 857) ((org (8)) (emacs (24 4))) "Org TiddlyWiki exporter" single ((:commit . "3377d8732aa916e736ce5822c7a9a4fbdc894e37") (:authors ("Derek Feichtinger" . "derek.feichtinger@psi.ch")) (:maintainer "Derek Feichtinger" . "derek.feichtinger@psi.ch") (:keywords "org") (:url . "https://github.com/dfeich/org8-wikiexporters"))]) + (ox-timeline . [(20210118 536) ((emacs (24 4))) "HTML Timeline Back-End for Org Export Engine" single ((:commit . "238e05b01dde37fa27a3a8943cc04dcc9b9b83b2") (:authors ("Joel Bryan Juliano <joelbryan dot juliano at gmail dot com>")) (:maintainer "Joel Bryan Juliano <joelbryan dot juliano at gmail dot com>") (:keywords "simple timeline" "timeline" "hypermedia" "html timeline") (:url . "https://github.com/jjuliano/org-simple-timeline"))]) + (ox-trac . [(20171026 1823) ((org (9 0))) "Org Export Backend to Trac WikiFormat" single ((:commit . "03cc31efb1aa06991918f1071e250a9d58f96cfb") (:authors ("Brian J. Carlson <hacker (at) abutilize (dot) com>")) (:maintainer "Brian J. Carlson <hacker (at) abutilize (dot) com>") (:keywords "org-mode" "trac") (:url . "https://github.com/JalapenoGremlin/ox-trac"))]) + (ox-tufte . [(20160926 1607) ((org (8 2)) (emacs (24))) "Tufte HTML org-mode export backend" single ((:commit . "49d7ea78fde063b407ce6fa57739f90c83500682") (:authors ("M. Lee Hinman")) (:maintainer "M. Lee Hinman") (:keywords "org" "tufte" "html") (:url . "https://github.com/dakrone/ox-tufte"))]) + (ox-twbs . [(20200628 1949) nil "Bootstrap compatible HTML Back-End for Org" single ((:commit . "e8a27dc78b7be494d9918f26db7a3bbb6b45020b") (:authors ("Carsten Dominik <carsten at orgmode dot org>") ("Jambunathan K <kjambunathan at gmail dot com>") ("Brandon van Beekum <marsmining at gmail dot com>")) (:maintainer "Carsten Dominik <carsten at orgmode dot org>") (:keywords "org" "html" "publish" "twitter" "bootstrap") (:url . "https://github.com/marsmining/ox-twbs"))]) + (ox-twiki . [(20200927 857) ((org (8)) (emacs (24 4))) "Org Twiki and Foswiki export" single ((:commit . "3377d8732aa916e736ce5822c7a9a4fbdc894e37") (:authors ("Derek Feichtinger" . "derek.feichtinger@psi.ch")) (:maintainer "Derek Feichtinger" . "derek.feichtinger@psi.ch") (:keywords "org") (:url . "https://github.com/dfeich/org8-wikiexporters"))]) + (ox-wk . [(20191231 2058) ((emacs (24 4)) (org (8 3))) "Wiki Back-End for Org Export Engine" single ((:commit . "d34d1b72e4e940745a377bfa745dfb618900a09e") (:authors ("Vilibald Wanča" . "vilibald@wvi.cz")) (:maintainer "Vilibald Wanča" . "vilibald@wvi.cz") (:keywords "org" "wp" "wiki") (:url . "https://github.com/w-vi/ox-wk.el"))]) + (ox-zenn . [(20200924 1607) ((emacs (27 1)) (org (9 0))) "Zenn flavored markdown backend for org export engine" single ((:commit . "b53bd82116c9f7dbb5b476d2cfcc8ed0f3bc9c78") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "convenience") (:url . "https://github.com/conao3/ox-zenn.el"))]) + (p4 . [(20150721 1937) nil "Simple Perforce-Emacs Integration" single ((:commit . "eff047caa75dbe4965defca9d1212454cdb755d5") (:authors ("Gareth Rees" . "gdr@garethrees.org")) (:maintainer "Gareth Rees" . "gdr@garethrees.org") (:url . "https://github.com/gareth-rees/p4.el"))]) + (pabbrev . [(20160320 2101) nil "Predictive abbreviation expansion" single ((:commit . "56400d5d256b42ffe45c229ea9827f026b650cf5") (:authors ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) (:maintainer "Phillip Lord" . "phillip.lord@newcastle.ac.uk"))]) + (pacfiles-mode . [(20200915 1815) ((emacs (26)) (cl-lib (0 5))) "pacnew and pacsave merging tool" tar ((:commit . "8d06f64abc98c3f3338560c8d6eb47719e034069") (:authors ("Carlos G. Cordero <http://github/UndeadKernel>")) (:maintainer "Carlos G. Cordero" . "pacfiles@binarycharly.com") (:keywords "files" "pacman" "arch" "pacnew" "pacsave" "update" "linux") (:url . "https://github.com/UndeadKernel/pacfiles-mode"))]) + (pack . [(20191017 456) ((emacs (24)) (cl-lib (0 5))) "Pack and unpack archive files" single ((:commit . "85cd856fdc00a2365e88b50373b99f1b3d2227be") (:authors ("10sr" . "8.slashes@gmail.com")) (:maintainer "10sr" . "8.slashes@gmail.com") (:keywords "files" "dired") (:url . "https://github.com/10sr/pack-el"))]) + (package+ . [(20210124 640) ((emacs (24 3))) "Extensions for the package library." tar ((:commit . "06fbc904e09d3349b669c2624a587fee5accf5ef") (:authors ("Ryan Davis" . "ryand-ruby@zenspider.com")) (:maintainer "Ryan Davis" . "ryand-ruby@zenspider.com") (:keywords "extensions" "tools") (:url . "https://github.com/zenspider/package"))]) + (package-build . [(20210421 1333) ((cl-lib (0 5)) (emacs (25 1))) "Tools for assembling a package archive" tar ((:commit . "b4eec13201093070a12f37396afce83eb6771df5") (:authors ("Donald Ephraim Curtis" . "dcurtis@milkbox.net")) (:maintainer "Donald Ephraim Curtis" . "dcurtis@milkbox.net") (:keywords "tools") (:url . "https://github.com/melpa/package-build"))]) + (package-filter . [(20161122 719) nil "package archive whitelist and blacklist" single ((:commit . "bc73b41aea1d65ca44ef1593ca13126df9bbb39e") (:authors ("Donald Ephraim Curtis" . "dcurtis@milkbox.net")) (:maintainer "Donald Ephraim Curtis" . "dcurtis@milkbox.net") (:url . "https://github.com/milkypostman/package-filter"))]) + (package-lint . [(20210528 2348) ((cl-lib (0 5)) (emacs (24 1)) (let-alist (1 0 6))) "A linting library for elisp package authors" tar ((:commit . "10b6f3aab4f7c014ce339694255cf2c6dfd2bdea") (:authors ("Steve Purcell" . "steve@sanityinc.com") ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "lisp") (:url . "https://github.com/purcell/package-lint"))]) + (package-lint-flymake . [(20210530 319) ((emacs (26 1)) (package-lint (0 5))) "A package-lint Flymake backend" single ((:commit . "10b6f3aab4f7c014ce339694255cf2c6dfd2bdea") (:url . "https://github.com/purcell/package-lint"))]) + (package-loading-notifier . [(20210608 1406) ((emacs (25))) "Notify a package is being loaded" single ((:commit . "1e30d097de8939c4aa380915d3ba3060a87ce3c6") (:authors ("SeungKi Kim" . "tttuuu888@gmail.com")) (:maintainer "SeungKi Kim" . "tttuuu888@gmail.com") (:keywords "convenience" "faces" "config" "startup") (:url . "https://github.com/tttuuu888/package-loading-notifier"))]) + (package-safe-delete . [(20150116 1607) ((emacs (24)) (epl (0 7 -4))) "Safely delete package.el packages" single ((:commit . "138171e4fc03c0ef05a8260cbb5cd2e114c1c194") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/package-safe-delete"))]) + (package-utils . [(20210221 822) ((restart-emacs (0 1 1))) "Extensions for package.el" single ((:commit . "6a26accfdf9c0f1cbceb09d970bf9c25a72f562a") (:authors ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainer "Philippe Vaucher" . "philippe.vaucher@gmail.com") (:keywords "package" "convenience") (:url . "https://github.com/Silex/package-utils"))]) + (packed . [(20210503 2046) ((emacs (24 3))) "package manager agnostic Emacs Lisp package utilities" single ((:commit . "ed63b4803899c3719aeeba461e249c473e5b26f0") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "compile" "convenience" "lisp" "package" "library") (:url . "https://github.com/emacscollective/packed"))]) + (pacmacs . [(20210225 1255) ((emacs (24 4)) (dash (2 18 0)) (cl-lib (0 5)) (f (0 18 0))) "Pacman for Emacs" tar ((:commit . "5e0bcba1eeb10a4218087ff9cd6217d662fb775b") (:authors ("Codingteam" . "codingteam@conference.jabber.ru")) (:maintainer "Alexey Kutepov" . "reximkut@gmail.com") (:url . "http://github.com/codingteam/pacmacs.el"))]) + (pact-mode . [(20201219 2223) ((emacs (24 3))) "Mode for Pact, a LISPlike smart contract language." single ((:commit . "f48a4faf5f8f8435423bda3888eca6ee67ee13a9") (:authors ("Stuart Popejoy")) (:maintainer "Stuart Popejoy" . "stuart@kadena.io") (:keywords "pact" "lisp" "languages" "blockchain" "smartcontracts" "tools" "mode") (:url . "https://github.com/kadena-io/pact-mode"))]) + (paganini-theme . [(20180815 1921) ((emacs (24 0))) "A colorful, dark and warm theme." single ((:commit . "255c5a2a8abee9c5935465ec42b9c3604c178c3c") (:authors ("Onur Temizkan")) (:maintainer "Onur Temizkan") (:url . "https://github.com/onurtemizkan/paganini"))]) + (page-break-lines . [(20210104 2224) ((emacs (24 4))) "Display ^L page breaks as tidy horizontal lines" single ((:commit . "3b8549cd414d4d7ee0168ab9917124133566d3db") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "convenience" "faces") (:url . "https://github.com/purcell/page-break-lines"))]) + (pager . [(20151202 120) nil "windows-scroll commands" single ((:commit . "5c791ed23f1136e04040d6f4bc9b4ca5b6dc919f") (:authors (nil . "Mikael Sjödin -- mic@docs.uu.se")) (:maintainer nil . "Mikael Sjödin -- mic@docs.uu.se"))]) + (pager-default-keybindings . [(20130719 2057) ((pager (1 0))) "Add the default keybindings suggested for pager.el" single ((:commit . "dbbd49c2ac5906d1dabf9e9c832bfebc1ab405b3") (:authors ("Nathaniel Flath" . "nflath@gmail.com")) (:maintainer "Nathaniel Flath" . "nflath@gmail.com") (:url . "http://github.com/nflath/pager-default-keybindings"))]) + (pair-tree . [(20210214 1651) ((emacs (27 1)) (dash (2 17 0))) "Visualize a list" single ((:commit . "972ba441c40edf9b2c212f64fc6670104749662b") (:authors ("Zainab Ali <zainab @kebab-ca.se>")) (:maintainer "Zainab Ali <zainab @kebab-ca.se>") (:keywords "lisp" "tools") (:url . "https://github.com/zainab-ali/pair-tree"))]) + (palimpsest . [(20200804 2308) nil "Various deletion strategies when editing" single ((:commit . "f474b3ad706373d9953abdc401d683a2a023d28e") (:authors ("Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com")) (:maintainer "Daniel Szmulewicz" . "daniel.szmulewicz@gmail.com"))]) + (pallet . [(20150512 702) ((dash (2 10 0)) (s (1 9 0)) (f (0 17 1)) (cask (0 7))) "A package management tool for Emacs, using Cask." tar ((:commit . "b8d0df1883224a371ac0a3bc9b9c1c4dc61e6ac0") (:authors ("Robert Dallas Gray")) (:maintainer "Robert Dallas Gray") (:keywords "elpa" "package") (:url . "https://github.com/rdallasgray/pallet"))]) + (pamparam . [(20210105 1513) ((emacs (26 1)) (lispy (0 27 0)) (worf (0 1 0)) (ivy-posframe (0 5 5))) "Simple and fast flashcards." tar ((:commit . "0ba91149095bee8c43688c68f83f4d365fbe6771") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "outlines" "hypermedia" "flashcards" "memory") (:url . "https://github.com/abo-abo/pamparam"))]) + (panda . [(20200715 338) ((emacs (25))) "Client for Bamboo's REST API." single ((:commit . "44beb80ac991e58231c05dc4afa1646fa768d573") (:authors ("Sebastian Monia" . "smonia@outlook.com")) (:maintainer "Sebastian Monia" . "smonia@outlook.com") (:keywords "maint" "tool") (:url . "https://github.com/sebasmonia/panda"))]) + (panda-theme . [(20181128 1738) ((emacs (24))) "Panda Theme" single ((:commit . "60aa47c7a930377807da0d601351ad91e8ca446a") (:authors ("jamiecollinson" . "jamiecollinson@gmail.com")) (:maintainer "jamiecollinson" . "jamiecollinson@gmail.com") (:url . "https://github.com/jamiecollinson/emacs-panda-theme"))]) + (pandoc . [(20161128 1157) ((emacs (24 4))) "Pandoc interface" single ((:commit . "198d262d09e30448f1672338b0b5a81cf75e1eaa") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "hypermedia" "documentation" "markup" "converter") (:url . "https://github.com/zonuexe/pandoc.el"))]) + (pandoc-mode . [(20210317 2340) ((hydra (0 10 0)) (dash (2 10 0))) "Minor mode for interacting with Pandoc" tar ((:commit . "2ad3cfa3045e0a3bcbdee02819c6fd356a8bc40c") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm") (:keywords "text" "pandoc") (:url . "http://joostkremers.github.io/pandoc-mode/"))]) + (pangu-spacing . [(20190823 401) nil "Minor-mode to add space between Chinese and English characters." single ((:commit . "f92898949ba3bf991fd229416f3bbb54e9c6c223") (:authors ("coldnew" . "coldnew.tw@gmail.com")) (:maintainer "coldnew" . "coldnew.tw@gmail.com") (:url . "http://github.com/coldnew/pangu-spacing"))]) + (paper-theme . [(20200510 5) ((emacs (24))) "A minimal Emacs colour theme." single ((:commit . "246120647e28a27506ca0894ba98e371086881fd") (:authors ("Göktuğ Kayaalp")) (:maintainer "Göktuğ Kayaalp") (:keywords "theme" "paper") (:url . "https://dev.gkayaalp.com/elisp/index.html#paper"))]) + (paperless . [(20201130 1241) ((emacs (24 4)) (f (0 11 0)) (s (1 10 0)) (cl-lib (0 6 1))) "A major mode for sorting and filing PDF documents." tar ((:commit . "2db39586a2914f78f345379511d0e8cea4c96b86") (:authors ("Anthony Green" . "green@moxielogic.com")) (:maintainer "Anthony Green" . "green@moxielogic.com") (:keywords "pdf" "convenience") (:url . "http://github.com/atgreen/paperless"))]) + (paradox . [(20191011 1111) ((emacs (24 4)) (seq (1 7)) (let-alist (1 0 3)) (spinner (1 7 3)) (hydra (0 13 2))) "A modern Packages Menu. Colored, with package ratings, and customizable." tar ((:commit . "339fe3518d1d102b2295670340e75caf4f01a29a") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") (:keywords "package" "packages") (:url . "https://github.com/Malabarba/paradox"))]) + (parchment-theme . [(20200910 2310) ((autothemer (0 2))) "Light theme inspired by Acme and Leuven" single ((:commit . "95e8248edbdb01fedc7db4472bcce90d2d872106") (:authors ("Alex Griffin" . "a@ajgrf.com")) (:maintainer "Alex Griffin" . "a@ajgrf.com") (:url . "https://github.com/ajgrf/parchment"))]) + (paredit . [(20191121 2328) nil "minor mode for editing parentheses" single ((:commit . "8330a41e8188fe18d3fa805bb9aa529f015318e8") (:authors ("Taylor R. Campbell" . "campbell+paredit@mumble.net")) (:maintainer "Taylor R. Campbell" . "campbell+paredit@mumble.net") (:keywords "lisp"))]) + (paredit-everywhere . [(20210510 531) ((paredit (22))) "Enable some paredit features in non-lisp buffers" single ((:commit . "b81e5d5356c85001a71640941b469aea9cf2e309") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "languages" "convenience"))]) + (paredit-menu . [(20160128 1733) ((paredit (25))) "Adds a menu to paredit.el as memory aid" single ((:commit . "cc0ae85bd819f9ebfa4f2a419ab3b2d70e39c9c8") (:authors ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) (:maintainer "Phillip Lord" . "phillip.lord@newcastle.ac.uk") (:keywords "paredit"))]) + (paren-completer . [(20160501 1052) ((emacs (24 3))) "Automatically, language agnostically, fill in delimiters." single ((:commit . "74183a8e13fa1266271bdcbcb4bfb29a4f915f0a") (:authors ("Matthew Bregg")) (:maintainer "Matthew Bregg") (:keywords "convenience") (:url . "https://github.com/MatthewBregg/paren-completer"))]) + (paren-face . [(20210127 1749) nil "a face for parentheses in lisp modes" single ((:commit . "6790c7fdec490a69e7d460c0bea36ad343776f9b") (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/tarsius/paren-face"))]) + (parent-mode . [(20150824 2300) nil "get major mode's parent modes" single ((:commit . "db692cf08deff2f0e973e6e86e26662b44813d1b") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/parent-mode"))]) + (parinfer-rust-mode . [(20210413 2) ((emacs (26 1))) "An interface for the parinfer-rust library" tar ((:commit . "c2c1bbec6cc7dad4f546868aa07609b8d58a78f8") (:authors ("Justin Barclay" . "justinbarclay@gmail.com")) (:maintainer "Justin Barclay" . "justinbarclay@gmail.com") (:keywords "lisp" "tools") (:url . "https://github.com/justinbarclay/parinfer-rust-mode"))]) + (parrot . [(20191015 2127) ((emacs (24 1))) "Party Parrot rotates gracefully in mode-line." tar ((:commit . "29265d118267e524453aaa9121c4eae213a63164") (:authors ("Daniel Ting" . "deep.paren.12@gmail.com")) (:maintainer "Daniel Ting" . "deep.paren.12@gmail.com") (:keywords "party" "parrot" "rotate" "sirocco" "kakapo" "games") (:url . "https://github.com/dp12/parrot.git"))]) + (parse-csv . [(20160512 1723) nil "Parse strings with CSV fields into s-expressions" single ((:commit . "96bef1ffbc89ea12d13311c9fa239c5c3e864890") (:authors ("Edward Marco Baringer (Common Lisp)") ("Matt Curtis" . "matt.r.curtis@gmail.com")) (:maintainer "Matt Curtis" . "matt.r.curtis@gmail.com") (:keywords "csv") (:url . "https://github.com/mrc/el-csv"))]) + (parse-it . [(20210306 821) ((emacs (25 1)) (s (1 12 0))) "Basic Parser in Emacs Lisp" tar ((:commit . "f910af3b1d98b88a0f41794bbe7fd57411e9b909") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/parse-it"))]) + (parsebib . [(20210108 1525) ((emacs (25 1))) "A library for parsing bib files" single ((:commit . "25ea94f57c6f3531dd8383f8c5a45ee8d81272bd") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm") (:keywords "text" "bibtex") (:url . "https://github.com/joostkremers/parsebib"))]) + (parsec . [(20180730 16) ((emacs (24)) (cl-lib (0 5))) "Parser combinator library" single ((:commit . "2cbbbc2254aa7bcaa4fb5e07c8c1bf2f381dba26") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions") (:url . "https://github.com/cute-jumper/parsec.el"))]) + (parseclj . [(20201012 712) ((emacs (25)) (a (0 1 0 -3 4))) "Clojure/EDN parser" tar ((:commit . "eff941126859bc9e949eae5cd6c2592e731629f2") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net") (:keywords "lisp" "clojure" "edn" "parser"))]) + (parseedn . [(20200419 1124) ((emacs (25)) (a (0 1 0 -3 4)) (parseclj (0 1 0))) "Clojure/EDN parser" single ((:commit . "90cfe3df51b96f85e346f336c0a0ee6bf7fee508") (:authors ("Arne Brasseur" . "arne@arnebrasseur.net")) (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net") (:keywords "lisp" "clojure" "edn" "parser"))]) + (pasp-mode . [(20180404 1700) ((emacs (24 3))) "- A major mode for editing Answer Set Programs." single ((:commit . "59385eb0e8ebcfc8c11dd811fb145d4b0fa3cc92") (:authors ("Henrik Jürges" . "juerges.henrik@gmail.com")) (:maintainer "Henrik Jürges" . "juerges.henrik@gmail.com") (:keywords "asp" "pasp" "answer set programs" "potassco answer set programs" "major mode" "languages") (:url . "https://github.com/santifa/pasp-mode"))]) + (pass . [(20210203 810) ((emacs (25)) (password-store (2 1 0)) (password-store-otp (0 1 5)) (f (0 17))) "Major mode for password-store.el" single ((:commit . "5651da53137db9adcb125b4897c2fe27eeb4368d") (:authors ("Nicolas Petton" . "petton.nicolas@gmail.com") ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Nicolas Petton" . "petton.nicolas@gmail.com") (:keywords "password-store" "password" "keychain"))]) + (passmm . [(20210109 8) ((emacs (24 4)) (password-store (0))) "A minor mode for pass (Password Store)." single ((:commit . "d78d1bf4f397180d2256248df589f33aafb4c8b4") (:authors ("Peter Jones" . "pjones@devalot.com")) (:maintainer "Peter Jones" . "pjones@devalot.com") (:url . "https://github.com/pjones/passmm"))]) + (password-generator . [(20210425 2227) nil "Password generator for humans. Good, Bad, Phonetic passwords included." single ((:commit . "c1da9790d594bc745cdbcc8003153e408aa92a5f") (:authors ("Vandrlexay")) (:maintainer "Vandrlexay") (:url . "http://github.com/vandrlexay/emacs-password-genarator"))]) + (password-mode . [(20210323 1816) ((emacs (25 1))) "Hide password text using overlays" single ((:commit . "114b721ebbf384b6af6fd46797e83896a9e14aca") (:authors ("Jürgen Hötzel" . "juergen@archlinux.org")) (:maintainer "Jürgen Hötzel" . "juergen@archlinux.org") (:keywords "docs" "password" "passphrase") (:url . "https://github.com/juergenhoetzel/password-mode"))]) + (password-store . [(20200328 1214) ((emacs (25)) (s (1 9 0)) (with-editor (2 5 11)) (auth-source-pass (5 0 0))) "Password store (pass) support" single ((:commit . "1078f2514d579178d5df7042c6a790e9c9b731ad") (:authors ("Svend Sorensen" . "svend@svends.net")) (:maintainer "Tino Calancha" . "tino.calancha@gmail.com") (:keywords "tools" "pass" "password" "password-store") (:url . "https://www.passwordstore.org/"))]) + (password-store-otp . [(20190713 1748) ((emacs (25)) (s (1 9 0)) (password-store (0 1))) "Password store (pass) OTP extension support" single ((:commit . "04998c8578a060ab4a4e8f46f2ee0aafad4ab4d5") (:authors ("Daniel Barreto")) (:maintainer "Daniel Barreto") (:keywords "tools" "pass") (:url . "https://github.com/volrath/password-store-otp.el"))]) + (password-vault . [(20160126 1820) ((cl-lib (0 2)) (emacs (24))) "A Password manager for Emacs." single ((:commit . "dc56e6c2f5da66f1ab63736cecf08fb2c6c2b30f") (:authors ("Javier \"PuercoPop\" Olaechea" . "pirata@gmail.com")) (:maintainer "Javier \"PuercoPop\" Olaechea" . "pirata@gmail.com") (:keywords "password" "productivity") (:url . "http://github.com/PuercoPop/password-vault"))]) + (paste-of-code . [(20170709 2355) ((emacs (24 3)) (request (0 2 0))) "paste code on https://paste.ofcode.org" single ((:commit . "92d258e8ec98598d847ecab82903f9224c7c2050") (:authors ("Bernhard Specht" . "bernhard@specht.net")) (:maintainer "Bernhard Specht" . "bernhard@specht.net") (:keywords "lisp"))]) + (pastebin . [(20101125 2002) nil "A simple interface to the www.pastebin.com webservice" single ((:commit . "8e9a829298ce0f747ab80758aa26caeb2af6cb30"))]) + (pastehub . [(20140615 620) nil "A client for the PasteHub cloud service" single ((:commit . "37b045c67659c078f1517d0fbd5282dab58dca23") (:authors ("Kiyoka Nishiyama")) (:maintainer "Kiyoka Nishiyama") (:url . "https://github.com/kiyoka/pastehub"))]) + (pastelmac-theme . [(20151031 236) ((emacs (24 1))) "a soothing theme with a pastel color palette" single ((:commit . "bead21741e3f46f6506e8aef4469d4240a819389") (:authors ("Brian Mastenbrook" . "brian@mastenbrook.net")) (:maintainer "Brian Mastenbrook" . "brian@mastenbrook.net") (:keywords "themes") (:url . "https://github.com/bmastenbrook/pastelmac-theme-el"))]) + (pastery . [(20171114 349) ((emacs (24 4)) (request (0 2 0))) "paste snippets to pastery.net." tar ((:commit . "4493be98b743b4d062cb4e00760125e394a55022") (:authors ("Bruno Dias" . "dias.h.bruno@gmail.com")) (:maintainer "Bruno Dias" . "dias.h.bruno@gmail.com") (:keywords "tools") (:url . "https://github.com/diasbruno/pastery.el"))]) + (path-headerline-mode . [(20140423 1332) nil "Displaying file path on headerline." single ((:commit . "b5b2725c6a8b1cb592fc242b7dbbd54b4dff2e69") (:authors ("7696122")) (:maintainer "7696122") (:keywords "headerline") (:url . "https://github.com/7696122/path-headerline-mode"))]) + (path-helper . [(20181208 2229) ((emacs (24))) "Set PATH environment variables from config files" single ((:commit . "34538affb3f341b3c56a875bb094ddb2b859a8ef") (:authors ("Arnaud Rouanet" . "arnaud@rouanet.org")) (:maintainer "Arnaud Rouanet" . "arnaud@rouanet.org") (:keywords "tools" "unix") (:url . "https://github.com/arouanet/path-helper"))]) + (pathify . [(20160423 846) nil "Symlink your scripts into a PATH directory" single ((:commit . "401b184c743694a60b3bc4273fc43de05cd5ac4b") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "convenience") (:url . "https://gitlab.com/alezost-emacs/pathify"))]) + (paxedit . [(20160730 1727) ((cl-lib (0 5)) (paredit (23))) "Structured, Context Driven LISP Editing and Refactoring" single ((:commit . "09f3d5aeb108937a801e77ef413e29eaa4ecc4be") (:authors ("Mustafa Shameem")) (:maintainer "Mustafa Shameem") (:keywords "lisp" "refactoring" "context") (:url . "https://github.com/promethial/paxedit"))]) + (pbcopy . [(20150225 459) nil "Emacs Interface to pbcopy" single ((:commit . "338f7245746b5de1bb96c5cc2b32bfd9b5d83272") (:authors ("Daniel Nelson")) (:maintainer "Daniel Nelson") (:keywords "mac" "osx" "pbcopy") (:url . "https://github.com/jkp/pbcopy.el"))]) + (pc-bufsw . [(20201011 1918) nil "PC style quick buffer switcher" single ((:commit . "a7295e4813d636d5a20605d134acd42e4e4fe8fa") (:authors ("Igor Bukanov" . "igor@mir2.org")) (:maintainer "Igor Bukanov" . "igor@mir2.org") (:keywords "buffer") (:url . "https://github.com/ibukanov/pc-bufsw"))]) + (pcache . [(20201226 634) ((emacs (25 1))) "persistent caching for Emacs." single ((:commit . "893d2a637423bae2cc5e72c559e3a9d1518797c9") (:authors ("Yann Hodique" . "yann.hodique@gmail.com")) (:maintainer "Yann Hodique" . "yann.hodique@gmail.com") (:keywords "extensions"))]) + (pcap-mode . [(20161025 1448) ((emacs (24 3))) "Major mode for working with PCAP files" single ((:commit . "52780669af0ade136f84d73f21b4dbb7ab655416") (:authors ("Aaron Conole" . "aconole@bytheb.org")) (:maintainer "Aaron Conole" . "aconole@bytheb.org") (:keywords "pcap" "packets" "tcpdump" "wireshark" "tshark"))]) + (pcmpl-args . [(20190223 1613) nil "Enhanced shell command completion" single ((:commit . "0b8a05fc6e370fa9c466250659619f8d6b53d446") (:authors ("Jonathan Waltman" . "jonathan.waltman@gmail.com")) (:maintainer "Jonathan Waltman" . "jonathan.waltman@gmail.com") (:keywords "abbrev" "completion" "convenience" "processes" "terminals" "unix") (:url . "https://github.com/JonWaltman/pcmpl-args.el"))]) + (pcmpl-git . [(20170121 59) nil "pcomplete for git" tar ((:commit . "9472ac70baeda025ef7becd1cf141d72aec93f32") (:authors ("Leo Liu" . "sdl.web@gmail.com")) (:maintainer "Leo Liu" . "sdl.web@gmail.com") (:keywords "tools"))]) + (pcmpl-homebrew . [(20200911 742) nil "pcomplete for homebrew" single ((:commit . "a2044042dd498abad1dc06162a8ee0d70314ca40") (:authors ("zwild" . "judezhao@outlook.com")) (:maintainer "zwild" . "judezhao@outlook.com") (:keywords "pcomplete" "homebrew" "tools" "cask" "services"))]) + (pcmpl-pip . [(20181229 1420) ((s (1 12 0)) (f (0 19 0)) (seq (2 15))) "pcomplete for pip" single ((:commit . "bc79228674ad5c1bc458c90dd8839790fb0a09e8") (:authors ("zwild" . "judezhao@outlook.com")) (:maintainer "zwild" . "judezhao@outlook.com") (:keywords "pcomplete" "pip" "python" "tools"))]) + (pcomplete-extension . [(20190928 519) ((emacs (24)) (cl-lib (0 5))) "additional completion for pcomplete" single ((:commit . "bc5eb204fee659e0980056009409b44bc7655716") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://github.com/thierryvolpiatto/pcomplete-extension"))]) + (pcre2el . [(20161120 2103) ((emacs (24)) (cl-lib (0 3))) "regexp syntax converter" single ((:commit . "0b5b2a2c173aab3fd14aac6cf5e90ad3bf58fa7d") (:authors ("joddie <jonxfield at gmail.com>")) (:maintainer "joddie <jonxfield at gmail.com>") (:url . "https://github.com/joddie/pcre2el"))]) + (pcsv . [(20150220 1131) nil "Parser of csv" single ((:commit . "798e0933f8d0818beb17aebf3b1056bbf74e03d0") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "data") (:url . "https://github.com/mhayashi1120/Emacs-pcsv/raw/master/pcsv.el"))]) + (pdb-capf . [(20200419 1237) ((emacs (25 1))) "Completion-at-point function for python debugger" single ((:commit . "2f4099aa1330f87df4e9cd526de057ee9b71de6c") (:authors ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainer "Andrii Kolomoiets" . "andreyk.mad@gmail.com") (:keywords "languages" "abbrev" "convenience") (:url . "https://github.com/muffinmad/emacs-pdb-capf"))]) + (pdb-mode . [(20150128 1751) nil "Major mode for editing Protein Data Bank files" single ((:commit . "855fb18ebb73b5df30c8d7677c2bcd0f361b138a") (:authors (nil . "charles.bond@uwa.edu.au")) (:maintainer nil . "aix.bing@gmail.com") (:keywords "data" "pdb") (:url . "http://bondxray.org/software/pdb-mode/"))]) + (pdf-tools . [(20210531 1613) ((emacs (24 3)) (tablist (1 0)) (let-alist (1 0 4))) "Support library for PDF documents" tar ((:commit . "5f77dae43eb8f71e52e10ba8cf994883f74c3fb7") (:authors ("Andreas Politz" . "politza@fh-trier.de")) (:maintainer "Andreas Politz" . "politza@fh-trier.de") (:keywords "files" "multimedia") (:url . "http://github.com/vedang/pdf-tools/"))]) + (pdf-view-restore . [(20190904 1708) ((pdf-tools (0 90)) (emacs (26 0))) "Support for opening last known pdf position in pdfview mode" single ((:commit . "5a1947c01a3edecc9e0fe7629041a2f53e0610c9") (:authors ("Kevin Kim" . "kevinkim1991@gmail.com")) (:maintainer "Kevin Kim" . "kevinkim1991@gmail.com") (:keywords "files" "convenience") (:url . "https://github.com/007kevin/pdf-view-restore"))]) + (pdfgrep . [(20210203 1730) ((emacs (24 4))) "run `pdfgrep' and display the results." single ((:commit . "a4ca0a1e6521de93f28bb6736a5344b4974d144c") (:authors ("Jérémy Compostella" . "jeremy.compostella@gmail.com")) (:maintainer "Jérémy Compostella" . "jeremy.compostella@gmail.com") (:keywords "extensions" "mail" "pdf" "grep") (:url . "https://github.com/jeremy-compostella/pdfgrep"))]) + (peacock-theme . [(20170808 1320) ((emacs (24 0))) "an Emacs 24 theme based on Peacock (tmTheme)" single ((:commit . "9e46fbfb562b6e26c6e3d6d618b044b3694da4c8") (:authors ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))]) + (peek-mode . [(20130620 1946) ((elnode (0 9 8 1))) "Serve buffers live over HTTP with elnode backend" tar ((:commit . "55a7dd011375330c7d57322257a5167516702c71") (:authors ("Erik Iverson" . "erik@sigmafield.org")) (:maintainer "Erik Iverson" . "erik@sigmafield.org") (:url . "https://github.com/erikriverson/peek-mode"))]) + (peep-dired . [(20160321 2237) nil "Peep at files in another window from dired buffers" single ((:commit . "29f6e7058f635b0084880a1f890a6c92501e8c29") (:authors ("Adam Sokolnicki" . "adam.sokolnicki@gmail.com")) (:maintainer "Adam Sokolnicki" . "adam.sokolnicki@gmail.com") (:keywords "files" "convenience"))]) + (peertube . [(20210101 1007) ((emacs (25 1)) (transmission (0 12 1))) "Query and download PeerTube videos" single ((:commit . "bb529db154596e86327829edbd7144b67cf72255") (:authors ("yoctocell" . "public@yoctocell.xyz")) (:maintainer "yoctocell" . "public@yoctocell.xyz") (:keywords "peertube" "multimedia") (:url . "https://git.sr.ht/~yoctocell/peertube"))]) + (pelican-mode . [(20190124 2336) ((emacs (25))) "Minor mode for editing Pelican sites" single ((:commit . "65d7caf5d926599a5007eb7bc279215908aa5252") (:authors ("Joe Wreschnig" . "joe.wreschnig@gmail.com")) (:maintainer "Joe Wreschnig" . "joe.wreschnig@gmail.com") (:keywords "convenience" "editing") (:url . "https://git.korewanetadesu.com/pelican-mode.git"))]) + (pepita . [(20200228 2257) ((emacs (25)) (csv (2 1))) "Run Splunk search commands, export results to CSV/HTML/JSON" single ((:commit . "c72c4a6f1e47ed5fe5103e0eaadad5a76deeec30") (:authors ("Sebastian Monia" . "smonia@outlook.com")) (:maintainer "Sebastian Monia" . "smonia@outlook.com") (:keywords "tools" "convenience" "matching") (:url . "https://github.com/sebasmonia/pepita.git"))]) + (per-buffer-theme . [(20200527 1256) nil "No description available." single ((:commit . "f29b5c57198ebfedbf142f95129190c6c00b4822"))]) + (perfect-margin . [(20190722 126) ((emacs (24 0)) (cl-lib (0 5))) "auto center windows, work with minimap and/or linum-mode" single ((:commit . "94b055c743b1859098870c8aca3e915bd6e67d9d") (:authors ("Randall Wang" . "randall.wjz@gmail.com")) (:maintainer "Randall Wang" . "randall.wjz@gmail.com") (:keywords "convenience" "frames") (:url . "https://github.com/mpwang/perfect-margin"))]) + (perlbrew . [(20161109 709) nil "A perlbrew wrapper for Emacs" single ((:commit . "3a3406c3307c92aa30f9400d430925c434a3b6f0") (:authors ("Kentaro Kuribayashi" . "kentarok@gmail.com")) (:maintainer "Kentaro Kuribayashi" . "kentarok@gmail.com") (:keywords "emacs" "perl"))]) + (persistent-overlays . [(20161128 700) nil "Minor mode to store selected overlays to be loaded later" tar ((:commit . "f563c8b966edc78c9d806661c4eb80e4781c4eab") (:authors ("Michael Neilly" . "mneilly@yahoo.com")) (:maintainer "Michael Neilly" . "mneilly@yahoo.com") (:keywords "overlays" "persistent") (:url . "https://github.com/mneilly/Emacs-Persistent-Overlays"))]) + (persistent-scratch . [(20200921 2309) ((emacs (24))) "Preserve the scratch buffer across Emacs sessions" single ((:commit . "57221e5fdff22985c0ea2f3e7c282ce823ea5932") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/persistent-scratch"))]) + (persistent-soft . [(20150223 1853) ((pcache (0 3 1)) (list-utils (0 4 2))) "Persistent storage, returning nil on failure" single ((:commit . "a1e0ddf2a12a6f18cab565dee250f070384cbe02") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "data" "extensions") (:url . "http://github.com/rolandwalker/persistent-soft"))]) + (persp-fr . [(20191108 754) ((emacs (25 1)) (persp-mode (2 9 6)) (dash (2 13 0))) "In persp-mode, show perspective list in the GUI window title" single ((:commit . "1adbb6a9f9a4db580a9b7ed8b4091738e01345e6") (:authors ("Francesc Rocher" . "francesc.rocher@gmail.com")) (:maintainer "Francesc Rocher" . "francesc.rocher@gmail.com") (:keywords "perspectives" "workspace" "windows" "convenience") (:url . "http://github.com/rocher/persp-fr"))]) + (persp-mode . [(20201128 2015) ((emacs (24 3))) "windows/buffers sets shared among frames + save/load." single ((:commit . "298df111f081b5925f0aa0126a1b8d334117e0a2") (:authors ("Constantin Kulikov (Bad_ptr)" . "zxnotdead@gmail.com")) (:maintainer "Constantin Kulikov (Bad_ptr)" . "zxnotdead@gmail.com") (:keywords "perspectives" "session" "workspace" "persistence" "windows" "buffers" "convenience") (:url . "https://github.com/Bad-ptr/persp-mode.el"))]) + (persp-mode-project-bridge . [(20210524 656) ((emacs (27 1)) (persp-mode (2 9))) "Integration of persp-mode + project.el" single ((:commit . "c8a2b76c4972c1e00648def5a9b59a2942bd462a") (:authors ("Constantin Kulikov (Bad_ptr)" . "zxnotdead@gmail.com") ("Siavash Askari Nasr" . "siavash.askari.nasr@gmail.com")) (:maintainer "Siavash Askari Nasr" . "siavash.askari.nasr@gmail.com") (:keywords "vc" "persp-mode" "perspective" "project" "project.el") (:url . "https://github.com/CIAvash/persp-mode-project-bridge"))]) + (persp-mode-projectile-bridge . [(20170315 1120) ((persp-mode (2 9)) (projectile (0 13 0)) (cl-lib (0 5))) "persp-mode + projectile integration." single ((:commit . "f6453cd7b8b4352c06e771706f2c5b7e2cdff1ce") (:authors ("Constantin Kulikov (Bad_ptr)" . "zxnotdead@gmail.com")) (:maintainer "Constantin Kulikov (Bad_ptr)" . "zxnotdead@gmail.com") (:keywords "persp-mode" "projectile") (:url . "https://github.com/Bad-ptr/persp-mode-projectile-bridge.el"))]) + (persp-projectile . [(20180616 1944) ((perspective (1 9)) (projectile (0 11 0)) (cl-lib (0 3))) "Perspective integration with Projectile" single ((:commit . "533808b3e4f8f95a1e3ed9c55d9aa720277ebd5f") (:authors ("Daniel Wu")) (:maintainer "Daniel Wu") (:keywords "project" "convenience"))]) + (perspective . [(20210610 548) ((emacs (24 4)) (cl-lib (0 5))) "switch between named \"perspectives\" of the editor" single ((:commit . "68b13cef8435cae581850415cdda17e245dd0eae") (:authors ("Natalie Weizenbaum" . "nex342@gmail.com")) (:maintainer "Natalie Weizenbaum" . "nex342@gmail.com") (:keywords "workspace" "convenience" "frames") (:url . "http://github.com/nex3/perspective-el"))]) + (perspeen . [(20171203 1021) ((emacs (25 0)) (powerline (2 4))) "An package for multi-workspace" tar ((:commit . "edb70c530bda50ff3d1756e32a703d5fef5e5480") (:authors ("Peng Li" . "seudut@gmail.com")) (:maintainer "Peng Li" . "seudut@gmail.com") (:keywords "lisp") (:url . "https://github.com/seudut/perspeen"))]) + (pest-mode . [(20200321 504) ((emacs (26 3))) "Major mode for editing Pest files" single ((:commit . "43447a2c70f98edd1139005e32f437d3f142442b") (:authors ("ksqsf" . "i@ksqsf.moe")) (:maintainer "ksqsf" . "i@ksqsf.moe") (:keywords "languages") (:url . "https://github.com/ksqsf/pest-mode"))]) + (pfuture . [(20200425 1357) ((emacs (25 2))) "a simple wrapper around asynchronous processes" single ((:commit . "d7926de3ba0105a36cfd00811fd6278aea903eef") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/pfuture"))]) + (pg . [(20130731 2142) nil "Emacs Lisp interface to the PostgreSQL RDBMS" single ((:commit . "4f6516ec3946d95dcef49abb6703cc89ecb5183d") (:authors ("Eric Marsden" . "emarsden@laas.fr")) (:maintainer "Helmut Eller" . "heller@common-lisp.net") (:keywords "data" "comm" "database" "postgresql"))]) + (pgdevenv . [(20150105 2236) nil "Manage your PostgreSQL development envs" tar ((:commit . "7f1d5bc734750aca98cf67a9491cdbd5615fd132") (:authors ("Dimitri Fontaine" . "dim@tapoueh.org")) (:maintainer "Dimitri Fontaine" . "dim@tapoueh.org") (:keywords "emacs" "postgresql" "development" "environment" "shell" "debug" "gdb"))]) + (ph . [(20161029 1522) ((emacs (24 3))) "A global minor mode for managing multiple projects." tar ((:commit . "ed80dad9211583ed0db633448b3624c99b7fac23") (:authors ("Alexander Gromnitsky" . "alexander.gromnitsky@gmail.com")) (:maintainer "Alexander Gromnitsky" . "alexander.gromnitsky@gmail.com"))]) + (phabricator . [(20160510 1425) ((emacs (24 4)) (dash (1 0)) (projectile (0 13 0)) (s (1 10 0)) (f (0 17 2))) "Phabricator/Arcanist helpers for Emacs." single ((:commit . "d09d6f059aea92d3b11c68664a5e80c901182ab8") (:authors ("Andrew Tulloch")) (:maintainer "Andrew Tulloch") (:keywords "phabricator" "arcanist" "diffusion") (:url . "https://github.com/ajtulloch/phabricator.el"))]) + (phan . [(20200805 356) ((emacs (24)) (composer (0 0 8)) (f (0 17))) "Utility functions for Phan (PHP static analizer)" single ((:commit . "b7d523630bb072c4dbcfa9995dc734b25b72a69f") (:authors ("USAMI Kenta" . "tadsan@pixiv.com")) (:maintainer "USAMI Kenta" . "tadsan@pixiv.com") (:keywords "tools" "php") (:url . "https://github.com/emacs-php/phan.el"))]) + (phi-autopair . [(20210306 424) ((paredit (20))) "another simple-minded autopair implementation" single ((:commit . "6a67c37d31a3ff9261fc9f812547a0c86721fc90") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://zk-phi.gitub.io/"))]) + (phi-grep . [(20210306 425) ((cl-lib (0 1)) (emacs (26 1))) "Interactively-editable recursive grep implementation in elisp" single ((:commit . "7e2804c7ab4e875c7511917692c4b192662aa1ae") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://github.com/zk-phi/phi-grep"))]) + (phi-rectangle . [(20200911 204) nil "another rectangle-mark command (rewrite of rect-mark)" single ((:commit . "43ee8aea9998b34a9fdb28d7da2e4f75e4154030") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://zk-phi.github.io/"))]) + (phi-search . [(20200510 906) nil "another incremental search & replace, compatible with \"multiple-cursors\"" tar ((:commit . "c34f5800968922d1f9e7b10092b8705d6640ad18") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))]) + (phi-search-dired . [(20200816 1542) ((phi-search (2 2 0))) "interactive filtering for dired powered by phi-search" single ((:commit . "f014a9fb0b6a94af2df0e22f91ef79ce6996afd7") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))]) + (phi-search-mc . [(20160324 1503) ((phi-search (2 0 0)) (multiple-cursors (1 2 1))) "multiple-cursors extension for phi-search" single ((:commit . "7aa671910f766437089aec26c3aa7814222d1356") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:keywords "search" "cursors") (:url . "https://github.com/knu/phi-search-mc.el"))]) + (phi-search-migemo . [(20170618 921) ((phi-search (2 2 0)) (migemo (1 9 1))) "migemo extension for phi-search" single ((:commit . "308909ebfc8003d16673f97ca9eb26a667b72969") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))]) + (phoenix-dark-mono-theme . [(20170729 1406) nil "Monochromatic version of the Phoenix theme" single ((:commit . "a54f515d162148bcb38676980bc2316adb3d7b8b") (:authors ("J Irving" . "j@lollyshouse.ca")) (:maintainer "J Irving" . "j@lollyshouse.ca") (:url . "http://github.com/j0ni/phoenix-dark-mono"))]) + (phoenix-dark-pink-theme . [(20190821 48) nil "Originally a port of the Sublime Text 2 theme" single ((:commit . "ddd98a45775be105984ec598384e68df3d3e8046") (:authors ("J Irving" . "j@lollyshouse.ca")) (:maintainer "J Irving" . "j@lollyshouse.ca") (:url . "http://github.com/j0ni/phoenix-dark-pink"))]) + (php-boris . [(20130527 821) nil "Run boris php REPL" single ((:commit . "f2faebf610c917f7091f7ec0cd97645629c4f819") (:authors ("Tom Regner")) (:maintainer "Tom Regner" . "tom@goochesa.de") (:keywords "php" "commint" "repl" "boris"))]) + (php-boris-minor-mode . [(20140209 1835) ((php-boris (0 0 1)) (highlight (0))) "a minor mode to evaluate PHP code in the Boris repl" single ((:commit . "c70e176dd6545f2d42ca3427e87b469635616d8a") (:authors ("steckerhalter")) (:maintainer "steckerhalter") (:keywords "php" "repl" "eval") (:url . "https://github.com/steckerhalter/php-boris-minor-mode"))]) + (php-cs-fixer . [(20201126 1538) ((cl-lib (0 5))) "php-cs-fixer wrapper." single ((:commit . "c5b5d8a4986b31bade5e2a57131469bf90630db8") (:authors ("Philippe Ivaldi for OVYA")) (:maintainer "Philippe Ivaldi for OVYA") (:keywords "languages" "php") (:url . "https://github.com/OVYA/php-cs-fixer"))]) + (php-eldoc . [(20140202 1941) nil "eldoc backend for php" tar ((:commit . "df05064146b884d9081e10657e32dc480f070cfe") (:authors ("sabof")) (:maintainer "sabof") (:url . "https://github.com/sabof/php-eldoc"))]) + (php-mode . [(20210519 1728) ((emacs (25 2))) "Major mode for editing PHP code" tar ((:commit . "9561a6c0a92a3d7c00e7e57972f42cb5be775898") (:authors ("Eric James Michael Ritz")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "languages" "php") (:url . "https://github.com/emacs-php/php-mode"))]) + (php-quickhelp . [(20201108 1132) ((emacs (25 1))) "Quickhelp at point for php" single ((:commit . "e36fc61a7061044ab7984421997566b97776f722") (:authors ("Vincenzo Pupillo")) (:maintainer "Vincenzo Pupillo") (:url . "https://github.com/vpxyz/php-quickhelp"))]) + (php-refactor-mode . [(20171124 635) nil "Minor mode to quickly and safely perform common refactorings" single ((:commit . "7a794b0618df2882b1bd586fdd698dba0bc5130d") (:authors ("Matthew M. Keeler" . "keelerm84@gmail.com")) (:maintainer "Matthew M. Keeler" . "keelerm84@gmail.com") (:keywords "php" "refactor") (:url . "https://github.com/keelerm84/php-refactor-mode.el"))]) + (php-runtime . [(20181212 1825) ((emacs (25)) (cl-lib (0 5)) (f (0 20)) (s (1 7))) "Language binding bridge to PHP" single ((:commit . "017e0e70f07d6b25e37d5c5f4d271a914b677631") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "processes" "php") (:url . "https://github.com/emacs-php/php-runtime.el"))]) + (php-scratch . [(20201108 750) ((emacs (24 3)) (s (1 11 0)) (php-mode (1 17 0))) "A scratch buffer to interactively evaluate php code" single ((:commit . "a9db3986144fff424c93228a613f54734ef993a8") (:authors ("Tijs Mallaerts" . "tijs.mallaerts@gmail.com")) (:maintainer "Tijs Mallaerts" . "tijs.mallaerts@gmail.com"))]) + (phpactor . [(20210517 1838) ((emacs (25 1)) (f (0 17)) (php-runtime (0 2)) (composer (0 2 0)) (async (1 9 3))) "Interface to Phpactor" tar ((:commit . "debf66848c6099415c731b179dcd47e96db3b50b") (:authors ("USAMI Kenta" . "tadsan@zonu.me") ("Mikael Kermorgant" . "mikael@kgtech.fi")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "tools" "php") (:url . "https://github.com/emacs-php/phpactor.el"))]) + (phpstan . [(20201122 950) ((emacs (24 3)) (php-mode (1 22 3))) "Interface to PHPStan" single ((:commit . "6863a5278fc656cddb604b0c6e165f05d0171d0a") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "tools" "php") (:url . "https://github.com/emacs-php/phpstan.el"))]) + (phpt-mode . [(20190512 1809) ((emacs (25)) (polymode (0 1 5)) (php-mode (1 21 2))) "Major mode for editing PHPT test code" single ((:commit . "deb386f1a81003074c476f15e1975d445ff6df01") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "languages" "php") (:url . "https://github.com/emacs-php/phpt-mode"))]) + (phpunit . [(20180829 1438) ((s (1 12 0)) (f (0 19 0)) (pkg-info (0 6)) (cl-lib (0 5)) (emacs (24 3))) "Launch PHP unit tests using phpunit" tar ((:commit . "fe6bc91c3bd8b329c6d26ad883a025f06b5121ee") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com") ("Eric Hansen" . "hansen.c.eric@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "tools" "php" "tests" "phpunit") (:url . "https://github.com/nlamirault/phpunit.el"))]) + (pianobar . [(20201002 1756) nil "thin wrapper for Pianobar, a Pandora Radio client" single ((:commit . "d708417608df4f09ee565fddaad03dfe181829a8") (:authors ("Aaron Griffith" . "aargri@gmail.com")) (:maintainer "Aaron Griffith" . "aargri@gmail.com") (:url . "http://github.com/agrif/pianobar.el"))]) + (pickle . [(20190923 354) ((emacs (25 1)) (cl-lib (0 6 1))) "Major mode for editing cucumber gherkin files." single ((:commit . "3a0a717f2a24827667f34bc53830a3b81cd57460") (:authors ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com") (:keywords "ahungry" "languages" "cucumber" "gherkin") (:url . "https://github.com/ahungry/pickle-mode"))]) + (picpocket . [(20210103 2315) ((emacs (25 1))) "Image viewer" single ((:commit . "fa3a49f011b5ae139728548fec7375743f61c7c7") (:authors ("Johan Claesson" . "johanwclaesson@gmail.com")) (:maintainer "Johan Claesson" . "johanwclaesson@gmail.com") (:keywords "multimedia") (:url . "https://github.com/johanclaesson/picpocket"))]) + (pig-mode . [(20180520 1400) nil "Major mode for Pig files" single ((:commit . "4c6c6e1b1bb719d8adc6c47cc24665f6fe558959") (:maintainer "David A. Shamma"))]) + (pig-snippets . [(20130913 624) ((yasnippet (0 8 0))) "Snippets for pig-mode" tar ((:commit . "4c6c6e1b1bb719d8adc6c47cc24665f6fe558959") (:authors ("Peter Vasil" . "mail@petervasil.net")) (:maintainer "Peter Vasil" . "mail@petervasil.net") (:keywords "snippets") (:url . "https://github.com/motus/pig-mode"))]) + (pikchr-mode . [(20210324 2125) ((emacs (27 1))) "A major mode for the pikchr diagram markup language" single ((:commit . "5d424c5c97ac854cc44c369e654e4f906fcae3c8") (:authors ("Johann Klähn" . "johann@jklaehn.de")) (:maintainer "Johann Klähn" . "johann@jklaehn.de") (:keywords "languages") (:url . "https://github.com/kljohann/pikchr-mode"))]) + (pillar . [(20141112 1811) ((makey (0 3))) "Major mode for editing Pillar files" tar ((:commit . "13a7f676544cc66005ccd8e6fc1c25e4ccd6f909") (:authors ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainer "Damien Cassou" . "damien.cassou@gmail.com") (:keywords "markup" "major-mode") (:url . "http://github.com/DamienCassou/pillar-mode"))]) + (pinboard . [(20200630 1544) ((emacs (25 1)) (cl-lib (0 5))) "A pinboard.in client" single ((:commit . "d426f9d2ebec5f907c8a89d6b38ccbcb13750d4f") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "hypermedia" "bookmarking" "reading" "pinboard") (:url . "https://github.com/davep/pinboard.el"))]) + (pinboard-api . [(20140324 1148) nil "Rudimentary http://pinboard.in integration" single ((:commit . "b7b5214d0c35178f8dca08cf22d6ef3c21f0fce4") (:authors ("Danie Roux" . "danie@danieroux.com")) (:maintainer "Danie Roux" . "danie@danieroux.com") (:keywords "pinboard" "www") (:url . "https://github.com/danieroux/pinboard-api-el"))]) + (pinboard-popular . [(20180511 1726) ((loop (1 4))) "Displays links from the pinboard.in popular page." single ((:commit . "c0bc76cd35f8ecf34723c64a702b82eec2751318") (:keywords "pinboard") (:url . "https://github.com/asimpson/pinboard-popular"))]) + (pine-script-mode . [(20210608 1703) ((emacs (24))) "Trading View Pine Script major mode" single ((:commit . "9cb58a4d5e3182180ece6ea8e2fc5c5643eb4d28") (:authors ("Eric Crosson" . "eric.s.crosson@utexas.edu")) (:maintainer "Eric Crosson" . "eric.s.crosson@utexas.edu") (:keywords "extensions") (:url . "https://github.com/ericcrosson/pine-script-mode"))]) + (pinot . [(20140211 2026) nil "Emacs interface to pinot-search" tar ((:commit . "67fda555a155b22bb2ce44ba618b4bd6fc5f144a") (:authors ("Takafumi Arakaki <aka.tkf at gmail.com>")) (:maintainer "Takafumi Arakaki <aka.tkf at gmail.com>"))]) + (pinyin . [(20180620 1241) ((cl-lib (0 5)) (emacs (24))) "Convert Hanzi to Pinyin (汉字转拼音)" tar ((:commit . "e5508e5aa1ad4cfa05a7f4d299e5a155b288ec4c") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:keywords "extensions") (:url . "https://github.com/xuchunyang/pinyin.el"))]) + (pinyin-search . [(20160515 358) ((pinyinlib (0 1 0))) "Search Chinese by Pinyin" single ((:commit . "2e877a76851009d41bde66eb33182a03a7f04262") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:keywords "chinese" "search") (:url . "https://github.com/xuchunyang/pinyin-search.el"))]) + (pinyinlib . [(20200911 1723) nil "Convert first letter of Pinyin to Simplified/Traditional Chinese characters" single ((:commit . "1772c79b6f319b26b6a394a8dda065be3ea4498d") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions"))]) + (pip-requirements . [(20181027 1629) ((dash (2 8 0))) "A major mode for editing pip requirements files." single ((:commit . "216cd1690f80cc965d4ae47b8753fc185f778ff6") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) + (pipenv . [(20210127 1444) ((emacs (25 1)) (s (1 12 0)) (pyvenv (1 20))) "A Pipenv porcelain" single ((:commit . "8f50c68d415307a2cbc65cc4df20df18e1776e9b") (:authors ("Paul Walsh" . "paulywalsh@gmail.com")) (:maintainer "Paul Walsh" . "paulywalsh@gmail.com") (:url . "https://github.com/pwalsh/pipenv.el"))]) + (pippel . [(20180710 856) ((emacs (25 1)) (s (1 11 0)) (dash (2 12 0))) "Frontend to python package manager pip" tar ((:commit . "21a5200e8e5ccaa1911abb4ebf090b76ca839756") (:authors ("Fritz Stelzer" . "brotzeitmacher@gmail.com")) (:maintainer "Fritz Stelzer" . "brotzeitmacher@gmail.com") (:url . "https://github.com/brotzeitmacher/pippel"))]) + (pixie-mode . [(20180626 541) ((clojure-mode (3 0 1)) (inf-clojure (1 0 0))) "Major mode for Pixie-lang" single ((:commit . "a40c2632cfbe948852a5cdcfd44e6a65db11834d") (:authors ("John Walker" . "john.lou.walker@gmail.com")) (:maintainer "John Walker" . "john.lou.walker@gmail.com") (:url . "https://github.com/johnwalker/pixie-mode"))]) + (pixiv-novel-mode . [(20160220 1421) nil "Major mode for pixiv novel" single ((:commit . "0d1ca524d92b91f20a7105402a773bc21779b434") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "novel" "pixiv"))]) + (pkg-info . [(20150517 1143) ((epl (0 8))) "Information about packages" single ((:commit . "76ba7415480687d05a4353b27fea2ae02b8d9d61") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Sebastian Wiesner" . "swiesner@lunaryorn.com") (:keywords "convenience") (:url . "https://github.com/lunaryorn/pkg-info.el"))]) + (pkgbuild-mode . [(20210123 1507) ((emacs (26 1))) "Interface to the ArchLinux package manager" single ((:commit . "8a5e95c8514315cb40c47f1acdb68a4ace921497") (:authors ("Juergen Hoetzel" . "juergen@hoetzel.info")) (:maintainer "Juergen Hoetzel" . "juergen@hoetzel.info") (:keywords "languages") (:url . "https://github.com/juergenhoetzel/pkgbuild-mode"))]) + (plain-org-wiki . [(20201217 1027) ((emacs (24 3)) (ivy (0 12 0))) "Simple jump-to-org-files in a directory package" single ((:commit . "faeeb54ca808bbf0f4380a938e75805b7a78dbf7") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "convenience") (:url . "https://github.com/abo-abo/plain-org-wiki"))]) + (plain-theme . [(20171124 410) ((emacs (24))) "Plain theme without syntax highlighting" single ((:commit . "48b37b9b19d8f1e0accbf930f30b5346cf7959fe"))]) + (plan9-theme . [(20180804 1441) nil "A color theme for Emacs based on Plan9" single ((:commit . "c2da2fcb241e9800d931a1ff19ecd9fd84d30382") (:authors ("John Louis Del Rosario" . "john2x@gmail.com")) (:maintainer "John Louis Del Rosario" . "john2x@gmail.com") (:url . "https://github.com/john2x/plan9-theme.el"))]) + (planemo-mode . [(20201216 1122) ((emacs (27 1)) (dash (2 17 0))) "Minor mode for editing Galaxy XML files" single ((:commit . "9a981f79a2727f87689ae5a07368c41d35902a67") (:authors ("Mehmet Tekman")) (:maintainer "Mehmet Tekman") (:keywords "outlines") (:url . "https://gitlab.com/mtekman/planemo-mode.el"))]) + (planet-theme . [(20161031 217) ((emacs (24))) "A dark theme inspired by Gmail's 'Planets' theme of yore" single ((:commit . "b0a310ff36565fe22224c407cf59569986698a32") (:authors ("Charlie McMackin" . "charlie.mac@gmail.com")) (:maintainer "Charlie McMackin" . "charlie.mac@gmail.com") (:keywords "themes") (:url . "https://github.com/cmack/emacs-planet-theme"))]) + (plantuml-mode . [(20191102 2056) ((dash (2 0 0)) (emacs (25 0))) "Major mode for PlantUML" single ((:commit . "ea45a13707abd2a70df183f1aec6447197fc9ccc") (:authors ("Zhang Weize (zwz)")) (:maintainer "Carlo Sciolla (skuro)") (:keywords "uml" "plantuml" "ascii"))]) + (plaster . [(20180127 2050) ((emacs (24 3))) "Pasting to a plaster host with buffers." single ((:commit . "4d18c8bc3322668ac1695e25c556bda6771af1d5") (:authors ("Nicolas Hafner" . "shinmera@tymoon.eu")) (:maintainer "Nicolas Hafner" . "shinmera@tymoon.eu") (:keywords "convenience" "paste service") (:url . "http://github.com/shirakumo/plaster/"))]) + (platformio-mode . [(20210511 957) ((emacs (25 1)) (async (1 9 0)) (projectile (0 13 0))) "PlatformIO integration" single ((:commit . "f4fd8932995a8aed80eab14e54232010c2889012") (:authors ("Zach Massia" . "zmassia@gmail.com") ("Dante Catalfamo" . "dante@lambda.cx")) (:maintainer "Zach Massia" . "zmassia@gmail.com") (:url . "https://github.com/zachmassia/platformio-mode"))]) + (play-crystal . [(20180114 1024) ((emacs (24 4)) (dash (2 12 0)) (request (0 2 0))) "https://play.crystal-lang.org integration." single ((:commit . "0b4810a9025213bd11dbcbfd38b3ca928829e0a5") (:authors ("Vitalii Elenhaupt")) (:maintainer "Vitalii Elenhaupt") (:keywords "convenience") (:url . "https://github.com/veelenga/play-crystal.el"))]) + (play-routes-mode . [(20170426 733) nil "Play Framework Routes File Support" single ((:commit . "22d7b87e0eaf0330f2b2283872f8dc08a3258771") (:authors ("M.Riehl <max@flatmap.ninja>, P.Haun" . "bomgar85@googlemail.com")) (:maintainer "M.Riehl <max@flatmap.ninja>, P.Haun" . "bomgar85@googlemail.com") (:keywords "play" "scala") (:url . "https://github.com/brocode/play-routes-mode/"))]) + (playerctl . [(20210411 1442) nil "Control your music player (e.g. Spotify) with playerctl" single ((:commit . "41564d453c9f936a4ce2699afacc6d1dff974f1c") (:authors ("Thomas Luquet" . "thomas@luquet.net")) (:maintainer "Thomas Luquet" . "thomas@luquet.net") (:keywords "multimedia" "playerctl" "music") (:url . "https://github.com/thomasluquet/playerctl.el"))]) + (playground . [(20200812 1336) ((emacs (24 4))) "Manage sandboxes for alternative configurations" single ((:commit . "77d2faab0bc3f6e1f2c65c66644c52167304610d") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:keywords "maint") (:url . "https://github.com/akirak/emacs-playground"))]) + (playonline . [(20200317 642) ((emacs (24 4)) (dash (2 1)) (request (0 2))) "Play code with online playgrounds" single ((:commit . "c75da1fdc1dfbd5d9aa274dc4e90ff631ea08e70") (:authors ("Gong Qijian" . "gongqijian@gmail.com")) (:maintainer "Gong Qijian" . "gongqijian@gmail.com") (:keywords "tools") (:url . "https://github.com/twlz0ne/playonline.el"))]) + (plenv . [(20130707 616) nil "A plenv wrapper for Emacs" single ((:commit . "ee937d0f3a1a7ba2d035f45be896d3ed8fefaee2") (:authors ("Kenta Sato" . "karupa@cpan.org")) (:maintainer "Kenta Sato" . "karupa@cpan.org") (:keywords "emacs" "perl"))]) + (plim-mode . [(20140813 13) nil "Major mode for editing Plim files" single ((:commit . "92e39190286f172567ceb02c80e1df3b81abfa2d") (:authors ("Dong Weiming")) (:maintainer "Dong Weiming") (:keywords "markup" "language") (:url . "http://github.com/dongweiming/plim-mode"))]) + (plisp-mode . [(20200427 405) nil "Major mode for PicoLisp programming." tar ((:commit . "59e682d77569b04e9fc80af9c4b05e4a997dbcec") (:authors ("Alexis" . "flexibeast@gmail.com")) (:maintainer "Alexis" . "flexibeast@gmail.com") (:keywords "picolisp" "lisp" "programming") (:url . "https://github.com/flexibeast/plisp-mode"))]) + (plsense . [(20151104 1445) ((auto-complete (1 4 0)) (log4e (0 2 0)) (yaxception (0 2 0))) "provide interface for PlSense that is a development tool for Perl." single ((:commit . "d50f9dccc98f42bdb42f1d1c8142246e03879218") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "perl" "completion") (:url . "https://github.com/aki2o/emacs-plsense"))]) + (plsense-direx . [(20140520 2008) ((direx (0 1 -3)) (plsense (0 3 2)) (log4e (0 2 0)) (yaxception (0 3 2))) "Perl Package Explorer" single ((:commit . "8a2f465264c74e04524cc789cdad0190ace43f6c") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "perl" "convenience") (:url . "https://github.com/aki2o/plsense-direx"))]) + (plur . [(20160504 924) ((emacs (24 4))) "Easily search and replace multiple variants of a word" single ((:commit . "5bdd3b9a2f0624414bd596e798644713cd1545f0") (:authors ("Chunyang Xu" . "xuchunyang.me@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang.me@gmail.com") (:url . "https://github.com/xuchunyang/plur"))]) + (pmdm . [(20191101 2346) nil "poor man's desktop-mode alternative." single ((:commit . "1f30adce8a23da94b3c2460b7248d5910592d8af") (:authors ("Iñigo Serna" . "inigoserna@gmx.com")) (:maintainer "Iñigo Serna" . "inigoserna@gmx.com") (:url . "https://hg.serna.eu/emacs/pmdm"))]) + (pnpm-mode . [(20200527 557) ((emacs (24 1))) "Minor mode for working with pnpm projects" single ((:commit . "391207e6505948b0d0cb57b802ee4885e3292c21") (:authors ("Rajasegar Chandran" . "rajasegar.c@gmail.com")) (:maintainer "Rajasegar Chandran" . "rajasegar.c@gmail.com") (:keywords "convenience" "project" "javascript" "node" "npm" "pnpm") (:url . "https://github.com/rajasegar/pnpm-mode"))]) + (po-mode . [(20200606 1404) nil "major mode for GNU gettext PO files" tar ((:commit . "25eb1bdca30ed25d2e5d51b9feeb28a3faff51ec") (:keywords "i18n" "gettext"))]) + (pocket-api . [(20180403 109) ((emacs (24 4)) (request (0 2))) "another pocket api" single ((:commit . "3eb9430b9db90bc02e736e433eb86389f7655189") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "convenience" "pocket") (:url . "https://github.com/lujun9972/pocket-api.el"))]) + (pocket-lib . [(20190720 1957) ((emacs (25 1)) (request (0 2)) (dash (2 13 0)) (kv (0 0 19)) (s (1 12 0))) "Library for accessing getpocket.com API" single ((:commit . "f794e3e619e1f6cad25bbfd5fe019a7e62820bf4") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "pocket") (:url . "https://github.com/alphapapa/pocket-lib.el"))]) + (pocket-mode . [(20171201 1315) ((emacs (24 4)) (pocket-api (0 1))) "Manage your pocket" single ((:commit . "229de7d35b7e5605797591c46aa8200d7efc363c") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "convenience" "pocket"))]) + (pocket-reader . [(20200828 9) ((emacs (25 1)) (dash (2 13 0)) (kv (0 0 19)) (pocket-lib (0 1)) (s (1 10)) (ov (1 0 6)) (rainbow-identifiers (0 2 2)) (org-web-tools (0 1)) (ht (2 2))) "Client for Pocket reading list" single ((:commit . "dbb7b043edb42341b7f48ce0d81ba08c3c676076") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "pocket") (:url . "https://github.com/alphapapa/pocket-reader.el"))]) + (podcaster . [(20200607 1054) ((cl-lib (0 5))) "Podcast client" single ((:commit . "7a21173da0c57e6aa41dbdc33383047386b35eb5") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:url . "https://github.com/lujun9972/podcaster"))]) + (poe-lootfilter-mode . [(20190330 1117) ((emacs (24 3))) "Major mode for editing Path of Exile lootfilters" single ((:commit . "5ef06684cb2b17b090ee1f303c2b789fa71bc106") (:authors ("Jeremiah Dodds" . "jeremiah.dodds@gmail.com")) (:maintainer "Jeremiah Dodds" . "jeremiah.dodds@gmail.com") (:keywords "languages" "games") (:url . "https://github.com/jdodds/poe-lootfilter-mode"))]) + (poet-client . [(20190124 654) ((emacs (24 4)) (request (0 3 0))) "Client for po.et network api" single ((:commit . "32382057b3e4b8a02ec5ac3190dbe4b93d058741") (:authors ("W.Yahia")) (:maintainer "W.Yahia") (:url . "https://github.com/wailo/emacs-poet"))]) + (poet-theme . [(20200606 2343) ((emacs (24 1))) "A theme for prose" tar ((:commit . "16eb694f0755c04c4db98614d0eca1199fddad70") (:authors ("Kunal Bhalla" . "bhalla.kunal@gmail.com")) (:maintainer "Kunal Bhalla" . "bhalla.kunal@gmail.com") (:keywords "faces" "theme" "prose") (:url . "https://github.com/kunalb/poet/"))]) + (poetry . [(20201114 1723) ((transient (0 2 0)) (pyvenv (1 2)) (emacs (25 1))) "Interface to Poetry" single ((:commit . "d5163fe065239bb7b46ed8b3ff3b85b1f3229af3") (:authors ("Gaby Launay" . "gaby.launay@protonmail.com")) (:maintainer "Gaby Launay" . "gaby.launay@protonmail.com") (:keywords "python" "tools") (:url . "https://github.com/galaunay/poetry.el"))]) + (point-pos . [(20170421 1632) nil "Save and restore point positions" single ((:commit . "442bccb40791832cbc2d6f5c8f53be745aea2b73") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "tools" "convenience") (:url . "https://github.com/alezost/point-pos.el"))]) + (point-stack . [(20200427 107) nil "Back and forward navigation through buffer locations" single ((:commit . "cddcea2c91038710c245819b3cda2dd739726134") (:authors ("Matt Harrison" . "matthewharrison@gmail.com") ("Dmitry Gutov" . "dgutov@yandex.ru")) (:maintainer "Matt Harrison" . "matthewharrison@gmail.com"))]) + (poke-line . [(20201023 247) ((emacs (24 3))) "Minor mode to show position in a buffer using a Pokemon" tar ((:commit . "8d484dbaa1215d902fbd1e3c9163b39a43ec532a") (:authors ("Ryan Miller" . "ryan@devopsmachine.com")) (:maintainer "Ryan Miller" . "ryan@devopsmachine.com") (:keywords "pokemon" "fun" "mode-line" "mouse") (:url . "https://github.com/RyanMillerC/poke-line/"))]) + (pollen-mode . [(20210120 422) ((emacs (24 3)) (cl-lib (0 5))) "major mode for editing pollen files" single ((:commit . "09a9dc48c468dcd385982b9629f325e70d569faf") (:authors ("Junsong Li <ljs.darkfish AT GMAIL>")) (:maintainer "Junsong Li") (:keywords "languages" "pollen" "pollenpub") (:url . "https://github.com/lijunsong/pollen-mode"))]) + (poly-R . [(20210210 1053) ((emacs (25)) (polymode (0 2 2)) (poly-markdown (0 2 2)) (poly-noweb (0 2 2))) "Various polymodes for R language" single ((:commit . "c42ff3a4d0da96ccb7f826dca5c6b2eb558a2ab5") (:authors ("Vitalie Spinu")) (:maintainer "Vitalie Spinu") (:keywords "languages" "multi-modes") (:url . "https://github.com/polymode/poly-R"))]) + (poly-ansible . [(20200826 1542) ((ansible (0 2)) (ansible-doc (0 4)) (jinja2-mode (0 2)) (polymode (0 1 5)) (yaml-mode (0 0 13))) "Polymode for Ansible: Jinja2 in YAML" tar ((:commit . "d76f6ec2374ec46ad78f2d0c3e1d1d91ee44c2bf") (:authors ("Peter Oliver" . "poly-ansible@mavit.org.uk")) (:maintainer "Peter Oliver" . "poly-ansible@mavit.org.uk") (:keywords "languages") (:url . "https://gitlab.com/mavit/poly-ansible/"))]) + (poly-erb . [(20200316 1314) ((emacs (25)) (polymode (0 2 2))) "Polymode for erb" single ((:commit . "56c744b8d87d8cbe0aba2696d4e8525afc4aa0e8") (:authors ("Siavash Sajjadi and Vitalie Spinu")) (:maintainer "Vitalie Spinu") (:keywords "emacs") (:url . "https://github.com/polymode/poly-erb"))]) + (poly-markdown . [(20200316 1315) ((emacs (25)) (polymode (0 2 2)) (markdown-mode (2 3))) "Polymode for markdown-mode" single ((:commit . "1536cf0c32f71d5cd05c90f7905905e38006e95d") (:authors ("Vitalie Spinu")) (:maintainer "Vitalie Spinu") (:keywords "emacs") (:url . "https://github.com/polymode/poly-markdown"))]) + (poly-noweb . [(20200316 1315) ((emacs (25)) (polymode (0 2 2))) "Polymode for noweb" single ((:commit . "3b0cd36ca9a707e8a09337a3468fa85d81fc461c") (:authors ("Vitalie Spinu")) (:maintainer "Vitalie Spinu") (:keywords "languages" "multi-modes") (:url . "https://github.com/polymode/poly-noweb"))]) + (poly-org . [(20200817 756) ((emacs (25)) (polymode (0 2 2))) "Polymode for org-mode" single ((:commit . "0793ee5c3565718606c514c3f299c0aa5bb71272") (:authors ("Vitalie Spinu")) (:maintainer "Vitalie Spinu") (:keywords "languages" "multi-modes") (:url . "https://github.com/polymode/poly-org"))]) + (poly-rst . [(20210418 1009) ((emacs (25)) (polymode (0 2 2))) "poly-rst-mode polymode" single ((:commit . "e71f2ae6a00683cdb8006f953e5db0673043e144") (:authors ("Gustaf Waldemarson, Vitalie Spinu")) (:maintainer "Gustaf Waldemarson, Vitalie Spinu") (:keywords "languages" "multi-modes") (:url . "https://github.com/polymode/poly-rst"))]) + (poly-ruby . [(20180905 929) ((emacs (25)) (polymode (0 1 2))) "Provides poly-ruby-mode" single ((:commit . "794ebb926ace23e9c1398da934701951432dcea2") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:keywords "languages") (:url . "https://github.com/knu/poly-ruby.el"))]) + (poly-slim . [(20200316 1316) ((emacs (25)) (polymode (0 2 2)) (slim-mode (1 1))) "Polymodes for slim" single ((:commit . "9e9b5164c68955974fd5f5d220aec5af9b5ba3ae") (:authors ("Siavash Sajjadi and Vitalie Spinu")) (:maintainer "Vitalie Spinu") (:keywords "emacs") (:url . "https://github.com/polymode/poly-slim"))]) + (poly-wdl . [(20190712 529) ((emacs (25)) (polymode (0 2)) (wdl-mode (20170709))) "Polymode for WDL" single ((:commit . "963faa828d15d49cee5a63f619c3c30e162c2d0f") (:authors ("Jean Monlong" . "jean.monlong@gmail.com")) (:maintainer "Jean Monlong" . "jean.monlong@gmail.com") (:keywords "languages") (:url . "https://github.com/jmonlong/poly-wdl"))]) + (polymode . [(20210521 1131) ((emacs (25))) "Extensible framework for multiple major modes" tar ((:commit . "7d1f822f0833b43326cc9253dc8a3e267ad4b376") (:authors ("Vitalie Spinu")) (:maintainer "Vitalie Spinu") (:keywords "languages" "multi-modes" "processes") (:url . "https://github.com/polymode/polymode"))]) + (pomidor . [(20210111 919) ((emacs (24 3)) (alert (1 2)) (dash (2 17 0))) "Simple and cool pomodoro timer" tar ((:commit . "52134701fa76b12252b06c9d6fd4e8665596a95a") (:authors ("TatriX" . "tatrics@gmail.com")) (:maintainer "TatriX" . "tatrics@gmail.com") (:keywords "tools" "time" "applications" "pomodoro technique") (:url . "https://github.com/TatriX/pomidor"))]) + (pomodoro . [(20210225 2018) nil "A timer for the Pomodoro Technique" single ((:commit . "ed888b24d0b89a5dec6f5278b1064c530c827321") (:authors ("David Kerschner" . "dkerschner@gmail.com")) (:maintainer "David Kerschner" . "dkerschner@gmail.com"))]) + (pony-mode . [(20170807 1522) nil "Minor mode for working with Django Projects" tar ((:commit . "760684d30b6c234d1b88c9a4673a808f36f7f341") (:authors ("David Miller" . "david@deadpansincerity.com")) (:maintainer "David Miller" . "david@deadpansincerity.com") (:keywords "python" "django") (:url . "https://github.com/davidmiller/pony-mode"))]) + (pony-snippets . [(20200418 354) ((yasnippet (0 8 0))) "Yasnippets for Pony" tar ((:commit . "115a0d5066f89554bee9cb1045bcda5a18ebd441") (:keywords "snippets" "pony") (:url . "https://github.com/seantallen/pony-snippets"))]) + (ponylang-mode . [(20210118 1325) ((emacs (25 1)) (dash (2 17 0)) (hydra (0 15 0)) (hl-todo (3 1 2)) (yafolding (0 4 1)) (yasnippet (0 14 0)) (company-ctags (0 0 4)) (rainbow-delimiters (2 1 4)) (fill-column-indicator (1 90))) "A major mode for the Pony programming language" single ((:commit . "3c011744e81263dab6a4b20e96ad1d290ef9d320") (:keywords "languages" "programming") (:url . "https://github.com/ponylang/ponylang-mode"))]) + (pophint . [(20200420 1429) ((log4e (0 3 3)) (yaxception (0 3))) "Provide navigation using pop-up tips, like Firefox's Vimperator Hint Mode" tar ((:commit . "5e13da4578ae7ba00e6f7bae31eb546d713cc19d") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "popup") (:url . "https://github.com/aki2o/emacs-pophint"))]) + (poporg . [(20170403 751) nil "Pop a comment or string to an empty buffer for text editing" single ((:commit . "2c58d68c81ecca4140bf179f19ed153ec804b65a") (:authors ("François Pinard" . "pinard@iro.umontreal.ca") ("Joseph Rabinoff" . "rabinoff@post.harvard.edu")) (:maintainer "Joseph Rabinoff" . "rabinoff@post.harvard.edu") (:keywords "outlines" "tools") (:url . "https://github.com/QBobWatson/poporg"))]) + (popper . [(20210610 1945) ((emacs (26 1))) "Summon and dismiss buffers as popups" single ((:commit . "4c51182f5f5dd7a1ffa69fb994ef5ef6f9592686") (:authors ("Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com")) (:maintainer "Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com") (:keywords "convenience") (:url . "https://github.com/karthink/popper"))]) + (popup . [(20210317 138) ((emacs (24 3))) "Visual Popup User Interface" single ((:commit . "866a091b83369873b4d1c5d62a590fbb0a150bd0") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "lisp") (:url . "https://github.com/auto-complete/popup-el"))]) + (popup-complete . [(20141109 308) ((popup (0 5 0))) "completion with popup" single ((:commit . "caa655a6d8472e9a4bfa1311126d90d7d1b07fca") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-popup-complete"))]) + (popup-edit-menu . [(20170404 1425) ((emacs (24))) "a popup context edit menu package" single ((:commit . "925600a6e29183841199e866cf55e566a6a1b002") (:authors ("Debugfan Chin" . "debugfanchin@gmail.com")) (:maintainer "Debugfan Chin" . "debugfanchin@gmail.com") (:keywords "lisp" "pop-up" "context" "edit" "menu"))]) + (popup-imenu . [(20210404 1153) ((dash (2 12 1)) (popup (0 5 3)) (flx-ido (0 6 1))) "imenu index popup" single ((:commit . "b00c4d503cbbaf01c136b1647329e6a6257d012c") (:authors ("Igor Shymko" . "igor.shimko@gmail.com")) (:maintainer "Igor Shymko" . "igor.shimko@gmail.com") (:keywords "popup" "imenu") (:url . "https://github.com/ancane/popup-imenu"))]) + (popup-kill-ring . [(20131020 1854) ((popup (0 4)) (pos-tip (0 4))) "interactively insert item from kill-ring" single ((:commit . "5773dfadc104a906c088a3ec62e8cdd3e01e57fa") (:authors ("khiker" . "khiker.mail+elisp@gmail.com")) (:maintainer "khiker" . "khiker.mail+elisp@gmail.com") (:keywords "popup" "kill-ring" "pos-tip") (:url . "https://github.com/waymondo/popup-kill-ring"))]) + (popup-switcher . [(20210402 1208) ((cl-lib (0 3)) (popup (0 5 3)) (dash (2 10 0))) "switch to other buffers and files via popup." single ((:commit . "94e01b9ea7970e86ed0f2fbeaa8cd320b60ae821") (:authors ("Kostafey" . "kostafey@gmail.com")) (:maintainer "Kostafey" . "kostafey@gmail.com") (:keywords "popup" "switch" "buffers" "functions") (:url . "https://github.com/kostafey/popup-switcher"))]) + (popwin . [(20210215 1849) ((emacs (24 3))) "Popup Window Manager" single ((:commit . "1184368d3610bd0d0ca4a3db4068048c562c2b50") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainer "Tomohiro Matsuyama" . "m2ym.pub@gmail.com") (:keywords "convenience") (:url . "https://github.com/emacsorphanage/popwin"))]) + (portage-navi . [(20141208 1355) ((concurrent (0 3 1)) (ctable (0 1 2))) "portage viewer" single ((:commit . "8016c3e99fe6cef101d479a3d69185796b22ca2f") (:authors ("<m.sakurai at kiwanami.net>")) (:maintainer "<m.sakurai at kiwanami.net>") (:keywords "tools" "gentoo") (:url . "https://github.com/kiwanami/emacs-portage-navi"))]) + (porthole . [(20200404 1454) ((emacs (26)) (web-server (0 1 2)) (f (0 19 0)) (json-rpc-server (0 1 2))) "RPC Servers in Emacs" single ((:commit . "9e68b419acf9245208f8094e10041b7f04511473") (:authors ("GitHub user \"Jcaw\"")) (:maintainer "GitHub user \"Jcaw\"") (:keywords "comm" "rpc" "http" "json") (:url . "https://github.com/jcaw/porthole"))]) + (pos-tip . [(20191227 1356) nil "Show tooltip at point" single ((:commit . "179cc126b363f72ca12fab1e0dc462ce0ee79742") (:authors ("S. Irie")) (:maintainer "S. Irie") (:keywords "tooltip"))]) + (posframe . [(20210604 647) ((emacs (26))) "Pop a posframe (just a frame) at point" tar ((:commit . "3257a52e3599bc1d5c9a4b646d36d7a49b0dd025") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:keywords "convenience" "tooltip") (:url . "https://github.com/tumashu/posframe"))]) + (posix-manual . [(20200301 1103) ((emacs (24))) "POSIX manual page lookup" tar ((:commit . "ebaacd7266ae7a66605317f57b9f42e9cfb2ce1e") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "languages" "util") (:url . "https://github.com/lassik/emacs-posix-manual"))]) + (postcss-sorting . [(20180211 956) ((emacs (24))) "postcss-sorting interface" single ((:commit . "deb0c935d2904c11a965758a9aee5a0e905f21fc") (:authors ("Peiwen Lu" . "hi@peiwen.lu")) (:maintainer "Peiwen Lu" . "hi@peiwen.lu") (:url . "https://github.com/P233/postcss-sorting.el"))]) + (pov-mode . [(20161115 743) nil "Major mode for editing POV-Ray scene files." tar ((:commit . "9fc1db3aab7c27155674dd1a87ec62606035d074") (:authors ("Peter Boettcher" . "pwb@andrew.cmu.edu")) (:maintainer "Marco Pessotto" . "melmothx@gmail.com") (:keywords "pov" "povray"))]) + (pow . [(20140420 806) ((emacs (24)) (cl-lib (0 5))) "pow (http://pow.cx/) manager for emacs" tar ((:commit . "ea83986b8ca8e27cb996290d6463b111ec0966ce") (:authors ("yukihiro hara" . "yukihr@gmail.com")) (:maintainer "yukihiro hara" . "yukihr@gmail.com") (:keywords "develop" "web" "pow") (:url . "http://github.com/yukihr/emacs-pow"))]) + (powerline . [(20210527 1953) ((cl-lib (0 2))) "Rewrite of Powerline" tar ((:commit . "cfba2aa9cfa190e7720900f01a946e1e78aac7e2") (:authors ("Donald Ephraim Curtis" . "dcurtis@milkbox.net")) (:maintainer "Donald Ephraim Curtis" . "dcurtis@milkbox.net") (:keywords "mode-line") (:url . "http://github.com/milkypostman/powerline/"))]) + (powerline-evil . [(20190603 340) ((evil (1 0 8)) (powerline (2 3))) "Utilities for better Evil support for Powerline" tar ((:commit . "b77e2cf571e9990734f2b30d826f3a362b559fd1") (:authors ("Chris Johnson" . "chris@christophermjohnson.net")) (:maintainer "Chris Johnson" . "chris@christophermjohnson.net") (:keywords "evil" "mode-line" "powerline") (:url . "http://github.com/johnson-christopher/powerline-evil/"))]) + (powershell . [(20201005 1642) ((emacs (24))) "Mode for editing PowerShell scripts" single ((:commit . "d1b3f95669343399f199f291ef76c09a0ede5e60") (:authors ("Frédéric Perrin <frederic (dot) perrin (arobas) resel (dot) fr>")) (:maintainer "Frédéric Perrin <frederic (dot) perrin (arobas) resel (dot) fr>") (:keywords "powershell" "languages") (:url . "http://github.com/jschaf/powershell.el"))]) + (powerthesaurus . [(20200720 1546) ((emacs (24)) (request (0 3 0)) (s (1 12 0)) (jeison (1 0 0))) "Powerthesaurus integration" single ((:commit . "93036d3b111925ebc34f747ff846cb0b8669b92e") (:keywords "convenience" "writing") (:url . "http://github.com/SavchenkoValeriy/emacs-powerthesaurus"))]) + (ppd-sr-speedbar . [(20151108 1224) ((sr-speedbar (20140914 2339)) (project-persist-drawer (0 0 4))) "Sr Speedbar adaptor for project-persist-drawer." tar ((:commit . "d88d7f63f695824c435dd996405454d1e46d2aa3") (:authors ("Robert Dallas Gray")) (:maintainer "Robert Dallas Gray") (:keywords "projects" "drawer") (:url . "https://github.com/rdallasgrayppd-sr-speedbar"))]) + (ppp . [(20200812 844) ((emacs (25 1)) (leaf (4 1 1))) "Extended pretty printer for Emacs Lisp" single ((:commit . "86dad69c3a7dae770f6b99285647dff2aad81930") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "tools") (:url . "https://github.com/conao3/ppp.el"))]) + (prassee-theme . [(20180709 1004) ((emacs (24))) "A high contrast color theme for Emacs." single ((:commit . "81126f69cdbaab836c00ae7a49aaf89d4229fde1") (:authors ("Prassee " . "prassee.sathian@gmail.com")) (:maintainer "Prassee " . "prassee.sathian@gmail.com") (:keywords "dark" "high-contrast" "faces") (:url . "https://github.com/prassee/prassee-emacs-theme"))]) + (preproc-font-lock . [(20151107 2018) nil "Highlight C-style preprocessor directives." single ((:commit . "565fda9f5fdeb0598986174a07e9fb09f7604397") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "c" "languages" "faces") (:url . "https://github.com/Lindydancer/preproc-font-lock"))]) + (prescient . [(20210425 1720) ((emacs (25 1))) "Better sorting and filtering" single ((:commit . "4a0f5405798cfcb98ea005078ef2e2d490e922c4") (:authors ("Radon Rosborough" . "radon.neon@gmail.com")) (:maintainer "Radon Rosborough" . "radon.neon@gmail.com") (:keywords "extensions") (:url . "https://github.com/raxod502/prescient.el"))]) + (preseed-generic-mode . [(20180210 500) nil "Debian preseed file major mode" single ((:commit . "3aa8806c4a659064baa01751400c53fbaf847f66") (:authors ("Tong Sun" . "suntong@users.sourceforge.net")) (:maintainer "Tong Sun" . "suntong@users.sourceforge.net") (:url . "https://github.com/suntong/preseed-generic-mode"))]) + (presentation . [(20180427 224) ((emacs (24 4)) (cl-lib (0 5))) "Display large character for presentation" single ((:commit . "f53f67aeab97e8eea6d1f12df5f7ce3b1b03b879") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "environment" "faces" "frames") (:url . "https://github.com/zonuexe/emacs-presentation-mode"))]) + (prettier . [(20210606 1152) ((emacs (26 1)) (iter2 (0 9)) (nvm (0 2))) "Code formatting with Prettier" tar ((:commit . "e38d21a885e234af9ea6b03f499c487175570571") (:authors ("Julian Scheid" . "julians37@gmail.com")) (:maintainer "Julian Scheid" . "julians37@gmail.com") (:keywords "convenience" "languages" "files") (:url . "https://github.com/jscheid/prettier.el"))]) + (prettier-js . [(20180109 726) nil "Minor mode to format JS code on file save" single ((:commit . "e9b73e81d3e1642aec682195f127a42dfb0b5774") (:authors ("James Long and contributors")) (:maintainer "James Long and contributors") (:keywords "convenience" "wp" "edit" "js") (:url . "https://github.com/prettier/prettier-emacs"))]) + (prettify-greek . [(20160603 908) nil "Greek letters for prettify-symbols" single ((:commit . "698d07a6ffe85f6fb53f3bfec4f49380c25cfd90") (:keywords "faces") (:url . "https://gitlab.com/fommil/emacs-prettify-greek"))]) + (pretty-hydra . [(20210221 834) ((hydra (0 15 0)) (s (1 12 0)) (dash (2 18 0)) (emacs (24))) "A macro for creating nice-looking hydras" single ((:commit . "84c1929a5153be169ca5c36737439d51dffde505") (:authors ("Jerry Peng" . "pr2jerry@gmail.com")) (:maintainer "Jerry Peng" . "pr2jerry@gmail.com") (:url . "https://github.com/jerrypnz/major-mode-hydra.el"))]) + (pretty-mode . [(20190615 2045) nil "Redisplay parts of the buffer as pretty Unicode symbols." single ((:commit . "5154355e90fdd70d3647257280a89eeb725ef084") (:authors ("Arthur Danskin" . "arthurdanskin@gmail.com")) (:maintainer "Grant Rettke" . "grant@wisdomandwonder.com") (:keywords "pretty" "unicode" "symbols") (:url . "https://github.com/akatov/pretty-mode"))]) + (pretty-sha-path . [(20141105 1826) nil "Prettify Guix/Nix store paths" single ((:commit . "a2b43dd9de423a38d67cda2e3bd9412f7d363257") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "faces" "convenience") (:url . "https://gitorious.org/alezost-emacs/pretty-sha-path"))]) + (pretty-symbols . [(20140814 959) nil "Draw tokens as Unicode glyphs." single ((:commit . "582cbe51ecfe1cc0a5b185bc06113c8a661e3956") (:authors ("David Röthlisberger" . "david@rothlis.net")) (:maintainer "David Röthlisberger" . "david@rothlis.net") (:keywords "faces") (:url . "http://github.com/drothlis/pretty-symbols"))]) + (prism . [(20201228 141) ((emacs (26 1)) (dash (2 14 1))) "Customizable, depth-based syntax coloring" single ((:commit . "e746822cd7d8a0dcf56902d32fbadb3297690590") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "faces" "lisp") (:url . "https://github.com/alphapapa/prism.el"))]) + (private . [(20150122 157) ((aes (0 6))) "take care of your private configuration files." single ((:commit . "9266d01c095895cc3ee9de95bc20511e88353755") (:authors ("Cheung Mou Wai" . "yeannylam@gmail.com")) (:maintainer "Cheung Mou Wai" . "yeannylam@gmail.com") (:keywords "private" "configuration" "backup" "recover") (:url . "https://github.com/cheunghy/private"))]) + (private-diary . [(20151216 1657) ((emacs (24 0))) "maintain a private diary in Emacs" single ((:commit . "0c86fb6150ad8ed14f94def3504f5a68f4147283") (:authors ("James P. Ascher" . "jpa4q@virginia.edu")) (:maintainer "James P. Ascher" . "jpa4q@virginia.edu") (:keywords "diary" "encryption") (:url . "https://github.com/cacology/private-diary"))]) + (proc-net . [(20130322 12) nil "network process tools" single ((:commit . "10861112a1f3994c8e6374d6c5bb5d734cfeaf73") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:keywords "processes") (:url . "http://github.com/nicferrier/emacs-procnet"))]) + (proced-narrow . [(20190911 1818) ((seq (2 20)) (emacs (24))) "Live-narrowing of search results for proced." single ((:commit . "0e2a4dfb072eb0369d0020b429e820ae620d325e") (:authors ("Travis Jeffery" . "tj@travisjeffery.com")) (:maintainer "Travis Jeffery" . "tj@travisjeffery.com") (:keywords "processes" "proced") (:url . "https://github.com/travisjeffery/proced-narrow"))]) + (processing-mode . [(20171022 2302) nil "Major mode for Processing 2.0" single ((:commit . "448aba82970c98322629eaf2746e73be6c30c98e") (:authors ("Peter Vasil" . "mail@petervasil.net")) (:maintainer "Peter Vasil" . "mail@petervasil.net") (:keywords "languages" "snippets") (:url . "https://github.com/ptrv/processing2-emacs"))]) + (processing-snippets . [(20140426 1428) ((yasnippet (0 8 0))) "Snippets for processing-mode" tar ((:commit . "448aba82970c98322629eaf2746e73be6c30c98e") (:authors ("Peter Vasil" . "mail@petervasil.net")) (:maintainer "Peter Vasil" . "mail@petervasil.net") (:keywords "snippets") (:url . "https://github.com/ptrv/processing2-emacs"))]) + (prodigy . [(20210116 816) ((s (1 8 0)) (dash (2 4 0)) (f (0 14 0)) (emacs (24))) "Manage external services from within Emacs" single ((:commit . "168f5ace1671876d8c3bd350c0853bd0196bddda") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:url . "http://github.com/rejeep/prodigy.el"))]) + (professional-theme . [(20150315 1100) nil "Emacs port of Vim's professional theme" single ((:commit . "0927d1474049a193f9f366bde5eb1887b9ba20ed") (:authors ("Juanjo Alvarez" . "juanjo@juanjoalvarez.net")) (:maintainer "Juanjo Alvarez" . "juanjo@juanjoalvarez.net") (:keywords "theme" "light" "professional") (:url . "https://github.com/juanjux/emacs-professional-theme"))]) + (prog-fill . [(20180607 132) ((emacs (25 1)) (cl-lib (0 6 1))) "Smartly format lines to use vertical space." single ((:commit . "3fbf7da6dd826e95c9077d659566ee29814a31d8") (:authors ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com") (:keywords "ahungry" "convenience" "c" "formatting" "editing") (:url . "https://github.com/ahungry/prog-fill"))]) + (prognth . [(20130920 1759) nil "Extend prog1 to arbitrary index" single ((:commit . "2f1ca4d34b1fd581163e1df122c85418137e8e62") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:keywords "lisp"))]) + (programmer-dvorak . [(20150427 137) nil "Input method for Programmer Dvorak." single ((:commit . "3288a8f058eca4cab390a564babbbcb17cfa0350") (:authors ("Chenyun Yang" . "yangchenyun@gmail.com")) (:maintainer "Chenyun Yang" . "yangchenyun@gmail.com") (:keywords "dvorak" "programmer-dvorak" "input-method") (:url . "https://github.com/yangchenyun/programmer-dvorak"))]) + (project-abbrev . [(20200724 901) ((emacs (25 1))) "Customize abbreviation expansion in the project" single ((:commit . "7b5749eae33eda576da3293dc386794c1248bb48") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/project-abbrev"))]) + (project-explorer . [(20150504 14) ((cl-lib (0 3)) (es-lib (0 3)) (es-windows (0 1)) (emacs (24))) "A project explorer sidebar" single ((:commit . "589a09008706f5f4ef91393dc4306eede0d15ca9") (:authors ("sabof")) (:maintainer "sabof") (:url . "https://github.com/sabof/project-explorer"))]) + (project-persist . [(20180906 1302) nil "A minor mode to allow loading and saving of project settings." tar ((:commit . "26d9435bef44da2a1b0892eba822f9f487b98eec") (:authors ("Robert Dallas Gray")) (:maintainer "Robert Dallas Gray") (:keywords "project" "persistence") (:url . "https://github.com/rdallasgray/project-persist"))]) + (project-persist-drawer . [(20151108 1222) ((project-persist (0 3))) "Use a project drawer with project-persist." tar ((:commit . "35bbe132a4fab6a0fec15ce6c0fd2fe6a4aa9626") (:authors ("Robert Dallas Gray" . "mail@robertdallasgray.com")) (:maintainer "Robert Dallas Gray" . "mail@robertdallasgray.com") (:keywords "defaults") (:url . "https://github.com/rdallasgray/project-persist-drawer.git"))]) + (project-root . [(20110206 2030) nil "Define a project root and take actions based upon it." single ((:commit . "a49b1be864357683d9489074148b6d667f4ed23b") (:authors ("Philip Jackson" . "phil@shellarchive.co.uk")) (:maintainer "Philip Jackson" . "phil@shellarchive.co.uk"))]) + (project-shells . [(20201026 748) ((emacs (24 3)) (seq (2 19))) "Manage the shell buffers of each project" single ((:commit . "382b3d48a797ea56383732ebf9cd219aeec676df") (:authors ("\"Huang, Ying\"" . "huang.ying.caritas@gmail.com")) (:maintainer "\"Huang, Ying\"" . "huang.ying.caritas@gmail.com") (:keywords "processes" "terminals") (:url . "https://github.com/hying-caritas/project-shells"))]) + (projectile . [(20210607 1513) ((emacs (25 1)) (pkg-info (0 4))) "Manage and navigate projects in Emacs easily" single ((:commit . "155fdb44176347c9599357c7935993033260a930") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.com")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.com") (:keywords "project" "convenience") (:url . "https://github.com/bbatsov/projectile"))]) + (projectile-codesearch . [(20180508 1522) ((codesearch (20171122 431)) (projectile (20150405 126))) "Integration of codesearch into projectile" single ((:commit . "f6eb96f034a925444412cfa03e45e0ccbbafe3f2") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:keywords "tools" "development" "search") (:url . "https://github.com/abingham/emacs-codesearch"))]) + (projectile-git-autofetch . [(20200820 2028) ((emacs (25 1)) (projectile (0 14 0))) "automatically fetch git repositories" single ((:commit . "423ed5fa6508c4edc0a837bb585c7e77e99876be") (:authors ("Andreas Müller" . "code@0x7.ch")) (:maintainer "Andreas Müller" . "code@0x7.ch") (:keywords "tools" "vc") (:url . "https://github.com/andrmuel/projectile-git-autofetch"))]) + (projectile-rails . [(20210325 2120) ((emacs (24 3)) (projectile (0 12 0)) (inflections (1 1)) (inf-ruby (2 2 6)) (f (0 13 0)) (rake (0 3 2))) "Minor mode for Rails projects based on projectile-mode" single ((:commit . "f1fe6e8eff485dc560e6ffe7f0b9c46a61509a58") (:authors ("Adam Sokolnicki" . "adam.sokolnicki@gmail.com")) (:maintainer "Adam Sokolnicki" . "adam.sokolnicki@gmail.com") (:keywords "rails" "projectile") (:url . "https://github.com/asok/projectile-rails"))]) + (projectile-ripgrep . [(20180914 1500) ((ripgrep (0 3 0)) (projectile (0 14 0))) "Run ripgrep with Projectile" single ((:commit . "40e871dcc4519a70981e9f28acea304692a60978") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "ripgrep" "projectile") (:url . "https://github.com/nlamirault/ripgrep.el"))]) + (projectile-sift . [(20160107 1015) ((sift (0 2 0)) (projectile (0 13 0))) "Run a sift with Projectile" single ((:commit . "cdddba2d183146c340915003f1b5d09d13712c22") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "sift" "projectile") (:url . "https://github.com/nlamirault/sift.el"))]) + (projectile-speedbar . [(20190807 2010) ((projectile (0 11 0)) (sr-speedbar (0))) "projectile integration for speedbar" single ((:commit . "93320e467ee78772065e599a5dba94889a77db22") (:authors ("Anshul Verma" . "anshul.verma86@gmail.com")) (:maintainer "Anshul Verma" . "anshul.verma86@gmail.com") (:keywords "project" "convenience" "speedbar" "projectile") (:url . "https://github.com/anshulverma/projectile-speedbar"))]) + (projectile-trailblazer . [(20170928 1624) ((emacs (24 4)) (projectile (0 12 0)) (inflections (1 1)) (inf-ruby (2 2 6)) (f (0 13 0)) (rake (0 3 2))) "Minor mode for Rails projects using trailblazer" single ((:commit . "a37a4f7b7f727d98e4c74c0256e059e84263553d") (:authors ("Michael Dahl" . "michael.dahl84@gmail.com")) (:maintainer "Michael Dahl" . "michael.dahl84@gmail.com") (:keywords "rails" "projectile" "trailblazer" "languages") (:url . "https://github.com/micdahl/projectile-trailblazer"))]) + (projectile-variable . [(20170208 1718) ((emacs (24)) (cl-lib (0 5))) "Store project local variables." single ((:commit . "8d348ac70bdd6dc320c13a12941b32b38140e264") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "project" "convenience") (:url . "https://github.com/zonuexe/projectile-variable"))]) + (projector . [(20210421 1728) ((alert (1 1)) (projectile (0 11 0)) (cl-lib (0 5))) "Lightweight library for managing project-aware shell and command buffers" single ((:commit . "7bbee0ef70817d52339119d4517dbbcbab930de6") (:authors ("Justin Talbott" . "justin@waymondo.com")) (:maintainer "Justin Talbott" . "justin@waymondo.com") (:url . "https://github.com/waymondo/projector.el"))]) + (projekt . [(20150324 848) ((emacs (24))) "some kind of staging for CVS" single ((:commit . "a65e554e5d8b0def08c5d06f3fe34fec40bebd83") (:authors ("Engelke Eschner" . "tekai@gmx.li")) (:maintainer "Engelke Eschner" . "tekai@gmx.li"))]) + (projmake-mode . [(20161031 1715) ((dash (20150611 922)) (indicators (20130217 1405))) "Project oriented automatic builder and error highlighter, flymake for projects" tar ((:commit . "a897701f7e8f8cc11459ed44eb0e454db2a460c1"))]) + (promise . [(20210307 727) ((emacs (25 1))) "Promises/A+" tar ((:commit . "cec51feb5f957e8febe6325335cf57dc2db6be30") (:authors ("chuntaro" . "chuntaro@sakura-games.jp")) (:maintainer "chuntaro" . "chuntaro@sakura-games.jp") (:keywords "async" "promise" "convenience") (:url . "https://github.com/chuntaro/emacs-promise"))]) + (prompt-text . [(20190408 310) nil "Configure your minibuffer prompt" single ((:commit . "0a75ecd5058c9a006e02d1ecd3f1c84194881abd") (:authors ("10sr <8slashes+el [at] gmail [dot] com>")) (:maintainer "10sr <8slashes+el [at] gmail [dot] com>") (:keywords "utility" "minibuffer") (:url . "https://github.com/10sr/prompt-text-el"))]) + (prompts . [(20160916 1041) ((dash (2 13 0))) "utilities for working with text prompts." single ((:commit . "1cd5e732ff2a86b47836eb7252e5b59cd4b6ab26") (:authors ("Ben Moon" . "guiltydolphin@gmail.com")) (:maintainer "Ben Moon" . "guiltydolphin@gmail.com") (:keywords "input" "minibuffer") (:url . "https://github.com/guiltydolphin/prompts.el"))]) + (pronto . [(20200218 1633) ((emacs (24))) "Compilation mode for pronto stylechecks" single ((:commit . "c2a2ec718c08de1fd2e681970456786cf4eac8fe") (:authors ("Julian Rubisch" . "julian@julianrubisch.at")) (:maintainer "Julian Rubisch" . "julian@julianrubisch.at") (:keywords "processes" "tools") (:url . "https://github.com/julianrubisch/pronto.el"))]) + (proof-general . [(20210607 1422) ((emacs (24 5))) "A generic front-end for proof assistants (interactive theorem provers)" tar ((:commit . "bc86736abb728ec0d28abc90ef0adae21d29a66a") (:url . "https://proofgeneral.github.io/"))]) + (prop-menu . [(20150728 1118) ((emacs (24 3)) (cl-lib (0 5))) "Create and display a context menu based on text and overlay properties" single ((:commit . "50b102c1c0935fd3e0c465feed7f27d66b21cdf3") (:authors ("David Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Christiansen" . "david@davidchristiansen.dk") (:keywords "convenience") (:url . "https://github.com/david-christiansen/prop-menu-el"))]) + (propfont-mixed . [(20150113 2211) ((emacs (24)) (cl-lib (0 5))) "Use proportional fonts with space-based indentation." single ((:commit . "0b461ef4754a469610dba71874a34b6da42176bf") (:authors ("Kirill Ignatiev <github.com/ikirill>")) (:maintainer "Kirill Ignatiev <github.com/ikirill>") (:keywords "faces") (:url . "https://github.com/ikirill/propfont-mixed"))]) + (proportional . [(20200309 1556) ((emacs (25 1))) "use a proportional font everywhere" single ((:commit . "0e4537af7ba2bc9dbb449c38350bce012b382f51") (:authors ("Johannes Goslar")) (:maintainer "Johannes Goslar") (:keywords "faces") (:url . "https://github.com/ksjogo/proportional"))]) + (prosjekt . [(20151127 1416) ((dash (2 8 0))) "a software project tool for emacs" tar ((:commit . "a864a8be5842223043702395f311e3350c28e9db") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/prosjekt"))]) + (protobuf-mode . [(20200619 1742) nil "major mode for editing protocol buffers." single ((:commit . "d1ef6d98261f874714bac0b3ef50f10227c5fe34") (:authors ("Alexandre Vassalotti" . "alexandre@peadrop.com")) (:maintainer "Alexandre Vassalotti" . "alexandre@peadrop.com") (:keywords "google" "protobuf" "languages"))]) + (protocols . [(20170802 1132) ((cl-lib (0 5))) "Protocol database access functions." single ((:commit . "d0f7c4acb05465f1a0d4be54363bbd2802647e77") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "convenience" "net" "protocols") (:url . "https://github.com/davep/protocols.el"))]) + (proxy-mode . [(20201214 727) ((emacs (25))) "A minor mode to toggle proxy." single ((:commit . "dbf163413e9e404c652cc0ea7185c623016a38e1") (:keywords "comm" "proxy") (:url . "https://github.com/stardiviner/proxy-mode"))]) + (psalm . [(20200510 1157) ((emacs (24 3)) (php-mode (1 22 3))) "Interface to Psalm" single ((:commit . "b2a1e8a9524b0004e62996c70da5536f86e56182") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "tools" "php") (:url . "https://github.com/emacs-php/psalm.el"))]) + (psc-ide . [(20210219 2247) ((emacs (25)) (dash (2 18 0)) (company (0 8 7)) (s (1 10 0)) (flycheck (0 24)) (let-alist (1 0 4)) (seq (1 11))) "Minor mode for PureScript's IDE server." tar ((:commit . "ce97d719458ea099b40c02f05b6609601c727e66") (:authors ("Erik Post" . "erik@shinsetsu.nl") ("Dmitry Bushenko" . "d.bushenko@gmail.com") ("Christoph Hegemann" . "christoph.hegemann1337@gmail.com") ("Brian Sermons")) (:maintainer "Erik Post" . "erik@shinsetsu.nl") (:keywords "languages") (:url . "https://github.com/purescript-emacs/psc-ide-emacs"))]) + (psci . [(20191025 830) ((emacs (24 4)) (purescript-mode (13 10)) (dash (2 9 0))) "Major mode for purescript repl psci" tar ((:commit . "95fb5d14033add8fe9c8c6b4379758beb88af1d0") (:authors ("Antoine R. Dumont <eniotna.t AT gmail.com>")) (:maintainer "Antoine R. Dumont <eniotna.t AT gmail.com>") (:keywords "languages" "purescript" "psci" "repl") (:url . "https://github.com/purescript-emacs/emacs-psci"))]) + (psession . [(20210203 828) ((emacs (24)) (cl-lib (0 5)) (async (1 9 3))) "Persistent save of elisp objects." single ((:commit . "ed53362af4dfc813505c30ca40227072df16fdfc") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://github.com/thierryvolpiatto/psession"))]) + (psysh . [(20190709 106) ((emacs (24 3)) (s (1 9 0)) (f (0 17)) (php-runtime (0 2))) "PsySH, PHP interactive shell (REPL)" single ((:commit . "21250984ad8137aa3440ac12e52475ef03f19fcb") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "processes" "php") (:url . "https://github.com/zonuexe/psysh.el"))]) + (pt . [(20161226 1959) nil "A front-end for pt, The Platinum Searcher." single ((:commit . "6d99b2aaded3ece3db19a20f4b8f1d4abe382622") (:authors ("Bailey Ling")) (:maintainer "Bailey Ling") (:keywords "pt" "ack" "ag" "grep" "search") (:url . "https://github.com/bling/pt.el"))]) + (ptemplate . [(20210324 1446) ((emacs (25 1)) (yasnippet (0 13 0))) "Project templates" single ((:commit . "b81cc7be8865745c3a60177a244d2a69729ab21b") (:authors ("Nikita Bloshchanevich" . "nikblos@outlook.com")) (:maintainer "Nikita Bloshchanevich" . "nikblos@outlook.com") (:url . "https://github.com/nbfalcon/ptemplate"))]) + (ptemplate-templates . [(20210324 1443) ((emacs (25 1)) (ptemplate (2 0 0))) "Official templates" tar ((:commit . "3788387973dde3101f9a3f2064572be033c59ad6") (:authors ("Nikita Bloshchanevich" . "nikblos@outlook.com")) (:maintainer "Nikita Bloshchanevich" . "nikblos@outlook.com") (:url . "https://github.com/nbfalcon/ptemplate-templates"))]) + (pubmed . [(20200618 2203) ((emacs (25 1)) (deferred (0 5 1)) (esxml (0 3 4)) (s (1 12 0)) (unidecode (0 2))) "Interface to PubMed" tar ((:commit . "88aeb71ed4354af0b58354636ee6a9485887213d") (:authors ("Folkert van der Beek" . "folkertvanderbeek@gmail.com")) (:maintainer "Folkert van der Beek" . "folkertvanderbeek@gmail.com") (:keywords "pubmed" "hypermedia") (:url . "https://gitlab.com/fvdbeek/emacs-pubmed"))]) + (pug-mode . [(20210503 147) ((emacs (24 4)) (cl-lib (0 5))) "Major mode for jade/pug template files" single ((:commit . "d08090485eb8c0488a7d2fbf63680dc0880c7d2f") (:authors ("Nathan Weizenbaum")) (:maintainer "Henrik Lissner" . "henrik@lissner.net") (:keywords "markup" "language" "jade" "pug") (:url . "https://github.com/hlissner/emacs-pug-mode"))]) + (pulseaudio-control . [(20200406 752) nil "Use `pactl' to manage PulseAudio volumes." single ((:commit . "a931533140547510decdc368f39b2d2b97ca725f") (:authors ("Alexis" . "flexibeast@gmail.com") ("Ellington Santos" . "ellingtonsantos@gmail.com") ("Sergey Trofimov" . "sarg@sarg.org.ru")) (:maintainer "Alexis" . "flexibeast@gmail.com") (:keywords "multimedia" "hardware" "sound" "pulseaudio") (:url . "https://github.com/flexibeast/pulseaudio-control"))]) + (punctuality-logger . [(20141120 2031) nil "Punctuality logger for Emacs" single ((:commit . "e09e5dd37bc92289fa2f7dc44aed51a7b5e04bb0") (:authors ("Philip Woods" . "elzairthesorcerer@gmail.com")) (:maintainer "Philip Woods" . "elzairthesorcerer@gmail.com") (:keywords "reminder" "calendar") (:url . "https://gitlab.com/elzair/punctuality-logger"))]) + (pungi . [(20150222 1246) ((jedi (0 2 0 -3 2)) (pyvenv (1 5))) "Integrates jedi with virtualenv and buildout python environments" single ((:commit . "a2d4d439ea371be0b064a12248288903b8a521a0") (:authors ("Matthew Russell" . "matthew.russell@horizon5.org")) (:maintainer "Matthew Russell" . "matthew.russell@horizon5.org") (:keywords "convenience"))]) + (punpun-theme . [(20210508 1635) ((emacs (24 1))) "A bleak theme" tar ((:commit . "7026684cd568cb691af3ced5de14c375fe6f5a1a"))]) + (puppet-mode . [(20210305 645) ((emacs (24 1)) (pkg-info (0 4))) "Major mode for Puppet manifests" single ((:commit . "71bcd383f20a457e8ad34e0e08ec47f8e1b64263") (:authors ("Vox Pupuli" . "voxpupuli@groups.io") ("Bozhidar Batsov" . "bozhidar@batsov.com") ("Sebastian Wiesner" . "swiesner@lunaryorn.com") ("Russ Allbery" . "rra@stanford.edu")) (:maintainer "Vox Pupuli" . "voxpupuli@groups.io") (:keywords "languages") (:url . "https://github.com/voxpupuli/puppet-mode"))]) + (purescript-mode . [(20210109 244) ((emacs (25 1))) "A PureScript editing mode" tar ((:commit . "0acd1af446424ba855153161fe07a20f67dc0a89") (:authors ("1992 Simon Marlow") ("1997-1998 Graeme E Moss" . "gem@cs.york.ac.uk") ("Tommy Thorn" . "thorn@irisa.fr") ("2001-2002 Reuben Thomas (>=v1.4)") ("2003 Dave Love" . "fx@gnu.org") ("2014 Tim Dysinger" . "tim@dysinger.net")) (:maintainer "1992 Simon Marlow") (:keywords "faces" "files" "purescript") (:url . "https://github.com/purescript-emacs/purescript-mode"))]) + (purp-theme . [(20190629 1829) nil "A dark color theme with few colors" tar ((:commit . "f821a7c30452d970ccb0ee08b68d56603860e31d") (:authors ("Vincent Foley" . "vfoley@gmail.com")) (:maintainer "Vincent Foley" . "vfoley@gmail.com") (:keywords "faces") (:url . "https://github.com/gnuvince/purp"))]) + (purple-haze-theme . [(20141015 229) ((emacs (24 0))) "an overtly purple color theme for Emacs24." single ((:commit . "3e245cbef7cd09e6b3ee124963e372a04e9a6485") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com") (:url . "https://github.com/jasonm23/emacs-purple-haze-theme"))]) + (purty-mode . [(20131004 2259) nil "Safely pretty-print greek letters, mathematical symbols, or anything else." single ((:commit . "8eef77317a3bab07ade212353a50fbd3f20f365a") (:authors ("James Atwood" . "jatwood@cs.umass.edu")) (:maintainer "James Atwood" . "jatwood@cs.umass.edu"))]) + (pushbullet . [(20140809 1232) ((grapnel (0 5 2)) (json (1 2))) "Emacs client for the PushBullet Android app" single ((:commit . "73c59a0f1dc04875b3e5a2c8afbc26c32128e445") (:authors ("Abhishek L" . "abhishek.lekshmanan@gmail.com")) (:maintainer "Abhishek L" . "abhishek.lekshmanan@gmail.com") (:keywords "convenience") (:url . "http://www.github.com/theanalyst/revolver"))]) + (pushover . [(20170818 2103) ((cl-lib (0 5))) "Pushover API Access" single ((:commit . "bbe3ac8df3c532a72da4552615af960b8a577588") (:authors ("Samuel W. Flint" . "swflint@flintfam.org")) (:maintainer "Samuel W. Flint" . "swflint@flintfam.org") (:keywords "notifications") (:url . "http://github.com/swflint/pushover.el"))]) + (px . [(20170317 2330) nil "preview inline latex in any mode" single ((:commit . "0c52f7933eab3ca1642ab0df151db9950430c9e2") (:authors ("Aurélien Aptel" . "aurelien.aptel@gmail.com")) (:maintainer "Aurélien Aptel" . "aurelien.aptel@gmail.com") (:url . "http://github.com/aaptel/preview-latex"))]) + (py-autopep8 . [(20160925 1052) nil "Use autopep8 to beautify a Python buffer" single ((:commit . "68e12d8788c91c7ec53a68acf1d23adb2ffa4788") (:authors ("Friedrich Paetzke" . "f.paetzke@gmail.com")) (:maintainer "Friedrich Paetzke" . "f.paetzke@gmail.com") (:url . "http://paetzke.me/project/py-autopep8.el"))]) + (py-gnitset . [(20170821 1732) nil "Run your Python tests any way you'd like" single ((:commit . "1e993cc29cbc31e06fe1e335dec198e21972fa55") (:authors ("Brandon W Maister" . "quodlibetor@gmail.com")) (:maintainer "Brandon W Maister" . "quodlibetor@gmail.com") (:url . "https://www.github.com/quodlibetor/py-gnitset"))]) + (py-import-check . [(20130802 1111) nil "Finds the unused python imports using importchecker" single ((:commit . "9787f87745a4234cd9bed711860b707902bc8ae4") (:authors ("Sibi" . "sibi@psibi.in")) (:maintainer "Sibi" . "sibi@psibi.in") (:keywords "python" "import" "check") (:url . "https://github.com/psibi/emacs-py-import-check"))]) + (py-isort . [(20160925 1018) nil "Use isort to sort the imports in a Python buffer" single ((:commit . "e67306f459c47c53a65604e4eea88a3914596560") (:authors ("Friedrich Paetzke" . "paetzke@fastmail.fm")) (:maintainer "Friedrich Paetzke" . "paetzke@fastmail.fm") (:url . "http://paetzke.me/project/py-isort.el"))]) + (py-smart-operator . [(20170531 1209) ((s (1 9 0))) "smart-operator for python-mode" single ((:commit . "0c8a66faca4b35158d0b5885472cb75286039167") (:authors ("Rustem Muslimov" . "r.muslimov@gmail.com")) (:maintainer "Rustem Muslimov" . "r.muslimov@gmail.com") (:keywords "python" "convenience" "smart-operator"))]) + (py-test . [(20151117 622) ((dash (2 9 0)) (f (0 17)) (emacs (24 4))) "A test runner for Python code." single ((:commit . "3b2a0bdaacb54df6f2bee8317423e5c0d159d5cf") (:authors ("Bogdan Paul Popa" . "popa.bogdanp@gmail.com")) (:maintainer "Bogdan Paul Popa" . "popa.bogdanp@gmail.com") (:keywords "python" "testing" "py.test") (:url . "https://github.com/Bogdanp/py-test.el"))]) + (py-yapf . [(20160925 1122) nil "Use yapf to beautify a Python buffer" single ((:commit . "a878304202ad827a1f3de3dce1badd9ca8731146") (:authors ("Friedrich Paetzke" . "f.paetzke@gmail.com")) (:maintainer "Friedrich Paetzke" . "f.paetzke@gmail.com") (:url . "https://github.com/paetzke/py-yapf.el"))]) + (pycarddavel . [(20150831 1216) ((helm (1 7 0)) (emacs (24 0))) "Integrate pycarddav" single ((:commit . "a6d81ee4eb8309cd82f6082aeca68c5a015702a3") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:keywords "helm" "pyccarddav" "carddav" "message" "mu4e" "contacts"))]) + (pycoverage . [(20200513 2047) ((emacs (24 3))) "Support for coverage stats on Python 2.X and 3" tar ((:commit . "3c69ed312121368f1b24cc04d54a29ce4ed4f743") (:authors ("matt harrison")) (:maintainer "matt harrison") (:keywords "project" "convenience") (:url . "https://github.com/mattharrison/pycoverage.el"))]) + (pydoc . [(20201030 1530) nil "functional, syntax highlighted pydoc navigation" single ((:commit . "4459aa1c2cc7648cb1b9c9fcf470d8809a9bc7b3") (:authors ("John Kitchin" . "jkitchin@andrew.cmu.edu")) (:maintainer "Brian J. Lopes" . "statmobile@gmail.com") (:keywords "pydoc" "python") (:url . "https://github.com/statmobile/pydoc"))]) + (pyenv-mode . [(20200518 1521) ((pythonic (0 1 0))) "Integrate pyenv with python-mode" single ((:commit . "b818901b8eac0e260ced66a6a5acabdbf6f5ba99") (:authors ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainer "Artem Malyshev" . "proofit404@gmail.com") (:url . "https://github.com/proofit404/pyenv-mode"))]) + (pyenv-mode-auto . [(20180620 1252) ((pyenv-mode (0 1 0)) (s (1 11 0)) (f (0 17 0))) "Automatically activates pyenv version if .python-version file exists." single ((:commit . "347b94cd5ad22e33cc41be661c102d4548767858") (:authors ("Sviatoslav Bulbakha" . "mail@ssbb.me")) (:maintainer "Sviatoslav Bulbakha" . "mail@ssbb.me") (:keywords "python" "pyenv") (:url . "https://github.com/ssbb/pyenv-mode-auto"))]) + (pygen . [(20161121 506) ((elpy (1 12 0)) (python-mode (6 2 2)) (dash (2 13 0))) "Python code generation using Elpy and Python-mode." single ((:commit . "9019ff44ba49d7295b1476530feab91fdadb084b") (:authors ("Jack Crawley <http://www.github.com/jackcrawley>")) (:maintainer "Jack Crawley <http://www.github.com/jackcrawley>") (:keywords "python" "code generation") (:url . "https://github.com/JackCrawley/pygen/"))]) + (pyim . [(20210610 643) ((emacs (24 4)) (async (1 6)) (xr (1 13))) "A Chinese input method support quanpin, shuangpin, wubi and cangjie." tar ((:commit . "8f954573d378c3f4b1931d96ba7143e79149c82e") (:authors ("Ye Wenbin" . "wenbinye@163.com") ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:keywords "convenience" "chinese" "pinyin" "input-method") (:url . "https://github.com/tumashu/pyim"))]) + (pyim-basedict . [(20210517 43) nil "The default pinyin dict of pyim" tar ((:commit . "86f6de3e3a1523eb278bd3afe7c4ceba2a0e2972") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:keywords "convenience" "chinese" "pinyin" "input-method" "complete") (:url . "https://github.com/tumashu/pyim-basedict"))]) + (pyim-cangjiedict . [(20210507 928) ((pyim (3 7))) "Some cangjie dicts for pyim" tar ((:commit . "455e20e90044a1fcd6c4b45252745fa233e0107d") (:authors ("Yuanchen Xie" . "yuanchen.gm@gmail.com")) (:maintainer "Yuanchen Xie" . "yuanchen.gm@gmail.com") (:keywords "convenience" "chinese" "pinyin" "input-method" "complete") (:url . "https://github.com/p1uxtar/pyim-cangjiedict"))]) + (pyim-smzmdict . [(20210505 1445) ((pyim (3 7))) "Sanma(triple) Zhengma dict for pyim" tar ((:commit . "fcddbde17a04d174c7353548056524687f7be8d2") (:authors ("Yue Shi (Zhizhi)")) (:maintainer "Yuanchen Xie") (:keywords "convenience" "i18n" "pyim" "chinese" "zhengma") (:url . "https://github.com/p1uxtar/pyim-smzmdict"))]) + (pyim-wbdict . [(20210504 1144) ((pyim (3 7))) "Some wubi dicts for pyim" tar ((:commit . "da51e226bca9be2ed6175298489be64e45492759") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:keywords "convenience" "chinese" "pinyin" "input-method" "complete") (:url . "https://github.com/tumashu/pyim-wbdict"))]) + (pyimport . [(20180308 1752) ((dash (2 8 0)) (s (1 9 0)) (shut-up (0 3 2))) "Manage Python imports!" single ((:commit . "a6f63cf7ed93f0c0f7c207e6595813966f8852b9") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk"))]) + (pyimpsort . [(20160130 453) ((emacs (24 3))) "Sort python imports." tar ((:commit . "d5c61d70896b642646dfd3c809c06174ae086c1a") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:keywords "convenience") (:url . "https://github.com/emacs-pe/pyimpsort.el"))]) + (pylint . [(20210411 1931) nil "minor mode for running `pylint'" single ((:commit . "45588d739450b7286c8dad7063523470ab7d01fd") (:authors ("Ian Eure" . "ian.eure@gmail.com")) (:maintainer "Jonathan Kotta" . "jpkotta@gmail.com") (:keywords "languages" "python"))]) + (pynt . [(20180710 726) ((emacs (24 4)) (ein (0 13 1)) (epc (0 1 1)) (deferred (0 5 1))) "Generate and scroll EIN buffers from python code" single ((:commit . "86cf9ce78d34f92bfd0764c9cbb75427ebd429e6") (:authors ("Edward Banner" . "edward.banner@gmail.com")) (:maintainer "Edward Banner" . "edward.banner@gmail.com") (:keywords "convenience") (:url . "https://github.com/ebanner/pynt"))]) + (pyramid . [(20210427 1032) ((emacs (25 2)) (pythonic (0 1 1)) (tablist (0 70))) "Minor mode for working with pyramid projects" tar ((:commit . "66f54f4a9cc9fa81edf768ab433d5b3c5517363c") (:authors ("Daniel Kraus" . "daniel@kraus.my")) (:maintainer "Daniel Kraus" . "daniel@kraus.my") (:keywords "python" "pyramid" "pylons" "convenience" "tools" "processes") (:url . "https://github.com/dakra/pyramid.el"))]) + (pytest . [(20200330 41) ((s (1 9 0))) "Easy Python test running in Emacs" single ((:commit . "6934047242db79b1c53e9fe3e0734cc9719ed1c4") (:keywords "pytest" "python" "testing") (:url . "https://github.com/ionrock/pytest-el"))]) + (pytest-pdb-break . [(20200804 848) ((emacs (25))) "A pytest PDB launcher" tar ((:commit . "fe4a43299a926223634c3b104b751397bb818019") (:authors ("Jane Soko" . "poppyschmo@protonmail.com")) (:maintainer "Jane Soko" . "poppyschmo@protonmail.com") (:keywords "languages" "tools") (:url . "https://github.com/poppyschmo/pytest-pdb-break"))]) + (python-black . [(20210511 1545) ((emacs (25)) (dash (2 16 0)) (reformatter (0 3))) "Reformat Python using python-black" single ((:commit . "6b6ab71d2762b6da703f8d1d3d964b712a98939e") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee") (:keywords "languages") (:url . "https://github.com/wbolster/emacs-python-black"))]) + (python-cell . [(20200314 1147) ((emacs (25 1))) "Support for MATLAB-like cells in python mode" single ((:commit . "4f0778b05bfb936861449bcb998ed620cd9b31ad") (:authors ("Thomas Hisch" . "t.hisch@gmail.com")) (:maintainer "Thomas Hisch" . "t.hisch@gmail.com") (:keywords "extensions" "python" "matlab" "cell") (:url . "https://github.com/thisch/python-cell.el"))]) + (python-django . [(20150822 404) nil "A Jazzy package for managing Django projects" single ((:commit . "fc54ad74f0309670359b939f64d0f1fff68aeac4") (:authors ("Fabián E. Gallina" . "fabian@anue.biz")) (:maintainer "FSF") (:keywords "languages") (:url . "https://github.com/fgallina/python-django.el"))]) + (python-docstring . [(20190716 921) nil "Smart Python docstring formatting" tar ((:commit . "ec253711f2bdcb3848046bb68f6405a7bf9eb0fb"))]) + (python-environment . [(20150310 853) ((deferred (0 3 1))) "virtualenv API for Emacs Lisp" tar ((:commit . "401006584e32864a10c69d29f14414828909362e") (:authors ("Takafumi Arakaki <aka.tkf at gmail.com>")) (:maintainer "Takafumi Arakaki <aka.tkf at gmail.com>") (:keywords "applications" "tools"))]) + (python-info . [(20151228 1852) nil "Python info manual for Emacs" tar ((:commit . "306f15441b54b25757cdfd3b327b84024ea21ed7"))]) + (python-isort . [(20210603 2153) ((emacs (26)) (reformatter (0 6))) "Reformat python-mode buffer with isort" single ((:commit . "339814df22b87eebca02137e581f65d6283fce97") (:authors ("Jimmy Yuen Ho Wong" . "wyuenho@gmail.com")) (:maintainer "Jimmy Yuen Ho Wong" . "wyuenho@gmail.com") (:keywords "languages") (:url . "https://github.com/wyuenho/emacs-python-isort"))]) + (python-mode . [(20210601 1845) nil "Python major mode" tar ((:commit . "198ba8e15e848825b2215e9fc363f06d8c173a28") (:authors ("2015-2021 https://gitlab.com/groups/python-mode-devs") ("2003-2014 https://launchpad.net/python-mode") ("1995-2002 Barry A. Warsaw") ("1992-1994 Tim Peters")) (:maintainer nil . "python-mode@python.org") (:keywords "languages" "processes" "python" "oop") (:url . "https://gitlab.com/groups/python-mode-devs"))]) + (python-pytest . [(20210219 1947) ((emacs (24 4)) (dash (2 18 0)) (transient (20200719)) (projectile (0 14 0)) (s (1 12 0))) "helpers to run pytest" single ((:commit . "31ae5e0e6813de8d889103f7b8dde252b04b1ae4") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee") (:keywords "pytest" "test" "python" "languages" "processes" "tools") (:url . "https://github.com/wbolster/emacs-python-pytest"))]) + (python-switch-quotes . [(20161228 809) ((emacs (24 3))) "cycle between ' and \" quotes in python strings" single ((:commit . "93f1e9b40e061a6cea480139e8b1362b6404abd0") (:authors ("Vladimir Lagunov" . "lagunov.vladimir@gmail.com")) (:maintainer "Vladimir Lagunov" . "lagunov.vladimir@gmail.com") (:keywords "python" "tools" "convenience") (:url . "https://github.com/werehuman/python-switch-quotes"))]) + (python-test . [(20181018 29) ((emacs (25 1))) "Python testing integration" single ((:commit . "f899975b133539e19ba822e4b0bfd1a28572967e") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:keywords "convenience" "tools" "processes") (:url . "https://github.com/emacs-pe/python-test.el"))]) + (python-x . [(20190611 1303) ((python (0 24)) (folding (0)) (cl-lib (0 5))) "python.el extras for interactive evaluation" tar ((:commit . "b1f8eaccee210d7c0580dba6dc9bd361fcf3765d") (:authors ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainer "Yuri D'Elia" . "wavexx@thregr.org"))]) + (pythonic . [(20210122 1247) ((emacs (25 1)) (s (1 9)) (f (0 17 2))) "Utility functions for writing pythonic emacs package." single ((:commit . "fe75bc17baae314bf8f5e0b12aad3fccfc6c5397") (:authors ("Artem Malyshev" . "proofit404@gmail.com")) (:maintainer "Artem Malyshev" . "proofit404@gmail.com") (:url . "https://github.com/proofit404/pythonic"))]) + (pyvenv . [(20210527 829) nil "Python virtual environment interface" single ((:commit . "045ff9476dac26086a04538d9b7ba186aa8f0fd1") (:authors ("Jorgen Schaefer" . "contact@jorgenschaefer.de")) (:maintainer "Jorgen Schaefer" . "contact@jorgenschaefer.de") (:keywords "python" "virtualenv" "tools") (:url . "http://github.com/jorgenschaefer/pyvenv"))]) + (q-mode . [(20210611 2044) ((emacs (24))) "A q editing mode" single ((:commit . "afb33782afdf19e094a0146c2e0ed10f798524a6") (:keywords "faces" "files" "q") (:url . "https://github.com/psaris/q-mode"))]) + (ql . [(20180418 2020) ((emacs (24))) "Control Quod Libet" single ((:commit . "d976414ba6aa576ad524b5ee5bfa620efd072258") (:authors ("Ian Eure" . "ian.eure@gmail.com")) (:maintainer "Ian Eure" . "ian.eure@gmail.com") (:keywords "multimedia") (:url . "https://github.com/ieure/ql-el"))]) + (qml-mode . [(20161016 31) nil "Major mode for editing QT Declarative (QML) code." single ((:commit . "6c5f33ba88ae010bf201a80ee8095e20a724558c") (:authors ("Yen-Chin Lee" . "coldnew.tw@gmail.com")) (:maintainer "Yen-Chin Lee" . "coldnew.tw@gmail.com") (:keywords "qml" "qt" "qt declarative") (:url . "https://github.com/coldnew/qml-mode"))]) + (qt-pro-mode . [(20170604 1841) ((emacs (24))) "Qt Pro/Pri major mode" single ((:commit . "7a2da323de834294b413cbbb3c92f42f54913643") (:authors ("Todd Neal" . "tolchz@gmail.com")) (:maintainer "Todd Neal" . "tolchz@gmail.com") (:keywords "extensions"))]) + (qtcreator-theme . [(20201215 1523) ((emacs (24 3))) "A color theme that mimics Qt Creator IDE" single ((:commit . "515532b05063898459157d2ba5c10ec0d5a4b1bd") (:authors ("Lesley Lai" . "lesley@lesleylai.info")) (:maintainer "Lesley Lai" . "lesley@lesleylai.info") (:keywords "theme" "light" "faces") (:url . "https://github.com/LesleyLai/emacs-qtcreator-theme"))]) + (quack . [(20181106 1301) nil "enhanced support for editing and running Scheme code" single ((:commit . "2146805ce2b5a9b155d73929986f11e713787e26"))]) + (quasi-monochrome-theme . [(20200415 705) nil "Quasi Monochrome theme" tar ((:commit . "b38d71860fdea945e10e8a766ac9dfa1410ade67") (:authors ("Lorenzo Bolla" . "lbolla@gmail.com")) (:maintainer "Lorenzo Bolla" . "lbolla@gmail.com") (:keywords "color-theme" "monochrome" "high contrast") (:url . "https://github.com/lbolla/emacs-quasi-monochrome"))]) + (quelpa . [(20210329 639) ((emacs (25 1))) "Emacs Lisp packages built directly from source" tar ((:commit . "9acc440f8c200b1e6134f53e219d84360ee1b6b7") (:authors ("steckerhalter")) (:maintainer "steckerhalter") (:keywords "tools" "package" "management" "build" "source" "elpa") (:url . "https://github.com/quelpa/quelpa"))]) + (quelpa-leaf . [(20210124 348) ((emacs (25 1)) (quelpa (1 0)) (leaf (4 1 0))) "Quelpa handler for leaf" single ((:commit . "cc13df4a6c6cdf1dea558be5b6e99b6e8d8b4065") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/quelpa/quelpa-leaf"))]) + (quelpa-use-package . [(20201022 746) ((emacs (25 1)) (quelpa (1 0)) (use-package (2))) "quelpa handler for use-package" single ((:commit . "d985c0326b66aa19581918deccdc5edcacccf953") (:authors ("steckerhalter")) (:maintainer "steckerhalter") (:keywords "package" "management" "elpa" "use-package") (:url . "https://github.com/quelpa/quelpa-use-package"))]) + (quick-buffer-switch . [(20201027 2307) nil "Quick switch to file or dir buffers." single ((:commit . "da82555f286588f171eed1de151325bbdd8cbd91") (:authors ("Sebastien Gross <seb•ɑƬ•chezwam•ɖɵʈ•org>")) (:maintainer "Sebastien Gross <seb•ɑƬ•chezwam•ɖɵʈ•org>") (:keywords "emacs" "configuration"))]) + (quick-peek . [(20200130 2059) ((emacs (24 3))) "Inline quick-peek windows" single ((:commit . "03a276086795faad46a142454fc3e28cab058b70") (:authors ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com") (:keywords "tools" "help" "doc" "convenience"))]) + (quick-preview . [(20191017 1920) nil "quick preview using GNOME sushi, gloobus or quick look" single ((:commit . "a312ab5539b9a362da9d305e4da814e17c5721c9") (:authors ("myuhe <yuhei.maeda_at_gmail.com>")) (:maintainer "myuhe") (:keywords "files" "hypermedia") (:url . "https://github.com/myuhe/quick-preview.el"))]) + (quick-shell-keybind . [(20171023 613) ((emacs (24))) "Interactively bind a key to shell commands" single ((:commit . "5f4541a5a5554d108bf16b5fd1713e962161ca1b") (:authors ("eyeinsky" . "eyeinsky9@gmail.com")) (:maintainer "eyeinsky" . "eyeinsky9@gmail.com") (:keywords "maint" "convenience" "processes") (:url . "https://github.com/eyeinsky/quick-shell-keybind"))]) + (quickref . [(20170817 1232) ((dash (1 0 3)) (s (1 0 0))) "Display relevant notes-to-self in the echo area" single ((:commit . "f368c8b8219bb90498c5ab84e26f00eedaa234cf") (:authors ("Kyle Hargraves")) (:maintainer "Kyle Hargraves") (:url . "https://github.com/pd/quickref.el"))]) + (quickrun . [(20210330 654) ((emacs (24 3))) "Run commands quickly" single ((:commit . "35e91f4b6cfbb8dd2adea4d8cf53ae76db7d00d9") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-quickrun"))]) + (quiet . [(20200211 721) nil "Disconnect from the online world for a while" single ((:commit . "f8a4ef0be086f97e7fb631df7060f29cc4025b98") (:authors ("nik gaffney" . "nik@fo.am")) (:maintainer "nik gaffney" . "nik@fo.am") (:keywords "convenience" "quiet" "distraction" "network" "detachment" "offline") (:url . "https://github.com/zzkt/quiet"))]) + (quilt . [(20190828 506) ((emacs (26 0))) "Minor mode for working with files in quilt" single ((:commit . "b56a1f1acc46cdf8655710e4c8f24f5f31f22c6a") (:authors ("Matt Mackall" . "mpm@selenic.com")) (:maintainer "Jan Stranik" . "jan@stranik.org") (:keywords "extensions") (:url . "https://github.com/jstranik/emacs-quilt"))]) + (quiz . [(20190525 1206) ((cl-lib (0 5)) (emacs (25))) "Multiple choice quiz game" single ((:commit . "570bf53926d89282cdb9653bd5aa8fe968f92bbd") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "games" "trivia" "quiz") (:url . "https://github.com/davep/quiz.el"))]) + (r-autoyas . [(20140101 1510) ((ess (0)) (yasnippet (0 8 0))) "Provides automatically created yasnippets for R function argument lists." tar ((:commit . "b4020ee7f5f895e0065b8b26da8a49c51432d530") (:authors ("Sven Hartenstein & Matthew Fidler")) (:maintainer "Matthew Fidler") (:keywords "r" "yasnippet") (:url . "https://github.com/mlf176f2/r-autoyas.el"))]) + (racer . [(20210307 243) ((emacs (25 1)) (rust-mode (0 2 0)) (dash (2 13 0)) (s (1 10 0)) (f (0 18 2)) (pos-tip (0 4 6))) "code completion, goto-definition and docs browsing for Rust via racer" single ((:commit . "1e63e98626737ea9b662d4a9b1ffd6842b1c648c") (:authors ("Phil Dawes")) (:maintainer "Phil Dawes") (:keywords "abbrev" "convenience" "matching" "rust" "tools") (:url . "https://github.com/racer-rust/emacs-racer"))]) + (racket-mode . [(20210604 1431) ((emacs (25 1)) (faceup (0 0 2)) (pos-tip (20191127 1028))) "Racket editing, REPL, and more" tar ((:commit . "4b46a818c08820e04d25df7fe830e80ea82e1126") (:authors ("Greg Hendershott")) (:maintainer "Greg Hendershott") (:url . "https://www.racket-mode.com/"))]) + (rails-log-mode . [(20140408 425) nil "Major mode for viewing Rails log files" single ((:commit . "ff440003ad7d47cb0ac3300f2a632f4cfd36a446") (:authors ("Anantha kumaran" . "ananthakumaran@gmail.com")) (:maintainer "Anantha kumaran" . "ananthakumaran@gmail.com") (:keywords "rails" "log"))]) + (railscasts-reloaded-theme . [(20190308 759) nil "Railscasts Reloaded color theme" single ((:commit . "1c3850568e60a555d59cbb57bf2b6aa06e99d454") (:authors ("George Thomas" . "iamgeorgethomas@gmail.com")) (:maintainer "George Thomas" . "iamgeorgethomas@gmail.com") (:url . "https://github.com/thegeorgeous/railscasts-reloaded-theme"))]) + (railscasts-theme . [(20150219 1525) nil "Railscasts color theme for GNU Emacs." single ((:commit . "1340c3f6c2717761cab95617cf8dcbd962b1095b") (:authors ("Oleg Shaldybin")) (:maintainer "Oleg Shaldybin") (:keywords "railscasts" "color" "theme") (:url . "https://github.com/mikenichols/railscasts-theme"))]) + (rainbow-blocks . [(20210412 1937) nil "Block syntax highlighting for lisp code" single ((:commit . "ae5c11cd3dc64039c5e65c9f1804aceba5b3b209") (:authors ("istib")) (:maintainer "istib") (:url . "https://github.com/istib/rainbow-blocks"))]) + (rainbow-delimiters . [(20210515 1254) nil "Highlight brackets according to their depth" single ((:commit . "d576e6694ad3a3e88b2bb1363305b38fa364c149") (:authors ("Jeremy Rayman" . "opensource@jeremyrayman.com") ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:keywords "faces" "convenience" "lisp" "tools") (:url . "https://github.com/Fanael/rainbow-delimiters"))]) + (rainbow-fart . [(20210202 846) ((emacs (25 1)) (flycheck (32 -4))) "Checks the keywords of code to play suitable sounds" tar ((:commit . "61acc77535720f7ed3b8f680fa9d9a1871832f11") (:keywords "tools") (:url . "https://github.com/stardiviner/emacs-rainbow-fart"))]) + (rainbow-identifiers . [(20141102 1526) ((emacs (24))) "Highlight identifiers according to their names" single ((:commit . "19fbfded1baa98d12335f26f6d7b20e5ae44ce2e") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/rainbow-identifiers"))]) + (rake . [(20180212 1008) ((f (0 13 0)) (dash (1 5 0)) (cl-lib (0 5))) "Run rake commands" single ((:commit . "9c204334b03b4e899fadae6e59c20cf105404128") (:authors ("Adam Sokolnicki" . "adam.sokolnicki@gmail.com")) (:maintainer "Adam Sokolnicki" . "adam.sokolnicki@gmail.com") (:keywords "rake" "ruby") (:url . "https://github.com/asok/rake.el"))]) + (raku-mode . [(20210412 2342) ((emacs (24 4)) (pkg-info (0 1))) "Major mode for editing Raku code" tar ((:commit . "7496ad3a03bed613c259405ec8839ae02950fdb1") (:authors ("Hinrik Örn Sigurðsson" . "hinrik.sig@gmail.com")) (:maintainer "Hinrik Örn Sigurðsson" . "hinrik.sig@gmail.com") (:keywords "languages") (:url . "https://github.com/hinrik/perl6-mode"))]) + (rally-mode . [(20161114 354) ((popwin (1 0 0))) "a mode to interact with the Rally Software web site." single ((:commit . "0f5e09a6abe2de7613f174b4f54863df93343134") (:authors ("Sean LeBlanc" . "seanleblanc@gmail.com")) (:maintainer "Sean LeBlanc" . "seanleblanc@gmail.com") (:keywords "rally" "ca" "agile") (:url . "https://pragcraft.wordpress.com/"))]) + (rand-theme . [(20151219 2335) ((cl-lib (0 5))) "Random Emacs theme at start-up!" single ((:commit . "65a00e5c5150f857aa96803b68f50bc8da0215b7") (:authors ("Daniel Gopar")) (:maintainer "Daniel Gopar") (:url . "https://github.com/gopar/rand-theme"))]) + (random-splash-image . [(20151003 130) nil "Randomly sets splash image to *GNU Emacs* buffer on startup." single ((:commit . "53a39ebfd8ac6be066a652a508a717870f94218a") (:authors ("kakakaya <kakakaya AT gmail.com>")) (:maintainer "kakakaya <kakakaya AT gmail.com>") (:keywords "games") (:url . "https://github.com/kakakaya/random-splash-image"))]) + (ranger . [(20210125 330) ((emacs (24 4))) "Make dired more like ranger" single ((:commit . "2498519cb21dcd5791d240607a72a204d1761668") (:authors ("Rich Alesi <https://github.com/ralesi>")) (:maintainer "Rich Alesi <https://github.com/ralesi>") (:keywords "files" "convenience" "dired") (:url . "https://github.com/ralesi/ranger"))]) + (rase . [(20120928 2045) nil "Run At Sun Event daemon" single ((:commit . "59b5f7e8102570b65040e8d55781c7ea28de7338") (:authors ("Andrey Kotlarski" . "m00naticus@gmail.com")) (:maintainer "Andrey Kotlarski" . "m00naticus@gmail.com") (:keywords "solar" "sunrise" "sunset" "midday" "midnight") (:url . "https://github.com/m00natic/rase/"))]) + (rats . [(20170818 1013) ((s (1 10 0)) (go-mode (1 3 1)) (cl-lib (0 5))) "Rapid testing suite for Go" single ((:commit . "a6d55aebcc54f669c6c6ffedf84364c4097903cc") (:authors ("Antoine Kalmbach" . "ane@iki.fi")) (:maintainer "Antoine Kalmbach" . "ane@iki.fi") (:keywords "go"))]) + (rbenv . [(20141120 749) nil "Emacs integration for rbenv" single ((:commit . "2ea1a5bdc1266caef1dd77700f2c8f42429b03f1") (:authors ("Yves Senn" . "yves.senn@gmail.com")) (:maintainer "Yves Senn" . "yves.senn@gmail.com") (:keywords "ruby" "rbenv") (:url . "https://github.com/senny/rbenv.el"))]) + (rbs-mode . [(20210430 135) ((emacs (24 5))) "A major mode for RBS" single ((:commit . "fd766a943d5f1f0624e10ffce096b9aaba14a5f4") (:authors ("Masafumi Koba")) (:maintainer "Masafumi Koba") (:keywords "languages") (:url . "https://github.com/ybiquitous/rbs-mode"))]) + (rbt . [(20170202 2302) ((popup (0 5 3)) (magit (20160128 1201))) "Integrate reviewboard with emacs." single ((:commit . "32bfba9062a014e375451cf4203c29535b5efc1e") (:authors ("Joe Heyming" . "joeheyming@gmail.com")) (:maintainer "Joe Heyming" . "joeheyming@gmail.com") (:keywords "reviewboard" "rbt"))]) + (rbtagger . [(20200911 2209) ((emacs (25 1))) "Ruby tagging tools" tar ((:commit . "32d1df138a9b70530ec7a71dc85aa6e133a6cd95") (:authors ("Thiago Araújo" . "thiagoaraujos@gmail.com")) (:maintainer "Thiago Araújo" . "thiagoaraujos@gmail.com") (:keywords "languages" "tools") (:url . "https://www.github.com/thiagoa/rbtagger"))]) + (rc-mode . [(20160913 1918) nil "Major mode for the Plan9 rc shell" single ((:commit . "fe2e0570bf9c19a292e16b18fd4b0a256df5d93f") (:authors ("Jordan Brown")) (:maintainer "Jordan Brown") (:keywords "rc" "plan9" "shell") (:url . "https://github.com/mrhmouse/rc-mode.el"))]) + (rcirc-alert . [(20141127 1047) nil "Configurable alert messages on top of RCIRC" tar ((:commit . "0adf8ff9c47023fec578f678424be62b0f49057f") (:maintainer "Cayetano Santos") (:keywords "lisp" "rcirc" "irc" "alert" "awesome"))]) + (rcirc-alertify . [(20140407 119) ((alert (20140406 1353))) "Cross platform notifications for rcirc" single ((:commit . "ea5cafc55893f375eccbe013d12dbaa94bf6e259") (:authors ("Fabián Ezequiel Gallina" . "fgallina@gnu.org")) (:maintainer "Fabián Ezequiel Gallina" . "fgallina@gnu.org") (:keywords "comm" "convenience"))]) + (rcirc-groups . [(20170731 2101) nil "an emacs buffer in rcirc-groups major mode" single ((:commit . "b68ece9d219b909244d4e3c0d8bf6a746d6fead7") (:authors ("Dimitri Fontaine" . "dim@tapoueh.org")) (:maintainer "Dimitri Fontaine" . "dim@tapoueh.org") (:keywords "comm" "convenience") (:url . "http://tapoueh.org/emacs/rcirc-groups.html"))]) + (rcirc-notify . [(20150219 2204) nil "libnotify popups" single ((:commit . "841a7b5a6cdb0c11a812df924d2c6a7d364fd455") (:authors ("Will Farrington, Alex Schroeder <alex@gnu.org>, Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:keywords "lisp" "rcirc" "irc" "notify" "growl"))]) + (rcirc-styles . [(20210414 1712) ((cl-lib (0 5))) "support mIRC-style color and attribute codes" single ((:commit . "dd06ec5fa455131788bbc885fcfaaec16b08f13b"))]) + (rdf-prefix . [(20200216 914) nil "Prefix lookup for RDF" single ((:commit . "825af2c584fbad9e67c2c08e29040776fa647fe0") (:authors ("Simen Heggestøyl" . "simenheg@gmail.com")) (:maintainer "Simen Heggestøyl" . "simenheg@gmail.com") (:keywords "convenience" "abbrev") (:url . "https://github.com/simenheg/rdf-prefix"))]) + (rdp . [(20120929 154) nil "Recursive Descent Parser library" single ((:commit . "b620192afada04aec33b38cc130fef0765f41ca9") (:authors ("Christopher Wellons" . "mosquitopsu@gmail.com")) (:maintainer "Christopher Wellons" . "mosquitopsu@gmail.com") (:url . "https://github.com/skeeto/rdp"))]) + (rdxmk . [(20170630 134) nil "A small set of tools for redox developments" tar ((:commit . "e78749fb29738365ffa4d863ffabeb969ebb0bcf") (:authors ("Jacob Salzberg" . "jsalzbergedu@yahoo.com")) (:maintainer "Jacob Salzberg" . "jsalzbergedu@yahoo.com") (:keywords "redox" "convenience" "tools") (:url . "https://github.com/jsalzbergedu/rdxmk"))]) + (react-snippets . [(20210430 1510) ((yasnippet (0 7 0))) "Yasnippets for React" tar ((:commit . "969c21734dab638057fe9e284f6a51edcc3407c9") (:authors ("John Mastro" . "john.b.mastro@gmail.com")) (:maintainer "John Mastro" . "john.b.mastro@gmail.com") (:keywords "snippets"))]) + (read-aloud . [(20160923 500) ((emacs (24 4))) "A simple interface to TTS engines" single ((:commit . "c662366226abfb07204ab442b4f853ed85438d8a") (:authors ("Alexander Gromnitsky" . "alexander.gromnitsky@gmail.com")) (:maintainer "Alexander Gromnitsky" . "alexander.gromnitsky@gmail.com") (:keywords "multimedia") (:url . "https://github.com/gromnitsky/read-aloud.el"))]) + (read-only-cfg . [(20210608 1259) ((emacs (24 3))) "Make files read-only based on user config" single ((:commit . "a02395b37a68b2e20e365c2e3752f966c71d4c02") (:authors ("pfchen" . "pfchen31@gmail.com")) (:maintainer "pfchen" . "pfchen31@gmail.com") (:keywords "tools" "convenience") (:url . "https://github.com/pfchen/read-only-cfg"))]) + (readline-complete . [(20150708 1437) nil "offers completions in shell mode" single ((:commit . "30c020c37b2741160cc37e656e13c85d826a0ebf") (:authors ("Christopher Monsanto" . "chris@monsan.to")) (:maintainer "Christopher Monsanto" . "chris@monsan.to"))]) + (real-auto-save . [(20200505 1537) ((emacs (24 4))) "Automatically save your buffers/files at regular intervals" single ((:commit . "481a2d1460ab5a9b6df3721dda76ad515923bfd1") (:authors ("Chaoji Li <lichaoji AT gmail DOT com>") ("Anand Reddy Pandikunta <anand21nanda AT gmail DOT com>")) (:maintainer "Chaoji Li <lichaoji AT gmail DOT com>") (:url . "https://github.com/ChillarAnand/real-auto-save"))]) + (realgud . [(20210522 2151) ((load-relative (1 3 1)) (loc-changes (1 2)) (test-simple (1 3 0)) (emacs (25))) "A modular front-end for interacting with external debuggers" tar ((:commit . "7a70b27614c488be274898d0141ec82feb3a8d5a") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org") (:keywords "debugger" "gdb" "python" "perl" "go" "bash" "zsh" "bashdb" "zshdb" "remake" "trepan" "perldb" "pdb") (:url . "https://github.com/realgud/realgud/"))]) + (realgud-byebug . [(20190520 1140) ((realgud (1 4 5)) (load-relative (1 2)) (cl-lib (0 5)) (emacs (24))) "Realgud front-end to the Ruby byebug debugger" tar ((:commit . "f8f20b92c6b13f75cc9797921c0e28d3def48b1c") (:authors ("Rocky Bernstein")) (:maintainer "Rocky Bernstein") (:url . "http://github.com/rocky/realgud-byebug"))]) + (realgud-ipdb . [(20200722 1116) ((realgud (1 5 0)) (load-relative (1 3 1)) (emacs (25))) "Realgud front-end to ipdb" tar ((:commit . "f18f907aa4ddd3e59dc19ca296d4ee2dc5e436b0") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org") (:url . "https://github.com/realgud/realgud-ipdb"))]) + (realgud-jdb . [(20200722 1120) ((realgud (1 5 0)) (load-relative (1 3 1)) (emacs (25))) "Realgud front-end to Java's jdb debugger\"" tar ((:commit . "1c183b2f8aae0de60942ea01444b896bf182c66a") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org") (:url . "https://github.com/realgud/realgud-jdb"))]) + (realgud-lldb . [(20210417 1434) ((load-relative (1 3 1)) (realgud (1 5 0)) (emacs (25))) "Realgud front-end to lldb" tar ((:commit . "abffd0d2d23f6c87be5dc5d36e948af92de5df86") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org") (:url . "http://github.com/realgud/realgud-lldb"))]) + (realgud-node-debug . [(20190525 1634) ((realgud (1 4 5)) (load-relative (1 2)) (cl-lib (0 5)) (emacs (25))) "Realgud front-end to older \"node debug\"" tar ((:commit . "72e786359ce9dace1796b0d81a00e9340e9c90ad") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org") (:url . "http://github.com/realgud/realgud-node-debug"))]) + (realgud-node-inspect . [(20190523 1251) ((realgud (1 4 5)) (load-relative (1 2)) (cl-lib (0 5)) (emacs (24))) "Realgud front-end to newer \"node inspect\"" tar ((:commit . "c3ed48cf3bc2b28f9fd23bcf60ea13a3cf019fc8") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org") (:url . "http://github.com/realgud/realgud-node-inspect"))]) + (realgud-old-debuggers . [(20190520 1150) ((realgud (1 4 5)) (load-relative (1 2)) (cl-lib (0 5)) (emacs (24))) "Realgud front-end to older lesser-used debuggers" tar ((:commit . "0fad38283e885c452160232e01adf3f6ae51983b") (:authors ("Rocky Bernstein")) (:maintainer "Rocky Bernstein") (:url . "http://github.com/rocky/realgud-old-debuggers"))]) + (realgud-pry . [(20201011 1815) ((realgud (1 4 5)) (load-relative (1 2)) (cl-lib (0 5)) (emacs (25))) "Realgud front-end to the Ruby pry debugger" tar ((:commit . "264ca6811b0bef5de4decc54acfeacf0bce2f51f") (:authors ("Rocky Bernstein")) (:maintainer "Rocky Bernstein") (:url . "http://github.com/rocky/realgud-pry"))]) + (realgud-rdb2 . [(20190520 1146) ((realgud (1 4 5)) (load-relative (1 2)) (cl-lib (0 5)) (emacs (24))) "Realgud front-end for interacting with Ruby debugger2" tar ((:commit . "3594aa74f7afda3c3251bb2af7fe0e8ec6d621ae") (:authors ("Rocky Bernstein")) (:maintainer "Rocky Bernstein") (:url . "http://github.com/rocky/realgud-ruby-debugger2"))]) + (realgud-trepan-ni . [(20210513 2237) ((load-relative (1 2)) (realgud (1 5 0)) (emacs (25))) "Realgud front-end to trepan-ni" tar ((:commit . "0ec088ea343835e24ae73da09bea96bfb02a3130") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org") (:url . "https://github.com/realgud/realgud-trepan-ni"))]) + (reaper . [(20201121 2302) ((emacs (25 1))) "Interact with Harvest time tracking app" single ((:commit . "93d21a26ca022d3929749a82498891054092094b") (:authors ("Thomas Fini Hansen" . "xen@xen.dk")) (:maintainer "Thomas Fini Hansen" . "xen@xen.dk") (:keywords "tools") (:url . "https://github.com/xendk/reaper"))]) + (reason-mode . [(20200929 1606) ((emacs (24 3))) "A major mode for editing ReasonML" tar ((:commit . "5690544a7091630e0ea0023bbbd57a733cea8bde") (:authors ("Mozilla")) (:maintainer "Mozilla") (:keywords "languages" "ocaml") (:url . "https://github.com/reasonml-editor/reason-mode"))]) + (reazon . [(20180921 1437) ((emacs (26))) "miniKanren for Emacs" tar ((:commit . "020be6467a83957adcbdcb192b61f2c76a94079b") (:authors ("Nick Drozd" . "nicholasdrozd@gmail.com")) (:maintainer "Nick Drozd" . "nicholasdrozd@gmail.com") (:keywords "languages" "extensions" "lisp") (:url . "https://github.com/nickdrozd/reazon"))]) + (rebecca-theme . [(20180324 821) ((emacs (24))) "Rebecca Purple Theme" single ((:commit . "9ac0c71c2858b76dc5499f62c7c7fb7f9e8f16bc") (:authors ("vic" . "vborja@apache.org")) (:maintainer "vic" . "vborja@apache.org") (:keywords "theme" "dark") (:url . "https://github.com/vic/rebecca-theme"))]) + (rebox2 . [(20121113 1300) nil "Handling of comment boxes in various styles." single ((:commit . "00634eca420cc48657b81e40e599ff8548083985") (:authors ("François Pinard") ("Le Wang")) (:maintainer "Le Wang (lewang.emacs!!!gmayo.com remove exclamations, correct host, hint: google mail)") (:url . "https://github.com/lewang/rebox2"))]) + (recentf-ext . [(20170926 35) nil "Recentf extensions" single ((:commit . "450de5f8544ed6414e88d4924d7daa5caa55b7fe") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "convenience" "files") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/recentf-ext.el"))]) + (recentf-remove-sudo-tramp-prefix . [(20210509 43) ((emacs (24 4))) "Normalise recentf history" single ((:commit . "c462344739867f35d39c8794c358b4c4b5af7dcc") (:authors ("ncaq" . "ncaq@ncaq.net")) (:maintainer "ncaq" . "ncaq@ncaq.net") (:url . "https://github.com/ncaq/recentf-remove-sudo-tramp-prefix"))]) + (recently . [(20200120 1432) ((cl-lib (0 5)) (emacs (24))) "Track recently opened files to visit them again" single ((:commit . "fa8b52fe891a0adaabe0456f6f5a56a2600a831f") (:authors ("10sr <8.slashes [at] gmail [dot] com>")) (:maintainer "10sr <8.slashes [at] gmail [dot] com>") (:keywords "utility" "files") (:url . "https://github.com/10sr/recently-el"))]) + (recompile-on-save . [(20151126 1446) ((dash (1 1 0)) (cl-lib (0 5))) "Trigger recompilation on file save." single ((:commit . "92e11446869d878803d4f3dec5d2101380c12bb2") (:authors ("Marian Schubert" . "marian.schubert@gmail.com")) (:maintainer "Marian Schubert" . "marian.schubert@gmail.com") (:keywords "convenience" "files" "processes" "tools") (:url . "https://github.com/maio/recompile-on-save.el"))]) + (recomplete . [(20210418 925) ((emacs (26 1))) "Immediately (re)complete actions" single ((:commit . "ef800da3ff3112baa71ad20e84c752f7a56c90b9") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-recomplete"))]) + (recover-buffers . [(20171009 437) nil "revisit all buffers from an auto-save file" tar ((:commit . "81a5cb53099955ebc2a411a44cba5a394ee3f2d1") (:authors ("era eriksson <http://www.iki.fi/era>")) (:maintainer "era eriksson <http://www.iki.fi/era>"))]) + (rect+ . [(20150621 44) nil "Extensions to rect.el" single ((:commit . "299b742faa0bc4448e0d5fe9cb98ab1eb93b8dcc") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "extensions" "data" "tools") (:url . "https://github.com/mhayashi1120/Emacs-rectplus"))]) + (rectangle-utils . [(20190411 1757) ((emacs (24)) (cl-lib (0 5))) "Some useful rectangle functions." single ((:commit . "46f7e73340fee40c1ab9a4e766a08ae3fce83ebe") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://github.com/thierryvolpiatto/rectangle-utils"))]) + (recursion-indicator . [(20201219 1739) ((emacs (26))) "Recursion indicator" single ((:commit . "348030d5d65524b4f6a2dfad1d53f2ca92dbd49c") (:authors ("Daniel Mendler")) (:maintainer "Daniel Mendler") (:url . "https://github.com/minad/recursion-indicator"))]) + (recursive-narrow . [(20190306 1521) nil "narrow-to-region that operates recursively" single ((:commit . "5e3e2067d5a148d7e64e64e0355d3b6860e4c259") (:authors ("Nathaniel Flath" . "flat0103@gmail.com")) (:maintainer "Nathaniel Flath" . "flat0103@gmail.com") (:url . "http://github.com/nflath/recursive-narrow"))]) + (reddigg . [(20210603 2305) ((emacs (26 3)) (promise (1 1)) (ht (2 3)) (request (0 3 0)) (org (9 2))) "A reader for redditt" single ((:commit . "1a6eaf3d1a5e44205399526c0f425281b8d9ccc3") (:authors ("Thanh Vuong" . "thanhvg@gmail.com")) (:maintainer "Thanh Vuong" . "thanhvg@gmail.com") (:url . "https://github.com/thanhvg/emacs-reddigg"))]) + (redis . [(20150531 1948) ((emacs (24)) (cl-lib (0 5))) "Redis integration" single ((:commit . "2c33f3397bc14e7a8192867b55920492d4eead8c") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:keywords "convenience") (:url . "https://github.com/emacs-pe/redis.el"))]) + (redpen-paragraph . [(20160625 1050) ((emacs (24)) (cl-lib (0 5)) (json (1 4))) "RedPen interface." single ((:commit . "0062f326106ce8be3c9b7d3fa0e88ed2c7bbfa5e") (:authors ("karronoli")) (:maintainer "karronoli") (:keywords "document" "proofreading" "help") (:url . "https://github.com/karronoli/redpen-paragraph.el"))]) + (redprl . [(20180418 1434) ((emacs (24 3))) "Major mode for editing RedPRL proofs and interacting with RedPRL" single ((:commit . "c72190de76f7ed1cfbe1d2046c96e99ac5022b0c") (:authors ("Jonathan Sterling" . "jon@jonmsterling.com")) (:maintainer "Jonathan Sterling" . "jon@jonmsterling.com") (:keywords "languages"))]) + (redshank . [(20180730 407) ((paredit (21))) "Common Lisp Editing Extensions" tar ((:commit . "d059c5841044aa163664f8bf87c1d981bf0a04fe") (:authors ("Michael Weber" . "michaelw@foldr.org")) (:maintainer "Michael Weber" . "michaelw@foldr.org") (:keywords "languages" "lisp"))]) + (redtick . [(20180424 2136) ((emacs (24 4))) "Smallest pomodoro timer (1 char)" tar ((:commit . "94b4cd43ac20c64dcac96edac2c1a3b9fcc59bb9") (:authors ("F. Febles")) (:maintainer "F. Febles") (:keywords "calendar") (:url . "http://github.com/ferfebles/redtick"))]) + (redtt . [(20181121 21) ((emacs (25 3))) "Major mode for editing redtt proofs" single ((:commit . "50689559ff970e33013b8cf8a3bbc8be18ec4e09") (:authors ("Jonathan Sterling" . "jon@jonmsterling.com")) (:maintainer "Jonathan Sterling" . "jon@jonmsterling.com") (:keywords "languages") (:url . "http://github.com/RedPRL/redtt"))]) + (refine . [(20200507 731) ((emacs (24 3)) (s (1 11 0)) (dash (2 12 0)) (list-utils (0 4 4)) (loop (1 2))) "interactive value editing" single ((:commit . "d72fa50910b86217a35bb1b7e56adea206052021") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:keywords "convenience"))]) + (reformatter . [(20210510 522) ((emacs (24 3))) "Define commands which run reformatters on the current buffer" single ((:commit . "e02a9ea94287f4195edeeab3033e017a56872f5b") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "convenience" "tools") (:url . "https://github.com/purcell/emacs-reformatter"))]) + (regex-dsl . [(20100124 1028) nil "lisp syntax for regexps" single ((:commit . "ac89ab8b7691a165ef3007cb84417125cfc0632e") (:authors ("Aliaksey Kandratsenka" . "alk@tut.by")) (:maintainer "Aliaksey Kandratsenka" . "alk@tut.by"))]) + (regex-tool . [(20170104 1918) nil "A regular expression evaluation tool for programmers" single ((:commit . "0b4a0111143c88ef94bec56624cb2e00c1a054e6") (:authors ("John Wiegley" . "johnw@newartisans.com")) (:maintainer "John Wiegley" . "johnw@newartisans.com") (:keywords "regex" "languages" "programming" "development") (:url . "http://www.newartisans.com/"))]) + (region-bindings-mode . [(20140407 2214) nil "Enable custom bindings when mark is active." single ((:commit . "3fa5dbdbd7c000bebff6d9d14a4be326ec24b6fc") (:authors ("Fabián E. Gallina" . "fabian@anue.biz")) (:maintainer "Fabián E. Gallina" . "fabian@anue.biz") (:keywords "convenience") (:url . "https://github.com/fgallina/region-bindings-mode"))]) + (region-convert . [(20210519 1655) ((emacs (24 3))) "Convert string in region by Lisp function" single ((:commit . "cb3ab0417d7b74e5edd34bf23a70737fc7bf1d3a") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "region" "convenience") (:url . "https://github.com/zonuexe/right-click-context"))]) + (region-occurrences-highlighter . [(20200815 1555) ((emacs (24))) "Mark occurrences of current region (selection)." single ((:commit . "07e2201db7a88b246a63e868e711749e1465d3d6") (:authors ("Álvaro González Sotillo" . "alvarogonzalezsotillo@gmail.com")) (:maintainer "Álvaro González Sotillo" . "alvarogonzalezsotillo@gmail.com") (:keywords "convenience") (:url . "https://github.com/alvarogonzalezsotillo/region-occurrences-highlighter"))]) + (region-state . [(20181205 1746) nil "Show the number of chars/lines or rows/columns in the region" single ((:commit . "8c636b655eef45e0015684699737d31e15450000") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:keywords "convenience") (:url . "https://github.com/xuchunyang/region-state.el"))]) + (register-channel . [(20210120 1618) nil "Jump around fast using registers" single ((:commit . "ed7f563e92170b758dc878fcb5df88d46d5d44cc") (:authors ("Yang Zhao" . "YangZhao11@users.noreply.github.com")) (:maintainer "Yang Zhao" . "YangZhao11@users.noreply.github.com") (:keywords "convenience"))]) + (register-quicknav . [(20200524 2006) ((emacs (25 3))) "Quickly jump to next/previous register" single ((:commit . "c15ea92b0946c28b3f14986d42b15b0b534aa6a2") (:authors ("tastytea" . "tastytea@tastytea.de")) (:maintainer "tastytea" . "tastytea@tastytea.de") (:keywords "convenience") (:url . "https://schlomp.space/tastytea/register-quicknav"))]) + (rego-mode . [(20201102 1420) ((emacs (24 4)) (reformatter (0 3))) "A major mode for rego language" single ((:commit . "be110e6cef5d34eef0529a8739c68e619cf15310") (:authors ("Sibi Prabakaran" . "sibi@psibi.in")) (:maintainer "Sibi Prabakaran" . "sibi@psibi.in") (:keywords "languages") (:url . "https://github.com/psibi/rego-mode"))]) + (related . [(20190327 1024) ((cl-lib (0 5))) "Switch back and forth between similarly named buffers." single ((:commit . "546c7e811b290470288b617f2c27106bd83ccd33") (:authors ("Julien Montmartin")) (:maintainer "Julien Montmartin") (:keywords "file" "buffer" "switch" "selection" "matching" "convenience") (:url . "https://github.com/julien-montmartin/related"))]) + (remark-mode . [(20210504 1238) ((emacs (25 1)) (markdown-mode (2 0))) "Major mode for the remark slideshow tool" tar ((:commit . "9f15285445fdb53e720ffe72f5cf05231d340906") (:authors ("@torgeir")) (:maintainer "@torgeir") (:keywords "remark" "slideshow" "markdown" "hot reload"))]) + (remember-last-theme . [(20170619 2133) ((emacs (24 4))) "Remember the last used theme between sessions." single ((:commit . "0973f1aa6b96355fa376fffe8b45733b6e963c51") (:authors ("Anler Hernández Peral" . "inbox+emacs@anler.me")) (:maintainer "Anler Hernández Peral" . "inbox+emacs@anler.me") (:keywords "convenience" "faces") (:url . "https://github.com/anler/remember-last-theme"))]) + (remind-bindings . [(20200820 1723) ((emacs (25 1)) (omni-quotes (0 5)) (popwin (1 0)) (map (2 0))) "Reminders for your init bindings" single ((:commit . "c9a327bfd3c68a0c41b5b64df491bdee4c73ca39") (:authors ("Mehmet Tekman")) (:maintainer "Mehmet Tekman") (:keywords "outlines") (:url . "https://github.com/mtekman/remind-bindings.el"))]) + (renpy . [(20200607 135) nil "silly walks for Renpy" single ((:commit . "f2f95a72a8c842f229f80999132e8ea8ee73f6fc") (:authors ("PyTom" . "pytom@bishoujo.us")) (:maintainer "Dave Love" . "fx@gnu.org") (:keywords "languages") (:url . "https://github.com/billywade/renpy-mode"))]) + (repeatable-motion . [(20170620 1848) ((emacs (24))) "Make repeatable versions of motions" tar ((:commit . "f29effdc4121c2dc7e3fec9b3a62debce29cda9d") (:authors ("William Hatch" . "willghatch@gmail.com")) (:maintainer "William Hatch" . "willghatch@gmail.com") (:keywords "motion" "repeatable") (:url . "https://github.com/willghatch/emacs-repeatable-motion"))]) + (repeater . [(20180418 1212) ((emacs (24 4))) "Repeat recent repeated commands" single ((:commit . "854b874542b186b2408cbc58ad0591fe8eb70b6c") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:keywords "convenience") (:url . "https://github.com/xuchunyang/repeater"))]) + (repl-toggle . [(20210226 1055) ((fullframe (0 0 5))) "Switch to/from repl buffer for current major-mode" single ((:commit . "7028ae65f136215f8e07a43afc33a6b99fe82857") (:authors ("Tom Regner" . "tom@goochesa.de")) (:maintainer "Tom Regner" . "tom@goochesa.de") (:keywords "repl" "buffers" "toggle"))]) + (replace-from-region . [(20170227 2316) nil "Replace commands whose query is from region" single ((:commit . "dc9318b9b2822da7b00ecc34d1dc965c8f96c9bb") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "replace" "search" "region") (:url . "http://www.emacswiki.org/emacs/download/replace-from-region.el"))]) + (replace-pairs . [(20160207 1251) ((emacs (24 4))) "Query-replace pairs of things" single ((:commit . "acfb254dddffcee4250092fab9394ef2b42ffbc0") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com") (:url . "https://github.com/davidshepherd7/replace-pairs"))]) + (replace-symbol . [(20160518 12) nil "Rename symbols in expressions or buffers" single ((:commit . "baf949e528aee1881f455f9c84e67718bedcb3f6") (:authors ("Brian Mastenbrook" . "brian@mastenbrook.net")) (:maintainer "Brian Mastenbrook" . "brian@mastenbrook.net") (:url . "https://github.com/bmastenbrook/replace-symbol-el"))]) + (replace-with-inflections . [(20180831 635) ((cl-lib (0 5)) (string-inflection (1 0 10)) (inflections (1 1))) "Inflection aware `query-replace'" single ((:commit . "d9201e047856492f282da65459b28aba25998dbb") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:keywords "matching") (:url . "https://github.com/knu/replace-with-inflections.el"))]) + (repo . [(20191201 38) ((emacs (24 3))) "Running repo from Emacs" single ((:commit . "7b3ce731f1209d74113cb65a2d6aa6f54ce8ed27") (:authors ("Damien Merenne")) (:maintainer "Damien Merenne") (:keywords "convenience") (:url . "https://github.com/canatella/repo-el"))]) + (req-package . [(20180122 500) ((use-package (1 0)) (dash (2 7 0)) (log4e (0 2 0)) (ht (0))) "A use-package wrapper for package runtime dependencies management" tar ((:commit . "0c0ac7451149dac6bfda2adfe959d1df1c273de6") (:authors ("Edward Knyshov" . "edvorg@gmail.com")) (:maintainer "Edward Knyshov" . "edvorg@gmail.com") (:keywords "dotemacs" "startup" "speed" "config" "package") (:url . "https://github.com/edvorg/req-package"))]) + (request . [(20210410 2218) ((emacs (24 4))) "Compatible layer for URL request" single ((:commit . "f3a5b4352e9f444ace2a332939abff504b573887") (:authors ("Takafumi Arakaki <aka.tkf at gmail.com>")) (:maintainer "Takafumi Arakaki <aka.tkf at gmail.com>") (:url . "https://github.com/tkf/emacs-request"))]) + (request-deferred . [(20210214 37) ((emacs (24 1)) (deferred (0 3 1)) (request (0 3))) "Wrap request.el by deferred" single ((:commit . "f3a5b4352e9f444ace2a332939abff504b573887") (:authors ("Takafumi Arakaki <aka.tkf at gmail.com>")) (:maintainer "Takafumi Arakaki <aka.tkf at gmail.com>") (:url . "https://github.com/tkf/emacs-request"))]) + (requirejs . [(20151204 719) ((js2-mode (20150713)) (popup (0 5 3)) (s (1 9 0)) (cl-lib (0 5)) (yasnippet (20151011 1823))) "Requirejs import manipulation and source traversal." tar ((:commit . "4ea2a5fcbc76e4cbb6a7461e6f05f019b75865b1") (:authors ("Joe Heyming" . "joeheyming@gmail.com")) (:maintainer "Joe Heyming" . "joeheyming@gmail.com") (:keywords "javascript" "requirejs") (:url . "https://github.com/joeheyming/requirejs-emacs"))]) + (requirejs-mode . [(20130215 2104) nil "Improved AMD module management" single ((:commit . "bbb0c09f8eb2d6a33c17319be8137f68bb16bc92") (:authors ("Marc-Olivier Ricard" . "marco.ricard@gmail.com")) (:maintainer "Marc-Olivier Ricard" . "marco.ricard@gmail.com") (:keywords "javascript" "amd" "requirejs"))]) + (rescript-mode . [(20210506 2101) ((emacs (26 1))) "A major mode for editing ReScript" tar ((:commit . "964a62f907bf786cec6a60719d17244b2958ac62") (:authors ("Karl Landstrom" . "karl.landstrom@brgeight.se") ("Daniel Colascione" . "dancol@dancol.org") ("John Lee" . "jjl@pobox.com")) (:maintainer "John Lee" . "jjl@pobox.com") (:keywords "languages" "rescript") (:url . "https://github.com/jjlee/rescript-mode"))]) + (resize-window . [(20180918 538) ((emacs (24)) (cl-lib (0 5))) "easily resize windows" single ((:commit . "72018aa4d2401b60120588199d4cedd0dc1fbcfb") (:authors ("Dan Sutton " . "danielsutton01@gmail.com")) (:maintainer "Dan Sutton " . "danielsutton01@gmail.com") (:keywords "window" "resize") (:url . "https://github.com/dpsutton/resize-mode"))]) + (restart-emacs . [(20201127 1425) nil "Restart emacs from within emacs" single ((:commit . "1607da2bc657fe05ae01f7fdf26f716eafead02c") (:authors ("Iqbal Ansari" . "iqbalansari02@yahoo.com")) (:maintainer "Iqbal Ansari" . "iqbalansari02@yahoo.com") (:keywords "convenience") (:url . "https://github.com/iqbalansari/restart-emacs"))]) + (restclient . [(20210511 1331) nil "An interactive HTTP client for Emacs" single ((:commit . "2cc1fd3496f57288de3f97c27a5f018284db2d23") (:authors ("Pavel Kurnosov" . "pashky@gmail.com")) (:maintainer "Pavel Kurnosov" . "pashky@gmail.com") (:keywords "http"))]) + (restclient-helm . [(20170314 1554) ((restclient (0)) (helm (1 9 4))) "helm interface for restclient.el" single ((:commit . "2cc1fd3496f57288de3f97c27a5f018284db2d23") (:authors ("Pavel Kurnosov" . "pashky@gmail.com")) (:maintainer "Pavel Kurnosov" . "pashky@gmail.com") (:keywords "http" "helm"))]) + (restclient-test . [(20210422 1815) ((emacs (26 1)) (restclient (0))) "Run tests with restclient.el" single ((:commit . "3c6661d087526510a04ea9de421c5869a1a1d061") (:authors ("Simen Heggestøyl" . "simenheg@runbox.com")) (:maintainer "Simen Heggestøyl" . "simenheg@runbox.com") (:url . "https://github.com/simenheg/restclient-test.el"))]) + (retrie . [(20200519 551) ((emacs (24 5))) "Refactoring Haskell code with retrie" single ((:commit . "976d6f01a3e214917f16b82e750d825cb9bfcc59") (:authors ("Junyoung Clare Jang" . "jjc9310@gmail.com")) (:maintainer "Junyoung Clare Jang" . "jjc9310@gmail.com") (:keywords "files" "languages" "tools") (:url . "https://github.com/Ailrun/emacs-retrie"))]) + (revbufs . [(20200907 2223) nil "Reverts all out-of-date buffers safely" single ((:commit . "df3c02d3063951582c693ae12547993cec8256e2") (:authors ("Neil Van Dyke" . "neil@neilvandyke.org")) (:maintainer "Sam Kleinman" . "sam@tychoish.com") (:keywords "convenience" "buffers") (:url . "http://www.neilvandyke.org/revbufs/"))]) + (reveal-in-folder . [(20210129 1921) ((emacs (24 3)) (f (0 20 0)) (s (1 12 0))) "Reveal current file in folder" single ((:commit . "f62be2d11c8a9182cf84f0efe7ed054cc304262d") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/reveal-in-folder"))]) + (reveal-in-osx-finder . [(20150802 1657) nil "Reveal file associated with buffer in OS X Finder" single ((:commit . "5710e5936e47139a610ec9a06899f72e77ddc7bc") (:authors ("Kazuki YOSHIDA")) (:maintainer "Kazuki YOSHIDA") (:keywords "os x" "finder") (:url . "https://github.com/kaz-yos/reveal-in-osx-finder"))]) + (reverse-im . [(20200520 853) ((emacs (25 1))) "Reverse mapping for non-default system layouts" single ((:commit . "2db53105f2f8ee533df903b7482e571e28ce3c7b") (:keywords "i18n") (:url . "https://github.com/a13/reverse-im.el"))]) + (reverse-theme . [(20141205 145) nil "Reverse theme for Emacs" single ((:commit . "8319d0d5342890a3530ffa4daafdb7c35feda1ca") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-reverse-theme"))]) + (revert-buffer-all . [(20210322 159) ((emacs (24 3))) "Revert all open buffers" single ((:commit . "14efdbf24ebe0d743ccb3f0d43acae98939c94fd") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-buffer-revert-all"))]) + (review-mode . [(20210516 503) nil "major mode for ReVIEW" single ((:commit . "4f64f0ce1fe3a59389a1462dc26d6ba89d44d51c") (:authors ("Kenshi Muto" . "kmuto@kmuto.jp")) (:maintainer "Kenshi Muto" . "kmuto@kmuto.jp") (:url . "https://github.com/kmuto/review-el"))]) + (reykjavik-theme . [(20201219 947) ((emacs (24))) "Theme with a dark background." single ((:commit . "f6d8e83946633603234cd1dac725e17447f40bce") (:authors ("martin haesler")) (:maintainer "martin haesler"))]) + (rfc-mode . [(20210510 1104) ((emacs (25 1))) "RFC document browser and viewer" single ((:commit . "b885d6bd2b3be69a2413c4dc5cc34344d821cba2") (:authors ("Nicolas Martyanoff" . "khaelin@gmail.com")) (:maintainer "Nicolas Martyanoff" . "khaelin@gmail.com") (:url . "https://github.com/galdor/rfc-mode"))]) + (rg . [(20210305 1621) ((emacs (25 1)) (transient (0 3 0)) (wgrep (2 1 10))) "A search tool based on ripgrep" tar ((:commit . "10e64887c224002572e1f1e19c74453cba606c3f") (:authors ("David Landell" . "david.landell@sunnyhill.email") ("Roland McGrath" . "roland@gnu.org")) (:maintainer "David Landell" . "david.landell@sunnyhill.email") (:keywords "matching" "tools") (:url . "https://github.com/dajva/rg.el"))]) + (rhtml-mode . [(20130422 1311) nil "major mode for editing RHTML files" tar ((:commit . "a6d71b38a3db867ccf82999c99805db1a3a33c33"))]) + (rib-mode . [(20170726 1448) ((emacs (24))) "RenderMan® Interface Bytestream (RIB) Major Mode" single ((:commit . "97470158784c3c212e22e2c20b8471ee65ba59af") (:authors ("Remik Ziemlinski and Daniel Blezek" . "daniel.blezek@gmail.com")) (:maintainer "Remik Ziemlinski and Daniel Blezek" . "daniel.blezek@gmail.com") (:url . "https://github.com/blezek/rib-mode"))]) + (rich-minority . [(20190419 1136) ((cl-lib (0 5))) "Clean-up and Beautify the list of minor-modes." single ((:commit . "a03e693f6f9232cf75363aaaf1cb041f21675c19") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") (:keywords "mode-line" "faces") (:url . "https://github.com/Malabarba/rich-minority"))]) + (right-click-context . [(20210519 1713) ((emacs (24 3)) (popup (0 5)) (ordinal (0 0 1))) "Right Click Context menu" single ((:commit . "c3c9d36ffbc9fb2bc7c2c4b75291dbcdb1c5f531") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "mouse" "menu" "rightclick") (:url . "https://github.com/zonuexe/right-click-context"))]) + (rigid-tabs . [(20170903 1559) ((emacs (24 3))) "Fix TAB alignment in diff buffers" single ((:commit . "eba84ceaba2e57e76ad2dfbb7a7154238a25d956") (:authors ("Yuri D'Elia" . "wavexx@thregr.org")) (:maintainer "Yuri D'Elia" . "wavexx@thregr.org") (:keywords "diff" "whitespace" "version control" "magit") (:url . "https://github.com/wavexx/rigid-tabs.el"))]) + (rii . [(20210317 1330) ((emacs (24 3))) "Reversible input interface for multiple input" single ((:commit . "d0cc3599129db735c23abe74d0876286a2fd6b6a") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com") (:keywords "extensions" "tools") (:url . "https://github.com/ROCKTAKEY/rii"))]) + (rime . [(20210608 116) ((emacs (26 3)) (dash (2 17 0)) (cl-lib (0 6 1)) (popup (0 5 3)) (posframe (0 1 0))) "Rime input method" tar ((:commit . "13203c442ae6990424ce5a1e4a0b60ddabe5cbfe") (:authors ("Shi Tianshu")) (:maintainer "Shi Tianshu") (:keywords "convenience" "input-method") (:url . "https://www.github.com/DogLooksGood/emacs-rime"))]) + (rimero-theme . [(20180901 1348) ((emacs (24))) "Theme with a dark background suitable for UI and terminal usage." single ((:commit . "a2e706c2b34f749019979a133f08a2d94a1104b3") (:authors ("Yves Zoundi" . "yveszoundi@users.sf.net")) (:maintainer "Yves Zoundi" . "yveszoundi@users.sf.net") (:keywords "faces" "theme" "dark" "light colors") (:url . "https://github.com/yveszoundi/emacs-rimero-theme"))]) + (rinari . [(20150709 640) ((ruby-mode (1 0)) (inf-ruby (2 2 5)) (ruby-compilation (0 16)) (jump (2 0))) "Rinari Is Not A Rails IDE" single ((:commit . "134438af8fbdfa9c8077267c768d273a9792b484") (:authors ("Phil Hagelberg, Eric Schulte, Steve Purcell")) (:maintainer "Phil Hagelberg, Eric Schulte, Steve Purcell") (:keywords "ruby" "rails" "project" "convenience" "web") (:url . "https://github.com/eschulte/rinari"))]) + (rings . [(20160531 2027) nil "Buffer rings. Like tabs, but better." single ((:commit . "3590b222eb80652cbd27866f066bd3571d86edfc") (:authors ("Konrad Scorciapino")) (:maintainer "Konrad Scorciapino") (:keywords "utilities" "productivity") (:url . "http://github.com/konr/rings"))]) + (ripgrep . [(20190215 841) nil "Front-end for ripgrep, a command line search tool" single ((:commit . "40e871dcc4519a70981e9f28acea304692a60978") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "ripgrep" "ack" "pt" "ag" "sift" "grep" "search") (:url . "https://github.com/nlamirault/ripgrep.el"))]) + (riscv-mode . [(20170804 1521) ((emacs (24 4))) "Major-mode for RISC V assembly" single ((:commit . "99febf97d1fa9441e8dada94fe30c2aa439c9749") (:authors ("Adam Niederer <https://github.com/AdamNiederer>")) (:maintainer "Adam Niederer") (:keywords "riscv" "assembly") (:url . "https://github.com/AdamNiederer/riscv-mode"))]) + (rivet-mode . [(20201013 1905) ((emacs (24)) (web-mode (16))) "A minor mode for editing Apache Rivet files" single ((:commit . "3dd4fc28f29e4d4f43a881ed5816dea41a912419") (:authors ("Jade Michael Thornton")) (:maintainer "Jade Michael Thornton") (:url . "https://gitlab.com/thornjad/rivet-mode"))]) + (rjsx-mode . [(20200120 1446) ((emacs (24 4)) (js2-mode (20170504))) "Real support for JSX" single ((:commit . "b697fe4d92cc84fa99a7bcb476f815935ea0d919") (:authors ("Felipe Ochoa" . "felipe@fov.space")) (:maintainer "Felipe Ochoa" . "felipe@fov.space") (:keywords "languages") (:url . "https://github.com/felipeochoa/rjsx-mode/"))]) + (rmsbolt . [(20191218 257) ((emacs (25 1))) "A compiler output viewer" tar ((:commit . "2bc1afe528b70b8aad4243a3b2b72bcf09a599e1") (:authors ("Jay Kamat" . "jaygkamat@gmail.com")) (:maintainer "Jay Kamat" . "jaygkamat@gmail.com") (:keywords "compilation" "tools") (:url . "http://gitlab.com/jgkamat/rmsbolt"))]) + (robe . [(20210608 17) ((inf-ruby (2 5 1)) (emacs (24 4))) "Code navigation, documentation lookup and completion for Ruby" tar ((:commit . "bcddba77ba11b46f94730708fff2215f4b620428") (:authors ("Dmitry Gutov")) (:maintainer "Dmitry Gutov") (:keywords "ruby" "convenience" "rails") (:url . "https://github.com/dgutov/robe"))]) + (robot-mode . [(20210425 1925) ((emacs (26 1))) "Major-mode for Robot Framework files" single ((:commit . "e7e9c4d4750d048ad771fa735621ad813fa9c128") (:authors ("Kalle Kankare" . "kalle.kankare@iki.fi")) (:maintainer "Kalle Kankare" . "kalle.kankare@iki.fi") (:keywords "languages" "files") (:url . "https://github.com/kopoli/robot-mode"))]) + (robots-txt-mode . [(20190812 1858) nil "Major mode for editing robots.txt" single ((:commit . "8bf67285a25a6756607354d184e36583f2847e7d") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "languages" "comm" "web") (:url . "https://github.com/emacs-php/robots-txt-mode"))]) + (roguel-ike . [(20160120 302) ((popup (0 5 0))) "A coffee-break roguelike" tar ((:commit . "706dcb0687e8016d7d776f9d9e5ace9fdbbca43c") (:authors ("Steven Rémot")) (:maintainer "Steven Rémot"))]) + (ron-mode . [(20200830 1554) ((emacs (24 5 1))) "Rusty Object Notation mode" single ((:commit . "c5e0454b9916d6b73adc15dab8abbb0b0a68ea22") (:authors ("Daniel Hutzley" . "endergeryt@gmail.com")) (:maintainer "Daniel Hutzley" . "endergeryt@gmail.com") (:keywords "languages") (:url . "https://chiselapp.com/user/Hutzdog/repository/ron-mode/home"))]) + (rope-read-mode . [(20201025 948) ((emacs (24))) "Rearrange lines to read text smoothly" single ((:commit . "6f024d9409ba454b83a2a1ccd57d9a3ebba90a39") (:authors ("Marco Wahl" . "marcowahlsoft@gmail.com")) (:maintainer "Marco Wahl" . "marcowahlsoft@gmail.com") (:keywords "reading" "convenience" "chill") (:url . "https://gitlab.com/marcowahl/rope-read-mode"))]) + (ros . [(20200109 1940) ((emacs (24 4))) "Package to interact with and write code for ROS systems" tar ((:commit . "0babdd3bbc038ee7436db0cc869df35752456268") (:authors ("Max Beutelspacher" . "max.beutelspacher@mailbox.org")) (:maintainer "Max Beutelspacher" . "max.beutelspacher@mailbox.org") (:url . "https://github.com/DerBeutlin/ros.el"))]) + (rotate . [(20210126 637) nil "Rotate the layout of emacs" single ((:commit . "4e9ac3ff800880bd9b705794ef0f7c99d72900a6") (:authors ("daichi.hirata <hirata.daichi at gmail.com>")) (:maintainer "daichi.hirata <hirata.daichi at gmail.com>") (:keywords "window" "layout") (:url . "https://github.com/daichirata/emacs-rotate"))]) + (roy-mode . [(20121208 1158) nil "Roy major mode" single ((:commit . "0416f561edbc6b4a29fced8be84d2527a9613d65") (:authors ("Georgii Leontiev")) (:maintainer "Georgii Leontiev") (:keywords "extensions") (:url . "https://github.com/folone/roy-mode"))]) + (rpm-spec-mode . [(20160710 1136) nil "RPM spec file editing commands for Emacs/XEmacs" single ((:commit . "c1c38050c48ea330c7cea632b8785d66daeefb2b") (:authors ("Stig Bjørlykke," . "stig@bjorlykke.org")) (:maintainer "Stig Bjørlykke," . "stig@bjorlykke.org") (:keywords "unix" "languages"))]) + (rpn-calc . [(20210306 426) ((popup (0 4))) "quick RPN calculator for hackers" single ((:commit . "320123ede874a8fc6cde542baa0d106950318071") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "https://github.com/zk-phi/rpn-calc"))]) + (rspec-mode . [(20201228 1319) ((ruby-mode (1 0)) (cl-lib (0 4))) "Enhance ruby-mode for RSpec" tar ((:commit . "92ef785010f6a68cbf73861e75ac6cf4e1832291") (:authors ("Peter Williams, et al.")) (:maintainer "Peter Williams, et al.") (:keywords "rspec" "ruby") (:url . "http://github.com/pezra/rspec-mode"))]) + (rtags . [(20210313 1541) ((emacs (24 3))) "A front-end for rtags" single ((:commit . "63f18acb21e664fd92fbc19465f0b5df085b5e93") (:authors ("Jan Erik Hanssen" . "jhanssen@gmail.com") ("Anders Bakken" . "agbakken@gmail.com")) (:maintainer "Jan Erik Hanssen" . "jhanssen@gmail.com") (:url . "https://github.com/Andersbakken/rtags"))]) + (rtags-xref . [(20200310 1909) ((emacs (25 1)) (rtags (2 37))) "RTags backend for xref.el" single ((:commit . "63f18acb21e664fd92fbc19465f0b5df085b5e93") (:authors ("Jörg Walter")) (:maintainer "RTags Team") (:url . "https://github.com/Andersbakken/rtags"))]) + (rtm . [(20180329 1508) ((cl-lib (1 0))) "An elisp implementation of the Remember The Milk API" single ((:commit . "3e3d09387cb84801343ecca8fb02e82f213e7bbe") (:authors ("Friedrich Delgado Friedrichs" . "frie...@nomaden.org")) (:maintainer "Friedrich Delgado Friedrichs" . "frie...@nomaden.org") (:keywords "remember" "the" "milk" "productivity" "todo") (:url . "https://github.com/pmiddend/emacs-rtm"))]) + (rubik . [(20180222 2014) ((cl-lib (1 0)) (emacs (25 3))) "Rubik's Cube" single ((:commit . "c8dab1726463dbc9042a0b00186e4a8df02eb868") (:authors ("Ivan 'Kurvivor' Truskov" . "trus19@gmail.com")) (:maintainer "Ivan 'Kurvivor' Truskov" . "trus19@gmail.com") (:keywords "games") (:url . "https://github.com/Kurvivor19/rubik-mode"))]) + (rubocop . [(20210309 1241) ((emacs (24))) "An Emacs interface for RuboCop" single ((:commit . "f5fd18aa810c3d3269188cbbd731ddc09006f8f5") (:authors ("Bozhidar Batsov")) (:maintainer "Bozhidar Batsov") (:keywords "project" "convenience") (:url . "https://github.com/rubocop/rubocop-emacs"))]) + (rubocopfmt . [(20200713 1144) ((cl-lib (0 5))) "Minor-mode to format Ruby code with RuboCop on save" single ((:commit . "b84810105940aa5e0bde20c9a89359c95c9b6917") (:authors ("Jim Myhrberg")) (:maintainer "Jim Myhrberg") (:keywords "convenience" "wp" "edit" "ruby" "rubocop") (:url . "https://github.com/jimeh/rubocopfmt.el"))]) + (ruby-compilation . [(20150709 640) ((inf-ruby (2 2 1))) "run a ruby process in a compilation buffer" single ((:commit . "134438af8fbdfa9c8077267c768d273a9792b484") (:authors ("Eric Schulte")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "test" "convenience") (:url . "https://github.com/eschulte/rinari"))]) + (ruby-electric . [(20200328 1528) nil "Minor mode for electrically editing ruby code" single ((:commit . "f2323cd9b5df3b34aa9810ba8109502824925d23") (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:keywords "languages" "ruby") (:url . "https://github.com/ruby/elisp-ruby-electric"))]) + (ruby-end . [(20141215 1223) nil "Automatic insertion of end blocks for Ruby" single ((:commit . "a136f75abb6d5577ce40d61dfeb778c2e9bb09c0") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "speed" "convenience" "ruby") (:url . "http://github.com/rejeep/ruby-end"))]) + (ruby-extra-highlight . [(20171106 1933) nil "Highlight Ruby parameters." single ((:commit . "83942d18eae361998d24c1c523b308eea821f048") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "languages" "faces") (:url . "https://github.com/Lindydancer/ruby-extra-highlight"))]) + (ruby-factory . [(20160102 721) ((inflections (1 1))) "Minor mode for Ruby test object generation libraries" tar ((:commit . "2bb7ccc2fccb5257376a989aa395bc7b9eb1d55d") (:authors ("Skye Shaw" . "skye.shaw@gmail.com")) (:maintainer "Skye Shaw" . "skye.shaw@gmail.com") (:keywords "ruby" "rails" "convenience") (:url . "http://github.com/sshaw/ruby-factory-mode"))]) + (ruby-hash-syntax . [(20210106 224) ((emacs (24 1))) "Toggle ruby hash syntax between => and 1.9+ styles" single ((:commit . "d458fb5891e0da85271b1cba3ee0ee69ea66a374") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "languages") (:url . "https://github.com/purcell/ruby-hash-syntax"))]) + (ruby-interpolation . [(20131112 1652) nil "Ruby string interpolation helpers" single ((:commit . "1978e337601222cedf00e117bf4b5cac15d1f203") (:authors ("Arthur Leonard Andersen" . "leoc.git@gmail.com")) (:maintainer "Arthur Leonard Andersen" . "leoc.git@gmail.com") (:url . "http://github.com/leoc/ruby-interpolation.el"))]) + (ruby-refactor . [(20160214 1650) ((ruby-mode (1 2))) "A minor mode which presents various Ruby refactoring helpers." single ((:commit . "e6b7125878a08518bffec6942df0c606f748e9ee") (:keywords "refactor" "ruby") (:url . "https://github.com/ajvargo/ruby-refactor"))]) + (ruby-test-mode . [(20210205 1107) ((ruby-mode (1 0)) (pcre2el (1 8))) "Minor mode for Behaviour and Test Driven" single ((:commit . "d66db4aca6e6a246f65f7195ecfbc7581d35fb7a") (:authors ("Roman Scherer" . "roman.scherer@gmx.de") ("Caspar Florian Ebeling" . "florian.ebeling@gmail.com")) (:maintainer "Roman Scherer" . "roman.scherer@burningswell.com") (:keywords "ruby" "unit" "test" "rspec" "tools") (:url . "https://github.com/ruby-test-mode/ruby-test-mode"))]) + (ruby-tools . [(20151209 1615) nil "Collection of handy functions for ruby-mode." tar ((:commit . "6b97066b58a4f82eb2ecea6434a0a7e981aa4c18") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "speed" "convenience" "ruby") (:url . "http://github.com/rejeep/ruby-tools"))]) + (rufo . [(20170718 1416) ((emacs (24 3))) "use rufo to automatically format ruby files" single ((:commit . "020b02ed6e9ab49e79d2ddf63e4ee2684c1728f4") (:authors ("Daniel Ma" . "danielhgma@gmail.com")) (:maintainer "Daniel Ma" . "danielhgma@gmail.com") (:url . "https://github.com/danielma/rufo.el"))]) + (rum-mode . [(20180127 22) ((emacs (24))) "Major mode for Rum programming language" single ((:commit . "b69a3866e0299cae8c9c805d644e69b2c17b64de") (:keywords "rum" "languages" "lisp") (:url . "https://github.com/rumlang/rum-mode"))]) + (run-command . [(20210529 1505) ((emacs (27 1))) "Run an external command from a context-dependent list" single ((:commit . "ce2d69feeffb9ef9815ef5b5e32f236763197a10") (:authors ("Massimiliano Mirra" . "hyperstruct@gmail.com")) (:maintainer "Massimiliano Mirra" . "hyperstruct@gmail.com") (:keywords "processes") (:url . "https://github.com/bard/emacs-run-command"))]) + (run-stuff . [(20210522 243) ((emacs (25 1))) "Context based command execution" single ((:commit . "767eea8928b92da032aca7c8a429b1cced46781d") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:keywords "files" "lisp" "files" "convenience" "hypermedia") (:url . "https://gitlab.com/ideasman42/emacs-run-stuff"))]) + (runner . [(20160524 743) nil "Improved \"open with\" suggestions for dired" single ((:commit . "a211d57ddc600410d07a8b534920ba905b093d87") (:authors ("Thamer Mahmoud" . "thamer.mahmoud@gmail.com")) (:maintainer "Thamer Mahmoud" . "thamer.mahmoud@gmail.com") (:keywords "shell command" "dired" "file extension" "open with") (:url . "https://github.com/thamer/runner"))]) + (runtests . [(20150807 831) nil "Run unit tests from Emacs" single ((:commit . "ed90249f24cc48290018df48b9b9b7172440be3e") (:authors ("Sune Simonsen" . "sune@we-knowhow.dk")) (:maintainer "Sune Simonsen" . "sune@we-knowhow.dk") (:keywords "test") (:url . "https://github.com/sunesimonsen/emacs-runtests"))]) + (russian-holidays . [(20170109 2140) nil "Russian holidays for the calendar" single ((:commit . "b285a30f29d85c48e3ea4eb93972d34a090c167b") (:authors ("Alexander I.Grafov" . "siberian@laika.name")) (:maintainer "Alexander I.Grafov" . "siberian@laika.name") (:url . "https://github.com/grafov/russian-holidays"))]) + (rust-auto-use . [(20200608 1359) nil "Utility to automatically insert Rust use statements" single ((:commit . "d5205f7b9b9eae0f7d0893f87d3391464719f9c0") (:authors ("Rotem Yaari" . "rotemy@MBP.local")) (:maintainer "Rotem Yaari" . "rotemy@MBP.local") (:keywords "languages"))]) + (rust-mode . [(20210423 1157) ((emacs (25 1))) "A major-mode for editing Rust source code" tar ((:commit . "494d59f92cbe12533eb89b202fc4f5342afcd543") (:authors ("Mozilla")) (:maintainer "Mozilla") (:keywords "languages") (:url . "https://github.com/rust-lang/rust-mode"))]) + (rust-playground . [(20200116 1043) ((emacs (24 3))) "Local Rust playground for short code snippets." single ((:commit . "5a117781dcb66065bea7830dd73618008fc34949") (:authors ("Alexander I.Grafov" . "grafov@gmail.com")) (:maintainer "Alexander I.Grafov" . "grafov@gmail.com") (:keywords "tools" "rust") (:url . "https://github.com/grafov/rust-playground"))]) + (rustic . [(20210609 1900) ((emacs (26 1)) (dash (2 13 0)) (f (0 18 2)) (let-alist (1 0 4)) (markdown-mode (2 3)) (project (0 3 0)) (s (1 10 0)) (seq (2 3)) (spinner (1 7 3)) (xterm-color (1 6))) "Rust development environment" tar ((:commit . "bbf129cd128105de51b6c242b2551094b8d8987d") (:authors ("Mozilla")) (:maintainer "Mozilla") (:keywords "languages"))]) + (rvm . [(20201222 17) nil "Emacs integration for rvm" single ((:commit . "c1f2642434b0f68d9baa0687127079ecd884ba12") (:authors ("Yves Senn" . "yves.senn@gmx.ch")) (:maintainer "Yves Senn" . "yves.senn@gmx.ch") (:keywords "ruby" "rvm") (:url . "http://www.emacswiki.org/emacs/RvmEl"))]) + (ryo-modal . [(20210523 757) ((emacs (25 1))) "Roll your own modal mode" single ((:commit . "ab6417d8e546f1836618ee72d074ec65431ebc80") (:authors ("Erik Sjöstrand" . "sjostrand.erik@gmail.com")) (:maintainer "Erik Sjöstrand" . "sjostrand.erik@gmail.com") (:keywords "convenience" "modal" "keys") (:url . "http://github.com/Kungsgeten/ryo-modal"))]) + (s . [(20210603 736) nil "The long lost Emacs string manipulation library." single ((:commit . "e1710af8d058faca32529d1129deb5d57871385a") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "strings"))]) + (s-buffer . [(20130605 2124) ((s (1 6 0)) (noflet (0 0 3))) "s operations for buffers" single ((:commit . "f95d234282377f00a2c3a9846681080cb95bb1df") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:keywords "lisp") (:url . "http://github.com/nicferrier/emacs-s-buffer"))]) + (s12cpuv2-mode . [(20171013 2051) ((emacs (24 3))) "Major-mode for S12CPUV2 assembly" single ((:commit . "b17d4cf848dec1e20e66458e5c7ff77a2c051a8c") (:authors ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainer "Adam Niederer" . "adam.niederer@gmail.com") (:keywords "s12cpuv2" "assembly" "languages") (:url . "https://github.com/AdamNiederer/s12cpuv2-mode"))]) + (s3ed . [(20200929 1317) ((emacs (25 1)) (dash (2 17 0)) (s (1 12 0))) "Tramp-like access to s3" tar ((:commit . "2234444ead6c4c6fc3fea548958b36d2c29a9938") (:authors ("Matt Usifer" . "mattusifer@gmail.com")) (:maintainer "Matt Usifer" . "mattusifer@gmail.com") (:keywords "s3" "tools") (:url . "https://github.com/mattusifer/s3ed"))]) + (sackspace . [(20130719 956) nil "A better backspace" single ((:commit . "fd0480eaaf6d3d11fd30ac5feb2da2f4f7572708") (:authors ("Michael Markert" . "markert.michael@googlemail.com")) (:maintainer "Michael Markert" . "markert.michael@googlemail.com") (:keywords "delete" "convenience") (:url . "http://github.com/cofi/sackspace.el"))]) + (sage-shell-mode . [(20201225 1011) ((cl-lib (0 6 1)) (emacs (24 4)) (let-alist (1 0 5)) (deferred (0 5 1))) "A front-end for Sage Math" tar ((:commit . "7fc47d5eab0efac009d5a9316e3dfa223595ab5a") (:authors ("Sho Takemori" . "stakemorii@gmail.com")) (:maintainer "Sho Takemori" . "stakemorii@gmail.com") (:keywords "sage" "math") (:url . "https://github.com/sagemath/sage-shell-mode"))]) + (sailfish-scratchbox . [(20171202 1332) nil "Sailfish OS scratchbox inside the emacs." single ((:commit . "65c6b04abadd2cdeb4cc2dc2a8b96b06e0f27ed8") (:authors ("V. V. Polevoy" . "fx@thefx.co")) (:maintainer "V. V. Polevoy" . "fx@thefx.co") (:keywords "sb2" "mb2" "building" "scratchbox" "sailfish") (:url . "https://github.com/vityafx/sailfish-scratchbox.el"))]) + (salesforce-utils . [(20160814 154) ((cl-lib (0 5))) "simple utilities for Salesforce" single ((:commit . "73328baf0fb94ac0d0de645a8f6d42e5ae27f773") (:authors ("Sean McAfee")) (:maintainer "Sean McAfee") (:url . "https://github.com/grimnebulin/emacs-salesforce"))]) + (salt-mode . [(20200210 1200) ((emacs (24 4)) (yaml-mode (0 0 12)) (mmm-mode (0 5 4)) (mmm-jinja2 (0 1))) "Major mode for Salt States" single ((:commit . "c46b24e7fdf4a46df5507dc9c533bbc0064a46fa") (:authors ("Ben Hayden" . "hayden767@gmail.com")) (:maintainer "Glynn Forrest" . "me@glynnforrest.com") (:keywords "languages") (:url . "https://github.com/glynnforrest/salt-mode"))]) + (sane-term . [(20181130 101) ((emacs (24 1))) "Multi Term is crazy. This is not." single ((:commit . "46352169bd6d2a86ca9c2052cd05ecd16fc7657b") (:authors ("Adam Patterson" . "adam@adamrt.com")) (:maintainer "Adam Patterson" . "adam@adamrt.com") (:url . "http://github.com/adamrt/sane-term"))]) + (sass-mode . [(20190502 53) ((haml-mode (3 0 15)) (cl-lib (0 5))) "Major mode for editing Sass files" single ((:commit . "247a0d4b509f10b28e4687cd8763492bca03599b") (:authors ("Natalie Weizenbaum")) (:maintainer "Natalie Weizenbaum") (:keywords "markup" "language" "css") (:url . "http://github.com/nex3/haml/tree/master"))]) + (sauron . [(20201015 836) nil "Track (erc/org/dbus/...) events and react to them." tar ((:commit . "5daade4836da5b1b2ab26d84128d6c38328a5d52") (:authors ("Dirk-Jan C. Binnema" . "djcb@djcbsoftware.nl")) (:maintainer "Dirk-Jan C. Binnema" . "djcb@djcbsoftware.nl") (:keywords "comm" "frames"))]) + (save-load-path . [(20140206 1214) nil "save load-path and reuse it to test" single ((:commit . "6cb763a37e2b8af505bff2bcd11fd49c9ea04d66") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "lisp") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/save-load-path.el"))]) + (save-visited-files . [(20200212 414) nil "save opened files across sessions" single ((:commit . "8203a05a322324ec17b14437c8dfb38efdb53241") (:authors ("Nathaniel Flath" . "nflath@gmail.com")) (:maintainer "Nathaniel Flath" . "nflath@gmail.com") (:url . "http://github.com/nflath/save-visited-files"))]) + (savekill . [(20140418 229) nil "Save kill ring to disk" single ((:commit . "67fc94e3d8fe8ce3ca16f90518f6a46479b63e34") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "tools") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/savekill.el"))]) + (saveplace-pdf-view . [(20210217 1312) ((emacs (24 1))) "Save place in pdf-view buffers" single ((:commit . "54ed966b842501c3c092dbf57b372e37b033c578") (:authors ("Nicolai Singh <nicolaisingh at pm.me>")) (:maintainer "Nicolai Singh <nicolaisingh at pm.me>") (:keywords "files" "convenience") (:url . "https://github.com/nicolaisingh/saveplace-pdf-view"))]) + (say-what-im-doing . [(20160706 1931) nil "dictate what you're doing with text to speech" single ((:commit . "5b2ce6783b02805bcac1107a149bfba3852cd9d5") (:authors ("Benaiah Mischenko")) (:maintainer "Benaiah Mischenko") (:keywords "text to speech" "dumb" "funny") (:url . "http://github.com/benaiah/say-what-im-doing"))]) + (sayid . [(20200902 703) ((cider (0 21 0))) "sayid nREPL middleware client" single ((:commit . "c813d94ee8d0a85dd33d0c5dbae832c24cf37e4f") (:authors ("Bill Piel" . "bill@billpiel.com")) (:maintainer "Bill Piel" . "bill@billpiel.com") (:url . "https://github.com/clojure-emacs/sayid"))]) + (sbt-mode . [(20210416 1845) ((emacs (24 4))) "Interactive support for sbt projects" tar ((:commit . "e29464a82bf706ef921f4e0052ce04fc74c34c84") (:keywords "languages") (:url . "https://github.com/hvesalai/emacs-sbt-mode"))]) + (scad-mode . [(20200830 301) nil "A major mode for editing OpenSCAD code" single ((:commit . "74235ca19b2a51ed65d9c2eb8f9b0459b2b7d3ab") (:authors ("Len Trigg, Łukasz Stelmach")) (:maintainer "Len Trigg" . "lenbok@gmail.com") (:keywords "languages") (:url . "https://raw.github.com/openscad/openscad/master/contrib/scad-mode.el"))]) + (scad-preview . [(20210306 426) ((scad-mode (91 0)) (emacs (24 4))) "Preview SCAD models in real-time within Emacs" single ((:commit . "8b2e7feb722ab2bde1ce050fe040f72ae0b05cad") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://zk-phi.gitub.io/"))]) + (scala-mode . [(20210414 1126) nil "Major mode for editing Scala" tar ((:commit . "598cb680f321d9609295aa9b4679040cc703b602") (:keywords "languages") (:url . "https://github.com/hvesalai/emacs-scala-mode"))]) + (scalariform . [(20190114 215) ((s (1 12 0)) (f (0 20 0))) "Format Scala code with scalariform." single ((:commit . "478a15ccb4f825aba73262bccd3e61ce7017f64b") (:authors ("zwild" . "judezhao@outlook.com")) (:maintainer "zwild" . "judezhao@outlook.com") (:keywords "processes" "scala" "scalariform") (:url . "https://github.com/zwild/scalariform"))]) + (scf-mode . [(20151122 248) nil "shorten file-names in compilation type buffers" single ((:commit . "dbfcdcd89034f208d65e181af58e0d73ad09f8b2") (:authors ("Le Wang")) (:maintainer "Le Wang") (:keywords "compilation") (:url . "https://github.com/lewang/scf-mode"))]) + (scheme-complete . [(20201112 442) nil "Smart auto completion for Scheme in Emacs" single ((:commit . "b9a1448c4696f117d9ea4e59b6162dc31112e71a") (:authors ("Alex Shinn")) (:maintainer "Alex Shinn"))]) + (schrute . [(20170521 1840) ((emacs (24 3))) "Help you remember there is a better way to do something." single ((:commit . "59faa6c4232ae183cea93237301acad8c0763997") (:authors ("Jorge Araya Navarro" . "elcorreo@deshackra.com")) (:maintainer "Jorge Araya Navarro" . "elcorreo@deshackra.com") (:keywords "convenience") (:url . "https://bitbucket.org/shackra/dwight-k.-schrute"))]) + (scihub . [(20201009 420) ((emacs (25 1))) "Sci-Hub integration" single ((:commit . "4f8852dc675fcf3d20ae6e945f4579890ed81de5") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:keywords "convenience") (:url . "https://github.com/emacs-pe/scihub.el"))]) + (scion . [(20130315 1255) nil "Haskell Minor Mode for Interacting with the Scion Library" single ((:commit . "99b4589175665687181a932cd836850205625f71") (:url . "https://code.google.com/p/scion-lib/"))]) + (sclang-extensions . [(20160509 338) ((auto-complete (1 4 0)) (s (1 3 1)) (dash (1 2 0)) (emacs (24 1))) "Extensions for the SuperCollider Emacs mode." tar ((:commit . "e9cc79732f16fdb582129303110c163dcc0d6da0") (:authors ("Chris Barrett" . "chris.d.barrett@me.com")) (:maintainer "Chris Barrett" . "chris.d.barrett@me.com") (:keywords "sclang" "supercollider" "languages" "tools"))]) + (sclang-snippets . [(20130513 751) ((yasnippet (0 8 0))) "Snippets for the SuperCollider Emacs mode" tar ((:commit . "c840a416b96f83bdd70491e3d1fbe2f1ae8b3f58") (:authors ("ptrv" . "mail@petervasil.net")) (:maintainer "ptrv" . "mail@petervasil.net") (:keywords "snippets"))]) + (scpaste . [(20210223 1902) ((htmlize (1 39))) "Paste to the web via scp." single ((:commit . "4ec352fb9fe261ffb8b78449dea986dc34d337b3") (:authors ("Phil Hagelberg")) (:maintainer "Phil Hagelberg") (:keywords "convenience" "hypermedia") (:url . "https://git.sr.ht/~technomancy/scpaste"))]) + (scratch . [(20190314 614) ((emacs (25 1))) "Mode-specific scratch buffers" single ((:commit . "4813d82b39a451f2a6d5b730cd7ec49a9bdabcca") (:authors ("Ian Eure" . "ian.eure@gmail.com")) (:maintainer "Ian Eure" . "ian.eure@gmail.com") (:keywords "convenience" "tools" "files") (:url . "https://github.com/ieure/scratch-el"))]) + (scratch-comment . [(20200812 1025) ((emacs (26 1))) "Insert Elisp result as comment in scratch buffer" single ((:commit . "cf3e967b4def1308b6ef1cfeedd2cf15ee6e226c") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "convenience") (:url . "https://github.com/conao3/scratch-comment.el"))]) + (scratch-ext . [(20140104 516) nil "Extensions for *scratch*" single ((:commit . "388c53cddd0466b451264894667ed64a6947ad67") (:authors ("Kouhei Yanagita" . "yanagi@shakenbu.org")) (:maintainer "Kouhei Yanagita" . "yanagi@shakenbu.org") (:url . "https://github.com/kyanagi/scratch-ext-el"))]) + (scratch-log . [(20141115 743) nil "Utility for *scratch* buffer." single ((:commit . "1168f7f16d36ca0f4ddf2bb98881f8db62cc5dc0") (:authors ("kmori" . "morihenotegami@gmail.com")) (:maintainer "kmori" . "morihenotegami@gmail.com"))]) + (scratch-message . [(20170107 1336) nil "Changing message in your scratch buffer" single ((:commit . "3ecc7f5e3b8a597ebd1492fd426d3720a7f34302") (:authors ("Sylvain Rousseau <thisirs at gmail dot com>")) (:maintainer "Sylvain Rousseau <thisirs at gmail dot com>") (:keywords "util" "scratch") (:url . "https://github.com/thisirs/scratch-message.git"))]) + (scratch-palette . [(20210306 427) ((popwin (0 7 0 -3))) "make scratch buffer for each files" single ((:commit . "e4642ed8a2b744ba48a8e11ca83861f8e4b9c5b3") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://zk-phi.gitub.io/"))]) + (scratch-pop . [(20200910 226) nil "Generate, popup (& optionally backup) scratch buffer(s)." single ((:commit . "cbe842fd78e4b742ece9fc493ebf43e69d872866") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))]) + (scratches . [(20151006 416) ((dash (2 11 0)) (f (0 17 0))) "Multiple scratches in any language" single ((:commit . "9441afe6396ca38f08029123fab5d87429cbf315") (:authors ("Zhang Kai Yu" . "yeannylam@gmail.com")) (:maintainer "Zhang Kai Yu" . "yeannylam@gmail.com") (:keywords "scratch"))]) + (scribble-mode . [(20190912 200) ((emacs (24))) "Major mode for editing Scribble documents" single ((:commit . "5c3ea3cc9bbad585476eee41ea76dc056c2012bb") (:authors ("Mario Rodas" . "marsam@users.noreply.github.com")) (:maintainer "Mario Rodas" . "marsam@users.noreply.github.com") (:keywords "convenience") (:url . "https://github.com/emacs-pe/scribble-mode"))]) + (scroll-on-drag . [(20210418 1318) ((emacs (26 2))) "Interactive scrolling" single ((:commit . "157637ba6b6cbe7a21c57f9eefb8a94fffa0085e") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-scroll-on-drag"))]) + (scroll-on-jump . [(20210426 1226) ((emacs (26 2))) "Scroll when jumping to a new point" single ((:commit . "30dc5f5e50fa702eb65756304f0fe406daec2397") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-scroll-on-jump"))]) + (scrollable-quick-peek . [(20201224 329) ((quick-peek (1 0)) (emacs (24 4))) "Display scrollable overlays" single ((:commit . "3e3492145a61831661d6e97fdcb47b5b66c73287") (:authors ("Pablo Barrantes" . "xjpablobrx@gmail.com")) (:maintainer "Pablo Barrantes" . "xjpablobrx@gmail.com") (:keywords "convenience" "extensions" "help" "tools") (:url . "https://github.com/jpablobr/scrollable-quick-peek"))]) + (scrollkeeper . [(20190109 629) ((emacs (25 1))) "Custom scrolling commands with visual guidelines" single ((:commit . "3c4ac6b6b44686d31c260ee0b19daaee59bdccd6") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "convenience") (:url . "https://github.com/alphapapa/scrollkeeper.el"))]) + (scrooge . [(20180630 1022) ((emacs (24)) (cl-lib (0 5)) (dash (2 13 0)) (thrift (0 9 3))) "Major mode for Twitter Scrooge files" single ((:commit . "0a8c58e9e6708abe4ef7e415bc1e0472318bb1b0") (:authors ("Daniel McClanahan" . "danieldmcclanahan@gmail.com")) (:maintainer "Daniel McClanahan" . "danieldmcclanahan@gmail.com") (:keywords "scrooge" "thrift"))]) + (scss-mode . [(20180123 1708) nil "Major mode for editing SCSS files" single ((:commit . "cf58dbec5394280503eb5502938f3b5445d1b53d") (:authors ("Anton Johansson" . "anton.johansson@gmail.com")) (:maintainer "Anton Johansson" . "anton.johansson@gmail.com") (:keywords "scss" "css" "mode") (:url . "https://github.com/antonj/scss-mode"))]) + (sculpture-themes . [(20210530 624) ((emacs (26 1))) "Themes with vivid colors" tar ((:commit . "1da2b3501f3732b4a58d28b502e356226a43a96f") (:authors ("t-e-r-m" . "newenewen@tutanota.com")) (:maintainer "t-e-r-m" . "newenewen@tutanota.com") (:url . "https://github.com/t-e-r-m/sculpture-theme"))]) + (sdcv . [(20190610 732) ((emacs (24 3)) (popup (0 5 3)) (showtip (0 1)) (pos-tip (0 4 6)) (cl-lib (0 3))) "Interface for sdcv (StartDict console version)." single ((:commit . "943ae3e90cc9a0a88a37cc710acd7424fd4defc4") (:authors ("Andy Stewart" . "lazycat.manatee@gmail.com")) (:maintainer "Andy Stewart" . "lazycat.manatee@gmail.com") (:keywords "startdict" "sdcv") (:url . "http://www.emacswiki.org/emacs/download/sdcv.el"))]) + (sdlang-mode . [(20161201 711) ((emacs (24 3))) "Major mode for Simple Declarative Language files." single ((:commit . "d42a6eedefeb44919fbacf58d302b6df18f05bbc") (:authors ("Vladimir Panteleev")) (:maintainer "Vladimir Panteleev") (:keywords "languages") (:url . "https://github.com/CyberShadow/sdlang-mode"))]) + (search-web . [(20150312 1103) nil "Post web search queries using `browse-url'." single ((:commit . "c4ae86ac1acfc572b81f3d78764bd9a54034c331") (:authors ("Tomoya Otake" . "tomoya.ton@gmail.com")) (:maintainer "Tomoya Otake" . "tomoya.ton@gmail.com"))]) + (searcher . [(20210124 1524) ((emacs (25 1)) (dash (2 10)) (f (0 20 0))) "Searcher in pure elisp" single ((:commit . "447b6f0c3b4429e70a474a325151913100bc6417") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/searcher"))]) + (searchq . [(20150829 1211) ((emacs (24 3))) "Framework of queued search tasks using GREP, ACK, AG and more." tar ((:commit . "dd510d55ad66a82c6ef022cfe7c4a73ad5365f82") (:authors ("boyw165")) (:maintainer "boyw165"))]) + (secretaria . [(20191128 250) ((emacs (24 4)) (alert (1 2)) (s (1 12)) (f (0 20 0)) (org (9))) "A personal assistant based on org-mode" single ((:commit . "03986130a2ada1fa952d45e83536729f20230fcf") (:authors ("Jorge Araya Navarro" . "jorge@esavara.cr")) (:maintainer "Jorge Araya Navarro" . "jorge@esavara.cr") (:keywords "org" "convenience") (:url . "https://gitlab.com/shackra/secretaria"))]) + (see-mode . [(20180511 41) ((emacs (24 4)) (language-detection (0 1 0))) "Edit string in a separate buffer" single ((:commit . "b6e72ea90105b03816c334be9e43bb41dcc79abf") (:authors ("Marcelo Muñoz" . "ma.munoz.araya@gmail.com")) (:maintainer "Marcelo Muñoz" . "ma.munoz.araya@gmail.com") (:keywords "convenience") (:url . "https://github.com/marcelino-m/see-mode"))]) + (seeing-is-believing . [(20170214 1320) nil "minor mode for running the seeing-is-believing ruby gem" single ((:commit . "fbbe246c0fda87bb26227bb826eebadb418a220f") (:authors ("John Cinnamond")) (:maintainer "John Cinnamond"))]) + (seen-mode . [(20210311 1935) ((emacs (24 4))) "A syntax highlighting package for text/kepago" single ((:commit . "57c960d76ad3dc551ac5a57ebe8682ef9fdc6d31") (:authors ("Filipe da Silva Santos" . "contact@shiori.com.br")) (:maintainer "Filipe da Silva Santos" . "contact@shiori.com.br") (:keywords "languages") (:url . "https://git.sr.ht/~shiorid/seen.el"))]) + (seethru . [(20150218 1829) ((shadchen (1 4))) "Easily change Emacs' transparency" single ((:commit . "d87e231f99313bea75b1e69e48c0f32968c82060") (:authors ("Benaiah Mischenko" . "benaiah@mischenko.com")) (:maintainer "Benaiah Mischenko" . "benaiah@mischenko.com") (:keywords "lisp" "tools" "alpha" "transparency") (:url . "http://github.com/benaiah/seethru"))]) + (sekka . [(20170803 1247) ((cl-lib (0 3)) (concurrent (0 3 1)) (popup (0 5 2))) "A client for Sekka IME server" single ((:commit . "61840b57d9ae32bf8e297b175942590a1319c7e7") (:authors ("Kiyoka Nishiyama" . "kiyoka@sumibi.org")) (:maintainer "Kiyoka Nishiyama" . "kiyoka@sumibi.org") (:keywords "ime" "skk" "japanese") (:url . "https://github.com/kiyoka/sekka"))]) + (select-themes . [(20160221 106) nil "Color theme selection with completing-read" single ((:commit . "236f54287519a3ea6dd7b3992d053e4f4ff5d0fe") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com") (:url . "https://github.com/jasonm23/emacs-select-themes"))]) + (selected . [(20200528 606) nil "Keymap for when region is active" single ((:commit . "3043fd2609f7e71d809763ae6e8dd4b6c904e63d") (:authors ("Erik Sjöstrand")) (:maintainer "Erik Sjöstrand") (:keywords "convenience") (:url . "http://github.com/Kungsgeten/selected.el"))]) + (selectric-mode . [(20200209 2107) nil "IBM Selectric mode for Emacs" tar ((:commit . "1840de71f7414b7cd6ce425747c8e26a413233aa") (:authors ("Ricardo Bánffy" . "rbanffy@gmail.com")) (:maintainer "Ricardo Banffy" . "rbanffy@gmail.com") (:keywords "multimedia" "convenience" "typewriter" "selectric") (:url . "https://github.com/rbanffy/selectric-mode"))]) + (selectrum . [(20210530 245) ((emacs (26 1))) "Easily select item from list" single ((:commit . "a19bbe94de492bf504399c093cfc5695eb630fa8") (:authors ("Radon Rosborough" . "radon.neon@gmail.com")) (:maintainer "Radon Rosborough" . "radon.neon@gmail.com") (:keywords "extensions") (:url . "https://github.com/raxod502/selectrum"))]) + (selectrum-prescient . [(20210425 1720) ((emacs (25 1)) (prescient (5 1)) (selectrum (3 1))) "Selectrum integration" single ((:commit . "4a0f5405798cfcb98ea005078ef2e2d490e922c4") (:authors ("Radon Rosborough" . "radon.neon@gmail.com")) (:maintainer "Radon Rosborough" . "radon.neon@gmail.com") (:keywords "extensions") (:url . "https://github.com/raxod502/prescient.el"))]) + (semaphore . [(20190607 1949) ((emacs (26))) "Semaphore based on condition variables" single ((:commit . "a069b69018b96d284ce7553cd63350a88ea3679c") (:authors ("Herwig Hochleitner" . "herwig@bendlas.net")) (:maintainer "Herwig Hochleitner" . "herwig@bendlas.net") (:keywords "processes" "unix") (:url . "http://github.com/webnf/semaphore.el"))]) + (semaphore-promise . [(20190607 2115) ((emacs (26)) (semaphore (1)) (promise (1))) "semaphore integration with promise" single ((:commit . "a069b69018b96d284ce7553cd63350a88ea3679c") (:authors ("Herwig Hochleitner" . "herwig@bendlas.net")) (:maintainer "Herwig Hochleitner" . "herwig@bendlas.net") (:keywords "processes" "unix") (:url . "http://github.com/webnf/semaphore.el"))]) + (semi . [(20210529 1313) ((emacs (24 5)) (apel (10 8)) (flim (1 14 9))) "A library to provide MIME features." tar ((:commit . "95259568446f32c1af56dfc27e3614815322a1bf"))]) + (seml-mode . [(20200812 1027) ((emacs (25 1)) (impatient-mode (1 1)) (htmlize (1 5)) (web-mode (16 0))) "Major-mode for SEML, S-Expression Markup Language, file" single ((:commit . "7a9a8305f7b54ee59e4c29b33ef5fd4058ba4219") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "lisp" "html") (:url . "https://github.com/conao3/seml-mode.el"))]) + (sendto . [(20160425 1250) ((emacs (24 4))) "send the region content to a function" single ((:commit . "076b81d7a53f75b0a59b0ef3448f35570567054c") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "convenience" "region") (:url . "https://github.com/lujun9972/sendto.el"))]) + (sensitive . [(20170818 1251) ((emacs (24)) (sequences (0 1 0))) "A dead simple way to load sensitive information" single ((:commit . "69dd6125a41d8b55f4b6ba61daa4d1aa1f716fa8") (:authors ("Tim Visher" . "tim.visher@gmail.com")) (:maintainer "Tim Visher" . "tim.visher@gmail.com") (:keywords "convenience"))]) + (sentence-navigation . [(20180408 1619) ((ample-regexps (0 1)) (cl-lib (0 5)) (emacs (24 4))) "Commands to navigate one-spaced sentences." single ((:commit . "7c5d2edeaed01196aec25031782e89adeaa089f0") (:authors ("Fox Kiester" . "noct@openmailbox.org")) (:maintainer "Fox Kiester" . "noct@openmailbox.org") (:keywords "sentence" "evil") (:url . "https://github.com/noctuid/emacs-sentence-navigation"))]) + (seoul256-theme . [(20180505 757) ((emacs (24 3))) "Low-contrast color scheme based on Seoul Colors." single ((:commit . "d28a9de73a5ffb1a1c9492db75a5c1efe5e9815f") (:authors ("Anand Iyer" . "anand.ucb@gmail.com")) (:maintainer "Anand Iyer" . "anand.ucb@gmail.com") (:keywords "theme") (:url . "http://github.com/anandpiyer/seoul256-emacs"))]) + (separedit . [(20210521 1050) ((emacs (25 1)) (dash (2 18)) (edit-indirect (0 1 5))) "Edit comment/string/docstring/code block in separate buffer" single ((:commit . "900fdc33b647e92d0f464872da1b12d724de7d43") (:authors ("Gong Qijian" . "gongqijian@gmail.com")) (:maintainer "Gong Qijian" . "gongqijian@gmail.com") (:keywords "tools" "languages" "docs") (:url . "https://github.com/twlz0ne/separedit.el"))]) + (sequed . [(20210417 28) ((emacs (25 2))) "Major mode for FASTA format DNA alignments" single ((:commit . "b28e20bf3e0ec7c56c705632e38ab842083d9c49") (:authors (nil . "Bruce Rannala <brannala@ucdavis.edu")) (:maintainer nil . "Bruce Rannala <brannala@ucdavis.edu") (:url . "https://github.com/brannala/sequed"))]) + (sequences . [(20170818 1252) ((emacs (24))) "Ports of some Clojure sequence functions." single ((:commit . "564ebbd93b0beea4e75acfbf824350e90b5d5738") (:authors ("Tim Visher" . "tim.visher@gmail.com")) (:maintainer "Tim Visher" . "tim.visher@gmail.com") (:keywords "convenience"))]) + (sequential-command . [(20170926 40) nil "Many commands into one command" tar ((:commit . "a48cbcbe273b33edd3ae56e68f44b4100fa3a48a") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "convenience" "lisp") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/sequential-command.el"))]) + (servant . [(20140216 1219) ((s (1 8 0)) (dash (2 2 0)) (f (0 11 0)) (ansi (0 3 0)) (commander (0 5 0)) (epl (0 2)) (shut-up (0 2 1)) (web-server (0 0 1))) "ELPA server written in Emacs Lisp" tar ((:commit . "4d2aa8250b54b28e6e7ee4cd5ebd98a33db2c134") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com") ("Sebastian Wiesner" . "lunaryorn@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "elpa" "server") (:url . "http://github.com/rejeep/servant.el"))]) + (serverspec . [(20150623 1155) ((dash (2 6 0)) (s (1 9 0)) (f (0 16 2)) (helm (1 6 1))) "Serverspec minor mode" tar ((:commit . "b6dfe82af9869438de5e5d860ced196641f372c0") (:authors ("k1LoW (Kenichirou Oyama), <k1lowxb [at] gmail [dot] com> <k1low [at] 101000lab [dot] org>")) (:maintainer "k1LoW (Kenichirou Oyama), <k1lowxb [at] gmail [dot] com> <k1low [at] 101000lab [dot] org>") (:url . "http://101000lab.org"))]) + (services . [(20170802 1130) ((cl-lib (0 5))) "Services database access functions." single ((:commit . "04c7986041a33dfa0b0ae57c7d6fbd600548c596") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "convenience" "net" "services") (:url . "https://github.com/davep/services.el"))]) + (sesman . [(20190909 1754) ((emacs (25))) "Generic Session Manager" tar ((:commit . "edee869c209c016e5f0c5cbb8abb9f3ccd2d1e05") (:authors ("Vitalie Spinu")) (:maintainer "Vitalie Spinu") (:keywords "process") (:url . "https://github.com/vspinu/sesman"))]) + (session . [(20120511 0) nil "use variables, registers and buffer places across sessions" single ((:commit . "19ea0806873daac3539a4b956e15655e99e3dd6c") (:authors ("Christoph Wedler" . "wedler@users.sourceforge.net")) (:maintainer "Christoph Wedler" . "wedler@users.sourceforge.net") (:keywords "session" "session management" "desktop" "data" "tools") (:url . "http://emacs-session.sourceforge.net/"))]) + (seti-theme . [(20190201 1848) nil "A dark colored theme, inspired by Seti Atom Theme" single ((:commit . "9d76db0b91d4f574dd96ac80fad41da35bffa109") (:authors ("Vlad Piersec" . "vlad.piersec@gmail.com")) (:maintainer "Vlad Piersec" . "vlad.piersec@gmail.com") (:keywords "themes") (:url . "https://github.com/caisah/seti-theme"))]) + (sexp-diff . [(20200314 2018) ((emacs (25))) "Diff sexps based on Levenshtein-like edit distance" single ((:commit . "7e8c988bea2af209e17b70fa51316ade55529acb") (:authors ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:keywords "lisp") (:url . "https://github.com/xuchunyang/sexp-diff.el"))]) + (sexp-move . [(20150915 1730) nil "Improved S-Expression Movement" single ((:commit . "117f7a91ab7c25e438413753e916570122011ce7") (:authors ("Philip Woods" . "elzairthesorcerer@gmail.com")) (:maintainer "Philip Woods" . "elzairthesorcerer@gmail.com") (:keywords "sexp") (:url . "https://gitlab.com/elzair/sexp-move"))]) + (sexy-monochrome-theme . [(20200115 2146) nil "A sexy dark Emacs >= 24 theme for your sexy code" single ((:commit . "f3ad07d60c966ef34cb11026eaba053e114bb8f1") (:authors ("Volodymyr Yevtushenko" . "voloyev@vivaldi.net")) (:maintainer "Volodymyr Yevtushenko" . "voloyev@vivaldi.net") (:keywords "themes") (:url . "https://github.com/voloyev/sexy-monochrome-theme"))]) + (sfz-mode . [(20200716 1023) ((emacs (25 1))) "Major mode for SFZ files" single ((:commit . "aaf31d1b68817251affed7da719dfcb2acd4b51a") (:authors ("Jean Pierre Cimalando" . "jp-dev@inbox.ru")) (:maintainer "Jean Pierre Cimalando" . "jp-dev@inbox.ru") (:keywords "languages") (:url . "https://github.com/sfztools/emacs-sfz-mode"))]) + (shackle . [(20210508 1637) ((emacs (24 3)) (cl-lib (0 5))) "Enforce rules for popups" single ((:commit . "4ef05b117c87e1f0d97e0ee74fd2f0bfd07a49b1") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:keywords "convenience") (:url . "https://depp.brause.cc/shackle"))]) + (shadchen . [(20141102 1839) nil "pattern matching for elisp" single ((:commit . "35f2b9c304eec990c16efbd557198289dc7cbb1f") (:authors ("Vincent Toups")) (:maintainer "Vincent Toups"))]) + (shader-mode . [(20180518 1157) ((emacs (24))) "Major mode for shader" single ((:commit . "d7dc8d0d6fe8914e8b6d5cf2081ad61e6952359c") (:authors ("midnightSuyama" . "midnightSuyama@gmail.com")) (:maintainer "midnightSuyama" . "midnightSuyama@gmail.com") (:url . "https://github.com/midnightSuyama/shader-mode"))]) + (shades-of-purple-theme . [(20210506 1448) nil "A theme with bold shades of purple" single ((:commit . "e9d2ac081ae657b1ad6a30b9f53e8572479deb80") (:authors ("Arturo Vergara" . "hello@dead.computer")) (:maintainer "Arturo Vergara" . "hello@dead.computer") (:url . "https://github.com/arturovm/shades-of-purple-emacs"))]) + (shadowenv . [(20210512 1625) ((emacs (24 3))) "Shadowenv integration." single ((:commit . "dbcef650b906fec62608d5e4e3075bf251e675e1") (:authors ("Dante Catalfamo" . "dante.catalfamo@shopify.com")) (:maintainer "Dante Catalfamo" . "dante.catalfamo@shopify.com") (:keywords "shadowenv" "tools") (:url . "https://github.com/Shopify/shadowenv.el"))]) + (shakespeare-mode . [(20180704 2138) nil "A major mode for editing Shakespearean templates." single ((:commit . "c442eeea9d585e1b1fbb8813e33d47feec348a57") (:authors ("Cody Reichert")) (:maintainer "Cody Reichert") (:keywords "shakespeare" "hamlet" "lucius" "julius" "mode") (:url . "http://github.com/CodyReichert/shakespeare-mode"))]) + (shampoo . [(20131230 1019) nil "A remote Smalltalk development mode" tar ((:commit . "bc193c39636c30182159c5c91c37a9a4cb50fedf"))]) + (share2computer . [(20200316 31) ((emacs (25 1))) "Elisp helper of android ShareToComputer" single ((:commit . "15da47625a800e3310b8dc714bd4e41e32966d6a") (:authors ("Feng Shu" . "tumashu@163.com")) (:maintainer "Feng Shu" . "tumashu@163.com") (:keywords "convenience" "comm") (:url . "https://github.com/tumashu/share2computer"))]) + (sharper . [(20210523 1821) ((emacs (27 1)) (transient (0 2 0))) "A dotnet CLI wrapper, using Transient" single ((:commit . "08277b6c30568adfbe438c9f2a1d6c3db4b7ebeb") (:authors ("Sebastian Monia" . "smonia@outlook.com")) (:maintainer "Sebastian Monia" . "smonia@outlook.com") (:keywords "maint" "tool") (:url . "https://github.com/sebasmonia/sharper"))]) + (shell-current-directory . [(20140101 2354) nil "create new shell based on buffer directory" single ((:commit . "bf843771bf9a4aa05e054ade799eb8862f3be89a") (:authors ("Daniel Polani")) (:maintainer "Daniel Polani") (:keywords "shell" "comint"))]) + (shell-here . [(20191011 1959) nil "Open a shell relative to the working directory" single ((:commit . "88b80deb1337a97b403b20fc467fa2d579b3bfd5") (:authors ("Ian Eure" . "ian.eure@gmail.com")) (:maintainer "Ian Eure" . "ian.eure@gmail.com") (:keywords "unix" "tools" "processes"))]) + (shell-history . [(20100505 839) nil "integration with shell history" single ((:commit . "ee371a81f2d2bf5a308344078329ca1e9b5ed38c") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "processes" "convenience") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/shell-history.el"))]) + (shell-pop . [(20200315 1139) ((emacs (24)) (cl-lib (0 5))) "helps you to use shell easily on Emacs. Only one key action to work." single ((:commit . "4b4394037940a890a313d715d203d9ead2d156a6") (:authors ("Kazuo YAGI" . "kazuo.yagi@gmail.com")) (:maintainer "Kazuo YAGI" . "kazuo.yagi@gmail.com") (:keywords "shell" "terminal" "tools") (:url . "http://github.com/kyagi/shell-pop-el"))]) + (shell-split-string . [(20151224 1008) nil "Split strings using shell-like syntax" single ((:commit . "19f6f999c33cc66a4c91bacdcc3697c25d97bf5a") (:authors ("10sr <8.slashes+el [at] gmail [dot] com>")) (:maintainer "10sr <8.slashes+el [at] gmail [dot] com>") (:keywords "utility" "library" "shell" "string") (:url . "https://github.com/10sr/shell-split-string-el"))]) + (shell-switcher . [(20210509 1045) ((emacs (24))) "Provide fast switching between shell buffers." tar ((:commit . "ed74b20fa12935be0068765f5bc8de97b92a8020") (:authors ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainer "Damien Cassou" . "damien.cassou@gmail.com") (:keywords "emacs" "package" "elisp" "shell" "eshell" "term" "switcher") (:url . "https://github.com/DamienCassou/shell-switcher"))]) + (shell-toggle . [(20150226 1411) nil "Toggle to and from the shell buffer" single ((:commit . "0d01bd9a780fdb7fe6609c552523f4498649a3b9") (:authors ("Mikael Sjödin" . "mic@docs.uu.se") ("Matthieu Moy") ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Mikael Sjödin" . "mic@docs.uu.se") (:keywords "processes") (:url . "https://github.com/knu/shell-toggle.el"))]) + (shelldoc . [(20200513 1206) ((cl-lib (0 3)) (s (1 9 0))) "shell command editing support with man page." single ((:commit . "fa69f67b6229fad3f31d936955ca8d1982009b77") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "applications") (:url . "http://github.com/mhayashi1120/Emacs-shelldoc"))]) + (shelltest-mode . [(20180501 141) nil "Major mode for shelltestrunner" single ((:commit . "5fea8c9394380e822971a171905b6b5ab9be812d") (:authors ("Dustin Fechner" . "dfe@rtrn.io")) (:maintainer "Dustin Fechner" . "dfe@rtrn.io") (:keywords "languages") (:url . "https://github.com/rtrn/shelltest-mode"))]) + (shen-elisp . [(20210530 349) ((emacs (24 4))) "Shen implementation in Elisp" tar ((:commit . "dabb829d0d86f454ceb3b0846cdfc11af1f91cc7") (:authors ("Aditya Siram" . "aditya.siram@gmail.com")) (:maintainer "Aditya Siram" . "aditya.siram@gmail.com") (:url . "https://github.com/deech/shen-elisp"))]) + (shfmt . [(20200421 103) ((emacs (24)) (reformatter (0 3))) "Reformat shell scripts using shfmt" single ((:commit . "49c9e11567874bc4c5c4b3578a6b8f6b1948c691") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "languages") (:url . "https://github.com/purcell/emacs-shfmt"))]) + (shift-number . [(20170301 1459) nil "Increase/decrease the number at point" single ((:commit . "cd099a5582fc996b800ac7607f6c38a004ce9740") (:authors ("Alex Kost" . "alezost@gmail.com")) (:maintainer "Alex Kost" . "alezost@gmail.com") (:keywords "convenience") (:url . "https://github.com/alezost/shift-number.el"))]) + (shift-text . [(20130831 1655) ((cl-lib (1 0)) (es-lib (0 3))) "Move the region in 4 directions, in a way similar to Eclipse's" single ((:commit . "1be9cbf994000022172ceb746fe1d597f57ea8ba") (:authors ("sabof")) (:maintainer "sabof") (:url . "https://github.com/sabof/shift-text"))]) + (shimbun . [(20210610 2317) nil "interfacing with web newspapers" tar ((:commit . "e2151425cc4e1681a0c6753e82807f2b8ef27b72") (:authors ("TSUCHIYA Masatoshi" . "tsuchiya@namazu.org") ("Akihiro Arisawa " . "ari@mbf.sphere.ne.jp") ("Yuuichi Teranishi " . "teranisi@gohome.org") ("Katsumi Yamaoka " . "yamaoka@jpl.org")) (:maintainer "TSUCHIYA Masatoshi" . "tsuchiya@namazu.org") (:keywords "news"))]) + (shm . [(20180327 57) nil "Structured Haskell Mode" tar ((:commit . "7f9df73f45d107017c18ce4835bbc190dfe6782e") (:authors ("Chris Done" . "chrisdone@gmail.com")) (:maintainer "Chris Done" . "chrisdone@gmail.com") (:keywords "development" "haskell" "structured"))]) + (shoulda . [(20140616 1833) ((cl-lib (0 5))) "Shoulda test support for ruby" single ((:commit . "fbe8eb8efc6cfcca1713283a290882cfcdc8725e") (:authors ("Marcwebbie" . "marcwebbie@gmail.com")) (:maintainer "Marcwebbie" . "marcwebbie@gmail.com") (:keywords "ruby" "tests" "shoulda"))]) + (show-css . [(20160210 1408) ((doom (1 3)) (s (1 10 0))) "Show the css of the html attribute the cursor is on" tar ((:commit . "771daeddd4df7a7c10f66419a837145649bab63b") (:authors ("Sheldon McGrandle" . "developer@rednemesis.com")) (:maintainer "Sheldon McGrandle" . "developer@rednemesis.com") (:keywords "hypermedia") (:url . "https://github.com/smmcg/showcss-mode"))]) + (show-eol . [(20200921 1201) ((emacs (24 4))) "Show end of line symbol in buffer" single ((:commit . "02fdb5b2832889afd6cad5c517da9b1e4611c766") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/show-eol"))]) + (show-font-mode . [(20201225 2217) ((emacs (25 1))) "Show font at point on mode line" single ((:commit . "8503be7966d3bd8316039b5f49d3c37c7b97d10c") (:authors ("Melissa Boiko" . "melissa@namakajiri.net")) (:maintainer "Melissa Boiko" . "melissa@namakajiri.net") (:keywords "faces" "i18n" "unicode" "fonts" "fontsets") (:url . "https://github.com/melissaboiko/show-font-mode"))]) + (showtip . [(20090830 1040) nil "Show tip at cursor" single ((:commit . "930da302809a4257e8d69425455b29e1cc91949b") (:authors ("Ye Wenbin" . "wenbinye@gmail.com")) (:maintainer "Ye Wenbin" . "wenbinye@gmail.com") (:keywords "help"))]) + (shpec-mode . [(20150530 922) nil "Minor mode for shpec specification" single ((:commit . "146adc8281d0f115df39a3a3f982ac59ab61b754") (:authors ("AdrieanKhisbe" . "adriean.khisbe@live.fr")) (:maintainer "AdrieanKhisbe" . "adriean.khisbe@live.fr") (:keywords "languages" "tools") (:url . "http://github.com/shpec/shpec-mode"))]) + (shr-tag-pre-highlight . [(20200626 1047) ((emacs (25 1)) (language-detection (0 1 0))) "Syntax highlighting code block in HTML" single ((:commit . "931c447bc0d6c134ddc9657c664eeee33afbc54d") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:keywords "html") (:url . "https://github.com/xuchunyang/shr-tag-pre-highlight.el"))]) + (shrface . [(20210506 358) ((emacs (25 1)) (org (9 0)) (language-detection (0 1 0))) "Extend shr/eww with org features and analysis capability" single ((:commit . "935cfc793c7380732915c88302c06271d9fc5cee") (:authors ("Damon Chan" . "elecming@gmail.com")) (:maintainer "Damon Chan" . "elecming@gmail.com") (:keywords "faces") (:url . "https://github.com/chenyanming/shrface"))]) + (shrink-path . [(20190208 1335) ((emacs (24)) (s (1 6 1)) (dash (1 8 0)) (f (0 10 0))) "fish-style path" single ((:commit . "c14882c8599aec79a6e8ef2d06454254bb3e1e41") (:authors ("Benjamin Andresen")) (:maintainer "Benjamin Andresen") (:url . "https://gitlab.com/bennya/shrink-path.el"))]) + (shrink-whitespace . [(20181003 321) nil "Whitespace removal DWIM key" single ((:commit . "0407b89c142bd17e65edb666f35e2c6755bd0867") (:authors ("Jean-Christophe Petkovich" . "jcpetkovich@gmail.com")) (:maintainer "Jean-Christophe Petkovich" . "jcpetkovich@gmail.com") (:keywords "convenience") (:url . "https://gitlab.com/jcpetkovich/shrink-whitespace.el"))]) + (shroud . [(20210220 1952) ((emacs (25)) (epg (1 0 0)) (s (1 6 0)) (bui (1 2 0)) (dash (2 18 0))) "Shroud secrets" tar ((:commit . "2e6ff2bab4a1e798c090c9d7fbd90b7f3463d5c5") (:authors ("Amar Singh" . "nly@disroot.org")) (:maintainer "Amar Singh" . "nly@disroot.org") (:keywords "tools" "password") (:url . "https://github.com/o-nly/emacs-shroud"))]) + (shut-up . [(20210403 1249) ((cl-lib (0 3)) (emacs (24))) "Shut up would you!" single ((:commit . "ff6f06f3b080ee833a25a22da8cb5b96e911dc77") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:url . "http://github.com/rejeep/shut-up.el"))]) + (shx . [(20201121 1824) ((emacs (24 4))) "Extras for the comint-mode shell" single ((:commit . "09ae2124369ded4f38459d2456f72536d172227a") (:keywords "terminals" "processes" "comint" "shell" "repl") (:url . "https://github.com/riscy/shx-for-emacs"))]) + (sibilant-mode . [(20151119 2145) nil "Support for the Sibilant programming language" single ((:commit . "bc1b5d8cd597918bafc9b2880ee49024740e54ab") (:authors ("Jacob Rothstein" . "hi@jbr.me")) (:maintainer "Jacob Rothstein" . "hi@jbr.me") (:keywords "languages") (:url . "http://sibilantjs.info"))]) + (sicp . [(20200512 1137) nil "Structure and Interpretation of Computer Programs in info format" tar ((:commit . "4002d83083d520c6b5ede2df36cc2cee885d450a") (:authors ("Hal Abelson") ("Jerry Sussman") ("Julie Sussman")) (:maintainer "Hal Abelson") (:url . "https://mitpress.mit.edu/sicp"))]) + (side-notes . [(20210502 935) ((emacs (24 4))) "Easy access to a directory notes file" single ((:commit . "ca73cec33880322c5bbab407825d502d87f4cf0f") (:authors ("Paul W. Rankin" . "pwr@bydasein.com")) (:maintainer "Paul W. Rankin" . "pwr@bydasein.com") (:keywords "convenience") (:url . "https://github.com/rnkn/side-notes"))]) + (sift . [(20200421 1423) nil "Front-end for sift, a fast and powerful grep alternative" single ((:commit . "cdddba2d183146c340915003f1b5d09d13712c22") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "sift" "ack" "pt" "ag" "grep" "search") (:url . "https://github.com/nlamirault/sift.el"))]) + (signal . [(20160816 1438) ((emacs (24)) (cl-lib (0 5))) "Advanced hook" single ((:commit . "aa58327e2297df921d72a0370468b48663efd438") (:authors ("Mola-T" . "Mola@molamola.xyz")) (:maintainer "Mola-T" . "Mola@molamola.xyz") (:keywords "internal" "lisp" "processes" "tools") (:url . "https://github.com/mola-T/signal"))]) + (silkworm-theme . [(20210215 1120) ((emacs (24))) "Light theme with pleasant, low contrast colors." single ((:commit . "ff80e9294da0fb093e15097ac62153ef4a64a889") (:authors ("Martin Haesler")) (:maintainer "Martin Haesler"))]) + (simp . [(20180607 254) nil "Simple project definition, chiefly for file finding, and grepping" tar ((:commit . "d4d4b8547055347828bedccbeffdb4fd2d5a5d34") (:authors ("atom smith")) (:maintainer "atom smith") (:keywords "project" "grep" "find") (:url . "https://github.com/re5et/simp"))]) + (simple-bookmarks . [(20190204 1426) ((cl-lib (0 5))) "Bookmark / functioncall manager" tar ((:commit . "54e8d771bcdb0eb235b31c0aa9642171369500e5") (:authors ("Julian T. Knabenschuh" . "jtkdevelopments@gmail.com")) (:maintainer "Julian T. Knabenschuh" . "jtkdevelopments@gmail.com") (:keywords "bookmark" "functioncall") (:url . "https://github.com/jtkDvlp/simple-bookmarks"))]) + (simple-call-tree . [(20210609 1427) ((emacs (24 3)) (anaphora (1 0 0))) "analyze source code based on font-lock text-properties" single ((:commit . "8afae56c4d653d0ff561093252756d28feaa1dc0") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:keywords "programming") (:url . "http://www.emacswiki.org/emacs/download/simple-call-tree.el"))]) + (simple-httpd . [(20191103 1446) ((cl-lib (0 3))) "pure elisp HTTP server" single ((:commit . "22ce66ea43e0eadb9ec1d691a35d9695fc29cee6") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/emacs-http-server"))]) + (simple-modeline . [(20210312 1048) ((emacs (26 1))) "A simple mode-line configuration for Emacs" tar ((:commit . "119d8224a8ae0ee17b09ac1fed6cdb9cb1d048fd") (:authors ("Eder Elorriaga" . "gexplorer8@gmail.com")) (:maintainer "Eder Elorriaga" . "gexplorer8@gmail.com") (:keywords "mode-line" "faces") (:url . "https://github.com/gexplorer/simple-modeline"))]) + (simple-mpc . [(20200523 1804) ((s (1 10 0))) "provides a simple interface to mpc" tar ((:commit . "ce731fa390b7e4edfc461a9cfb4443c1aab4b011") (:authors ("Joren Van Onder" . "joren@jvo.sh")) (:maintainer "Joren Van Onder" . "joren@jvo.sh") (:keywords "multimedia" "mpd" "mpc") (:url . "https://github.com/jorenvo/simple-mpc"))]) + (simple-paren . [(20210206 2015) ((emacs (24)) (cl-lib (0 5))) "Non-electrical insert paired delimiter, wrap" single ((:commit . "7b17fcc467e485dce5550be901d26223b8ad3f23") (:authors ("Andreas Röhler, Steve Purcell")) (:maintainer "Andreas Röhler, Steve Purcell") (:keywords "convenience") (:url . "https://github.com/andreas-roehler/simple-paren"))]) + (simple-rtm . [(20160222 1534) ((rtm (0 1)) (dash (2 0 0))) "Interactive Emacs mode for Remember The Milk" single ((:commit . "8c7cd96cf66ef112be5c363e3378e304f8f83999") (:authors ("Moritz Bunkus" . "morit@bunkus.org")) (:maintainer "Moritz Bunkus" . "morit@bunkus.org") (:keywords "remember" "the" "milk" "productivity" "todo"))]) + (simple-screen . [(20200926 109) nil "Simple screen configuration manager" single ((:commit . "3ce535755986f7c25890d11e42fa621a3a069a4f") (:authors ("Tadashi Watanabe" . "wac@umiushi.org")) (:maintainer "Tadashi Watanabe" . "wac@umiushi.org") (:keywords "tools") (:url . "https://github.com/wachikun/simple-screen"))]) + (simpleclip . [(20210406 1221) nil "Simplified access to the system clipboard" single ((:commit . "67c8c17adbbe6d9407a5ce4159d097a8b8bf6adb") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "convenience") (:url . "http://github.com/rolandwalker/simpleclip"))]) + (simplenote . [(20141118 1440) nil "Interact with simple-note.appspot.com" single ((:commit . "e836fcdb5a6497a9ffd6bceddd19b4bc52189078") (:authors ("Konstantinos Efstathiou" . "konstantinos@efstathiou.gr")) (:maintainer "Konstantinos Efstathiou" . "konstantinos@efstathiou.gr") (:keywords "simplenote"))]) + (simplenote2 . [(20190321 933) ((request-deferred (0 2 0)) (uuidgen (20140918)) (unicode-escape (1 1))) "Interact with app.simplenote.com" tar ((:commit . "760ffecda63bd218876b623f46d332e3ef079be6") (:authors ("alpha22jp" . "alpha22jp@gmail.com")) (:maintainer "alpha22jp" . "alpha22jp@gmail.com") (:keywords "simplenote"))]) + (simplezen . [(20130421 1000) ((s (1 4 0)) (dash (1 1 0))) "A simple subset of zencoding-mode for Emacs." single ((:commit . "119fdf2c6890a0c56045ae72cf4fce0071a81481") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))]) + (sis . [(20201223 547) ((emacs (25 1)) (terminal-focus-reporting (0 0))) "Less manual switch for native or OS input source (input method)." single ((:commit . "f2d4031711714b100ec81aac321917c40cf20dc9") (:keywords "convenience") (:url . "https://github.com/laishulu/emacs-smart-input-source"))]) + (skeletor . [(20210129 239) ((s (1 7 0)) (f (0 14 0)) (dash (2 2 0)) (cl-lib (0 3)) (let-alist (1 0 3)) (emacs (24 1))) "Provides project skeletons for Emacs" tar ((:commit . "f6e560a0bfe459e0b8a268047920ce1148f2ebf6") (:authors ("Chris Barrett" . "chris.d.barrett@me.com")) (:maintainer "Chris Barrett" . "chris.d.barrett@me.com"))]) + (sketch-themes . [(20210325 1700) ((emacs (26 1))) "Sketch color themes" tar ((:commit . "407094c03e934043aa6d70369bf3e1bd841d1c91") (:authors ("Daw-Ran Liou" . "hi@dawranliou.com")) (:maintainer "Daw-Ran Liou" . "hi@dawranliou.com") (:keywords "faces") (:url . "https://github.com/dawranliou/sketch-themes/"))]) + (skewer-less . [(20210510 532) ((skewer-mode (1 5 3))) "Skewer support for live LESS stylesheet updates" single ((:commit . "baa973581c2ab7326db65803df97d1a7382b6564") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "languages" "tools"))]) + (skewer-mode . [(20200304 1142) ((simple-httpd (1 4 0)) (js2-mode (20090723)) (emacs (24))) "live browser JavaScript, CSS, and HTML interaction" tar ((:commit . "e5bed351939c92a1f788f78398583c2f83f1bb3c") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/skewer-mode"))]) + (skewer-reload-stylesheets . [(20160725 1220) ((skewer-mode (1 5 3))) "live-edit CSS, SCSS, Less, and friends." tar ((:commit . "b9cc5635230ac3c0603a6da690c6e632d0a7490a") (:authors ("Nate Eagleson" . "nate@nateeag.com")) (:maintainer "Nate Eagleson" . "nate@nateeag.com"))]) + (skype . [(20160711 824) nil "skype UI for emacs users.." tar ((:commit . "8e3b33e620ed355522aa36434ff41e3ced080629") (:authors ("SAKURAI Masashi" . "m.sakurai@kiwanami.net")) (:maintainer "SAKURAI Masashi" . "m.sakurai@kiwanami.net") (:keywords "skype" "chat"))]) + (sl . [(20161217 1404) ((cl-lib (0 5))) "An Emacs clone of sl(1)" tar ((:commit . "fceb2ae12a3065b2a265b921baca0891c5ea54dc") (:authors ("Chunyang Xu" . "mail@xuchunyang.me")) (:maintainer "Chunyang Xu" . "mail@xuchunyang.me") (:url . "https://github.com/xuchunyang/sl.el"))]) + (slack . [(20200830 1021) ((websocket (1 8)) (request (0 2 0)) (oauth2 (0 10)) (circe (2 2)) (alert (1 2)) (emojify (0 2))) "Slack client for Emacs" tar ((:commit . "1f6a40faec0d8d9c9de51c444508d05a3e995ccd") (:authors ("yuya.minami" . "yuya.minami@yuyaminami-no-MacBook-Pro.local")) (:maintainer "yuya.minami" . "yuya.minami@yuyaminami-no-MacBook-Pro.local") (:keywords "tools") (:url . "https://github.com/yuya373/emacs-slack"))]) + (slideview . [(20150324 2240) ((cl-lib (0 3))) "File slideshow" single ((:commit . "b6d170bda139aedf81b47dc55cbd1a3af512fb4c") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "files") (:url . "https://github.com/mhayashi1120/Emacs-slideview"))]) + (slim-mode . [(20170728 1348) nil "Major mode for editing Slim files" single ((:commit . "3636d18ab1c8b316eea71c4732eb44743e2ded87") (:authors ("Nathan Weizenbaum")) (:maintainer "Nathan Weizenbaum") (:keywords "markup" "language") (:url . "http://github.com/slim-template/emacs-slim"))]) + (slime . [(20210512 1220) ((cl-lib (0 5)) (macrostep (0 9))) "Superior Lisp Interaction Mode for Emacs" tar ((:commit . "bdda756a5667a537497a35f5a0fc5b7c28bf3bd3") (:keywords "languages" "lisp" "slime") (:url . "https://github.com/slime/slime"))]) + (slime-company . [(20210124 1627) ((emacs (24 4)) (slime (2 13)) (company (0 9 0))) "slime completion backend for company mode" single ((:commit . "f20ecc4104d4c35052696e7e760109fb02060e72") (:authors ("Ole Arndt" . "anwyn@sugarshark.com")) (:maintainer "Ole Arndt" . "anwyn@sugarshark.com") (:keywords "convenience" "lisp" "abbrev"))]) + (slime-docker . [(20210426 1422) ((emacs (24 4)) (slime (2 16)) (docker-tramp (0 1))) "Integration of SLIME with Docker containers" tar ((:commit . "c7d073720f2bd8e9f72a20309fff2afa4c4e798d") (:keywords "docker" "lisp" "slime") (:url . "https://gitlab.common-lisp.net/cl-docker-images/slime-docker"))]) + (slime-repl-ansi-color . [(20200712 1226) ((emacs (24)) (slime (2 3 1))) "Turn on ANSI colors in REPL output;" single ((:commit . "e38c7958d9657e41c426b4e96938b3f604238795") (:authors ("Max Mikhanosha" . "max@openchat.com")) (:maintainer "Augustin Fabre" . "augustin@augfab.fr") (:keywords "lisp") (:url . "https://gitlab.com/augfab/slime-repl-ansi-color"))]) + (slime-theme . [(20170808 1322) ((emacs (24 0))) "an Emacs 24 theme based on Slime (tmTheme)" single ((:commit . "8e5880ac69e0b6a079103001cc3a90bdb688998f") (:authors ("Jason Milkins")) (:maintainer "Jason Milkins") (:url . "https://github.com/emacsfodder/tmtheme-to-deftheme"))]) + (slime-volleyball . [(20190701 1624) nil "An SVG Slime Volleyball Game" tar ((:commit . "f36a84f3c503c46ba0d011874d387a34b01c6bf6") (:authors ("Thomas Fitzsimmons" . "fitzsim@fitzsim.org")) (:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org") (:keywords "games"))]) + (slirm . [(20160201 1425) ((emacs (24 4))) "Systematic Literature Review Mode for Emacs." single ((:commit . "9adfbe1fc67580e7d0d90f7e927a25d63a797464") (:authors ("Florian Biermann" . "fbie@itu.dk")) (:maintainer "Florian Biermann" . "fbie@itu.dk") (:url . "http://github.com/fbie/slirm"))]) + (slovak-holidays . [(20200919 1345) nil "Adds a list of slovak holidays to Emacs calendar" single ((:commit . "4c6f635a2153ecb8f76d566d40ccb9d7b1d5fdc7") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "calendar"))]) + (slow-keys . [(20180831 459) ((emacs (24 1))) "Slow keys mode to avoid RSI" single ((:commit . "b93ad77f9fc1d14e080d7d64864fc9cb222248b6") (:authors ("Manuel Uberti" . "manuel.uberti@inventati.org")) (:maintainer "Manuel Uberti" . "manuel.uberti@inventati.org") (:keywords "convenience") (:url . "https://github.com/manuel-uberti/slow-keys"))]) + (slstats . [(20170823 849) ((cl-lib (0 5)) (emacs (24))) "Acquire and display stats about Second Life" single ((:commit . "e9696066abf3f2b7b818a57c062530dfd9377033") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "games") (:url . "https://github.com/davep/slstats.el"))]) + (slurm-mode . [(20210519 1109) nil "Interaction with the SLURM job scheduling system" tar ((:commit . "589826fbb07f625b23c322df1cc16377c4fe6f66") (:url . "https://github.com/ffevotte/slurm.el"))]) + (sly . [(20210604 937) ((emacs (24 3))) "Sylvester the Cat's Common Lisp IDE" tar ((:commit . "c783ba6576b554f3fc15a70bf30d225f277d1863") (:keywords "languages" "lisp" "sly") (:url . "https://github.com/joaotavora/sly"))]) + (sly-asdf . [(20210407 600) ((emacs (24 3)) (sly (1 0 0 -2 2)) (popup (0 5 3))) "ASDF system support for SLY" tar ((:commit . "95ca71ddeb6132c413e1e4352b136f41ed9254f1") (:maintainer "Matt George" . "mmge93@gmail.com") (:keywords "languages" "lisp" "sly" "asdf") (:url . "https://github.com/mmgeorge/sly-asdf"))]) + (sly-hello-world . [(20200225 1755) ((sly (1 0 0 -2 2))) "A template SLY contrib" tar ((:commit . "d25acc1220a3ce066bd9908251c2f0f88b1781e9") (:authors ("João Távora" . "joaotavora@gmail.com")) (:maintainer "João Távora" . "joaotavora@gmail.com") (:keywords "languages" "lisp" "sly") (:url . "https://github.com/capitaomorte/sly-hello-world"))]) + (sly-macrostep . [(20191211 1630) ((sly (1 0 0 -2 2)) (macrostep (0 9))) "fancy macro-expansion via macrostep.el" tar ((:commit . "5113e4e926cd752b1d0bcc1508b3ebad5def5fad") (:keywords "languages" "lisp" "sly") (:url . "https://github.com/capitaomorte/sly-macrostep"))]) + (sly-named-readtables . [(20191013 2138) ((sly (1 0 0 -2 2))) "Support named readtables in Common Lisp files" tar ((:commit . "a5a42674ccffa97ccd5e4e9742beaf3ea719931f") (:authors ("João Távora" . "joaotavora@gmail.com")) (:maintainer "João Távora" . "joaotavora@gmail.com") (:keywords "languages" "lisp" "sly") (:url . "https://github.com/capitaomorte/sly-named-readtables"))]) + (sly-quicklisp . [(20200707 1635) ((sly (1 0 0 -2 2))) "Quicklisp support for SLY" tar ((:commit . "4707b62803d7a29f172e9c5ff993b91187a9aaf3") (:authors ("João Távora" . "joaotavora@gmail.com")) (:maintainer "João Távora" . "joaotavora@gmail.com") (:keywords "languages" "lisp" "sly") (:url . "https://github.com/capitaomorte/sly-quicklisp"))]) + (sly-repl-ansi-color . [(20171020 1516) ((sly (0)) (cl-lib (0 5))) "Add ANSI colors support to the sly mrepl." single ((:commit . "b9cd52d1cf927bf7e08582d46ab0bcf1d4fb5048") (:authors ("Javier \"PuercoPop\" Olaechea" . "pirata@gmail.com") ("Max Mikhanosha")) (:maintainer "Javier \"PuercoPop\" Olaechea" . "pirata@gmail.com") (:keywords "sly") (:url . "https://github.com/PuercoPop/sly-repl-ansi-color"))]) + (smart-backspace . [(20171014 526) nil "intellj like backspace" single ((:commit . "a10ec44ff325ec8c4c98b1a6e44e89e60a9aa4ac") (:authors ("Takeshi Tsukamoto" . "t.t.itm.0403@gmail.com")) (:maintainer "Takeshi Tsukamoto" . "t.t.itm.0403@gmail.com") (:url . "https://github.com/itome/smart-backspace"))]) + (smart-comment . [(20160322 1839) nil "smarter commenting" single ((:commit . "17ddbd83205818763e6d68aa7a1aa9aaf414cbd4") (:authors ("Simon Friis Vindum" . "simon@vindum.io")) (:maintainer "Simon Friis Vindum" . "simon@vindum.io") (:keywords "lisp"))]) + (smart-compile . [(20201029 1600) nil "an interface to `compile'" single ((:commit . "2edfcf2004ce927f11ca9cb43e2e4b93f43524a9") (:authors ("Seiji Zenitani" . "zenitani@gmail.com")) (:maintainer "Seiji Zenitani" . "zenitani@gmail.com") (:keywords "tools" "unix"))]) + (smart-cursor-color . [(20201207 2228) nil "Change cursor color dynamically" single ((:commit . "d532f0b27e37cbd3bfc0be09d0b54aa38f1648f1") (:authors ("7696122")) (:maintainer "7696122") (:keywords "cursor" "color" "face") (:url . "https://github.com/7696122/smart-cursor-color/"))]) + (smart-dash . [(20210427 1709) nil "Smart-Dash minor mode" single ((:commit . "bc740889dd81e7dc8a90a33d1f075f21aba9b2d3") (:authors ("Dennis Lambe Jr." . "malsyned@malsyned.net")) (:maintainer "Dennis Lambe Jr." . "malsyned@malsyned.net"))]) + (smart-forward . [(20140430 713) ((expand-region (0 8 0))) "Semantic navigation" single ((:commit . "7b6dbfdbd4b646376a567c70e1a161545431b72b") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "navigation"))]) + (smart-hungry-delete . [(20170412 1343) ((emacs (24 3))) "smart hungry deletion of whitespace" single ((:commit . "7c1d56a92481594e14d40b5fdf6c48657a0108a0") (:authors ("Hauke Rehfeld" . "emacs@haukerehfeld.de")) (:maintainer "Hauke Rehfeld" . "emacs@haukerehfeld.de") (:keywords "convenience") (:url . "https://github.com/hrehfeld/emacs-smart-hungry-delete"))]) + (smart-indent-rigidly . [(20141206 15) nil "Smart rigid indenting" single ((:commit . "323d1fe4d0b81e598249aad01bc44adb180ece0e") (:authors ("atom smith")) (:maintainer "atom smith") (:keywords "indenting" "coffee-mode" "haml-mode" "sass-mode") (:url . "https://github.com/re5et/smart-indent-rigidly"))]) + (smart-jump . [(20210304 844) ((emacs (25 1))) "Smart go to definition." tar ((:commit . "3392eb35e3cde37e6f5f2a48dc0db15ca535143c") (:authors ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com") (:keywords "tools") (:url . "https://github.com/jojojames/smart-jump"))]) + (smart-mark . [(20150912 210) nil "Restore point after C-g when mark" single ((:commit . "04b522a23e3aae8381c6a976fc978532fcb2e7d0") (:authors ("Kai Yu" . "yeannylam@gmail.com")) (:maintainer "Kai Yu" . "yeannylam@gmail.com") (:keywords "mark" "restore"))]) + (smart-mode-line . [(20210428 1641) ((emacs (24 3)) (rich-minority (0 1 1))) "A color coded smart mode-line." tar ((:commit . "744ee1a9479a7901cedd6f0d59e6c6c86b20a78d") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") (:keywords "mode-line" "faces" "themes") (:url . "http://github.com/Malabarba/smart-mode-line"))]) + (smart-mode-line-atom-one-dark-theme . [(20201229 1711) ((emacs (24 3)) (smart-mode-line (2 10))) "Atom-one-dark theme for smart-mode-line" single ((:commit . "0c360f390cbeea59dceb99e8c499e0db7c323510") (:authors ("Davide Restivo" . "davide.restivo@yahoo.it")) (:maintainer "Davide Restivo" . "davide.restivo@yahoo.it") (:keywords "mode-line" "themes" "faces") (:url . "https://github.com/daviderestivo/smart-mode-line-atom-one-dark-theme"))]) + (smart-mode-line-powerline-theme . [(20160706 38) ((emacs (24 3)) (powerline (2 2)) (smart-mode-line (2 5))) "smart-mode-line theme that mimics the powerline appearance." tar ((:commit . "744ee1a9479a7901cedd6f0d59e6c6c86b20a78d") (:authors ("Artur Malabarba" . "bruce.connor.am@gmail.com")) (:maintainer "Artur Malabarba" . "bruce.connor.am@gmail.com") (:keywords "mode-line" "faces" "themes") (:url . "http://github.com/Bruce-Connor/smart-mode-line"))]) + (smart-newline . [(20131208 340) nil "Provide smart newline for one keybind." single ((:commit . "0553a9e4be7188352de1a28f2eddfd28e7436f94") (:authors ("Satoshi Namai")) (:maintainer "Satoshi Namai"))]) + (smart-region . [(20150903 1403) ((emacs (24 4)) (expand-region (0 10 0)) (multiple-cursors (1 3 0)) (cl-lib (0 5))) "Smartly select region, rectangle, multi cursors" single ((:commit . "5a8017fd8e8dc3483865951c4942cab3f96f69f6") (:authors ("Yuuki Arisawa" . "yuuki.ari@gmail.com")) (:maintainer "Yuuki Arisawa" . "yuuki.ari@gmail.com") (:keywords "marking" "region") (:url . "https://github.com/uk-ar/smart-region"))]) + (smart-semicolon . [(20200909 1412) ((emacs (26))) "Insert semicolon smartly" single ((:commit . "dd52a3e1a7b043fb88f799827c7b3e39f60a14f1") (:authors ("Iku Iwasa" . "iku.iwasa@gmail.com")) (:maintainer "Iku Iwasa" . "iku.iwasa@gmail.com") (:url . "https://github.com/iquiw/smart-semicolon"))]) + (smart-shift . [(20150203 725) nil "Smart shift text left/right." single ((:commit . "a26ab2b240137e62ec4bce1698ed9c5f7b6d13ae") (:authors ("Bin Huang" . "huangbin88@foxmail.com")) (:maintainer "Bin Huang" . "huangbin88@foxmail.com") (:keywords "convenience" "tools") (:url . "https://github.com/hbin/smart-shift"))]) + (smart-tab . [(20210530 1743) ((emacs (24 3))) "Intelligent tab completion and indentation" single ((:commit . "2f1b4073904805c8454ebc9bc967b23836a2d577") (:authors ("John SJ Anderson" . "john@genehack.org") ("Sebastien Rocca Serra" . "sroccaserra@gmail.com") ("Daniel Hackney" . "dan@haxney.org")) (:maintainer "John SJ Anderson" . "john@genehack.org") (:keywords "extensions") (:url . "https://git.genehack.net/genehack/smart-tab"))]) + (smart-tabs-mode . [(20200907 2025) nil "Intelligently indent with tabs, align with spaces!" single ((:commit . "1044c17e42479de943e69cdeb85e4d05ad9cca8c") (:authors ("John Croisant" . "jacius@gmail.com") ("Alan Pearce" . "alan@alanpearce.co.uk") ("Daniel Dehennin" . "daniel.dehennin@baby-gnu.org") ("Matt Renaud" . "mrenaud92@gmail.com")) (:maintainer "Joel C. Salomon" . "joelcsalomon@gmail.com") (:keywords "languages") (:url . "http://www.emacswiki.org/emacs/SmartTabs"))]) + (smart-window . [(20160717 130) ((cl-lib (0 5))) "vim-like window controlling plugin" single ((:commit . "5996461b7cbc5ab4509ac48537916eb29a8e4c16") (:authors ("Felix Chern" . "idryman@gmail.com")) (:maintainer "Felix Chern" . "idryman@gmail.com") (:keywords "window") (:url . "https://github.com/dryman/smart-window.el"))]) + (smartparens . [(20210529 1129) ((dash (2 13 0)) (cl-lib (0 3))) "Automatic insertion, wrapping and paredit-like navigation with user defined pairs." tar ((:commit . "911cc896a0f2eb8b5fbdd6fc8331523ad9889a3a") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:keywords "abbrev" "convenience" "editing") (:url . "https://github.com/Fuco1/smartparens"))]) + (smartrep . [(20150509 230) nil "Support sequential operation which omitted prefix keys." single ((:commit . "f0ff5a6d7b8603603598ae3045c98b011e58d86e") (:authors ("myuhe <yuhei.maeda_at_gmail.com>")) (:maintainer "myuhe") (:keywords "convenience") (:url . "https://github.com/myuhe/smartrep.el"))]) + (smartscan . [(20170211 2033) nil "Jumps between other symbols found at point" single ((:commit . "234e077145710a174c20742de792b97ed2f965f6") (:authors ("Mickey Petersen" . "mickey@masteringemacs.org")) (:maintainer "Mickey Petersen" . "mickey@masteringemacs.org") (:keywords "extensions"))]) + (smarty-mode . [(20100703 1158) nil "major mode for editing smarty templates" single ((:commit . "3dfdfe1571f5e9ef55a29c51e5a80046d4cb7568") (:maintainer "Benj Carson") (:keywords "smarty" "php" "languages" "templates") (:url . "none yet"))]) + (smbc . [(20171229 1808) nil "View SMBC from Emacs" single ((:commit . "10538e3d575ba6ef3c94d555af2744b42dfd36c7") (:authors ("Saksham Sharma" . "saksham0808@gmail.com")) (:maintainer "Saksham Sharma" . "saksham0808@gmail.com") (:keywords "smbc" "webcomic") (:url . "https://github.com/sakshamsharma/emacs-smbc"))]) + (smblog . [(20200424 938) ((emacs (24 3))) "samba log viewer" single ((:commit . "fc949cff7051b31f0dbc7169774144533a27b92f") (:authors ("Aurélien Aptel" . "aaptel@suse.com")) (:maintainer "Aurélien Aptel" . "aaptel@suse.com") (:url . "http://github.com/aaptel/smblog-mode"))]) + (smeargle . [(20200323 533) ((emacs (24 3))) "Highlighting region by last updated time" single ((:commit . "0cfe0ff083d55bb90c6dfaf1dc930500099c4d5c") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Neil Okamoto" . "neil.okamoto+melpa@gmail.com") (:url . "https://github.com/emacsorphanage/smeargle"))]) + (smex . [(20151212 2209) ((emacs (24))) "M-x interface with Ido-style fuzzy matching." single ((:commit . "55aaebe3d793c2c990b39a302eb26c184281c42c") (:authors ("Cornelius Mika" . "cornelius.mika@gmail.com")) (:maintainer "Cornelius Mika" . "cornelius.mika@gmail.com") (:keywords "convenience" "usability") (:url . "http://github.com/nonsequitur/smex/"))]) + (smiles-mode . [(20160717 1120) nil "Major mode for SMILES." single ((:commit . "fbb381758adcb000a0c304be1b797f985f00e2de") (:authors (nil . "John Kitchin [jkitchin@andrew.cmu.edu]")) (:maintainer nil . "John Kitchin [jkitchin@andrew.cmu.edu]") (:keywords "smiles"))]) + (smithers . [(20210531 2232) ((emacs (26 1)) (dash (2 17 0)) (org (9 4 5))) "A startup message featuring Mr C.M. Burns" tar ((:commit . "db9ed12a8d2c131b6d37b4e7aff01b8e3cec81a6") (:authors ("Mehmet Tekman")) (:maintainer "Mehmet Tekman") (:keywords "games") (:url . "https://gitlab.com/mtekman/smithers.el"))]) + (sml-basis . [(20210518 2040) ((emacs (24 5))) "Standard ML Basis Library lookup" tar ((:commit . "c048d575e30a20ec825fd0c5eb9c8a4428a43298") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "languages" "util") (:url . "https://github.com/lassik/emacs-sml-basis"))]) + (sml-modeline . [(20170614 2111) nil "Show position in a scrollbar like way in mode-line" single ((:commit . "d2f9f70174c4cf68c67eb3bb8088235735e34d9a") (:authors ("Lennart Borgman (lennart O borgman A gmail O com)")) (:maintainer "Lennart Borgman (lennart O borgman A gmail O com)") (:url . "http://bazaar.launchpad.net/~nxhtml/nxhtml/main/annotate/head%3A/util/sml-modeline.el"))]) + (smmry . [(20161024 901) nil "SMMRY client" single ((:commit . "986a1b0aec8ab1ef17dbfb7886f47e5558cf738a") (:authors ("james sangho nah" . "microamp@protonmail.com")) (:maintainer "james sangho nah" . "microamp@protonmail.com") (:keywords "api" "smmry") (:url . "https://github.com/microamp/smmry.el"))]) + (smog . [(20200211 528) ((emacs (24 1)) (org (8 1))) "Analyse the writing style, word use and readability of prose" single ((:commit . "531957d7356f623b026aa45923e536421f682c1a") (:authors ("nik gaffney" . "nik@fo.am")) (:maintainer "nik gaffney" . "nik@fo.am") (:keywords "tools" "style" "readability" "prose") (:url . "https://github.com/zzkt/smog"))]) + (smooth-scroll . [(20130322 414) nil "Minor mode for smooth scrolling and in-place scrolling." single ((:commit . "02320f28abb5cae28b3a18f6b9ce93129bdbfc45") (:authors ("K-talo Miyazaki <Keitaro dot Miyazaki at gmail dot com>")) (:maintainer "K-talo Miyazaki <Keitaro dot Miyazaki at gmail dot com>") (:keywords "convenience" "emulations" "frames") (:url . "http://www.emacswiki.org/emacs/download/smooth-scroll.el"))]) + (smooth-scrolling . [(20161002 1949) nil "Make emacs scroll smoothly" single ((:commit . "2462c13640aa4c75ab3ddad443fedc29acf68f84") (:authors ("Adam Spiers" . "emacs-ss@adamspiers.org") ("Jeremy Bondeson" . "jbondeson@gmail.com") ("Ryan C. Thompson" . "rct+github@thompsonclan.org")) (:maintainer "Adam Spiers" . "emacs-ss@adamspiers.org") (:keywords "convenience") (:url . "http://github.com/aspiers/smooth-scrolling/"))]) + (smotitah . [(20150218 1030) nil "Modular emacs configuration framework" tar ((:commit . "f9ab562128a5460549d016913533778e8c94bcf3") (:authors ("Alessandro Piras" . "laynor@gmail.com")) (:maintainer "Alessandro Piras" . "laynor@gmail.com") (:keywords "configuration"))]) + (smtpmail-multi . [(20160218 2349) nil "Use different smtp servers for sending mail" single ((:commit . "83fa9d7a02e000be95cb282c8b48446646896ea1") (:authors ("Joe Bloggs" . "vapniks@yahoo.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:keywords "comm") (:url . "https://github.com/vapniks/smtpmail-multi"))]) + (smudge . [(20210326 2222) ((emacs (27 1)) (simple-httpd (1 5)) (request (0 3)) (oauth2 (0 16))) "Control the Spotify app" tar ((:commit . "808f0ef172a80cf4a8ae6d58dfe385d28ecde28e") (:keywords "multimedia" "music" "spotify" "smudge") (:url . "https://github.com/danielfm/smudge"))]) + (smyx-theme . [(20141127 828) nil "smyx Color Theme" single ((:commit . "6263f6b401bbabaed388c8efcfc0be2e58c51401") (:authors ("Uriel G Maldonado" . "uriel781@gmail.com")) (:maintainer "Uriel G Maldonado" . "uriel781@gmail.com") (:keywords "color" "theme" "smyx"))]) + (snakemake-mode . [(20201224 1744) ((emacs (24 5)) (cl-lib (0 5)) (magit-popup (2 4 0))) "Major mode for editing Snakemake files" tar ((:commit . "592901893f297099ffb759b4d1359bcd3411d1a9") (:authors ("Kyle Meyer" . "kyle@kyleam.com")) (:maintainer "Kyle Meyer" . "kyle@kyleam.com") (:keywords "tools") (:url . "https://git.kyleam.com/snakemake-mode/about"))]) + (snapshot-timemachine . [(20161221 929) ((emacs (24 4))) "Step through (Btrfs, ZFS, ...) snapshots of files" single ((:commit . "99efcebab309b11ed512a8dc62555d3834df5efb") (:authors ("Thomas Winant" . "dewinant@gmail.com")) (:maintainer "Thomas Winant" . "dewinant@gmail.com") (:url . "https://github.com/mrBliss/snapshot-timemachine"))]) + (snapshot-timemachine-rsnapshot . [(20170324 1213) ((snapshot-timemachine (20160222 132)) (seq (2 19))) "rsnapshot backend for snapshot-timemachine" single ((:commit . "72b0b700d80f1a0442e62bbbb6a0c8c59182f97f") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr"))]) + (snazzy-theme . [(20170823 1832) ((emacs (24)) (base16-theme (2 1))) "An elegant syntax theme with bright colors" single ((:commit . "57a1763b49b4a776084c16bc70c219246fa5b412") (:keywords "faces" "theme" "color" "snazzy") (:url . "https://github.com/weijiangan/emacs-snazzy/"))]) + (sniem . [(20210605 1242) ((emacs (26 1)) (s (2 12 0)) (dash (1 12 0))) "Simple united editing method" tar ((:commit . "54005eb19dfab02f38074e696fa8d247b59a2ad8") (:authors ("SpringHan")) (:maintainer "SpringHan") (:keywords "convenience" "united-editing-method") (:url . "https://github.com/SpringHan/sniem.git"))]) + (snitch . [(20210202 1730) ((emacs (27 1))) "An Emacs firewall" tar ((:commit . "3b3e7f1bf612c4624764d1ec4b1a96e4d2850b05") (:authors ("Trevor Bentley" . "snitch.el@x.mrmekon.com")) (:maintainer "Trevor Bentley" . "snitch.el@x.mrmekon.com") (:keywords "processes" "comm") (:url . "https://github.com/mrmekon/snitch-el"))]) + (snoopy . [(20171008 2004) ((emacs (24)) (cl-lib (0 6))) "minor mode for number row unshifted character insertion" single ((:commit . "ec4123bdebfe0bb7bf4feaac2dc02b59caffe386") (:authors ("António Nuno Monteiro" . "anmonteiro@gmail.com")) (:maintainer "António Nuno Monteiro" . "anmonteiro@gmail.com") (:keywords "lisp"))]) + (snow . [(20201231 1632) ((emacs (26 3))) "Let it snow in Emacs!" single ((:commit . "7ca25adc94148f182ac58c9f5d35f576a8a3131c") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "games") (:url . "https://github.com/alphapapa/snow.el"))]) + (soar-mode . [(20190503 1843) nil "A major mode for the Soar language" single ((:commit . "13b6fca62ea6574d230516fddf359a61f6558ecd") (:keywords "languages" "soar") (:url . "https://github.com/adeschamps/soar-mode"))]) + (socyl . [(20170212 642) ((s (1 11 0)) (dash (2 12 0)) (pkg-info (0 5 0)) (cl-lib (0 5))) "Frontend for several search tools" tar ((:commit . "1ef2da42f66f3ab31a34131e51648f352416f0ba") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "ripgrep" "sift" "ack" "pt" "ag" "grep" "search") (:url . "https://github.com/nlamirault/socyl"))]) + (soft-charcoal-theme . [(20140420 1643) nil "Dark charcoal theme with soft colors" single ((:commit . "5607ab977fae6638e78b1495e02da8955c9ba19f") (:authors ("Martin Haesler")) (:maintainer "Martin Haesler") (:url . "http://github.com/mswift42/soft-charcoal-theme"))]) + (soft-morning-theme . [(20150918 2041) nil "Emacs24 theme with a light background." single ((:commit . "c0f9c70c97ef2be2a093cf839c4bfe27740a111c") (:authors ("Martin Haesler")) (:maintainer "Martin Haesler") (:url . "http://github.com/mswift42/soft-morning-theme"))]) + (soft-stone-theme . [(20140614 835) ((emacs (24))) "Emacs 24 theme with a light background." single ((:commit . "fb475514cfb02cf30ce358a61c48e46614344d48") (:authors ("Martin Haesler")) (:maintainer "Martin Haesler") (:url . "http://github.com/mswift42/soft-stone-theme"))]) + (solaire-mode . [(20210601 1921) ((emacs (25 1)) (cl-lib (0 5))) "make certain buffers grossly incandescent" single ((:commit . "2298fd806d28daf511eb7836b23775e7df1f65e2") (:authors ("Henrik Lissner <http://github/hlissner>")) (:maintainer "Henrik Lissner" . "henrik@lissner.net") (:keywords "dim" "bright" "window" "buffer" "faces") (:url . "https://github.com/hlissner/emacs-solaire-mode"))]) + (solarized-theme . [(20210519 925) ((emacs (24 1)) (dash (2 16))) "The Solarized color theme" tar ((:commit . "e626b1889d8c945806e959e451f08633d948f8a7") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.com")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.com") (:keywords "convenience" "themes" "solarized") (:url . "http://github.com/bbatsov/solarized-emacs"))]) + (solidity-flycheck . [(20210411 758) ((flycheck (32 -4)) (solidity-mode (0 1 9)) (dash (2 17 0))) "Flycheck integration for solidity emacs mode" single ((:commit . "383ac144727c716c65989c079ae76127e25144c3") (:authors ("Lefteris Karapetsas " . "lefteris@refu.co")) (:maintainer "Lefteris Karapetsas " . "lefteris@refu.co") (:keywords "languages" "solidity" "flycheck"))]) + (solidity-mode . [(20210505 1704) nil "Major mode for ethereum's solidity language" tar ((:commit . "383ac144727c716c65989c079ae76127e25144c3") (:authors ("Lefteris Karapetsas " . "lefteris@refu.co")) (:maintainer "Lefteris Karapetsas " . "lefteris@refu.co") (:keywords "languages" "solidity"))]) + (solo-jazz-theme . [(20201106 1640) ((emacs (24 1))) "The Solo-Jazz color theme" single ((:commit . "3a2d1a0b404ba7c765526a1b76e0f1148ed8d0f2") (:authors ("Carl Steib")) (:maintainer "Carl Steib") (:url . "https://github.com/cstby/solo-jazz-emacs-theme"))]) + (somafm . [(20200224 48) ((emacs (26 1)) (dash (2 12 0)) (request (0 3 2)) (cl-lib (0 6 1))) "A simple soma.fm interface" single ((:commit . "918e7c876f26f74ab21b585de2607819e9e74c08") (:authors ("Arte Ebrahimi <>")) (:maintainer "Arte Ebrahimi <>") (:keywords "multimedia") (:url . "https://github.com/artenator/somafm.el"))]) + (sonic-pi . [(20171205 1205) ((cl-lib (0 5)) (osc (0 1)) (dash (2 2 0)) (emacs (24)) (highlight (0))) "A Emacs client for SonicPi" tar ((:commit . "3cf101b3b299735ed91658c7791ea4f04164e076") (:authors ("Joseph Wilk" . "joe@josephwilk.net")) (:maintainer "Joseph Wilk" . "joe@josephwilk.net") (:keywords "sonicpi" "ruby") (:url . "http://www.github.com/repl-electric/sonic-pi.el"))]) + (soothe-theme . [(20141027 1441) ((emacs (24 1))) "a dark colorful theme for Emacs24." single ((:commit . "0786fe70c6c1b4ddcfb932fdc6862b9611cfc09b") (:authors ("Jason Milkins" . "jasonm23@gmail.com")) (:maintainer "Jason Milkins" . "jasonm23@gmail.com") (:url . "https://github.com/jasonm23/emacs-soothe-theme"))]) + (sorcery-theme . [(20210101 1352) ((autothemer (0 2))) "A D&D (Dark and Dusty) Theme" single ((:commit . "5a1c4445b9e6e09589a299a9962a6973272a0c2f") (:authors ("Maxime Tréca" . "maxime@gmail.com")) (:maintainer "Maxime Tréca" . "maxime@gmail.com") (:url . "http://github.com/vxid/emacs-theme-sorcery"))]) + (soria-theme . [(20210426 1433) ((emacs (25 1))) "A xoria256 theme with some colors from openSUSE" tar ((:commit . "12d3472e6823ff1bdc1591984367e2ed769afcb7") (:authors ("Miquel Sabaté Solà" . "mikisabate@gmail.com")) (:maintainer "Miquel Sabaté Solà" . "mikisabate@gmail.com") (:keywords "faces") (:url . "https://github.com/mssola/soria"))]) + (sort-words . [(20160929 1335) nil "Sort words in a selected region" single ((:commit . "7b6e108f80237363faf7ec28b2c58dec270b8601") (:authors ("\"Aleksandar Simic\"" . "asimic@gmail.com")) (:maintainer "\"Aleksandar Simic\"" . "asimic@gmail.com") (:keywords "tools") (:url . "http://github.org/dotemacs/sort-words.el"))]) + (sotclojure . [(20170922 8) ((emacs (24 1)) (clojure-mode (4 0 0)) (cider (0 8)) (sotlisp (1 3))) "Write clojure at the speed of thought." tar ((:commit . "a480c887b53cb007b7b099c5ffcab89b9e59d7bc") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") (:keywords "convenience" "clojure") (:url . "https://github.com/Malabarba/speed-of-thought-clojure"))]) + (sotlisp . [(20190211 2026) ((emacs (24 1))) "Write lisp at the speed of thought." single ((:commit . "ed2356a325c7a4a88ec1bd31381c8666e8997e97") (:authors ("Artur Malabarba" . "emacs@endlessparentheses.com")) (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com") (:keywords "convenience" "lisp") (:url . "https://github.com/Malabarba/speed-of-thought-lisp"))]) + (sound-wav . [(20200323 728) ((deferred (0 3 1)) (cl-lib (0 5))) "Play wav file" single ((:commit . "8a18f8a62f4fdde80dfa069986aa959091a42472") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-sound-wav"))]) + (soundcloud . [(20150502 326) ((emms (20131016)) (json (1 2)) (deferred (0 3 1)) (string-utils (0 3 2)) (request (20140316 417)) (request-deferred (20130526 1015))) "a SoundCloud client for Emacs" single ((:commit . "f998d4276ea90258909c698f6a5a51fccb667c08") (:authors ("Travis Thieman" . "travis.thieman@gmail.com")) (:maintainer "Travis Thieman" . "travis.thieman@gmail.com") (:keywords "soundcloud" "music" "audio"))]) + (soundklaus . [(20191220 2112) ((dash (2 12 1)) (emacs (24)) (emms (4 0)) (s (1 11 0)) (pkg-info (0 4)) (cl-lib (0 5)) (request (0 2 0))) "Play music on SoundCloud with Emacs via EMMS" tar ((:commit . "15ce6e7f24a45e4f202d83cca9fa3bfdd94ca592") (:authors ("r0man" . "roman@burningswell.com")) (:maintainer "r0man" . "roman@burningswell.com") (:keywords "soundcloud" "music" "emms") (:url . "https://github.com/r0man/soundklaus.el"))]) + (sourcekit . [(20210430 2155) ((emacs (24 3)) (dash (2 18 0)) (request (0 2 0))) "Library to interact with sourcekittendaemon" single ((:commit . "a1860ad4dd3a542acd2fa0dfac2a388cbdf4af0c") (:authors ("Nathan Kot" . "nk@nathankot.com")) (:maintainer "Nathan Kot" . "nk@nathankot.com") (:keywords "tools" "processes") (:url . "https://github.com/nathankot/company-sourcekit"))]) + (sourcemap . [(20200315 1037) ((emacs (24 3))) "Sourcemap parser" single ((:commit . "bb2a56b2feb62b0c77d7f03ef2acd94f91be6b3f") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-sourcemap"))]) + (sourcerer-theme . [(20161014 1625) nil "A version of sourcerer by xero" single ((:commit . "c7f8e665d53bb48fb72f95f706710d53d24bd407") (:authors ("Bryan Gilbert" . "gilbertw1@gmail.com")) (:maintainer "Bryan Gilbert" . "gilbertw1@gmail.com") (:keywords "themes") (:url . "http://github.com/gilbertw1/sourcerer-emacs"))]) + (sourcetrail . [(20170410 2137) ((emacs (24 4))) "Communication with Sourcetrail" single ((:commit . "b8d5557aa565ae979622312576db20515f65f977") (:authors ("Andreas Stallinger" . "astallinger@sourcetrail.com")) (:maintainer "Andreas Stallinger" . "astallinger@sourcetrail.com") (:keywords "external" "tool"))]) + (space-theming . [(20200502 1032) ((emacs (24))) "Easilly override theme faces" single ((:commit . "31dca6954df643255175f7df68a86892aa3c71a7") (:keywords "faces") (:url . "https://github.com/p3r7/space-theming"))]) + (spacebar . [(20190719 334) ((eyebrowse (0 7 7)) (emacs (25 4 0))) "Workspaces Bar" single ((:commit . "2b2cd0e786877273103f048e62a06b0027deca2d") (:authors ("Matthias Margush" . "matthias.margush@gmail.com")) (:maintainer "Matthias Margush" . "matthias.margush@gmail.com") (:keywords "convenience") (:url . "https://github.com/matthias-margush/spacebar"))]) + (spacegray-theme . [(20150719 1931) ((emacs (24 1))) "A Hyperminimal UI Theme" single ((:commit . "9826265c2bceb2ebc1c5e16a45021da0253ace97") (:authors ("Bruce Williams" . "brwcodes@gmail.com")) (:maintainer "Bruce Williams" . "brwcodes@gmail.com") (:keywords "themes") (:url . "http://github.com/bruce/emacs-spacegray-theme"))]) + (spaceline . [(20201016 1043) ((emacs (24 4)) (cl-lib (0 5)) (powerline (2 3)) (dash (2 11 0)) (s (1 10 0))) "Modeline configuration library for powerline" tar ((:commit . "50cc5b26d823bbfd347becd7da03cd29c2a2a0dc") (:authors ("Eivind Fonn" . "evfonn@gmail.com")) (:maintainer "Eivind Fonn" . "evfonn@gmail.com") (:keywords "mode-line" "powerline" "spacemacs") (:url . "https://github.com/TheBB/spaceline"))]) + (spaceline-all-the-icons . [(20190325 1602) ((emacs (24 4)) (all-the-icons (2 6 0)) (spaceline (2 0 0)) (memoize (1 0 1))) "A Spaceline theme using All The Icons" tar ((:commit . "5afd48c10f1bd42d9b9648c5e64596b72f3e9042") (:authors ("Dominic Charlesworth" . "dgc336@gmail.com")) (:maintainer "Dominic Charlesworth" . "dgc336@gmail.com") (:keywords "convenience" "lisp" "tools") (:url . "https://github.com/domtronn/spaceline-all-the-icons.el"))]) + (spacemacs-theme . [(20210206 1428) nil "Color theme with a dark and light versions" tar ((:commit . "c8c468580048e2464f012d171b2101bfb208e33d"))]) + (spaces . [(20170809 2208) nil "Create and switch between named window configurations." single ((:commit . "6bdb51e9a346907d60a9625f6180bddd06be6674") (:authors ("Steven Thomas")) (:maintainer "Steven Thomas") (:keywords "frames" "convenience") (:url . "https://github.com/chumpage/chumpy-windows"))]) + (spark . [(20160415 201) ((emacs (24 3))) "sparkline generation" single ((:commit . "0bf148c3ede3b31d56fd75f347cdd0b0eae60025") (:authors ("Alvin Francis Dumalus")) (:maintainer "Alvin Francis Dumalus") (:keywords "lisp" "data") (:url . "https://github.com/alvinfrancis/spark"))]) + (sparkline . [(20150101 1319) ((cl-lib (0 3))) "Make sparkline images from a list of numbers" single ((:commit . "a2b5d817d272d6363b67ed8f8cc75499a19fa8d2") (:authors ("Willem Rein Oudshoorn" . "woudshoo@xs4all.nl")) (:maintainer "Willem Rein Oudshoorn" . "woudshoo@xs4all.nl") (:keywords "extensions"))]) + (sparql-mode . [(20200429 1719) ((cl-lib (0 5)) (emacs (24 3))) "Edit and interactively evaluate SPARQL queries." tar ((:commit . "e8c9345e2e2427282b3dc9cd1e297e3c76d34f7f") (:authors ("Craig Andera <candera at wangdera dot com>")) (:maintainer "Bjarte Johansen <Bjarte dot Johansen at gmail dot com>") (:url . "https://github.com/ljos/sparql-mode"))]) + (spatial-navigate . [(20201115 1006) ((emacs (26 2))) "Directional navigation between white-space blocks" single ((:commit . "03bf203854f80b6a98a8098e4aed08f585cb1d71") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-spatial-navigate"))]) + (spdx . [(20210415 1821) ((emacs (24 4))) "Insert SPDX license and copyright headers" tar ((:commit . "86c223a2db529768fd815dc0635ed432c1a215e8") (:authors ("Zhiwei Chen" . "condy0919@gmail.com")) (:maintainer "Zhiwei Chen" . "condy0919@gmail.com") (:keywords "license" "tools") (:url . "https://github.com/condy0919/spdx.el"))]) + (speech-tagger . [(20170728 1829) ((cl-lib (0 5))) "tag parts of speech using coreNLP" tar ((:commit . "61955b40d4e8b09e66a3e8033e82893f81657c06") (:authors ("Danny McClanahan" . "danieldmcclanahan@gmail.com")) (:maintainer "Danny McClanahan" . "danieldmcclanahan@gmail.com") (:keywords "speech" "tag" "nlp" "language" "corenlp" "parsing" "natural") (:url . "https://github.com/cosmicexplorer/speech-tagger"))]) + (speechd-el . [(20210607 2032) nil "Client to speech synthesizers and Braille displays." tar ((:commit . "2ffae385139936a03e1d1a96993d3bf5f9509bbf"))]) + (speed-type . [(20191204 1107) ((emacs (24 3)) (cl-lib (0 3))) "Practice touch and speed typing" single ((:commit . "5ef695f7159aa1f20c7c9e55f0c39bcdacce8d21") (:authors ("Gunther Hagleitner")) (:maintainer "Julien Pagès" . "j.parkouss@gmail.com") (:keywords "games") (:url . "https://github.com/parkouss/speed-type"))]) + (speedbar-git-respect . [(20200901 246) ((f (0 8 0)) (emacs (25 1))) "Particular respect git repo in speedbar" single ((:commit . "dd8f0849fc1dd21b42380e1a8c28a9a29acd9511") (:authors ("Muromi Ukari" . "chendianbuji@gmail.com")) (:maintainer "Muromi Ukari" . "chendianbuji@gmail.com") (:url . "https://github.com/ukari/speedbar-git-respect"))]) + (speeddating . [(20180319 723) ((emacs (25))) "Increase date and time at point" single ((:commit . "df69db0560f19636a66a74f3d88c793bbb18b21e") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:keywords "date" "time") (:url . "https://github.com/xuchunyang/emacs-speeddating"))]) + (spell-fu . [(20210415 1326) ((emacs (26 2))) "Fast & light spelling highlighter" single ((:commit . "fae15427a1027e5eafdff7e5627cd399f73dbc37") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:keywords "convenience") (:url . "https://gitlab.com/ideasman42/emacs-spell-fu"))]) + (sphinx-doc . [(20210213 1250) ((s (1 9 0)) (cl-lib (0 5)) (dash (2 10 0))) "Sphinx friendly docstrings for Python functions" single ((:commit . "1eda612a44ef027e5229895daa77db99a21b8801") (:authors ("Vineet Naik" . "naikvin@gmail.com")) (:maintainer "Vineet Naik" . "naikvin@gmail.com") (:keywords "sphinx" "python") (:url . "https://github.com/naiquevin/sphinx-doc.el"))]) + (sphinx-frontend . [(20161025 758) nil "Launch build process for rst documents via sphinx." single ((:commit . "0cbb03361c245382d3e679dded30c4fc1713c252") (:authors ("Kostafey" . "kostafey@gmail.com")) (:maintainer "Kostafey" . "kostafey@gmail.com") (:keywords "compile" "sphinx" "restructuredtext") (:url . "https://github.com/kostafey/sphinx-frontend"))]) + (sphinx-mode . [(20180620 915) ((f (0 20 0)) (dash (2 14 1))) "Minor mode providing sphinx support." tar ((:commit . "b5ac514e213459dcc57184086f10b5b6be3cecd8") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "languages"))]) + (spice-mode . [(20190608 1033) ((emacs (24 3))) "Major mode for SPICE" single ((:commit . "e5e0644f03f9696f56dd69e2b6979da7f30ed600") (:authors ("Geert A. M. Van der Plas" . "geert_vanderplas@email.com") ("Emmanuel Rouat" . "emmanuel.rouat@wanadoo.fr") ("Carlin J. Vieri, MIT AI Lab" . "cvieri@ai.mit.edu")) (:maintainer "Geert A. M. Van der Plas" . "geert_vanderplas@email.com") (:keywords "spice" "spice2g6" "spice3" "eldo" "hspice" "layla" "mondriaan" "fasthenry" "cdl" "spectre compatibility" "netlist editing") (:url . "http://spice-mode.4t.com/"))]) + (spiral . [(20180223 1140) ((emacs (25 1)) (a (0 1 0 -3 4)) (avy (0 4 0)) (clojure-mode (5 6 0)) (highlight (0)) (treepy (1 0 0))) "Clojure IDE based on UNREPL" tar ((:commit . "907b9792467139a942ba7b07ca0276b90770baf9") (:authors ("Daniel Barreto" . "daniel@barreto.tech")) (:maintainer "Daniel Barreto" . "daniel@barreto.tech") (:keywords "languages" "clojure") (:url . "https://github.com/Unrepl/spiral"))]) + (splitjoin . [(20150505 1432) ((cl-lib (0 5))) "Transition between multiline and single-line code" single ((:commit . "e2945ee269e6e90f0243d6f2a33e067bb0a2873c") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-splitjoin"))]) + (splitter . [(20170809 2208) nil "Manage window splits" single ((:commit . "6bdb51e9a346907d60a9625f6180bddd06be6674") (:authors ("Steven Thomas")) (:maintainer "Steven Thomas") (:keywords "frames" "convenience") (:url . "https://github.com/chumpage/chumpy-windows"))]) + (spotify . [(20200615 1418) ((cl-lib (0 5))) "Control the spotify application from emacs" single ((:commit . "7e28ef0b4519c6a46fce6a89c0ff1ed775eda71a") (:authors ("R.W. van 't Veer")) (:maintainer "R.W. van 't Veer") (:keywords "convenience") (:url . "https://github.com/remvee/spotify-el"))]) + (spotlight . [(20200109 2137) ((emacs (24 1)) (swiper (0 6 0)) (counsel (0 6 0))) "search files with Mac OS X spotlight" single ((:commit . "ea71f4fd380c51e50c47bb25855af4f40e4d8da0") (:authors ("Ben Maughan" . "benmaughan@gmail.com")) (:maintainer "Ben Maughan" . "benmaughan@gmail.com") (:keywords "search" "external") (:url . "http://www.pragmaticemacs.com"))]) + (spray . [(20160304 2220) nil "a speed reading mode" single ((:commit . "74d9dcfa2e8b38f96a43de9ab0eb13364300cb46") (:authors ("Ian Kelling" . "ian@iankelling.org")) (:maintainer "Ian Kelling" . "ian@iankelling.org") (:keywords "convenience") (:url . "https://github.com/ian-kelling/spray"))]) + (springboard . [(20170106 755) ((helm (1 6 9))) "Temporarily change default-directory for one command" single ((:commit . "687d1e5898a880878995dc9bffe93b4598366203") (:authors ("John Wiegley" . "jwiegley@gmail.com")) (:maintainer "John Wiegley" . "jwiegley@gmail.com") (:keywords "helm") (:url . "https://github.com/jwiegley/springboard"))]) + (sprintly-mode . [(20121006 534) ((furl (0 0 2))) "Major mode for dealing with sprint.ly" single ((:commit . "6695892bae5860b5268bf3ae62be990ee9b63c11") (:authors ("Justin Lilly" . "justin@justinlilly.com")) (:maintainer "Justin Lilly" . "justin@justinlilly.com") (:url . "https://github.com/sprintly/sprintly-mode"))]) + (sproto-mode . [(20151115 1805) nil "Major mode for editing sproto." single ((:commit . "0583a88273204dccd884b7edaa3590cefd31e7f7") (:authors ("m2q1n9")) (:maintainer "m2q1n9") (:keywords "sproto"))]) + (sprunge . [(20160301 243) ((request (0 2 0)) (cl-lib (0 5))) "Upload pastes to sprunge.us" single ((:commit . "0fd386b8b29c4175022a04ad70ea5643185b6726") (:authors ("Tom Jakubowski")) (:maintainer "Tom Jakubowski") (:keywords "tools"))]) + (spu . [(20161214 324) ((emacs (24 4)) (signal (1 0)) (timp (1 2 0))) "Silently upgrade package in the background" tar ((:commit . "41eec86b595816e3852e8ad1a8e07e51a27fd065") (:authors ("Mola-T" . "Mola@molamola.xyz")) (:maintainer "Mola-T" . "Mola@molamola.xyz") (:keywords "convenience" "package") (:url . "https://github.com/mola-T/spu"))]) + (sql-clickhouse . [(20191209 1443) ((emacs (24))) "support ClickHouse as SQL interpreter" single ((:commit . "8403a4a5d332dbb6459b7fbce6ea95c36d390a5b") (:authors ("Robert Schwarz" . "mail@rschwarz.net")) (:maintainer "Robert Schwarz" . "mail@rschwarz.net") (:url . "https://github.com/leethargo/sql-clickhouse"))]) + (sql-impala . [(20181218 410) nil "comint support for Cloudera Impala" single ((:commit . "466e7c0c789ec3e5e8a276c8f6754f91bb584c3e") (:authors ("Jason Terk" . "jason@goterkyourself.com")) (:maintainer "Jason Terk" . "jason@goterkyourself.com") (:keywords "sql" "impala") (:url . "https://github.com/jterk/sql-impala"))]) + (sql-presto . [(20190113 1742) ((emacs (24 4))) "No description available." single ((:commit . "bcda455e300a1af75c7bb805882329bc844703b2") (:authors ("Katherine Cox-Buday" . "cox.katherine.e@gmail.com")) (:maintainer "Katherine Cox-Buday" . "cox.katherine.e@gmail.com") (:keywords "sql" "presto" "database"))]) + (sql-sqlline . [(20201102 1508) ((emacs (24 4))) "Adds SQLLine support to SQLi mode" single ((:commit . "38baf140cae26f9d93fc45d5eaff7d5c7f050bff") (:authors ("Matteo Redaelli" . "matteo.redaelli@gmail.com")) (:maintainer "Matteo Redaelli" . "matteo.redaelli@gmail.com") (:keywords "languages") (:url . "https://gitlab.com/matteoredaelli/sql-sqlline"))]) + (sqlformat . [(20210305 209) ((emacs (24 3)) (reformatter (0 3))) "Reformat SQL using sqlformat or pgformatter" single ((:commit . "0351dad6bec06a381484c0c95309d46a7a8acdb4") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "languages") (:url . "https://github.com/purcell/sqlformat"))]) + (sqlite . [(20201227 1822) ((emacs (24 5))) "Use sqlite via ELisp" single ((:commit . "f3da716302c929b9df4ba0c281968f72a9d1d188") (:authors ("cnngimenez")) (:maintainer "cnngimenez") (:keywords "extensions" "lisp" "sqlite") (:url . "https://gitlab.com/cnngimenez/sqlite.el"))]) + (sqlite3 . [(20200916 132) ((emacs (25 1))) "Direct access to the core SQLite3 API" tar ((:commit . "95abc25cc67d652ce2ba79907224e581aef62e93") (:authors ("Y. N. Lo" . "gordonynlo@yahoo.com")) (:maintainer "Y. N. Lo" . "gordonynlo@yahoo.com") (:keywords "comm" "data" "sql") (:url . "https://github.com/pekingduck/emacs-sqlite3-api"))]) + (sqlup-mode . [(20170610 1537) nil "Upcase SQL words for you" single ((:commit . "3f9df9c88d6a7f9b1ae907e401cad8d3d7d63bbf") (:authors ("Aldric Giacomoni" . "trevoke@gmail.com")) (:maintainer "Aldric Giacomoni" . "trevoke@gmail.com") (:keywords "sql" "tools" "redis" "upcase") (:url . "https://github.com/trevoke/sqlup-mode.el"))]) + (sr-speedbar . [(20161025 831) nil "Same frame speedbar" single ((:commit . "77a83fb50f763a465c021eca7343243f465b4a47") (:authors ("Sebastian Rose" . "sebastian_rose@gmx.de")) (:maintainer "Sebastian Rose" . "sebastian_rose@gmx.de") (:keywords "speedbar" "sr-speedbar.el") (:url . "http://www.emacswiki.org/emacs/download/sr-speedbar.el"))]) + (srcery-theme . [(20210601 1247) ((emacs (24))) "Dark color theme" single ((:commit . "58dd21cd63e4a2eed15e0082c2547069363f107b") (:authors ("Daniel Berg")) (:maintainer "Daniel Berg") (:keywords "faces") (:url . "https://github.com/srcery-colors/srcery-emacs"))]) + (srefactor . [(20180703 1810) ((emacs (24 4))) "A refactoring tool based on Semantic parser framework" tar ((:commit . "6f2c97d17fb70f4ca2112f5a2b99a8ec162004f5") (:authors ("Tu, Do Hoang" . "tuhdo1710@gmail.com")) (:maintainer "Tu, Do Hoang") (:keywords "c" "languages" "tools") (:url . "https://github.com/tuhdo/semantic-refactor"))]) + (srfi . [(20210528 2053) ((emacs (25 1))) "Scheme Requests for Implementation browser" tar ((:commit . "c4ff94490dd8124e633f907f94955b30b7a4d8d4") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "languages" "util") (:url . "https://github.com/srfi-explorations/emacs-srfi"))]) + (srv . [(20180715 1959) ((emacs (24 3))) "perform SRV DNS requests" single ((:commit . "714387d5a5cf34d8d8cd96bdb1f9cb8ded823ff7") (:authors ("Magnus Henoch" . "magnus.henoch@gmail.com")) (:maintainer "Magnus Henoch" . "magnus.henoch@gmail.com") (:keywords "comm") (:url . "https://github.com/legoscia/srv.el"))]) + (ssass-mode . [(20200211 132) ((emacs (24 3))) "Edit Sass without a Turing Machine" single ((:commit . "96f557887ad97a0066a60c54f92b7234b8407016") (:authors ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainer "Adam Niederer" . "adam.niederer@gmail.com") (:keywords "languages" "sass") (:url . "http://github.com/AdamNiederer/ssass-mode"))]) + (ssh . [(20120904 2042) nil "Support for remote logins using ssh." single ((:commit . "812e27409d01c38d74906a1816640506d6e7e3ef") (:authors ("Noah Friedman" . "friedman@splode.com")) (:maintainer "Ian Eure" . "ian.eure@gmail.com") (:keywords "unix" "comm"))]) + (ssh-agency . [(20200329 1558) ((emacs (24 4)) (dash (2 10 0))) "manage ssh-agent from Emacs" single ((:commit . "a5377e4317365a3d5442e06d5c255d4a7c7618db") (:authors ("Noam Postavsky" . "npostavs@user.sourceforge.net")) (:maintainer "Noam Postavsky" . "npostavs@user.sourceforge.net") (:url . "https://github.com/magit/ssh-agency"))]) + (ssh-config-mode . [(20210517 1925) nil "Mode for fontification of ~/.ssh/config" tar ((:commit . "ff9a15ec150baef21d7d8c6f79c5602e56825391") (:authors ("Harley Gorrell" . "harley@panix.com")) (:maintainer "Harley Gorrell" . "harley@panix.com") (:keywords "ssh" "config" "emacs") (:url . "https://github.com/jhgorrell/ssh-config-mode-el"))]) + (ssh-deploy . [(20201016 1439) ((emacs (25))) "Deployment via Tramp, global or per directory." tar ((:commit . "fce4ea35f09ed5899c1a2dfa3527bc2dd5ca3ba5") (:authors ("Christian Johansson" . "christian@cvj.se")) (:maintainer "Christian Johansson" . "christian@cvj.se") (:keywords "tools" "convenience") (:url . "https://github.com/cjohansson/emacs-ssh-deploy"))]) + (ssh-tunnels . [(20190622 931) ((cl-lib (0 5)) (emacs (24))) "Manage SSH tunnels" tar ((:commit . "d32e2072f50bcbde787196abb5862735837dc8be") (:authors ("death <github.com/death>")) (:maintainer "death <github.com/death>") (:keywords "tools" "convenience") (:url . "http://github.com/death/ssh-tunnels"))]) + (stack-mode . [(20150923 1523) ((haskell-mode (13 14)) (cl-lib (0 5)) (flycheck (0 23))) "A minor mode enabling various features based on stack-ide." tar ((:commit . "f3481e239dde9817152ec00e32bfc3ebf5aaf2cb") (:keywords "haskell" "stack") (:url . "https://github.com/commercialhaskell/stack-ide"))]) + (stan-mode . [(20210130 1325) ((emacs (24 4))) "Major mode for editing Stan files" tar ((:commit . "9bb858b9f1314dcf1a5df23e39f9af522098276b") (:authors ("Jeffrey Arnold" . "jeffrey.arnold@gmail.com") ("Daniel Lee" . "bearlee@alum.mit.edu") ("Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu")) (:maintainer "Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu") (:keywords "languages" "c") (:url . "https://github.com/stan-dev/stan-mode/tree/master/stan-mode"))]) + (stan-snippets . [(20210130 1325) ((emacs (24 3)) (stan-mode (10 2 1)) (yasnippet (0 8 0))) "Yasnippets for Stan" tar ((:commit . "9bb858b9f1314dcf1a5df23e39f9af522098276b") (:authors ("Jeffrey Arnold" . "jeffrey.arnold@gmail.com") ("Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu")) (:maintainer "Kazuki Yoshida" . "kazukiyoshida@mail.harvard.edu") (:keywords "languages" "tools") (:url . "https://github.com/stan-dev/stan-mode/tree/master/stan-snippets"))]) + (standard-dirs . [(20200621 1603) ((emacs (26 1)) (f (0 20 0)) (s (1 7 0))) "Platform-specific paths for config, cache, and other data" single ((:commit . "92460e21f964cb7495d974c42acd0b726af3fbcb") (:authors ("Joseph M LaFreniere" . "joseph@lafreniere.xyz")) (:maintainer "Joseph M LaFreniere" . "joseph@lafreniere.xyz") (:keywords "files") (:url . "https://github.com/lafrenierejm/standard-dirs.el"))]) + (standoff-mode . [(20171115 1731) nil "Create stand-off markup, also called external markup." tar ((:commit . "76cc8122a39a3ef5947d706377b007ef53a354fe") (:authors ("Christian Lück" . "christian.lueck@ruhr-uni-bochum.de")) (:maintainer "Christian Lück" . "christian.lueck@ruhr-uni-bochum.de") (:keywords "text" "annotations" "ner" "humanities") (:url . "https://github.com/lueck/standoff-mode"))]) + (start-menu . [(20160426 1225) ((cl-lib (0 5)) (config-parser (0 1))) "start-menu for executing external program like in windows" single ((:commit . "f7d33fed7ad2dc61156f1c1cff9e1805366fbd69") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "convenience" "menu") (:url . "https://github.com/lujun9972/el-start-menu"))]) + (stash . [(20151117 1427) nil "lightweight persistent caching" single ((:commit . "c2e494d20c752b80ebbdffbf66687b3cdfc425ad") (:authors ("Sean Allred" . "code@seanallred.com")) (:maintainer "Sean Allred" . "code@seanallred.com") (:keywords "extensions" "data" "internal" "lisp") (:url . "https://www.github.com/vermiculus/stash.el/"))]) + (state . [(20200727 1227) ((emacs (24))) "Quick navigation between workspaces" single ((:commit . "8cd9210f17c1b134274a7352b996839aed9a7d8c") (:authors ("Sylvain Rousseau <thisirs at gmail dot com>")) (:maintainer "Sylvain Rousseau <thisirs at gmail dot com>") (:keywords "convenience" "workspaces") (:url . "https://github.com/thisirs/state.git"))]) + (status . [(20151230 1408) nil "This package adds support for status icons to Emacs." tar ((:commit . "b62c74bf272566f82a68622f29fb9edafea0f241") (:authors ("Tom Tromey" . "tom@tromey.com")) (:maintainer "Tom Tromey" . "tom@tromey.com") (:keywords "frames" "multimedia"))]) + (steam . [(20210404 1658) ((cl-lib (0 5))) "Organize and launch Steam games" single ((:commit . "2b24198844e7296c68f870490fabe896ed101baa") (:authors ("Erik Sjöstrand")) (:maintainer "Erik Sjöstrand") (:keywords "games") (:url . "http://github.com/Kungsgeten/steam.el"))]) + (stem . [(20131102 1109) nil "Routines for stemming" single ((:commit . "d74e6611d6ba5025e0276a2cc7c8a90f46bfa9ac") (:authors ("Tsuchiya Masatoshi" . "tsuchiya@pine.kuee.kyoto-u.ac.jp")) (:maintainer "Tsuchiya Masatoshi" . "tsuchiya@pine.kuee.kyoto-u.ac.jp") (:keywords "stemming") (:url . "https://github.com/yuutayamada/stem"))]) + (stem-english . [(20180109 358) ((emacs (24 3))) "- routines for stemming English word" single ((:commit . "c9fc4c6ed6bf82382e479dae80912f4ae17d31f4") (:authors ("Tsuchiya Masatoshi" . "tsuchiya@pine.kuee.kyoto-u.ac.jp")) (:maintainer "KAWABATA, Taichi <kawabata.taichi_at_gmail.com>") (:keywords "text") (:url . "http://github.com/kawabata/stem-english"))]) + (stgit . [(20200606 1308) nil "major mode for StGit interaction" single ((:commit . "311caea3f11330a42a37efe078305b4ce42e53ae") (:authors ("David Kågedal" . "davidk@lysator.liu.se")) (:maintainer "David Kågedal" . "davidk@lysator.liu.se") (:url . "http://stacked-git.github.io"))]) + (sticky . [(20170926 36) nil "Sticky key for capital letters" single ((:commit . "fec4e1af38f17f5cd80eca361d8e8ef8772db366") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "convenience") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/sticky.el"))]) + (stickyfunc-enhance . [(20150429 1814) ((emacs (24 3))) "An enhancement to stock `semantic-stickyfunc-mode'" single ((:commit . "13bdba51fcd83ccbc3267959d23afc94d458dcb0") (:authors ("Tu, Do Hoang" . "tuhdo1710@gmail.com")) (:maintainer "Tu, Do Hoang") (:keywords "c" "languages" "tools") (:url . "https://github.com/tuhdo/semantic-stickyfunc-enhance"))]) + (stimmung-themes . [(20210610 1256) ((emacs (25))) "Themes tuned to inner harmonies" tar ((:commit . "e69b7532ceb27126fb9516c9a8aff652b032088a") (:authors ("Love Lagerkvist")) (:maintainer "Love Lagerkvist") (:keywords "faces") (:url . "https://github.com/motform/stimmung-themes"))]) + (stock-ticker . [(20150204 1052) ((s (1 9 0)) (request (0 2 0))) "Show stock prices in mode line" single ((:commit . "f2e564142c9de84232839a5b01979cf95b04d6a9") (:authors ("Gunther Hagleitner")) (:maintainer "Gunther Hagleitner") (:keywords "comms") (:url . "https://github.com/hagleitn/stock-ticker"))]) + (stock-tracker . [(20200228 542) ((emacs (26)) (dash (2 16 0))) "Track stock price" single ((:commit . "32ae436a4cad49fea5038cc3e8eb638a3a83dd6c") (:authors ("Huming Chen" . "chenhuming@gmail.com")) (:maintainer "Huming Chen" . "chenhuming@gmail.com") (:keywords "convenience" "chinese" "stock") (:url . "https://github.com/beacoder/stock-tracker"))]) + (strace-mode . [(20171116 2039) nil "strace output syntax highlighting" single ((:commit . "2901baa968d5180ab985ac40ca22cc20914d01f5") (:authors ("Preston Moore" . "prestonkmoore@gmail.com")) (:maintainer "Preston Moore" . "prestonkmoore@gmail.com") (:keywords "languages"))]) + (strie . [(20160211 2222) ((cl-lib (0 5))) "A simple trie data structure implementation" single ((:commit . "eb7efb0cccc127c414f6a64db11454869d9c10a8") (:authors ("James Atwood" . "jatwood@cs.umass.edu")) (:maintainer "James Atwood" . "jatwood@cs.umass.edu"))]) + (string-edit . [(20210405 1836) ((dash (1 2 0))) "Avoid escape nightmares by editing string in separate buffer" single ((:commit . "0e225df6f8740467231c787a50025e4552b3eddb") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))]) + (string-inflection . [(20200927 747) nil "underscore -> UPCASE -> CamelCase -> lowerCamelCase conversion of names" single ((:commit . "c4a519be102cb99dd86be3ee8c387f008d097635") (:authors ("akicho8" . "akicho8@gmail.com")) (:maintainer "akicho8" . "akicho8@gmail.com") (:keywords "elisp"))]) + (string-utils . [(20140508 2041) ((list-utils (0 4 2))) "String-manipulation utilities" single ((:commit . "c2232d691617973ecf12a970c6008a161c21da14") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "extensions") (:url . "http://github.com/rolandwalker/string-utils"))]) + (stripe-buffer . [(20141208 1508) ((cl-lib (1 0))) "Use a different background for even and odd lines" single ((:commit . "c252080f55cb78c951b19ebab9687f6d00237baf") (:authors ("Andy Stewart" . "lazycat.manatee@gmail.com")) (:maintainer "sabof" . "esabof@gmail.com") (:url . "https://github.com/sabof/stripe-buffer"))]) + (stripes . [(20200330 2022) ((emacs (24))) "highlight alternating lines differently" single ((:commit . "7b1d501f44b697a0514ef6759fd126d65867f18d") (:authors ("Michael Schierl" . "schierlm-public@gmx.de") ("Štěpán Němec" . "stepnem@gmail.com")) (:maintainer "Štěpán Němec" . "stepnem@gmail.com") (:keywords "convenience" "faces") (:url . "https://gitlab.com/stepnem/stripes-el"))]) + (stumpwm-mode . [(20140131 216) nil "special lisp mode for evaluating code into running stumpwm" single ((:commit . "61a7cf27e49e0779a53c018b2342f5f1c5cc70b4") (:maintainer "Shawn Betts") (:keywords "comm" "lisp" "tools"))]) + (stupid-indent-mode . [(20170525 1117) nil "Plain stupid indentation minor mode" single ((:commit . "3295e7de5e2cfddc3bf0e462e852bf58972f5d70") (:authors ("Mihai Bazon" . "mihai.bazon@gmail.com")) (:maintainer "Mihai Bazon" . "mihai.bazon@gmail.com"))]) + (stylefmt . [(20161025 824) nil "Stylefmt interface" single ((:commit . "7a38f26bf8ff947215f34f0a064c7ca80575ccbc") (:authors ("κeen")) (:maintainer "κeen") (:keywords "style" "code" "formatter") (:url . "https://github.com/KeenS/stylefmt.el"))]) + (stylus-mode . [(20150313 1512) ((sws-mode (0))) "Major mode for editing .jade files" single ((:commit . "4dbde92542fc7ad61df38776980905a4721d642e") (:authors ("Brian M. Carlson and other contributors")) (:maintainer "Brian M. Carlson and other contributors") (:url . "https://github.com/brianc/jade-mode"))]) + (su . [(20210226 42) ((emacs (26 1))) "Automatically read and write files as other users" single ((:commit . "787f78989253f4568942a4cece5f135f005e135f") (:authors ("PythonNut" . "pythonnut@pythonnut.com")) (:maintainer "PythonNut" . "pythonnut@pythonnut.com") (:keywords "convenience" "helm" "fuzzy" "flx") (:url . "https://github.com/PythonNut/su.el"))]) + (subatomic-theme . [(20190607 1022) nil "Low contrast bluish color theme" single ((:commit . "a13cdac97a6d0488b13bc36d4c2f4d4102ff6a31") (:authors ("John Olsson" . "john@cryon.se")) (:maintainer "John Olsson" . "john@cryon.se") (:keywords "color-theme" "blue" "low contrast") (:url . "https://github.com/cryon/subatomic"))]) + (subatomic256-theme . [(20130621 210) nil "Fork of subatomic-theme for terminals." single ((:commit . "326177d6f99cd2b1d30df695e67ee3bc441cd96f") (:authors ("John Olsson" . "john@cryon.se")) (:maintainer "John Olsson" . "john@cryon.se") (:url . "https://github.com/cryon/subatomic256"))]) + (subemacs . [(20170401 934) nil "Evaluating expressions in a fresh Emacs subprocess" single ((:commit . "18d53939fec8968c08dfc5aff7240ca07efb1aac") (:authors ("Klaus-Dieter Bauer" . "bauer.klaus.dieter@gmail.com")) (:maintainer "Klaus-Dieter Bauer" . "bauer.klaus.dieter@gmail.com") (:keywords "extensions" "lisp" "multiprocessing") (:url . "https://github.com/kbauer/subemacs"))]) + (sublime-themes . [(20170606 1844) nil "A collection of themes based on Sublime Text" tar ((:commit . "60ee40af82eb55b79d5ed4026f1911326311603f") (:authors ("Owain Lewis" . "owain@owainlewis.com")) (:maintainer "Owain Lewis" . "owain@owainlewis.com") (:keywords "faces"))]) + (sublimity . [(20200905 1730) ((emacs (26 1))) "smooth-scrolling, minimap and distraction-free mode" tar ((:commit . "8e2ffc4d62194106130014531e7b54fc9b4b9e6c") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "https://github.com/zk-phi/sublimity"))]) + (subsonic . [(20210331 1845) ((emacs (27 1)) (transient (0 2))) "Browse and play music from subsonic servers with mpv" single ((:commit . "9764405dede46791e411cdcc7963808f76201529") (:authors ("Alex McGrath" . "amk@amk.ie")) (:maintainer "Alex McGrath" . "amk@amk.ie") (:keywords "multimedia") (:url . "https://git.sr.ht/~amk/subsonic.el"))]) + (sudo-edit . [(20210108 420) ((emacs (24)) (cl-lib (0 5))) "Open files as another user" single ((:commit . "a7ae1713bb659988bb1465a13b837fbc2d699504") (:authors ("Nathaniel Flath" . "flat0103@gmail.com")) (:maintainer "Nathaniel Flath" . "flat0103@gmail.com") (:keywords "convenience") (:url . "https://github.com/nflath/sudo-edit"))]) + (sudo-ext . [(20170126 1214) nil "sudo support" single ((:commit . "9d4580f304121ce7b8104bd4bd3b64e4dfa3c9b3") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "unix") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/sudo-ext.el"))]) + (sudo-utils . [(20210119 1930) ((emacs (25 1))) "Sudo utilities" single ((:commit . "089f7833fa256f293284a6286bf9cb2b78eff40d") (:authors ("Alpha Catharsis" . "alpha.catharsis@gmail.com")) (:maintainer "Alpha Catharsis" . "alpha.catharsis@gmail.com") (:keywords "processes" "unix") (:url . "https://github.com/alpha-catharsis/sudo-utils"))]) + (sudoku . [(20191015 1315) ((emacs (24 4))) "Simple sudoku game, can download puzzles" single ((:commit . "b1924fd244a5fa284de9d67b66fbd69164b37318") (:authors ("Zajcev Evgeny" . "zevlg@yandex.ru")) (:maintainer "Zajcev Evgeny" . "zevlg@yandex.ru") (:keywords "games"))]) + (suggest . [(20180916 1859) ((emacs (24 4)) (loop (1 3)) (dash (2 13 0)) (s (1 11 0)) (f (0 18 2)) (spinner (1 7 3))) "suggest elisp functions that give the output requested" tar ((:commit . "83a2679baf661ee834e9e75921fd546243a6d919") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:keywords "convenience") (:url . "https://github.com/Wilfred/suggest.el"))]) + (suggestion-box . [(20170830 807) ((emacs (25 1)) (popup (0 5 3))) "show tooltip on the cursor" single ((:commit . "50af0776c8caf3c79c4d37fd51cbf304ea34b68e") (:authors ("Yuta Yamada <cokesboy\"at\"gmail.com>")) (:maintainer "Yuta Yamada <cokesboy\"at\"gmail.com>") (:keywords "convenience"))]) + (sunburn-theme . [(20201216 1539) ((emacs (24))) "A low contrast color theme" single ((:commit . "6b5c14c76dcdfdb099102ef7a388b2f0c6f1951d") (:authors ("Martín Varela" . "martin@varela.fi")) (:maintainer "Martín Varela" . "martin@varela.fi") (:url . "http://github.com/mvarela/Sunburn-Theme"))]) + (sunny-day-theme . [(20140413 2125) nil "Emacs24 theme with a light background." single ((:commit . "420e0a6eb33fcc9b75c2c9e88ab60a975d782a00") (:authors ("Martin Haesler")) (:maintainer "Martin Haesler") (:url . "http://github.com/mswift42/sunny-day-theme"))]) + (sunshine . [(20200306 1711) ((cl-lib (0 5))) "Provide weather and forecast information." single ((:commit . "88256223539edcfe57017778a997a474c9c022f6") (:authors ("Aaron Bieber" . "aaron@aaronbieber.com")) (:maintainer "Aaron Bieber" . "aaron@aaronbieber.com") (:keywords "tools" "weather") (:url . "https://github.com/aaronbieber/sunshine.el"))]) + (suomalainen-kalenteri . [(20200830 1107) nil "Finnish national and Christian holidays for calendar" tar ((:commit . "5b209ff7b7d3dcd09b623915aba1e137c875fa0e") (:authors ("Teemu Likonen" . "tlikonen@iki.fi")) (:maintainer "Teemu Likonen" . "tlikonen@iki.fi") (:keywords "calendar" "holidays" "finnish") (:url . "https://github.com/tlikonen/suomalainen-kalenteri"))]) + (super-save . [(20200930 1634) ((emacs (24 4))) "Auto-save buffers, based on your activity." single ((:commit . "886b5518c8a8b4e1f5e59c332d5d80d95b61201d") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.com")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.com") (:keywords "convenience") (:url . "https://github.com/bbatsov/super-save"))]) + (supergenpass . [(20130329 548) nil "SuperGenPass for Emacs" single ((:commit . "549072ef7b5b82913cadd4758e8a0a9926f0a04a") (:authors ("Jaime Fournier" . "jaimef@linbsd.org")) (:maintainer "Jaime Fournier" . "jaimef@linbsd.org") (:keywords "supergenpass"))]) + (suscolors-theme . [(20190713 1009) nil "Colorful theme, inspired by Gruvbox." single ((:commit . "b4a979ee23e26e255b9a63525b0a28e810fab9ae") (:url . "https://github.com/TheSuspiciousWombat/SusColors-emacs"))]) + (sv-kalender-namnsdagar . [(20190421 1521) nil "Swedish celebrated name of the day" single ((:commit . "fff970f49c77abfc69e37817f25a939818420971") (:authors ("Mats Lidell" . "mats.lidell@lidells.se")) (:maintainer "Mats Lidell" . "mats.lidell@lidells.se") (:keywords "calendar" "swedish" "localization") (:url . "https://github.com/matsl/sv-kalender-namnsdagar"))]) + (svelte-mode . [(20210222 1037) ((emacs (26 1))) "Emacs major mode for Svelte" single ((:commit . "25d0018036f44ff9bd685a1c9a76d8ba57c1024d") (:authors ("Leaf" . "leafvocation@gmail.com")) (:maintainer "Leaf" . "leafvocation@gmail.com") (:keywords "wp" "languages") (:url . "https://github.com/leafOfTree/svelte-mode"))]) + (svg-mode-line-themes . [(20150425 2006) ((xmlgen (0 4))) "SVG-based themes for mode-line" tar ((:commit . "80a0e01839cafbd66899202e7764c33231974259") (:authors ("sabof")) (:maintainer "sabof") (:url . "https://github.com/sabof/svg-mode-line-themes"))]) + (svg-tag-mode . [(20210301 2205) ((emacs (26 1))) "Replace keywords with SVG tags" single ((:commit . "95b5404997d7194b4946df0a475fd93203a36cb9") (:authors ("Nicolas P. Rougier" . "Nicolas.Rougier@inria.fr")) (:maintainer "Nicolas P. Rougier" . "Nicolas.Rougier@inria.fr") (:keywords "convenience") (:url . "https://github.com/rougier/svg-tag-mode"))]) + (svnwrapper . [(20180414 1843) ((e2ansi (0 1 1))) "Highlighting and paging for shell command `svn'" tar ((:commit . "de5069f5784e5d9e87a0af0159ba5f28a3716583") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "faces") (:url . "https://github.com/Lindydancer/svnwrapper"))]) + (swagger-to-org . [(20160611 56) ((emacs (24)) (cl-lib (0 5)) (json (1 4))) "Convert a swagger.json file into an org-mode file" single ((:commit . "181357c71ea24bede263f5706d8781ad65e16877") (:authors ("Matthew Carter" . "m@ahungry.com")) (:maintainer "Matthew Carter" . "m@ahungry.com") (:keywords "ahungry" "emacs" "swagger" "openapi" "orgmode" "org" "export") (:url . "https://github.com/ahungry/swagger-to-org"))]) + (swap-buffers . [(20150506 2139) nil "The quickest way to swap buffers between windows. Based on switch-window package." single ((:commit . "46ab31359b70d935add6c6e9533443116dc51103") (:authors ("Evgeniy Kazakov" . "evgeniy.kazakov@gmail.com")) (:maintainer "Evgeniy Kazakov" . "evgeniy.kazakov@gmail.com") (:keywords "window" "swap" "buffer" "exchange") (:url . "https://github.com/ekazakov/swap-buffers"))]) + (swap-regions . [(20180915 1346) ((emacs (24 3))) "Swap text in two regions" single ((:commit . "f4fd9880cf690e003fcde88dcf2b46adbbbb03cd") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:keywords "convenience") (:url . "https://github.com/xuchunyang/swap-regions.el"))]) + (sway . [(20210501 2201) ((emacs (27 1)) (dash (2 18 1))) "Communication with the Sway window manager" single ((:commit . "8a4d9cc1a469efa707cf67b57b752f28547e331e") (:authors ("Thibault Polge" . "thibault@thb.lt")) (:maintainer "Thibault Polge" . "thibault@thb.lt") (:keywords "frames") (:url . "https://github.com/thblt/sway.el"))]) + (sweet-theme . [(20200708 1202) ((emacs (24 1))) "Sweet-looking theme" single ((:commit . "78f741806ecebe01224bf54d09ad80e306652508") (:authors ("2bruh4me")) (:maintainer "2bruh4me") (:keywords "faces") (:url . "https://github.com/2bruh4me/sweet-theme"))]) + (sweetgreen . [(20180605 335) ((dash (2 12 1)) (helm (1 5 6)) (request (0 2 0)) (cl-lib (0 5))) "Order Salads from sweetgreen.com" single ((:commit . "e933fe466b5ef0e976967e203f88bd7a012469d1") (:authors ("Diego Berrocal" . "cestdiego@gmail.com")) (:maintainer "Diego Berrocal" . "cestdiego@gmail.com") (:keywords "salad" "food" "sweetgreen" "request") (:url . "https://www.github.com/CestDiego/sweetgreen.el"))]) + (swift-helpful . [(20210405 1727) ((emacs (25 1)) (dash (2 12 0)) (lsp-mode (6 0)) (swift-mode (8 0 0))) "Show documentation for Swift programs." tar ((:commit . "ed36ea3d8cd80159f7f90b144c4503411b74ae3e") (:authors ("Daniel Martín" . "mardani29@yahoo.es")) (:maintainer "Daniel Martín" . "mardani29@yahoo.es") (:keywords "help" "swift") (:url . "https://github.com/danielmartin/swift-helpful"))]) + (swift-mode . [(20210612 1034) ((emacs (24 4)) (seq (2 3))) "Major-mode for Apple's Swift programming language" tar ((:commit . "f614620ad63adcb617df7964923766194810ec73") (:keywords "languages" "swift") (:url . "https://github.com/swift-emacs/swift-mode"))]) + (swift-playground-mode . [(20190717 2223) ((emacs (24 4)) (seq (2 2 0))) "Run Apple's playgrounds in Swift buffers" tar ((:commit . "111cde906508824ee11d774b908df867142a8aec") (:keywords "languages" "swift") (:url . "https://gitlab.com/michael.sanders/swift-playground-mode"))]) + (swift3-mode . [(20160918 1250) ((emacs (24 4))) "Major-mode for Apple's Swift programming language." tar ((:commit . "4e51265c6905e17d8910e35b0b37cf51e20ecdfe") (:keywords "languages" "swift") (:url . "https://github.com/taku0/swift3-mode"))]) + (swiper . [(20210521 1319) ((emacs (24 5)) (ivy (0 13 4))) "Isearch with an overview. Oh, man!" single ((:commit . "040d458bce4a88f37359192061bcea5ebe87007c") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "matching") (:url . "https://github.com/abo-abo/swiper"))]) + (swiper-helm . [(20180131 1744) ((emacs (24 1)) (swiper (0 1 0)) (helm (1 5 3))) "Helm version of Swiper." single ((:commit . "93fb6db87bc6a5967898b5fd3286954cc72a0008") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "matching") (:url . "https://github.com/abo-abo/swiper-helm"))]) + (swiss-holidays . [(20200526 822) nil "Swiss holidays for the calendar" single ((:commit . "0995c9685033a09466f5b2dceb7316362bde997a") (:authors ("Christian Egli" . "christian.egli@alumni.ethz.ch")) (:maintainer "Christian Egli" . "christian.egli@alumni.ethz.ch") (:keywords "calendar") (:url . "https://github.com/egli/swiss-holidays"))]) + (switch-buffer-functions . [(20200127 409) nil "Hook run when current buffer changed" single ((:commit . "95a846baa93bac4c3b3c028b9d53507f1042b23a") (:authors ("10sr <8slashes+el [at] gmail [dot] com>")) (:maintainer "10sr <8slashes+el [at] gmail [dot] com>") (:keywords "hook" "utility") (:url . "https://github.com/10sr/switch-buffer-functions-el"))]) + (switch-window . [(20210331 911) ((emacs (24))) "A *visual* way to switch window" tar ((:commit . "2801d9b3a9d7bf0b64cd8b2f2e572124ed2ff9ad") (:authors ("Dimitri Fontaine" . "dim@tapoueh.org") ("Feng Shu" . "tumashu@163.com")) (:maintainer "Dimitri Fontaine" . "dim@tapoueh.org") (:keywords "convenience") (:url . "https://github.com/dimitri/switch-window"))]) + (swoop . [(20200618 905) ((emacs (24 3)) (ht (2 0)) (pcre2el (1 5)) (async (1 1))) "Peculiar buffer navigation" tar ((:commit . "0c737a961970a2e61735545320367bafaa8dfc49") (:authors ("Shingo Fukuyama - http://fukuyama.co")) (:maintainer "Shingo Fukuyama - http://fukuyama.co") (:keywords "tools" "swoop" "inner" "buffer" "search" "navigation") (:url . "https://github.com/ShingoFukuyama/emacs-swoop"))]) + (sws-mode . [(20150317 1945) nil "(S)ignificant (W)hite(S)pace mode" single ((:commit . "4dbde92542fc7ad61df38776980905a4721d642e") (:authors ("Brian M. Carlson and other contributors")) (:maintainer "Brian M. Carlson and other contributors") (:url . "https://github.com/brianc/jade-mode"))]) + (sx . [(20191229 1746) ((emacs (24 1)) (cl-lib (0 5)) (json (1 3)) (markdown-mode (2 0)) (let-alist (1 0 3))) "StackExchange client. Ask and answer questions on Stack Overflow, Super User, and the likes" tar ((:commit . "e9d1093c97507a6d7b4f4710ef65200dae725e5f") (:authors ("Sean Allred" . "code@seanallred.com")) (:maintainer "Sean Allred" . "code@seanallred.com") (:keywords "help" "hypermedia" "tools") (:url . "https://github.com/vermiculus/sx.el/"))]) + (sxiv . [(20210514 918) ((dash (2 16 0)) (emacs (25 1))) "Run the sxiv image viewer" single ((:commit . "a531a7596e307a218beb8ff77893eeae61284f6e") (:authors ("contrapunctus" . "xmpp:contrapunctus@jabber.fr")) (:maintainer "contrapunctus" . "xmpp:contrapunctus@jabber.fr") (:keywords "multimedia") (:url . "https://gitlab.com/contrapunctus/sxiv.el"))]) + (symbol-navigation-hydra . [(20201223 2054) ((auto-highlight-symbol (1 53)) (hydra (0 15 0)) (emacs (24 4)) (multiple-cursors (1 4 0))) "A symbol-aware, range-aware hydra" single ((:commit . "ed65cd9c22550e59f723d7fc36ecc313aedc83da") (:authors ("Brett Wines" . "bgwines@cs.stanford.edu")) (:maintainer "Brett Wines" . "bgwines@cs.stanford.edu") (:keywords "highlight" "face" "match" "convenience" "hydra" "symbol") (:url . "https://github.com/bgwines/symbol-navigation-hydra"))]) + (symbol-overlay . [(20210422 2110) ((emacs (24 3)) (seq (2 2))) "Highlight symbols with keymap-enabled overlays" single ((:commit . "4231a36e39b7393d639e9cdef19f311d780deeab") (:authors ("wolray" . "wolray@foxmail.com")) (:maintainer "wolray" . "wolray@foxmail.com") (:keywords "faces" "matching") (:url . "https://github.com/wolray/symbol-overlay/"))]) + (symbolist . [(20210503 1220) ((emacs (24 5))) "List and interactively unbind Emacs Lisp symbols" single ((:commit . "f600e07fe06c19b67f917a8839bbcd6c78f1fbd4") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "lisp" "maint") (:url . "https://github.com/lassik/emacs-symbolist"))]) + (symbolword-mode . [(20180401 1427) ((emacs (24)) (f (0 19 0))) "modify word split" single ((:commit . "c254ec56e83a5d9de04df0856248723cf6d4be50") (:authors ("ncaq" . "ncaq@ncaq.net")) (:maintainer "ncaq" . "ncaq@ncaq.net") (:url . "https://github.com/ncaq/symbolword-mode"))]) + (symex . [(20210528 406) ((emacs (25 1)) (lispy (0 26 0)) (paredit (24)) (evil-cleverparens (20170718 413)) (evil (1 2 14)) (evil-surround (1 0 4)) (hydra (0 15 0)) (seq (2 22)) (undo-tree (0 7 5))) "An evil way to edit Lisp symbolic expressions as trees" tar ((:commit . "1b6466e75295bbf7847253dfb6bf580b1c68eb9f") (:authors ("Siddhartha Kasivajhula" . "sid@countvajhula.com")) (:maintainer "Siddhartha Kasivajhula" . "sid@countvajhula.com") (:keywords "lisp" "convenience" "languages") (:url . "https://github.com/countvajhula/symex.el"))]) + (symon . [(20170224 833) nil "tiny graphical system monitor" single ((:commit . "8dd8b6df49b03cd7d31b85aedbe9dd08fb922335") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))]) + (symon-lingr . [(20150719 1342) ((symon (1 1 2)) (cl-lib (0 5))) "A notification-based Lingr client powered by symon.el" single ((:commit . "056d1a473e36992ff5881e5ce6fdc331cead975f") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))]) + (sync-recentf . [(20160326 2001) nil "Synchronize the recent files list between Emacs instances" single ((:commit . "0052561d5c5b5c2684faedc3eead776aec06c3ed") (:authors ("François Févotte" . "fevotte@gmail.com")) (:maintainer "François Févotte" . "fevotte@gmail.com") (:keywords "recentf") (:url . "https://github.com/ffevotte/sync-recentf"))]) + (synonymous . [(20180325 1817) ((emacs (24)) (cl-lib (0 5)) (request (0 2 0))) "A thesaurus at your fingertips" single ((:commit . "2cb9a674d84fddf3f1b00c9d6b13a853576acb87") (:authors ("Katherine Whitlock" . "toroidalcode@gmail.com") ("Snippets adapted from FlySpell, authored by Manuel Serrano" . "Manuel.Serrano@inria.fr")) (:maintainer "Katherine Whitlock" . "toroidalcode@gmail.com") (:keywords "utility") (:url . "http://github.com/toroidal-code/synonymous.el"))]) + (synosaurus . [(20191125 552) ((cl-lib (0 5))) "An extensible thesaurus supporting lookup and substitution." tar ((:commit . "14d34fc92a77c3a916b4d58400424c44ae99cd81") (:authors ("Hans-Peter Deifel" . "hpd@hpdeifel.de")) (:maintainer "Hans-Peter Deifel" . "hpd@hpdeifel.de") (:keywords "wp"))]) + (synquid . [(20160930 1550) ((flycheck (27)) (emacs (24 3))) "Major mode for editing Synquid files" single ((:commit . "28701ce1a15437202f53ab93a14bcba1de83fd2c") (:authors ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")) (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com") (:keywords "languages") (:url . "https://github.com/cpitclaudel/synquid-mode"))]) + (syntactic-close . [(20210105 1400) ((emacs (24)) (cl-lib (0 5))) "Insert closing delimiter" single ((:commit . "ffe8b28907973fda775254432f88b55c92b5ae1f") (:authors ("Emacs User Group Berlin" . "emacs-berlin@emacs-berlin.org")) (:maintainer "Emacs User Group Berlin" . "emacs-berlin@emacs-berlin.org") (:keywords "languages" "convenience") (:url . "https://github.com/emacs-berlin/syntactic-close"))]) + (syntactic-sugar . [(20140508 2041) nil "Effect-free forms such as if/then/else" single ((:commit . "7ddc4502c831abe1c4ad4c7d1ca628a2c9e13968") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "extensions") (:url . "http://github.com/rolandwalker/syntactic-sugar"))]) + (syntax-subword . [(20160205 2154) nil "make operations on words more fine-grained" single ((:commit . "9aa9b3f846bfe2474370642458a693ac4760d9fe") (:authors ("Jonathan Kotta" . "jpkotta@gmail.com")) (:maintainer "Jonathan Kotta" . "jpkotta@gmail.com"))]) + (sysctl . [(20200615 1824) ((emacs (26))) "Manage sysctl though org-mode" single ((:commit . "d8c2e18de1d7a3b2999a4d5054c0bbf30cb10fed") (:authors ("Dante Catalfamo")) (:maintainer "Dante Catalfamo") (:keywords "sysctl" "tools" "unix") (:url . "https://github.com/dantecatalfamo/sysctl.el"))]) + (syslog-mode . [(20190913 2040) ((hide-lines (20130623)) (ov (20150311))) "Major-mode for viewing log files" single ((:commit . "18f441bf57dd70cdd48a71f1f4566ab35facdb35") (:authors ("Harley Gorrell" . "harley@panix.com")) (:maintainer "Joe Bloggs" . "vapniks@yahoo.com") (:keywords "unix") (:url . "https://github.com/vapniks/syslog-mode"))]) + (system-packages . [(20210103 8) ((emacs (24 3))) "functions to manage system packages" single ((:commit . "05add2fe051846e2ecb3c23ef22c41ecc59a1f36") (:authors ("J. Alexander Branham" . "alex.branham@gmail.com")) (:maintainer "J. Alexander Branham" . "alex.branham@gmail.com") (:url . "https://gitlab.com/jabranham/system-packages"))]) + (system-specific-settings . [(20140818 1457) nil "Apply settings only on certain systems" single ((:commit . "0050d85b2175095aa5ecf580a2fe43c069b0eef3") (:authors ("Ryan C. Thompson")) (:maintainer "Ryan C. Thompson") (:keywords "configuration") (:url . "https://github.com/DarwinAwardWinner/emacs-system-specific-settings"))]) + (systemd . [(20210209 2052) ((emacs (24 4))) "Major mode for editing systemd units" tar ((:commit . "b6ae63a236605b1c5e1069f7d3afe06ae32a7bae") (:authors ("Mark Oteiza" . "mvoteiza@udel.edu")) (:maintainer "Mark Oteiza" . "mvoteiza@udel.edu") (:keywords "tools" "unix"))]) + (systemtap-mode . [(20151122 1940) nil "A mode for SystemTap" single ((:commit . "1a968c2b1f3a054bebf91ac49739d3a81ce050a9") (:maintainer nil . "ruediger@c-plusplus.de") (:keywords "tools" "languages") (:url . "https://github.com/ruediger/systemtap-mode"))]) + (ta . [(20160619 1645) ((emacs (24 3)) (cl-lib (0 5))) "A tool to deal with Chinese homophonic characters" single ((:commit . "668ad41e71f374f8c32c8d0532f3d8485b355d35") (:authors ("kuanyui" . "azazabc123@gmail.com")) (:maintainer "kuanyui" . "azazabc123@gmail.com") (:keywords "tools") (:url . "http://github.com/kuanyui/ta.el"))]) + (tab-bar-echo-area . [(20210525 2204) ((emacs (27 1))) "Display tab names of the tab bar in the echo area" single ((:commit . "2196e76cb6f11e6ae0f35ac8259dfb755ea60336") (:authors ("Fritz Grabo" . "me@fritzgrabo.com")) (:maintainer "Fritz Grabo" . "me@fritzgrabo.com") (:keywords "convenience") (:url . "https://github.com/fritzgrabo/tab-bar-echo-area"))]) + (tab-bar-groups . [(20210526 2044) ((emacs (27 1)) (s (1 12 0))) "Tab groups for the tab bar" single ((:commit . "63af8dced377a346b4559145b2e6e1767263f916") (:authors ("Fritz Grabo" . "me@fritzgrabo.com")) (:maintainer "Fritz Grabo" . "me@fritzgrabo.com") (:keywords "convenience") (:url . "https://github.com/fritzgrabo/tab-bar-groups"))]) + (tab-bar-lost-commands . [(20210215 1412) ((emacs (27 1))) "The \"lost commands\" of the tab bar" single ((:commit . "e587cdb5d6d2c8d509c43db4b5bb285415916c4e") (:authors ("Fritz Grabo" . "me@fritzgrabo.com")) (:maintainer "Fritz Grabo" . "me@fritzgrabo.com") (:keywords "convenience") (:url . "https://github.com/fritzgrabo/tab-bar-lost-commands"))]) + (tab-group . [(20140306 1450) nil "Grouped tabs and their tabbar" single ((:commit . "5a290ec2608e4100fb188fd60ecb77affcc3465b") (:authors ("INA Lintaro <tarao.gnn at gmail.com>")) (:maintainer "INA Lintaro <tarao.gnn at gmail.com>") (:keywords "convenience" "tabs") (:url . "http://github.com/tarao/tab-group-el"))]) + (tab-jump-out . [(20151006 130) ((dash (2 10)) (emacs (24 4))) "Use tab to jump out of delimiter pairs." single ((:commit . "1c3fec1826d2891177ea78e4e7cce1dc67e83e51") (:authors ("Zhang Kai Yu" . "yeannylam@gmail.com")) (:maintainer "Zhang Kai Yu" . "yeannylam@gmail.com") (:keywords "tab" "editing"))]) + (tabbar . [(20180726 1735) nil "Display a tab bar in the header line" tar ((:commit . "82bbda31cbe8ef367dd6501c3aa14b7f2c835910") (:authors ("David Ponce" . "david@dponce.com")) (:maintainer "David Ponce" . "david@dponce.com") (:keywords "convenience"))]) + (tabbar-ruler . [(20160802 307) ((tabbar (2 0 1)) (powerline (2 3)) (mode-icons (0 4 0)) (cl-lib (0 5))) "Pretty tabbar, autohide, use both tabbar/ruler" tar ((:commit . "535568189aa12a3eff7f977d2783e57b6a65ab6a") (:authors ("Matthew Fidler, Ta Quang Trung, Nathaniel Cunningham")) (:maintainer "Matthew L. Fidler") (:keywords "tabbar" "ruler mode" "menu" "tool bar.") (:url . "http://github.com/mlf176f2/tabbar-ruler.el"))]) + (tablist . [(20200427 2205) ((emacs (24 3))) "Extended tabulated-list-mode" tar ((:commit . "faab7a035ef2258cc4ea2182f67e3aedab7e2af9") (:authors ("Andreas Politz" . "politza@fh-trier.de")) (:maintainer "Andreas Politz" . "politza@fh-trier.de") (:keywords "extensions" "lisp"))]) + (tabula-rasa . [(20141216 547) ((emacs (24 4))) "Distraction free writing mode" single ((:commit . "e85fff9de18dc31bc6a7aca726e34a95cc5459f5") (:authors ("Ido Magal" . "misc@satans.church")) (:maintainer "Ido Magal" . "misc@satans.church") (:keywords "distraction free" "writing") (:url . "https://github.com/idomagal/Tabula-Rasa/blob/master/tabula-rasa.el"))]) + (tagedit . [(20161121 855) ((s (1 3 1)) (dash (1 0 3))) "Some paredit-like features for html-mode" single ((:commit . "b3a70101a0dcf85498c92b7fcfa7fdbac869746c") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com") (:keywords "convenience"))]) + (take-off . [(20140531 917) ((emacs (24 3)) (web-server (0 1 0))) "Emacs remote web access" tar ((:commit . "aa9ea45566fc74febbb6ee9c409ecc4b59246215") (:authors ("Thomas Burette" . "burettethomas@gmail.com")) (:maintainer "Thomas Burette" . "burettethomas@gmail.com") (:url . "https://github.com/tburette/take-off"))]) + (tango-2-theme . [(20120312 2025) nil "Tango 2 color theme for GNU Emacs 24" single ((:commit . "64e44c98e41ebbe3b827d54280e3b9615787daaa") (:authors ("Nick Parker")) (:maintainer "Nick Parker"))]) + (tango-plus-theme . [(20210505 1051) nil "A color theme based on the tango palette" single ((:commit . "f31d282a70b0eb24470935438af59de96ddace2e") (:authors ("Titus von der Malsburg" . "malsburg@posteo.de")) (:maintainer "Titus von der Malsburg" . "malsburg@posteo.de") (:url . "https://github.com/tmalsburg/tango-plus-theme"))]) + (tangotango-theme . [(20200907 729) nil "Tango Palette color theme for Emacs 24." single ((:commit . "2293311166308a76bda691898b6952921bb95da9") (:authors ("Julien Barnier")) (:maintainer "Julien Barnier") (:keywords "tango" "palette" "color" "theme" "emacs") (:url . "https://github.com/juba/color-theme-tangotango"))]) + (tao-theme . [(20210417 626) nil "This package provides two parametrized uncoloured color themes for Emacs: tao-yin and tao-yang." tar ((:commit . "d5ccf6f53d65e80083acdfb0bced6bcd678c6ea9") (:authors ("Peter Kosov" . "11111000000@email.com")) (:maintainer "Peter Kosov" . "11111000000@email.com") (:url . "http://github.com/11111000000/tao-theme-emacs"))]) + (taskpaper-mode . [(20210415 1322) nil "Major mode for working with TaskPaper files" single ((:commit . "1c0028d6c406cf4884e6aa35313e82041b7e857f") (:authors ("Dmitry Safronov" . "saf.dmitry@gmail.com")) (:maintainer "Dmitry Safronov" . "saf.dmitry@gmail.com") (:keywords "outlines" "notetaking" "task management" "productivity" "taskpaper") (:url . "https://github.com/saf-dmitry/taskpaper-mode"))]) + (taskrunner . [(20190916 1608) ((emacs (25 1)) (projectile (2 0 0)) (async (1 9 3))) "Retrieve build system/taskrunner tasks" tar ((:commit . "716323aff410b4d864d137c9ebe4bbb5b8587f5e") (:authors ("Yavor Konstantinov <ykonstantinov1 AT gmail DOT com>")) (:maintainer "Yavor Konstantinov <ykonstantinov1 AT gmail DOT com>") (:keywords "build-system" "taskrunner" "build" "task-runner" "tasks" "convenience") (:url . "https://github.com/emacs-taskrunner/emacs-taskrunner"))]) + (tawny-mode . [(20191108 1346) ((cider (0 12)) (emacs (25))) "Ontology Editing with Tawny-OWL" single ((:commit . "82f343bac637e62f31152d72086c7facd4dfea27") (:authors ("Phillip Lord" . "phillip.lord@newcastle.ac.uk")) (:maintainer "Phillip Lord" . "phillip.lord@newcastle.ac.uk"))]) + (tblui . [(20161007 1912) ((dash (2 12 1)) (magit-popup (2 6 0)) (tablist (0 70)) (cl-lib (0 5))) "Define tabulated list UI easily" single ((:commit . "bb29323bb3e27093d50cb42db3a9329a096b6e4d") (:authors ("Yuki Inoue <inouetakahiroki _at_ gmail.com>")) (:maintainer "Yuki Inoue <inouetakahiroki _at_ gmail.com>") (:url . "https://github.com/Yuki-Inoue/tblui.el"))]) + (tbx2org . [(20140224 1559) ((dash (2 5 0)) (s (1 8 0)) (cl-lib (0 4))) "Tinderbox to org-mode conversion" single ((:commit . "08e9816ba6066f56936050b58d07ceb2187ae6f7") (:authors ("istib")) (:maintainer "istib") (:keywords "org-mode") (:url . "https://github.com/istib/tbx2org"))]) + (tc . [(20201022 1646) nil "a Japanese input method with T-Code on Emacs" tar ((:commit . "5c6bbb0ff08e5d81e905198156ae5600df7ff7ab") (:authors ("Kaoru Maeda" . "maeda@src.ricoh.co.jp") ("Yasushi Saito" . "yasushi@cs.washington.edu") ("KITAJIMA Akira" . "kitajima@isc.osakac.ac.jp")) (:maintainer "KITAJIMA Akira"))]) + (tco . [(20191129 2040) ((dash (1 2 0)) (emacs (24 3))) "Tail-call optimisation for Emacs lisp" single ((:commit . "d82478d56568f60b3a82fd010b3ca0bab2ef5dc9") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:url . "https://github.com/Wilfred/tco.el"))]) + (tea-time . [(20120331 820) nil "Simple timer package, useful to make perfect tea." single ((:commit . "1f6cf0bdd27c5eb3508989c5095427781f858eca") (:authors ("konsty" . "antipin.konstantin@googlemail.com")) (:maintainer "Gabriel Saldana" . "gsaldana@gmail.com") (:keywords "timer" "tea-time"))]) + (teacode-expand . [(20181231 640) ((emacs (24 4))) "Expansion of text by TeaCode program." single ((:commit . "2122e4b32ed4edd2d7ebc0ff8ebf407e29d6e910") (:authors ("Richard Guay" . "raguay@customct.com")) (:maintainer "Richard Guay" . "raguay@customct.com") (:keywords "lisp") (:url . "https://github.com/raguay/TeaCode-Expand"))]) + (teco . [(20200707 2309) nil "Teco interpreter" single ((:commit . "61caf8f419659a0567a269f290c90427a215d77b") (:authors ("Dale R. Worley" . "worley@alum.mit.edu")) (:maintainer "Mark T. Kennedy" . "mtk@acm.org") (:keywords "convenience" "emulations" "files") (:url . "https://github.com/mtk/teco.git"))]) + (telega . [(20210612 712) ((emacs (26 1)) (visual-fill-column (1 9)) (rainbow-identifiers (0 2 2))) "Telegram client (unofficial)" tar ((:commit . "f03e6116a37753abf6b5d0b897eb6648ca5525aa") (:authors ("Zajcev Evgeny" . "zevlg@yandex.ru")) (:maintainer "Zajcev Evgeny" . "zevlg@yandex.ru") (:keywords "comm") (:url . "https://github.com/zevlg/telega.el"))]) + (telepathy . [(20131209 1258) nil "Access Telepathy from Emacs" single ((:commit . "211d785b02a29ddc254422fdcc3db45262582f8c") (:authors ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainer "Nicolas Petton" . "petton.nicolas@gmail.com") (:keywords "telepathy" "tools"))]) + (telephone-line . [(20210322 2248) ((emacs (24 4)) (cl-lib (0 5)) (cl-generic (0 2)) (seq (1 8))) "Rewrite of Powerline" tar ((:commit . "aebac4658e553902369a3bf465bacc1f07a01106") (:authors ("Daniel Bordak" . "dbordak@fastmail.fm")) (:maintainer "Daniel Bordak" . "dbordak@fastmail.fm") (:keywords "mode-line") (:url . "https://github.com/dbordak/telephone-line"))]) + (teletext . [(20210312 1951) ((emacs (24 3))) "Teletext broadcast viewer" single ((:commit . "7ec1118b9e4a8663fe9ec933e9e13f7c2d57e986") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "comm" "help" "hypermedia") (:url . "https://github.com/lassik/emacs-teletext"))]) + (teletext-yle . [(20201019 756) ((emacs (24 3)) (teletext (0 1))) "Teletext provider for Finnish national network YLE" single ((:commit . "c5ba744191eb35b6877863b31bc00e6e9a264927") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "comm" "help" "hypermedia") (:url . "https://github.com/lassik/emacs-teletext-yle"))]) + (template-overlays . [(20180706 1132) ((emacs (24 4)) (ov (1 0 6))) "Display template regions using overlays" single ((:commit . "d32db58c044b2aca3720879003f55b1d57208b07") (:authors ("Mariano Montone" . "marianomontone@gmail.com")) (:maintainer "Mariano Montone" . "marianomontone@gmail.com") (:keywords "faces" "convenience" "templates" "overlays") (:url . "http://www.github.com/mmontone/template-overlays"))]) + (templatel . [(20210425 2215) ((emacs (25 1))) "Templating language;" single ((:commit . "3ee3761d9dd30b1c6af74dc393d43b9a91a75951") (:authors ("Lincoln Clarete" . "lincoln@clarete.li")) (:maintainer "Lincoln Clarete" . "lincoln@clarete.li") (:url . "https://clarete.li/templatel"))]) + (temporary-persistent . [(20200201 1719) ((emacs (24 3)) (names (20151201 0)) (dash (2 12 1)) (s (1 10 0))) "Keep temp notes buffers persistent" single ((:commit . "0080879b0257d350aeba1c4d6901613d7dc534de") (:authors ("Kostafey" . "kostafey@gmail.com")) (:maintainer "Kostafey" . "kostafey@gmail.com") (:keywords "temp" "buffers" "notes") (:url . "https://github.com/kostafey/temporary-persistent"))]) + (ten-hundred-mode . [(20161028 2236) ((cl-lib (0 5))) "use only the ten hundred most usual words" tar ((:commit . "bdcfda49b1819e82d61fe90947e50bb948cf7933"))]) + (term+ . [(20170509 17) ((emacs (24)) (cl-lib (0 5))) "term-mode enhancement" tar ((:commit . "c3c9239b339c127231860de43abfa08c44c0201a") (:authors ("INA Lintaro <tarao.gnn at gmail.com>")) (:maintainer "INA Lintaro <tarao.gnn at gmail.com>") (:keywords "terminal" "emulation") (:url . "https://github.com/tarao/term-plus-el"))]) + (term+key-intercept . [(20140211 750) ((term+ (0 1)) (key-intercept (0 1))) "term+ intercept key mapping" single ((:commit . "fd0771fd66b8c7a909aaac972194485c79ba48c4") (:authors ("INA Lintaro <tarao.gnn at gmail.com>")) (:maintainer "INA Lintaro <tarao.gnn at gmail.com>") (:keywords "terminal" "emulation") (:url . "http://github.com/tarao/term+-el"))]) + (term+mux . [(20140211 749) ((term+ (0 1)) (tab-group (0 1))) "term+ terminal multiplexer and session management" single ((:commit . "81b60e80cf008472bfd7fad9233af2ef722c208a") (:authors ("INA Lintaro <tarao.gnn at gmail.com>")) (:maintainer "INA Lintaro <tarao.gnn at gmail.com>") (:keywords "terminal" "emulation") (:url . "http://github.com/tarao/term+-el"))]) + (term-alert . [(20210414 1638) ((emacs (24 0)) (term-cmd (1 1)) (alert (1 1)) (f (0 18 2))) "Notifications when commands complete in term.el." tar ((:commit . "ca1b48ad911bc972b049f48fe0531e702dbc553c") (:authors ("Callie Cameron" . "cjcameron7@gmail.com")) (:maintainer "Callie Cameron" . "cjcameron7@gmail.com") (:keywords "notifications" "processes") (:url . "https://github.com/calliecameron/term-alert"))]) + (term-cmd . [(20210417 1447) ((emacs (27 2)) (dash (2 12 0)) (f (0 18 2))) "Send commands from programs running in term.el." tar ((:commit . "281b9a6d864ca85dc1451dc46baca98f48dc3f60") (:authors ("Callie Cameron" . "cjcameron7@gmail.com")) (:maintainer "Callie Cameron" . "cjcameron7@gmail.com") (:keywords "processes") (:url . "https://github.com/calliecameron/term-cmd"))]) + (term-manager . [(20190610 2032) ((dash (2 12 0)) (emacs (24 4))) "Contextual terminal management" tar ((:commit . "eea7894350a4f31e1df0c666d3fb0bac822d34d2") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:keywords "terminals" "tools") (:url . "https://www.github.com/IvanMalison/term-manager"))]) + (term-projectile . [(20190307 400) ((emacs (24)) (term-manager (0 1 0)) (projectile (0 13 0))) "projectile terminal management" single ((:commit . "eea7894350a4f31e1df0c666d3fb0bac822d34d2") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:keywords "projectile" "tools" "terminals" "vc") (:url . "https://www.github.com/IvanMalison/term-manager"))]) + (term-run . [(20200128 702) nil "Run arbitrary command in terminal buffer" single ((:commit . "0fd135d55fcf864598b1fb8dd880833a1a322910") (:authors ("10sr <8slashes+el [at] gmail [dot] com>")) (:maintainer "10sr <8slashes+el [at] gmail [dot] com>") (:keywords "utility" "shell" "command" "term-mode") (:url . "https://github.com/10sr/term-run-el"))]) + (termbright-theme . [(20151031 235) ((emacs (24 1))) "a more usable theme for white-on-black terminals" single ((:commit . "bec6ab14336c0611e85f45486276004f16d20607") (:authors ("Brian Mastenbrook" . "brian@mastenbrook.net")) (:maintainer "Brian Mastenbrook" . "brian@mastenbrook.net") (:keywords "themes") (:url . "https://github.com/bmastenbrook/termbright-theme-el"))]) + (terminal-focus-reporting . [(20180830 719) ((emacs (24 4))) "Minor mode for terminal focus reporting." single ((:commit . "6b1dbb2e96b3ff680dbe88153c4c569adbbd64ce") (:authors ("Vitalii Elenhaupt")) (:maintainer "Vitalii Elenhaupt") (:keywords "convenience") (:url . "https://github.com/veelenga/terminal-focus-reporting.el"))]) + (terminal-here . [(20210605 1453) ((emacs (25 1))) "Run an external terminal in current directory" single ((:commit . "e0e89344624fadf080f6770132ebdd7991355fdd") (:authors ("David Shepherd" . "davidshepherd7@gmail.com")) (:maintainer "David Shepherd" . "davidshepherd7@gmail.com") (:keywords "tools" "frames") (:url . "https://github.com/davidshepherd7/terminal-here"))]) + (terminal-toggle . [(20190226 1510) ((emacs (24)) (popwin (1 0 0))) "simple pop-up terminal" single ((:commit . "f824d634aef3600cb7a8e2ddf9e8444c6607c160") (:authors ("Mehmet Tekman")) (:maintainer "Mehmet Tekman") (:keywords "outlines") (:url . "https://github.com/mtekman/terminal-toggle.el"))]) + (tern . [(20181108 722) ((json (1 2)) (cl-lib (0 5)) (emacs (24))) "Tern-powered JavaScript integration" single ((:commit . "ef50c6f0269a6fd9ce742d0a87647d60a0ef850f") (:authors ("Marijn Haverbeke")) (:maintainer "Marijn Haverbeke") (:url . "http://ternjs.net/"))]) + (tern-auto-complete . [(20170521 1935) ((tern (0 0 1)) (auto-complete (1 4)) (cl-lib (0 5)) (emacs (24))) "Tern Completion by auto-complete.el" single ((:commit . "ef50c6f0269a6fd9ce742d0a87647d60a0ef850f") (:authors ("<m.sakurai at kiwanami.net>")) (:maintainer "<m.sakurai at kiwanami.net>"))]) + (tern-context-coloring . [(20161218 747) ((emacs (24 3)) (context-coloring (8 1 0)) (tern (0 0 1))) "Use Tern for context coloring" single ((:commit . "3a8e979d6cc83aabcb3dda3f5f31a6422532efba") (:authors ("Jackson Ray Hamilton" . "jackson@jacksonrayhamilton.com")) (:maintainer "Jackson Ray Hamilton" . "jackson@jacksonrayhamilton.com") (:keywords "convenience" "faces" "tools") (:url . "https://github.com/jacksonrayhamilton/tern-context-coloring"))]) + (terraform-doc . [(20210514 737) ((emacs (24 4))) "Look up terraform documentation on the fly" single ((:commit . "5d35efbf2c1619d9385ef00ed74e9de1ea7cf32d") (:authors ("Giap Tran" . "txgvnn@gmail.com")) (:maintainer "Giap Tran" . "txgvnn@gmail.com") (:keywords "comm") (:url . "https://github.com/TxGVNN/terraform-doc"))]) + (terraform-mode . [(20201208 1827) ((emacs (24 3)) (hcl-mode (0 3)) (dash (2 17 0))) "Major mode for terraform configuration file" single ((:commit . "a9fa5bdaf58e9cae32ee44b7d0883f5600441b05") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-terraform-mode"))]) + (test-c . [(20180423 1720) ((emacs (24 3))) "quickly test c code" single ((:commit . "761a576f62c7021ba941f178f153c51289df1553") (:authors ("Aurélien Aptel" . "aurelien.aptel@gmail.com")) (:maintainer "Aurélien Aptel" . "aurelien.aptel@gmail.com") (:url . "http://github.com/aaptel/test-c"))]) + (test-case-mode . [(20130525 1434) ((fringe-helper (0 1 1))) "unit test front-end" single ((:commit . "6074df10ebc97ddfcc228c71c73db179e672dac3") (:authors ("Nikolaj Schumacher <bugs * nschum de>")) (:maintainer "Nikolaj Schumacher <bugs * nschum de>") (:keywords "tools") (:url . "http://nschum.de/src/emacs/test-case-mode/"))]) + (test-kitchen . [(20171129 2035) nil "Run test-kitchen inside of emacs" single ((:commit . "0fc0ca4808425f03fbeb8125246043723e2a179a") (:authors ("JJ Asghar")) (:maintainer "JJ Asghar") (:keywords "chef" "ruby" "test-kitchen") (:url . "http://github.com/jjasghar/test-kitchen-el"))]) + (test-simple . [(20200722 1121) ((cl-lib (0))) "Simple Unit Test Framework for Emacs Lisp" single ((:commit . "ce6de04636e8d19ec84a475c03c0142b20a63de0") (:authors ("Rocky Bernstein" . "rocky@gnu.org")) (:maintainer "Rocky Bernstein" . "rocky@gnu.org") (:keywords "unit-test") (:url . "https://github.com/rocky/emacs-test-simple"))]) + (tex-smart-umlauts . [(20190316 2215) nil "Smart umlaut conversion for TeX." single ((:commit . "f15ed781b1fb38bf3e46c481dd602c3999920b99") (:authors ("Frank Fischer <frank-fischer at shadow-soft.de>")) (:maintainer "Frank Fischer <frank-fischer at shadow-soft.de>") (:keywords "tex" "wp") (:url . "http://hub.darcs.net/lyro/tex-smart-umlauts"))]) + (texfrag . [(20200716 1331) ((emacs (25)) (auctex (11 90 2))) "preview LaTeX fragments in alien major modes" single ((:commit . "a5f59e0c5f43578f139a2943bd08e5b3140f4c2b") (:authors ("Tobias Zawada" . "i@tn-home.de")) (:maintainer "Tobias Zawada" . "i@tn-home.de") (:keywords "tex" "languages" "wp") (:url . "https://github.com/TobiasZawada/texfrag"))]) + (textile-mode . [(20170304 1716) nil "Textile markup editing major mode" single ((:commit . "c37aaab809503df008209390e31e19abf4e23630") (:authors ("Julien Barnier" . "julien@nozav.org")) (:maintainer "Julien Barnier" . "julien@nozav.org"))]) + (textmate . [(20110816 2146) nil "TextMate minor mode for Emacs" single ((:commit . "350918b070148f0ace6d9d3cd4ebcaf15c1a8781") (:authors ("Chris Wanstrath" . "chris@ozmm.org")) (:maintainer "Chris Wanstrath" . "chris@ozmm.org") (:keywords "textmate" "osx" "mac"))]) + (textmate-to-yas . [(20160409 1708) nil "Import Textmate macros into yasnippet syntax" tar ((:commit . "be3a768b7ac4c2e24b9d4aa6e9ac1d916cdc5a73") (:authors ("Matthew L. Fidler")) (:maintainer "Matthew L. Fidler") (:keywords "yasnippet" "textmate") (:url . "https://github.com/mlf176f2/textmate-to-yas.el/"))]) + (textx-mode . [(20170516 911) ((emacs (24 3))) "Major mode for editing TextX files" single ((:commit . "72f9f0c5855b382024f0da8f56833c22a70a5cb3") (:authors ("Novak Boškov" . "gnovak.boskov@gmail.com")) (:maintainer "Novak Boškov" . "gnovak.boskov@gmail.com") (:keywords "textx") (:url . "https://github.com/novakboskov/textx-mode"))]) + (tf2-conf-mode . [(20161209 1620) nil "TF2 Configuration files syntax highlighting" single ((:commit . "536950f64c071ffd8495fb2c7ac7c63a11e25f93") (:authors ("Guillermo Robles" . "guillerobles1995@gmail.com")) (:maintainer "Guillermo Robles" . "guillerobles1995@gmail.com") (:keywords "languages") (:url . "https://github.com/wynro/emacs-tf2-conf-mode"))]) + (tfsmacs . [(20180911 2114) ((emacs (25)) (tablist (0 70))) "MS TFS source control interaction." single ((:commit . "6865d7bf772a6ecabacc868e45a0f5a5e197e1a5") (:authors ("Dino Chiesa <dpchiesa@outlook.com>, Sebastian Monia" . "smonia@outlook.com")) (:maintainer "Dino Chiesa <dpchiesa@outlook.com>, Sebastian Monia" . "smonia@outlook.com") (:keywords "tfs" "vc") (:url . "http://github.com/sebasmonia/tfsmacs/"))]) + (theme-anchor . [(20210408 2149) ((emacs (26))) "Apply theme in current buffer only" single ((:commit . "ec7f522ec25c7f8342dfd067b7d9f6862c828c93") (:authors ("Liāu, Kiong-Gē" . "gongyi.liao@gmail.com")) (:maintainer "Liāu, Kiong-Gē" . "gongyi.liao@gmail.com") (:keywords "extensions" "lisp" "theme") (:url . "https://github.com/GongYiLiao/theme-anchor"))]) + (theme-changer . [(20201226 2256) nil "Sunrise/Sunset Theme Changer for Emacs" single ((:commit . "57b8c579f134374a45bec9043feff6b29bb4f108") (:authors ("Joshua B. Griffith" . "josh.griffith@gmail.com")) (:maintainer "Joshua B. Griffith" . "josh.griffith@gmail.com") (:keywords "color-theme" "deftheme" "solar" "sunrise" "sunset") (:url . "https://github.com/hadronzoo/theme-changer"))]) + (theme-looper . [(20201107 4) ((emacs (24)) (cl-lib (0 5))) "Loop thru the available color-themes" single ((:commit . "6bc170097f1dfb7ea4db91544c5ab653279e15cd") (:authors ("Mohammed Ismail Ansari" . "team.terminal@gmail.com")) (:maintainer "Mohammed Ismail Ansari" . "team.terminal@gmail.com") (:keywords "convenience" "color-themes") (:url . "http://ismail.teamfluxion.com"))]) + (theme-magic . [(20190711 2034) ((emacs (25)) (seq (1 8))) "Apply your Emacs theme to the rest of Linux" tar ((:commit . "844c4311bd26ebafd4b6a1d72ddcc65d87f074e3") (:authors ("GitHub user \"jcaw\"" . "40725916+jcaw@users.noreply.github.com")) (:maintainer "GitHub user \"jcaw\"" . "40725916+jcaw@users.noreply.github.com") (:keywords "unix" "faces" "terminals" "extensions") (:url . "https://github.com/jcaw/theme-magic.el"))]) + (therapy . [(20151113 1953) ((emacs (24))) "Hooks for managing multiple Python major versions" single ((:commit . "775a92bb7b6b0fcc5b38c0b5198a9d0a1bef788a") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/therapy"))]) + (thingopt . [(20160520 2318) nil "Thing at Point optional utilities" single ((:commit . "5679815852652479f3b3c9f3a98affc927384b2c") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainer "Tomohiro Matsuyama" . "m2ym.pub@gmail.com") (:keywords "convenience"))]) + (thinks . [(20170802 1128) ((cl-lib (0 5))) "Insert text in a think bubble." single ((:commit . "c02f236abc8c2025d9f01460b09b89ebdc96e28d") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "convenience" "quoting") (:url . "https://github.com/davep/thinks.el"))]) + (thread-dump . [(20170816 1850) nil "Java thread dump viewer" single ((:commit . "204c9600242756d4b514bb5ff6293e052bf4b49d") (:authors ("Dmitry Neverov")) (:maintainer "Dmitry Neverov") (:url . "http://github.com/nd/thread-dump.el"))]) + (threes . [(20160820 1242) ((emacs (24)) (seq (1 11))) "A clone of Threes (a tiny puzzle game)" single ((:commit . "6981acb30b856c77cba6aba63fefbf102cbdfbb2") (:authors ("Chunyang Xu" . "xuchunyang.me@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang.me@gmail.com") (:keywords "games") (:url . "https://github.com/xuchunyang/threes.el"))]) + (thrift . [(20200212 1903) ((emacs (24))) "major mode for fbthrift and Apache Thrift files" single ((:commit . "8d741e567a2021749ea754f3049beeac6413b9b5") (:keywords "languages"))]) + (thumb-through . [(20120119 534) nil "Plain text reader of HTML documents" single ((:commit . "08d8fb720f93c6172653e035191a8fa9c3305e63") (:keywords "html"))]) + (tickscript-mode . [(20171219 203) ((emacs (24 1))) "A major mode for Tickscript files" single ((:commit . "f0579f38ff14954df5002ce30ae6d4a2c978d461") (:authors ("Marc Sherry" . "msherry@gmail.com")) (:maintainer "Marc Sherry" . "msherry@gmail.com") (:keywords "languages") (:url . "https://github.com/msherry/tickscript-mode"))]) + (tidal . [(20210211 1531) ((haskell-mode (16)) (emacs (24))) "Interact with TidalCycles for live coding patterns" single ((:commit . "8fd24400b1663729a12503a96fda43b2852a4533") (:authors (nil . "alex@slab.org")) (:maintainer nil . "alex@slab.org") (:keywords "tools") (:url . "https://github.com/tidalcycles/Tidal"))]) + (tide . [(20210517 507) ((emacs (25 1)) (dash (2 10 0)) (s (1 11 0)) (flycheck (27)) (typescript-mode (0 1)) (cl-lib (0 5))) "Typescript Interactive Development Environment" tar ((:commit . "c593153373d05b56ae56b0ca3a6752ee86708aaa") (:authors ("Anantha kumaran" . "ananthakumaran@gmail.com")) (:maintainer "Anantha kumaran" . "ananthakumaran@gmail.com") (:keywords "typescript") (:url . "http://github.com/ananthakumaran/tide"))]) + (tikz . [(20200728 913) ((emacs (24 1))) "A minor mode to edit TikZ pictures" single ((:commit . "f1495516657da6dc2296ffb6c38a3bb4acf118ad") (:authors ("Emilio Torres-Manzanera" . "torres@uniovi.es")) (:maintainer "Emilio Torres-Manzanera" . "torres@uniovi.es") (:keywords "tex") (:url . "https://github.com/emiliotorres/tikz"))]) + (tile . [(20161225 357) ((emacs (25 1)) (s (1 9 0)) (dash (2 12 0)) (stream (2 2 3))) "Tile windows with layouts" single ((:commit . "22660f21f6e95de5aba55cd5d293d4841e9a4661") (:authors ("Ivan Malison" . "IvanMalison@gmail.com")) (:maintainer "Ivan Malison" . "IvanMalison@gmail.com") (:keywords "tile" "tiling" "window" "manager" "dynamic" "frames") (:url . "https://github.com/IvanMalison/tile"))]) + (time-ext . [(20170126 1215) nil "more function for time/date" single ((:commit . "d128becf660fe3f30178eb1b05cd266741f4784a") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "lisp") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/time-ext.el"))]) + (timecop . [(20160520 1052) ((cl-lib (0 5)) (datetime-format (0 0 1))) "Freeze Time for testing" single ((:commit . "e6427538b547cbe02e1bd6ed4b765c73620bdae8") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "datetime" "testing") (:url . "https://github.com/zonuexe/emacs-datetime"))]) + (timer-revert . [(20150122 2032) nil "minor mode to revert buffer for a given time interval." tar ((:commit . "615c91dec8b440d2b9b7c725dd733d7432564e45") (:authors ("Yagnesh Raghava Yakkala. http://yagnesh.org")) (:maintainer nil . "hi@yagnesh.org") (:keywords "timer" "revert" "auto-revert.") (:url . "http://github.com/yyr/timer-revert"))]) + (timesheet . [(20191024 151) ((s (1)) (org (7)) (auctex (11))) "Timesheet management add-on for org-mode" tar ((:commit . "5098dc87d3d4f289b6c1b6532070dacbfe6de9fd") (:authors ("Tom Marble")) (:maintainer "Tom Marble") (:keywords "org" "timesheet") (:url . "https://github.com/tmarble/timesheet.el"))]) + (timonier . [(20170411 800) ((emacs (24 4)) (s (1 11 0)) (f (0 19 0)) (dash (2 12 0)) (pkg-info (0 5 0)) (hydra (0 13 6)) (request (0 2 0)) (all-the-icons (2 0 0))) "Manage Kubernetes Applications" tar ((:commit . "0a150ea87bf695b43cf1740dfd7e553e0ae7601c") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "kubernetes" "docker") (:url . "https://github.com/nlamirault/timonier"))]) + (timp . [(20160618 803) ((emacs (24 4)) (cl-lib (0 5)) (fifo-class (1 0)) (signal (1 0))) "Multithreading library" tar ((:commit . "66b21934b1eb8ee428c06dd64b3562ad44776a35") (:authors ("Mola-T" . "Mola@molamola.xyz")) (:maintainer "Mola-T" . "Mola@molamola.xyz") (:keywords "internal" "lisp" "processes" "tools") (:url . "https://github.com/mola-T/timp"))]) + (timu-spacegrey-theme . [(20210611 2321) ((emacs (27 1))) "Color theme inspired by the Spacegray theme in Sublime Text" single ((:commit . "a5cb038f126e80753c9207a5e8452c3224b9b83a") (:authors ("Aimé Bertrand" . "aime.bertrand@macowners.club")) (:maintainer "Aimé Bertrand" . "aime.bertrand@macowners.club") (:keywords "faces" "themes") (:url . "https://gitlab.com/aimebertrand/timu-spacegrey-theme"))]) + (tinkerer . [(20200914 1756) ((s (1 2 0))) "Elisp wrapper for Tinkerer Blogging Engine." single ((:commit . "7cedeb264a44cd62bcd9c778dca52316d09e07e5") (:authors ("Yagnesh Raghava Yakkala" . "hi@yagnesh.org")) (:maintainer "Yagnesh Raghava Yakkala" . "hi@yagnesh.org") (:keywords "tinkerer" "blog" "wrapper") (:url . "https://github.com/yyr/tinkerer.el"))]) + (tiny . [(20190722 1212) nil "Quickly generate linear ranges in Emacs" single ((:commit . "fd8a6b0b0c564d8242259e20e557ee6041f40908") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "convenience") (:url . "https://github.com/abo-abo/tiny"))]) + (tiny-menu . [(20161213 1235) ((emacs (24 4))) "Display tiny menus." single ((:commit . "05563b94537b6eb22aeddedef2a6e59e3f88d073") (:authors ("Aaron Bieber" . "aaron@aaronbieber.com")) (:maintainer "Aaron Bieber" . "aaron@aaronbieber.com") (:keywords "menu" "tools") (:url . "https://github.com/aaronbieber/tiny-menu.el"))]) + (tinypng . [(20200306 911) ((emacs (25 1))) "Compress PNG and JPEG with TinyPNG.com API" single ((:commit . "f7632e073ce13ef5ce30ae5584cb482a8bb9ffff") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:keywords "multimedia") (:url . "https://github.com/xuchunyang/tinypng.el"))]) + (tinysegmenter . [(20141124 1013) ((cl-lib (0 5))) "Super compact Japanese tokenizer in Javascript ported to emacs lisp" single ((:commit . "872134704bd25c13a4c59552433da4c6881b5230") (:authors ("lugecy" . "lugecy@gmail.com")) (:maintainer "myuhe") (:keywords "convenience") (:url . "https://github.com/myuhe/tinysegmenter.el"))]) + (tj3-mode . [(20180519 1228) nil "major mode for editing TaskJuggler 3 files" single ((:commit . "1d98eb23f1606392f34ef1b80517cfc940fb9950") (:authors ("Christophe Rhodes" . "christophe@rhodes.io")) (:maintainer "Christophe Rhodes" . "christophe@rhodes.io") (:url . "https://github.com/csrhodes/tj3-mode"))]) + (tldr . [(20200330 1025) ((emacs (24 3)) (request (0 3 0))) "tldr client for Emacs" single ((:commit . "d59405bd72f3379417b9e73f06e8848b43cb021d") (:authors ("Ono Hiroko" . "azazabc123@gmail.com")) (:maintainer "Ono Hiroko" . "azazabc123@gmail.com") (:keywords "tools" "docs") (:url . "https://github.com/kuanyui/tldr.el"))]) + (tmmofl . [(20121025 1101) nil "Calls functions dependant on font lock highlighting at point" single ((:commit . "532aa6978e994e2b069ffe37aaf9a0011a07dadc") (:authors ("Phillip Lord" . "p.lord@hgmp.mrc.ac.uk")) (:maintainer "Phillip Lord" . "p.lord@hgmp.mrc.ac.uk") (:keywords "minor mode" "font lock" "toggling."))]) + (tmux-pane . [(20200730 520) ((names (0 5)) (emacs (24)) (s (0))) "Provide integration between emacs window and tmux pane" single ((:commit . "92f67c6d270c7c923edcde81a235ed0b49a61a70") (:keywords "convenience" "terminals" "tmux" "window" "pane" "navigation" "integration") (:url . "https://github.com/laishulu/emacs-tmux-pane"))]) + (toc-mode . [(20201028 1141) ((emacs (26 1))) "Manage outlines of pdf and djvu document" single ((:commit . "36fe728f387ab2087e4096cb4734a8642dd7f880") (:authors ("Daniel Laurens Nicolai" . "dalanicolai@gmail.com")) (:maintainer "Daniel Laurens Nicolai" . "dalanicolai@gmail.com") (:keywords "tools" "outlines" "convenience") (:url . "https://github.com/dalanicolai/toc-mode"))]) + (toc-org . [(20210421 657) nil "add table of contents to org-mode files (formerly, org-toc)" single ((:commit . "df4ad6ff15e3b02f6322305638a441a636b9b37e") (:authors ("Sergei Nosov <sergei.nosov [at] gmail.com>")) (:maintainer "Sergei Nosov <sergei.nosov [at] gmail.com>") (:keywords "org-mode" "org-toc" "toc-org" "org" "toc" "table" "of" "contents") (:url . "https://github.com/snosov1/toc-org"))]) + (todoist . [(20200517 1825) ((dash (2 15 0)) (transient (0 1 0)) (org (8 3 5)) (emacs (25 3))) "Extension for interacting and managing todoist tasks" single ((:commit . "b3f003603111b7e31b94c354cf4c83c8208c01c3") (:authors ("Adrien Brochard")) (:maintainer "Adrien Brochard") (:keywords "todoist" "task" "todo" "comm") (:url . "https://github.com/abrochard/emacs-todoist"))]) + (todotxt . [(20200530 2337) nil "A major mode for editing todo.txt files" single ((:commit . "b51f7fa1357d2cbc1b72b10d15f8c6f009ce5a46") (:authors ("Rick Dillon" . "rpdillon@killring.org")) (:maintainer "Rick Dillon" . "rpdillon@killring.org") (:keywords "todo.txt" "todotxt" "todotxt.el") (:url . "https://github.com/rpdillon/todotxt.el"))]) + (todotxt-mode . [(20200228 952) nil "Major mode for editing todo.txt files" single ((:commit . "8b616ce1cf3e18a60757450a0acf22996abb9b79") (:authors ("Adolfo Villafiorita" . "adolfo.villafiorita@me.com")) (:maintainer "Adolfo Villafiorita" . "adolfo.villafiorita@me.com") (:keywords "wp" "files"))]) + (togetherly . [(20170426 616) ((cl-lib (0 3))) "allow multiple clients to edit a single buffer online" single ((:commit . "a6491bd5dd84f2aded0cd112ff06ae76ff78dfeb") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))]) + (toggle . [(20180316 3) ((cl-lib (0 5))) "quickly open corresponding file (eg test vs impl)." single ((:commit . "2d76365d2aa13543121d5c623df465adb68b76f7") (:authors ("Ryan Davis" . "ryand-ruby@zenspider.com")) (:maintainer "Ryan Davis" . "ryand-ruby@zenspider.com") (:keywords "files" "extensions" "convenience"))]) + (toggle-quotes . [(20140710 926) nil "Toggle between single and double quoted string" single ((:commit . "33abc221d6887f0518337851318065cd86c34b03") (:authors ("Jim Tian" . "tianjin.sc@gmail.com")) (:maintainer "Jim Tian" . "tianjin.sc@gmail.com") (:keywords "convenience" "quotes") (:url . "https://github.com/toctan/toggle-quotes.el"))]) + (toggle-test . [(20140723 537) nil "Toggle between source and test files in various programming languages" single ((:commit . "e969321f274903d705995a7d0345a257576ec5ff") (:authors ("Raghunandan Rao" . "r.raghunandan@gmail.com")) (:maintainer "Raghunandan Rao" . "r.raghunandan@gmail.com") (:keywords "tdd" "test" "toggle" "productivity") (:url . "https://github.com/rags/toggle-test"))]) + (toggle-window . [(20141207 1548) nil "toggle current window size between half and full" single ((:commit . "e82c60e543933880402ede11e9423e48a17dde53") (:authors ("Kenny Liu")) (:maintainer "Kenny Liu") (:keywords "hide" "window") (:url . "https://github.com/deadghost/toggle-window"))]) + (tomatinho . [(20180621 1748) nil "Simple and beautiful pomodoro timer" tar ((:commit . "b53354b9b9f496c0388d6a573b06b7d6fc53d0bd") (:authors ("Konrad Scorciapino" . "scorciapino@gmail.com")) (:maintainer "Konrad Scorciapino" . "scorciapino@gmail.com") (:keywords "time" "productivity" "pomodoro technique"))]) + (toml . [(20130903 1255) nil "TOML (Tom's Obvious, Minimal Language) parser" single ((:commit . "994644f9e68c383071eeee23389a7989b228c2d2") (:authors ("Wataru MIYAGUNI" . "gonngo@gmail.com")) (:maintainer "Wataru MIYAGUNI" . "gonngo@gmail.com") (:keywords "toml" "parser") (:url . "https://github.com/gongo/emacs-toml"))]) + (toml-mode . [(20161107 1800) ((emacs (24)) (cl-lib (0 5))) "Major mode for editing TOML files" single ((:commit . "f6c61817b00f9c4a3cab1bae9c309e0fc45cdd06") (:authors ("Felix Chern" . "idryman@gmail.com")) (:maintainer "Felix Chern" . "idryman@gmail.com") (:keywords "data" "toml") (:url . "https://github.com/dryman/toml-mode.el"))]) + (tommyh-theme . [(20131004 2330) nil "A bright, bold-colored theme for emacs" single ((:commit . "46d1c69ee0a1ca7c67b569b891a2f28fed89e7d5") (:authors ("William Glass" . "william.glass@gmail.com")) (:maintainer "William Glass" . "william.glass@gmail.com"))]) + (tongbu . [(20200414 507) ((emacs (25 1)) (web-server (0 1 2))) "A web server to share text or files between two devices" single ((:commit . "6f6e5c5446f0c5735357ab520b249ab97295653e") (:authors ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:keywords "tools") (:url . "https://github.com/xuchunyang/tongbu.el"))]) + (tornado-template-mode . [(20141128 1008) nil "A major mode for editing tornado templates" single ((:commit . "667c0663dbbd279b6c345446b9f2bc50eb52b747") (:authors ("Florian Mounier aka paradoxxxzero")) (:maintainer "Florian Mounier aka paradoxxxzero"))]) + (torus . [(20190325 753) ((emacs (26))) "A buffer groups manager" single ((:commit . "b309da8c2eaee573a2e2572f25a08ce5da9e9990") (:authors ("Chimay")) (:maintainer "Chimay") (:keywords "files" "buffers" "groups" "persistent" "history" "layout" "tabs") (:url . "https://github.com/chimay/torus"))]) + (total-lines . [(20171227 1239) ((emacs (24 3))) "Keep track of a buffer's total number of lines" single ((:commit . "473fa74a5416697ecd938866518bcad423f8fda6") (:authors ("Hinrik Örn Sigurðsson")) (:maintainer "Hinrik Örn Sigurðsson") (:keywords "convenience" "mode-line") (:url . "https://github.com/hinrik/total-lines"))]) + (totd . [(20150519 1440) ((s (1 9 0)) (cl-lib (0 5))) "Display a random daily emacs command." single ((:commit . "ca47b618ea8290776cdb5b0f1c2c335691f69660") (:authors ("Erik Hetzner" . "egh@e6h.org")) (:maintainer "Erik Hetzner" . "egh@e6h.org") (:keywords "help"))]) + (tox . [(20160810 1555) nil "Launch current python test with tox" single ((:commit . "7655eb254038d5e34433e8a9d66b3ffc9c72e40c") (:authors ("Chmouel Boudjnah" . "chmouel@chmouel.com")) (:maintainer "Chmouel Boudjnah" . "chmouel@chmouel.com") (:keywords "convenience" "tox" "python" "tests") (:url . "https://github.com/chmouel/tox.el"))]) + (toxi-theme . [(20160424 2126) ((emacs (24))) "A dark color theme by toxi" single ((:commit . "90c8828b91025adf5adc96011a35d25682991b8a") (:authors ("Karsten Schmidt" . "info@postspectacular.com")) (:maintainer "Karsten Schmidt" . "info@postspectacular.com") (:url . "http://bitbucket.org/postspectacular/toxi-theme/"))]) + (tql-mode . [(20170724 254) ((emacs (24))) "TQL mode" single ((:commit . "488add79eb3fc8ec02aedaa997fe1ed9e5c3e638") (:authors ("Sean McLaughlin" . "seanmcl@gmail.com")) (:maintainer "Sean McLaughlin" . "seanmcl@gmail.com") (:keywords "languages" "tql"))]) + (tr-ime . [(20210202 1057) ((emacs (27 1)) (w32-ime (0 0 1))) "Emulator of IME patch for Windows" tar ((:commit . "92591f7c0b94f8b1875f1078d1ba3be40848f0b8") (:authors ("Masamichi Hosoda" . "trueroad@trueroad.jp")) (:maintainer "Masamichi Hosoda" . "trueroad@trueroad.jp") (:url . "https://github.com/trueroad/tr-emacs-ime-module"))]) + (traad . [(20180730 48) ((dash (2 13 0)) (deferred (0 3 2)) (popup (0 5 0)) (request (0 2 0)) (request-deferred (0 2 0)) (virtualenvwrapper (20151123)) (f (0 20 0)) (bind-map (1 1 1))) "emacs interface to the traad refactoring server." single ((:commit . "98e23363b7e8a590a2f55976123a8c3da75c87a5") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/traad"))]) + (tracking . [(20210528 754) nil "Buffer modification tracking" tar ((:commit . "c0b2f997b3b73640d635ee84627bb8cf36c9adfe") (:authors ("Jorgen Schaefer" . "forcer@forcix.cx")) (:maintainer "Jorgen Schaefer" . "forcer@forcix.cx") (:url . "https://github.com/jorgenschaefer/circe/wiki/Tracking"))]) + (tracwiki-mode . [(20150119 1621) ((xml-rpc (1 6 8))) "Emacs Major mode for working with Trac" single ((:commit . "6a620444d59b438f42383b48cd4c19c03105dba6") (:authors ("Matthew Erickson" . "peawee@peawee.net")) (:maintainer "Matthew Erickson" . "peawee@peawee.net") (:keywords "trac" "wiki" "tickets"))]) + (tramp-auto-auth . [(20191027 1419) ((emacs (24 4)) (tramp (0 0))) "TRAMP automatic authentication library" single ((:commit . "f15a12dfab651aff60f4a9d70f868030a12344ac") (:authors ("Bruno Félix Rezende Ribeiro" . "oitofelix@gnu.org")) (:maintainer "Bruno Félix Rezende Ribeiro" . "oitofelix@gnu.org") (:keywords "comm" "processes") (:url . "https://github.com/oitofelix/tramp-auto-auth"))]) + (tramp-hdfs . [(20210526 339) ((emacs (24 4))) "Tramp extension to access hadoop/hdfs file system in Emacs" single ((:commit . "aa93bdbb3d5619c262ce53af1981edcd2a0705e5") (:authors ("Raghav Kumar Gautam" . "raghav@apache.org")) (:maintainer "Raghav Kumar Gautam" . "raghav@apache.org") (:keywords "tramp" "emacs" "hdfs" "hadoop" "webhdfs" "rest"))]) + (tramp-term . [(20190628 1207) nil "Automatic setup of directory tracking in ssh sessions." single ((:commit . "fdc3d5a29ca9549db462cd66d8f5d97026a1200f") (:authors ("Randy Morris" . "randy.morris@archlinux.us")) (:maintainer "Randy Morris" . "randy.morris@archlinux.us") (:keywords "tramp" "ssh") (:url . "https://github.com/randymorris/tramp-term.el"))]) + (transfer-sh . [(20200601 1708) ((emacs (24 3)) (async (1 0))) "Simple interface for sending buffer contents to transfer.sh" single ((:commit . "0621a66d00ec91a209a542c10b158095088bd44d") (:keywords "comm" "convenience" "files") (:url . "https://gitlab.com/tuedachu/transfer-sh.el"))]) + (transient . [(20210530 2252) ((emacs (25 1))) "Transient commands" tar ((:commit . "a96818c93a10d9ef9bb14e5c0b9fdc1a808b13b9") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "bindings") (:url . "https://github.com/magit/transient"))]) + (transient-dwim . [(20200812 1033) ((emacs (26 1)) (transient (0 1))) "Useful preset transient commands" single ((:commit . "de03d875dd89b1d838be67b0c44d9786adf96717") (:authors ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Naoya Yamashita" . "conao3@gmail.com") (:keywords "tools") (:url . "https://github.com/conao3/transient-dwim.el"))]) + (transient-posframe . [(20210102 130) ((emacs (26 0)) (posframe (0 4 3)) (transient (0 2 0))) "Using posframe to show transient" single ((:commit . "dcd898d1d35183a7d4f2c8f0ebcb43b4f8e70ebe") (:authors ("Yanghao Xie")) (:maintainer "Yanghao Xie" . "yhaoxie@gmail.com") (:keywords "convenience" "bindings" "tooltip") (:url . "https://github.com/yanghaoxie/transient-posframe"))]) + (transmission . [(20210218 2015) ((emacs (24 4)) (let-alist (1 0 5))) "Interface to a Transmission session" single ((:commit . "b5c1d391b4be469a07536e901e54a8680387025f") (:authors ("Mark Oteiza" . "mvoteiza@udel.edu")) (:maintainer "Mark Oteiza" . "mvoteiza@udel.edu") (:keywords "comm" "tools"))]) + (transpose-frame . [(20200307 2119) nil "Transpose windows arrangement in a frame" single ((:commit . "12e523d70ff78cc8868097b56120848befab5dbc") (:authors ("S. Irie")) (:maintainer "S. Irie") (:keywords "window"))]) + (transpose-mark . [(20150405 716) nil "Transpose data using the Emacs mark" single ((:commit . "667327602004794de97214cf336ac61650ef75b7") (:authors ("Kevin W. van Rooijen" . "kevin.van.rooijen@attichacker.com")) (:maintainer "Kevin W. van Rooijen" . "kevin.van.rooijen@attichacker.com") (:keywords "transpose" "convenience"))]) + (transwin . [(20200910 1636) ((emacs (24 3))) "Make window/frame transparent" single ((:commit . "20694aae145edd6ad496a395ef1a53ab37a59521") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/transwin"))]) + (trashed . [(20200523 231) ((emacs (25 1))) "Viewing/editing system trash can" single ((:commit . "23e782f78d9adf6b5479a01bfac90b2cfbf729fe") (:authors ("Shingo Tanaka" . "shingo.fg8@gmail.com")) (:maintainer "Shingo Tanaka" . "shingo.fg8@gmail.com") (:keywords "files" "convenience" "unix") (:url . "https://github.com/shingo256/trashed"))]) + (travis . [(20150825 1138) ((s (1 9 0)) (dash (2 9 0)) (pkg-info (0 5 0)) (request (0 1 0))) "Emacs client for Travis" tar ((:commit . "754ef07c17fed17ab03664ad11e2b0b2ef5e78ed") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:keywords "travis") (:url . "https://github.com/nlamirault/emacs-travis"))]) + (tray . [(20210214 1119) ((emacs (27 1)) (transient (0 3 0))) "Various transient menus" single ((:commit . "e2b169daae9d1d6f7e9fc32365247027fb4e87ba") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "compile" "convenience" "lisp") (:url . "https://git.sr.ht/~tarsius/tray"))]) + (tree-mode . [(20151104 1331) nil "A mode to manage tree widgets" single ((:commit . "b06078826d5875d74b0e7b7ac47b0d0917610534") (:authors (nil . "wenbinye@163.com")) (:maintainer nil . "wenbinye@163.com") (:keywords "help" "convenience" "widget"))]) + (tree-sitter . [(20210328 434) ((emacs (25 1)) (tsc (0 15 1))) "Incremental parsing system" tar ((:commit . "7f5d0938002092ec08830a73f64961021303e1e9") (:authors ("Tuấn-Anh Nguyễn" . "ubolonton@gmail.com")) (:maintainer "Tuấn-Anh Nguyễn" . "ubolonton@gmail.com") (:keywords "languages" "tools" "parsers" "tree-sitter") (:url . "https://github.com/ubolonton/emacs-tree-sitter"))]) + (tree-sitter-indent . [(20210322 2033) ((emacs (26 1)) (tree-sitter (0 12 1)) (seq (2 20))) "Provide indentation with a Tree-sitter backend" single ((:commit . "18d263720c5a8f7fde0db368c7c36ea70437fc0b") (:authors ("Felipe Lema" . "felipelema@mortemale.org")) (:maintainer "Felipe Lema" . "felipelema@mortemale.org") (:keywords "convenience" "internal") (:url . "https://codeberg.org/FelipeLema/tree-sitter-indent.el"))]) + (tree-sitter-langs . [(20210314 1704) ((emacs (25 1)) (tree-sitter (0 15 0))) "Grammar bundle for tree-sitter" tar ((:commit . "5d362ce98dcf656d7a55fcad6ae21c0a2caca861") (:authors ("Tuấn-Anh Nguyễn" . "ubolonton@gmail.com")) (:maintainer "Tuấn-Anh Nguyễn" . "ubolonton@gmail.com") (:keywords "languages" "tools" "parsers" "tree-sitter") (:url . "https://github.com/ubolonton/tree-sitter-langs"))]) + (treefactor . [(20200516 1631) ((emacs (26 1)) (dash (2 16 0)) (f (0 20 0)) (org (9 2 6)) (avy (0 5 0))) "Restructure your messy Org documents" single ((:commit . "75357757022a4399ab772ff0d92065bd114dabe9") (:authors ("Leo Littlebook" . "Leo.Littlebook@gmail.com")) (:maintainer "Leo Littlebook" . "Leo.Littlebook@gmail.com") (:keywords "outlines" "files" "convenience") (:url . "https://github.com/cyberthal/treefactor"))]) + (treemacs . [(20210606 1918) ((emacs (26 1)) (cl-lib (0 5)) (dash (2 11 0)) (s (1 12 0)) (ace-window (0 9 0)) (pfuture (1 7)) (hydra (0 13 2)) (ht (2 2)) (cfrs (1 3 2))) "A tree style file explorer package" tar ((:commit . "c2b0beaeb0383c3e6cbc453d6c42cdbc87c6da5e") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs-all-the-icons . [(20210408 2051) ((emacs (26 1)) (all-the-icons (4 0 1)) (treemacs (0 0))) "all-the-icons integration for treemacs" single ((:commit . "c2b0beaeb0383c3e6cbc453d6c42cdbc87c6da5e") (:authors ("Eric Dallo" . "ercdll1337@gmail.com")) (:maintainer "Eric Dallo" . "ercdll1337@gmail.com") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs-evil . [(20210419 1753) ((emacs (26 1)) (evil (1 2 12)) (treemacs (0 0))) "Evil mode integration for treemacs" single ((:commit . "c2b0beaeb0383c3e6cbc453d6c42cdbc87c6da5e") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs-icons-dired . [(20210605 1118) ((treemacs (0 0)) (emacs (26 1))) "Treemacs icons for dired" single ((:commit . "c2b0beaeb0383c3e6cbc453d6c42cdbc87c6da5e") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs-magit . [(20210107 1251) ((emacs (26 1)) (treemacs (0 0)) (pfuture (1 3)) (magit (2 90 0))) "Magit integration for treemacs" single ((:commit . "c2b0beaeb0383c3e6cbc453d6c42cdbc87c6da5e") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs-persp . [(20210114 2135) ((emacs (26 1)) (treemacs (0 0)) (persp-mode (2 9 7)) (dash (2 11 0))) "Persp-mode integration for treemacs" single ((:commit . "c2b0beaeb0383c3e6cbc453d6c42cdbc87c6da5e") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs-perspective . [(20210116 1155) ((emacs (26 1)) (treemacs (0 0)) (perspective (2 8)) (dash (2 11 0))) "Perspective integration for treemacs" single ((:commit . "c2b0beaeb0383c3e6cbc453d6c42cdbc87c6da5e") (:authors ("Alexander Miller" . "alexanderm@web.de") ("Jason Dufair" . "jase@dufair.org")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treemacs-projectile . [(20210107 1251) ((emacs (26 1)) (projectile (0 14 0)) (treemacs (0 0))) "Projectile integration for treemacs" single ((:commit . "c2b0beaeb0383c3e6cbc453d6c42cdbc87c6da5e") (:authors ("Alexander Miller" . "alexanderm@web.de")) (:maintainer "Alexander Miller" . "alexanderm@web.de") (:url . "https://github.com/Alexander-Miller/treemacs"))]) + (treepy . [(20191108 2217) ((emacs (25 1))) "Generic tree traversal tools" single ((:commit . "3ac940e97f3d03e48ca9d7fcd74916a9b01c72f3") (:authors ("Daniel Barreto" . "daniel.barreto.n@gmail.com")) (:maintainer "Daniel Barreto" . "daniel.barreto.n@gmail.com") (:keywords "lisp" "maint" "tools") (:url . "https://github.com/volrath/treepy.el"))]) + (treeview . [(20200921 6) ((emacs (24 4))) "A generic tree navigation library" single ((:commit . "e6012303670d112596e00eb3cb505eb0e0d61d84") (:authors ("Tilman Rassy" . "tilman.rassy@googlemail.com")) (:maintainer "Tilman Rassy" . "tilman.rassy@googlemail.com") (:keywords "lisp" "tools" "internal" "convenience") (:url . "https://github.com/tilmanrassy/emacs-treeview"))]) + (trident-mode . [(20190410 2036) ((emacs (24)) (slime (20130526)) (skewer-mode (1 5 0)) (dash (1 0 3))) "Live Parenscript interaction" single ((:commit . "109a1bc10bd0c4b47679a6ca5c4cd27c7c8d4ccb") (:authors ("John Mastro" . "john.b.mastro@gmail.com")) (:maintainer "John Mastro" . "john.b.mastro@gmail.com") (:keywords "languages" "lisp" "processes" "tools") (:url . "https://github.com/johnmastro/trident-mode.el"))]) + (trinary . [(20180904 2313) ((emacs (24))) "Trinary logic." single ((:commit . "886232c6d7e92a8e9fe573eef46754ebe321f90d") (:authors ("Matúš Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matúš Goljer" . "matus.goljer@gmail.com") (:keywords "languages") (:url . "https://github.com/Fuco1/trinary-logic"))]) + (tron-legacy-theme . [(20210420 1201) nil "An original retro-futuristic theme inspired by Tron: Legacy" single ((:commit . "e7d16ebe4a824e7d7766fb34ffe4ea3b002f3d23") (:authors ("Ian Y.E. Pan")) (:maintainer "Ian Y.E. Pan") (:url . "https://github.com/ianpan870102/tron-legacy-emacs-theme"))]) + (trr . [(20191019 1403) nil "a type-writing training program on GNU Emacs." tar ((:commit . "f841173e11213ac6916b2d3394b28fb202543871") (:authors ("YAMAMOTO Hirotaka" . "ymmt@is.s.u-tokyo.ac.jp") ("KATO Kenji" . "kato@suri.co.jp") (" *Original Author") ("INAMURA You" . "inamura@icot.or.jp") (" *Original Author")) (:maintainer "YAMAMOTO Hirotaka" . "ymmt@is.s.u-tokyo.ac.jp") (:keywords "games" "faces"))]) + (truthy . [(20140508 2041) ((list-utils (0 4 2))) "Test the content of a value" single ((:commit . "8ed8d07772aa8457554547eb17e264b5df2b4a69") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "extensions") (:url . "http://github.com/rolandwalker/truthy"))]) + (try . [(20181204 236) ((emacs (24))) "Try out Emacs packages." single ((:commit . "8831ded1784df43a2bd56c25ad3d0650cdb9df1d") (:authors ("Lars Tveito" . "larstvei@ifi.uio.no")) (:maintainer "Lars Tveito" . "larstvei@ifi.uio.no") (:keywords "packages") (:url . "http://github.com/larstvei/try"))]) + (ts . [(20201212 1041) ((emacs (26 1)) (dash (2 14 1)) (s (1 12 0))) "Timestamp and date/time library" single ((:commit . "b7ca357a0ed57694e0b25ec1b1ca12e24a4ce541") (:authors (nil . "Adam Porter <adam@alphapapa.net")) (:maintainer nil . "Adam Porter <adam@alphapapa.net") (:keywords "calendar" "lisp") (:url . "http://github.com/alphapapa/ts.el"))]) + (ts-comint . [(20181219 719) nil "Run a Typescript interpreter in an inferior process window." single ((:commit . "786b88fffc553e122868a1c4883f14136a040df6") (:authors ("Paul Huff" . "paul.huff@gmail.com")) (:maintainer "Paul Huff" . "paul.huff@gmail.com") (:keywords "typescript" "node" "inferior-mode" "convenience") (:url . "https://github.com/josteink/ts-comint"))]) + (tsc . [(20210320 1052) ((emacs (25 1))) "Core Tree-sitter APIs" tar ((:commit . "7f5d0938002092ec08830a73f64961021303e1e9") (:authors ("Tuấn-Anh Nguyễn" . "ubolonton@gmail.com") ("Jorge Javier Araya Navarro" . "jorgejavieran@yahoo.com.mx")) (:maintainer "Tuấn-Anh Nguyễn" . "ubolonton@gmail.com") (:keywords "languages" "tools" "parsers" "dynamic-modules" "tree-sitter") (:url . "https://github.com/ubolonton/emacs-tree-sitter"))]) + (tss . [(20150913 1408) ((auto-complete (1 4 0)) (json-mode (1 1 0)) (log4e (0 2 0)) (yaxception (0 1))) "provide a interface for auto-complete.el/flymake.el on typescript-mode." tar ((:commit . "81ac6351a2ae258fd0ebf916dae9bd5a179fefd0") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "typescript" "completion") (:url . "https://github.com/aki2o/emacs-tss"))]) + (tt-mode . [(20130804 1110) nil "Emacs major mode for editing Template Toolkit files." single ((:commit . "85ed3832e7eef391f7879d9990d59c7a3493c15e") (:authors ("Dave Cross" . "dave@dave.org.uk")) (:maintainer "Dave Cross" . "dave@dave.org.uk"))]) + (ttl-mode . [(20160505 832) nil "mode for Turtle (and Notation 3)" single nil]) + (tuareg . [(20210605 1629) ((caml (3 12 0 1)) (emacs (24 4))) "OCaml mode for Emacs." tar ((:commit . "6559b203bac9416bcdf4b53d217d76893f4454be") (:authors ("Albert Cohen" . "Albert.Cohen@inria.fr") ("Sam Steingold" . "sds@gnu.org") ("Christophe Troestler" . "Christophe.Troestler@umons.ac.be") ("Till Varoquaux" . "till@pps.jussieu.fr") ("Sean McLaughlin" . "seanmcl@gmail.com") ("Stefan Monnier" . "monnier@iro.umontreal.ca")) (:maintainer "Albert Cohen" . "Albert.Cohen@inria.fr") (:keywords "ocaml" "languages") (:url . "https://github.com/ocaml/tuareg"))]) + (tumble . [(20160112 729) ((http-post-simple (0)) (cl-lib (0 5))) "an Tumblr mode for Emacs" single ((:commit . "e8fd7643cccf2b6ea4170f0c5f1f87d007e7fa00") (:authors ("Federico Builes" . "federico.builes@gmail.com")) (:maintainer "Federico Builes" . "federico.builes@gmail.com") (:keywords "tumblr"))]) + (tumblesocks . [(20191014 356) ((htmlize (1 39)) (oauth (1 0 3)) (markdown-mode (1 8 1))) "An Emacs tumblr client." tar ((:commit . "0e4c3847e31a59d405b9927107a23dde9531d744") (:authors ("gcr" . "gcr@sneakygcr.net")) (:maintainer "gcr" . "gcr@sneakygcr.net") (:url . "http://github.com/gcr/tumblesocks"))]) + (turing-machine . [(20180222 438) ((emacs (24 4))) "Single-tape Turing machine simulator" single ((:commit . "fa60b76a5bac1f54b7a1b3dc55aae7602c7e385b") (:authors ("Diego A. Mundo" . "diegoamundo@gmail.com")) (:maintainer "Diego A. Mundo" . "diegoamundo@gmail.com") (:keywords "turing" "machine" "simulation") (:url . "http://github.com/therockmandolinist/turing-machine"))]) + (turkish . [(20170910 1511) nil "Convert to Turkish characters on-the-fly" single ((:commit . "9831a316c176bb21a1b91226323ea4133163e00c") (:authors ("Deniz Yüret")) (:maintainer "Emre Sevinç" . "emre.sevinc@gmail.com") (:keywords "turkish" "languages" "automatic" "conversion") (:url . "http://www.denizyuret.com/2006/11/emacs-turkish-mode.html"))]) + (turnip . [(20150309 629) ((dash (2 6 0)) (s (1 9 0))) "Interacting with tmux from Emacs" single ((:commit . "2fd32562fc6fc1cda6d91aa939cfb29f9b16e9de") (:authors ("Johann Klähn" . "kljohann@gmail.com")) (:maintainer "Johann Klähn" . "kljohann@gmail.com") (:keywords "terminals" "tools"))]) + (twig-mode . [(20130220 1850) nil "A major mode for twig" single ((:commit . "2849f273a4855d3314a9c0cc84134f5b28ad5ea6") (:authors ("Bojan Matic aka moljac024")) (:maintainer "Bojan Matic aka moljac024"))]) + (twilight-anti-bright-theme . [(20160622 848) nil "A soothing Emacs 24 light-on-dark theme" single ((:commit . "523b95fcdbf4a6a6483af314ad05354a3d80f23f") (:authors ("Jim Myhrberg" . "contact@jimeh.me")) (:maintainer "Jim Myhrberg" . "contact@jimeh.me") (:keywords "themes") (:url . "https://github.com/jimeh/twilight-anti-bright-theme.el"))]) + (twilight-bright-theme . [(20130605 843) nil "A Emacs 24 faces port of the TextMate theme" single ((:commit . "322157cb2f3bf7920ecd209dafc31bc1c7959f49") (:authors ("Jim Myhrberg" . "contact@jimeh.me")) (:maintainer "Jim Myhrberg" . "contact@jimeh.me") (:keywords "themes") (:url . "https://github.com/jimeh/twilight-bright-theme.el"))]) + (twilight-theme . [(20120412 1303) nil "Twilight theme for GNU Emacs 24 (deftheme)" single ((:commit . "77c4741cb3dcf16e53d06d6c2ffdc660c40afb5b") (:authors ("Nick Parker" . "nickp@developernotes.com")) (:maintainer "Nick Parker" . "nickp@developernotes.com"))]) + (twittering-mode . [(20181121 1402) nil "Major mode for Twitter" single ((:commit . "114891e8fdb4f06b1326a6cf795e49c205cf9e29") (:authors ("Tadashi MATSUO" . "tad@mymail.twin.ne.jp") ("Y. Hayamizu" . "y.hayamizu@gmail.com") ("Tsuyoshi CHO" . "Tsuyoshi.CHO+develop@Gmail.com") ("Alberto Garcia" . "agarcia@igalia.com") ("Xavier Maillard" . "xavier@maillard.im")) (:maintainer "Tadashi MATSUO" . "tad@mymail.twin.ne.jp") (:keywords "twitter" "web") (:url . "http://twmode.sf.net/"))]) + (twtxt . [(20200824 1323) ((emacs (25 1)) (request (0 2 0))) "Client twtxt" single ((:commit . "e7bafaf92124bb4f2a0be5c1a635b80f9b3a8c87") (:authors ("DEADBLACKCLOVER" . "deadblackclover@protonmail.com")) (:maintainer "DEADBLACKCLOVER" . "deadblackclover@protonmail.com") (:url . "https://github.com/deadblackclover/twtxt-el"))]) + (typescript-mode . [(20201002 1109) ((emacs (24 3))) "Major mode for editing typescript" tar ((:commit . "b369d7d2518fa11760ac3908a383405350cd51d2") (:keywords "typescript" "languages") (:url . "http://github.com/ananthakumaran/typescript.el"))]) + (typing . [(20180830 2203) nil "The Typing Of Emacs" single ((:commit . "a2ef25dde2d8eb91bd9c0c6164cb5208208647fa") (:authors ("Alex Schroeder" . "alex@gnu.org")) (:maintainer "Alex Schroeder" . "alex@gnu.org") (:keywords "games") (:url . "http://www.emacswiki.org/emacs/TypingOfEmacs"))]) + (typing-game . [(20160426 1220) nil "a simple typing game" single ((:commit . "616435a5270274f4c7b698697674dbb2039049a4") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "lisp" "game"))]) + (typit . [(20210318 1747) ((emacs (24 4)) (f (0 18)) (mmt (0 1 1))) "Typing game similar to tests on 10 fast fingers" tar ((:commit . "fa125bf43757737fbcf91958b76c38b440d54b4c") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:keywords "games") (:url . "https://github.com/mrkkrp/typit"))]) + (typo . [(20200706 1714) nil "Minor mode for typographic editing" single ((:commit . "173ebe4fc7ac38f344b16e6eaf41f79e38f20d57") (:authors ("Jorgen Schaefer" . "forcer@forcix.cx")) (:maintainer "Jorgen Schaefer" . "forcer@forcix.cx") (:keywords "convenience" "wp") (:url . "https://github.com/jorgenschaefer/typoel"))]) + (typo-suggest . [(20200830 1143) ((emacs (24 3)) (helm (3 0)) (company (0 9 10)) (s (1 12 0)) (dash (2 13 0))) "Don't make typos with the help of helm and company" single ((:commit . "3014d18ae2f0b6b857bb613f373e034c743f4d2e") (:authors ("Kadir Can Çetin" . "kadircancetin@gmail.com")) (:maintainer "Kadir Can Çetin" . "kadircancetin@gmail.com") (:keywords "convenience" "wp") (:url . "https://github.com/kadircancetin/typo-suggest"))]) + (typoscript-mode . [(20170126 912) ((emacs (24 4)) (use-package (0))) "mode for TypoScript files" single ((:commit . "44e7567e921573c4f33c537b827f71fb1f565c32") (:authors ("Johannes Goslar")) (:maintainer "Johannes Goslar") (:keywords "typo3" "typoscript") (:url . "https://github.com/ksjogo/typoscript-mode"))]) + (ubuntu-theme . [(20150805 1506) nil "A theme inspired by the default terminal colors in Ubuntu" single ((:commit . "88b0eefc75d4cbcde103057e1c5968d4c3052f69") (:authors ("Francesc Rocher" . "francesc.rocher@gmail.com")) (:maintainer "Francesc Rocher" . "francesc.rocher@gmail.com") (:url . "http://github.com/rocher/ubuntu-theme"))]) + (ucs-utils . [(20150826 1414) ((persistent-soft (0 8 8)) (pcache (0 2 3)) (list-utils (0 4 2))) "Utilities for Unicode characters" tar ((:commit . "cbfd42f822bf5717934fa2d92060e6e24a813433") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "i18n" "extensions") (:url . "http://github.com/rolandwalker/ucs-utils"))]) + (udev-mode . [(20200702 1536) ((emacs (24))) "Major mode for editing udev rules files" single ((:commit . "5ca236980662141518603672ebdbdf863756da5a") (:authors ("Benjamin Staffin" . "benley@gmail.com")) (:maintainer "Benjamin Staffin" . "benley@gmail.com") (:keywords "languages" "unix") (:url . "https://github.com/benley/emacs-udev-mode"))]) + (uimage . [(20160901 1221) nil "An iimage like mode with the ability to display url images" single ((:commit . "9893d09160ef7e8c0ecdcd74fca99ffeb5f9d70d") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "lisp" "url" "image"))]) + (ujelly-theme . [(20180214 1624) nil "Ujelly theme for GNU Emacs 24 (deftheme)" single ((:commit . "bf724ce7806a738d2043544061e5f9bbfc56e674") (:authors ("Mark Tran" . "mark.tran@gmail.com")) (:maintainer "Mark Tran" . "mark.tran@gmail.com") (:url . "http://github.com/marktran/color-theme-ujelly"))]) + (ukrainian-holidays . [(20130720 1349) nil "Ukrainian holidays for Emacs calendar." single ((:commit . "e52b0c92843e9f4d0415a7ba3b8559785497d23d") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/ukrainian-holidays"))]) + (uml-mode . [(20200129 1147) ((emacs (24 4)) (seq (0))) "Minor mode for ascii uml sequence diagrams" single ((:commit . "4c37ac1c4424b2313cd8f16ba48a98a4cc214200") (:authors ("Ian Martins" . "ianxm@jhu.edu")) (:maintainer "Ian Martins" . "ianxm@jhu.edu") (:keywords "docs") (:url . "http://github.com/ianxm/emacs-uml"))]) + (uncrustify-mode . [(20130707 1359) nil "Minor mode to automatically uncrustify." single ((:commit . "73893d000361e95784911e5ec268ad0ab2a1473c") (:authors ("Tabito Ohtani" . "koko1000ban@gmail.com")) (:maintainer "Tabito Ohtani" . "koko1000ban@gmail.com") (:keywords "uncrustify"))]) + (undercover . [(20210602 2119) ((emacs (24)) (dash (2 0 0)) (shut-up (0 3 2))) "Test coverage library for Emacs Lisp" single ((:commit . "1d3587f1fad66a747688f36636b67b33b73447d3") (:authors ("Sviridov Alexander" . "sviridov.vmi@gmail.com")) (:maintainer "Sviridov Alexander" . "sviridov.vmi@gmail.com") (:keywords "lisp" "tests" "coverage" "tools") (:url . "https://github.com/sviridov/undercover.el"))]) + (underline-with-char . [(20191128 2309) ((emacs (24))) "Underline with a char" single ((:commit . "36577e72aa4fbfa7f1abad01842359209f543751") (:maintainer nil . "marcowahlsoft@gmail.com") (:keywords "convenience") (:url . "https://gitlab.com/marcowahl/underline-with-char"))]) + (undersea-theme . [(20200719 618) ((emacs (24 3))) "Theme styled after undersea imagery" single ((:commit . "d4edb2cc110f1679ebc82cb52a4242cbc74636db") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/undersea-theme"))]) + (underwater-theme . [(20131118 2) nil "A gentle, deep blue color theme" single ((:commit . "4eb9ef014f580adc135d91d1cd68d37a310640b6") (:authors ("Jon-Michael Deldin" . "dev@jmdeldin.com")) (:maintainer "Jon-Michael Deldin" . "dev@jmdeldin.com") (:keywords "faces"))]) + (undo-fu . [(20210418 920) ((emacs (24 3))) "Undo helper with redo" single ((:commit . "e0ad06b5ef2ac2733dad2ad48e3957b5c36edfa5") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-undo-fu"))]) + (undo-fu-session . [(20210418 920) ((emacs (24 1))) "Persistent undo, available between sessions" single ((:commit . "243d93b4c7c1224e7067cd323f64d23dfdfe7c0e") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:keywords "convenience") (:url . "https://gitlab.com/ideasman42/emacs-undo-fu-session"))]) + (undo-propose . [(20210207 45) ((emacs (24 3))) "Simple and safe undo navigation" single ((:commit . "91a1dfe516d90dab69c368f6669bacb2458ec5e9") (:authors ("Jack Kamm")) (:maintainer "Jack Kamm") (:keywords "convenience" "files" "undo" "redo" "history") (:url . "https://github.com/jackkamm/undo-propose.el"))]) + (undohist . [(20210517 411) ((cl-lib (1 0))) "Persistent undo history for GNU Emacs" single ((:commit . "56c6f58873f8ebb743e4dc5aff143744720375bd") (:authors ("MATSUYAMA Tomohiro" . "m2ym.pub@gmail.com")) (:maintainer "MATSUYAMA Tomohiro" . "m2ym.pub@gmail.com") (:keywords "convenience"))]) + (unfill . [(20210106 220) ((emacs (24 1))) "Do the opposite of fill-paragraph or fill-region" single ((:commit . "eef1614c79eb259cb782437a25680246793a924d") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "convenience") (:url . "https://github.com/purcell/unfill"))]) + (unicad . [(20200914 1500) ((emacs (24)) (nadvice (0 3))) "An elisp port of Mozilla Universal Charset Auto Detector" single ((:commit . "a5fd4e326a0607acc3776c11f41826e60b6486c6") (:authors ("Qichen Huang" . "unicad.el@gmail.com")) (:maintainer "Qichen Huang" . "unicad.el@gmail.com") (:keywords "i18n") (:url . "https://github.com/ukari/unicad"))]) + (unicode-emoticons . [(20150204 1108) nil "Shortcuts for common unicode emoticons" single ((:commit . "fb18631f342b0243cf77cf59ed2067c47aae5233") (:authors ("Gunther Hagleitner")) (:maintainer "Gunther Hagleitner") (:keywords "games" "entertainment" "comms") (:url . "https://github.com/hagleitn/unicode-emoticons"))]) + (unicode-enbox . [(20140508 2041) ((string-utils (0 3 2)) (ucs-utils (0 7 6)) (list-utils (0 4 2)) (persistent-soft (0 8 8)) (pcache (0 2 3))) "Surround a string with box-drawing characters" single ((:commit . "77074fac1994a4236f111d6a1d0cf79ea3fca151") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "extensions" "interface") (:url . "http://github.com/rolandwalker/unicode-enbox"))]) + (unicode-escape . [(20160614 1234) ((emacs (24)) (names (20151201 0)) (dash (2 12 1))) "Escape/Unescape unicode notations" single ((:commit . "fc69ec780d9e54c364a9252bd0cf1d2507f3fab7") (:authors ("KOBAYASHI Shigeru (kosh)" . "shigeru.kb@gmail.com")) (:maintainer "KOBAYASHI Shigeru (kosh)" . "shigeru.kb@gmail.com") (:keywords "i18n" "unicode") (:url . "https://github.com/kosh04/unicode-escape.el"))]) + (unicode-fonts . [(20200803 1335) ((font-utils (0 7 8)) (ucs-utils (0 8 2)) (list-utils (0 4 2)) (persistent-soft (0 8 10)) (pcache (0 3 1))) "Configure Unicode fonts" single ((:commit . "e3942fe40b418bfb2dc4e73633e09195437fef01") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "i18n" "faces" "frames" "wp" "interface") (:url . "http://github.com/rolandwalker/unicode-fonts"))]) + (unicode-math-input . [(20210612 847) ((emacs (25))) "Insert Unicode math symbols using TeX notation" single ((:commit . "2788d7824d23749a6e5b33f653c47471455da187") (:authors ("Augusto Stoffel")) (:maintainer "Augusto Stoffel") (:url . "https://github.com/astoff/unicode-math-input.el"))]) + (unicode-progress-reporter . [(20140508 2041) ((emacs (24 1 0)) (ucs-utils (0 7 6)) (list-utils (0 4 2)) (persistent-soft (0 8 8)) (pcache (0 2 3))) "Progress-reporter with fancy characters" single ((:commit . "5e66724fd7d15743213b082474d798117b194494") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "interface") (:url . "http://github.com/rolandwalker/unicode-progress-reporter"))]) + (unicode-troll-stopper . [(20190209 411) nil "Minor mode for Highlighting Unicode homoglyphs" single ((:commit . "5e8be35a7bf6382384a701663f7438ee27e4b67c") (:authors ("Cam Saül" . "cammsaul@gmail.com")) (:maintainer "Cam Saül" . "cammsaul@gmail.com") (:keywords "unicode") (:url . "https://github.com/camsaul/emacs-unicode-troll-stopper"))]) + (unicode-whitespace . [(20140508 2041) ((ucs-utils (0 7 6)) (list-utils (0 4 2)) (persistent-soft (0 8 8)) (pcache (0 2 3))) "teach whitespace-mode about fancy characters" single ((:commit . "a18c6b38d78b94f2eb1dcc4cb4fa91b6a17efabe") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "faces" "wp" "interface") (:url . "http://github.com/rolandwalker/unicode-whitespace"))]) + (unidecode . [(20201213 1449) nil "Transliterate Unicode to ASCII" tar ((:commit . "525b51b38f5b0435642005957740fe22ecb2a53c") (:authors ("sindikat <sindikat at mail36 dot net>")) (:maintainer "John Mastro" . "john.b.mastro@gmail.com"))]) + (unifdef . [(20200517 514) nil "Delete code guarded by processor directives" single ((:commit . "7a4b76f664c4375e3d98e8af0a29270752c13701") (:authors ("Anders Lindgren")) (:maintainer "Anders Lindgren") (:keywords "convenience" "languages") (:url . "https://github.com/Lindydancer/unifdef"))]) + (unify-opening . [(20171122 2012) ((emacs (24 4))) "Unify the mechanism to open files" single ((:commit . "502469ddba6d8d52159f53976265f7d956b6b17c") (:authors ("Damien Cassou" . "damien.cassou@gmail.com")) (:maintainer "Damien Cassou" . "damien.cassou@gmail.com") (:url . "https://github.com/DamienCassou/unify-opening"))]) + (unipoint . [(20140113 2224) nil "a simple way to insert unicode characters by TeX name" single ((:commit . "5da04aebac35a5c9e1d8704f2231808d42f4b36a") (:authors ("Andrew Gwozdziewycz" . "git@apgwoz.com")) (:maintainer "Andrew Gwozdziewycz" . "git@apgwoz.com") (:url . "https://github.com/apgwoz/unipoint"))]) + (unison . [(20160704 740) ((emacs (24 1))) "sync with Unison" single ((:commit . "a78a04c0d1398d00f75a1bd4799622a65bcb0f28") (:authors ("Kevin Brubeck Unhammer" . "unhammer@fsfe.org")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer@fsfe.org") (:keywords "sync") (:url . "http://github.com/unhammer/unison.el"))]) + (unison-mode . [(20160513 1501) nil "Syntax highlighting for unison file synchronization program" single ((:commit . "0bd6a65c0d12f87fcf7bdff15fe54444959b93bf") (:authors ("Karl Fogelmark" . "karlfogel@gmail.com")) (:maintainer "Karl Fogelmark" . "karlfogel@gmail.com") (:keywords "symchronization" "unison") (:url . "https://github.com/impaktor/unison-mode"))]) + (unisonlang-mode . [(20200803 808) ((emacs (25 1))) "Simple major mode for editing Unison" single ((:commit . "2b794adbe0b2a4edd40f350173a32b80bd2c5896") (:authors ("Dario Oddenino")) (:maintainer "Dario Oddenino") (:keywords "languages") (:url . "https://github.com/dariooddenino/unison-mode-emacs"))]) + (universal-emotions-emoticons . [(20180729 1941) ((emacs (24 4))) "Emoticons For The Six Universal Expressions" single ((:commit . "9cedd09ee65cb9fa71f27b0ab46a8353bdc00902") (:authors ("Grant Rettke" . "gcr@wisdomandwonder.com")) (:maintainer nil . "<gcr@wisdomandwonder.com>") (:keywords "convenience" "docs" "languages") (:url . "https://github.com/grettke/universal-emotions-emoticons"))]) + (unkillable-scratch . [(20190309 17) ((emacs (24))) "Disallow the \\*scratch\\* buffer from being killed" single ((:commit . "b24c2a760529833f230c14cb02ff6e7ec92288ab") (:authors ("Eric Crosson" . "eric.s.crosson@utexas.com")) (:maintainer "Eric Crosson" . "eric.s.crosson@utexas.com") (:keywords "convenience") (:url . "https://github.com/EricCrosson/unkillable-scratch"))]) + (unobtrusive-magit-theme . [(20200411 1349) ((emacs (24 1))) "An unobtrusive Magit theme" single ((:commit . "aede357009655d19d4468320b2b61b0f26a47593") (:authors ("Thomas A. Brown" . "tabsoftwareconsulting@gmail.com")) (:maintainer "Thomas A. Brown" . "tabsoftwareconsulting@gmail.com") (:keywords "faces" "vc" "magit") (:url . "https://github.com/tee3/unobtrusive-magit-theme"))]) + (untitled-new-buffer . [(20161212 1508) ((emacs (24 4)) (magic-filetype (0 2 0))) "Open untitled new buffer like other text editors." single ((:commit . "4eabc6937b0e83062ffce9de0d42110224063a6c") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:keywords "files" "convenience") (:url . "https://github.com/zonuexe/untitled-new-buffer.el"))]) + (upbo . [(20180422 822) ((dash (2 12 0)) (emacs (24 4))) "Karma Test Runner Integration" single ((:commit . "1e4b1e7f44f242a6cdcce0c157d07efe667b7bef") (:authors ("Sungho Kim(shiren)")) (:maintainer "Sungho Kim(shiren)") (:keywords "javascript" "js" "test" "karma") (:url . "http://github.com/shiren"))]) + (uptimes . [(20191121 1030) ((cl-lib (0 5)) (emacs (24))) "Track and display Emacs session uptimes." single ((:commit . "29ae6585eeed5a00719b2e52f5ae1082087c1778") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:keywords "processes" "uptime") (:url . "https://github.com/davep/uptimes.el"))]) + (url-shortener . [(20170805 242) nil "shorten long url and expand tinyurl" single ((:commit . "06db8270213b9e352d6c335b0663059a1353d05e") (:authors ("Yu Yang" . "yy2012cn@NOSPAM.gmail.com")) (:maintainer "Yu Yang" . "yy2012cn@NOSPAM.gmail.com") (:url . "https://github.com/yuyang0/url-shortener"))]) + (urlenc . [(20140116 1456) nil "URL encoding/decoding utility for Emacs." single ((:commit . "835a6dcb783bbe84714bae87a3464aa0b128bfac") (:authors ("Taiki SUGAWARA" . "buzz.taiki@gmail.com")) (:maintainer "Taiki SUGAWARA" . "buzz.taiki@gmail.com") (:keywords "url") (:url . "https://github.com/buzztaiki/urlenc-el"))]) + (urscript-mode . [(20190219 1604) ((emacs (24 4))) "major mode for editing URScript." single ((:commit . "b341f96b129ead8fb74d680cb4f546985bf110a9") (:authors ("Guido Schmidt" . "git@guidoschmidt.cc")) (:maintainer "Guido Schmidt" . "git@guidoschmidt.cc") (:keywords "languages") (:url . "https://github.com/guidoschmidt/urscript-mode"))]) + (usage-memo . [(20170926 37) nil "integration of Emacs help system and memo" single ((:commit . "88e15a9942a3e0a6e36e9c3e51e3edb746067b1a") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "convenience" "languages" "lisp" "help" "tools" "docs") (:url . "http://www.emacswiki.org/cgi-bin/wiki/download/usage-memo.el"))]) + (use-package . [(20210207 1926) ((emacs (24 3)) (bind-key (2 4))) "A configuration macro for simplifying your .emacs" tar ((:commit . "a7422fb8ab1baee19adb2717b5b47b9c3812a84c") (:authors ("John Wiegley" . "johnw@newartisans.com")) (:maintainer "John Wiegley" . "johnw@newartisans.com") (:keywords "dotemacs" "startup" "speed" "config" "package") (:url . "https://github.com/jwiegley/use-package"))]) + (use-package-chords . [(20181024 2322) ((use-package (2 1)) (bind-key (1 0)) (bind-chord (0 2)) (key-chord (0 6))) "key-chord keyword for use-package" single ((:commit . "a7422fb8ab1baee19adb2717b5b47b9c3812a84c") (:authors ("Justin Talbott" . "justin@waymondo.com")) (:maintainer "Justin Talbott" . "justin@waymondo.com") (:keywords "convenience" "tools" "extensions") (:url . "https://github.com/waymondo/use-package-chords"))]) + (use-package-el-get . [(20180131 505) ((use-package (1 0))) "el-get support for use package" single ((:commit . "cba87c4e9a3a66b7c10962e3aefdf11c83d737bc") (:authors ("Edward Knyshov" . "edvorg@gmail.com")) (:maintainer "Edward Knyshov" . "edvorg@gmail.com") (:keywords "dotemacs" "startup" "speed" "config" "package" "tools") (:url . "https://github.com/edvorg/use-package-el-get"))]) + (use-package-ensure-system-package . [(20180913 1501) ((use-package (2 1)) (system-packages (1 0 4))) "auto install system packages" single ((:commit . "a7422fb8ab1baee19adb2717b5b47b9c3812a84c") (:authors ("Justin Talbott" . "justin@waymondo.com")) (:maintainer "Justin Talbott" . "justin@waymondo.com") (:keywords "convenience" "tools" "extensions") (:url . "https://github.com/waymondo/use-package-ensure-system-package"))]) + (use-package-hydra . [(20181228 745) ((emacs (24 3)) (use-package (2 4))) "Adds :hydra keyword to use-package macro" single ((:commit . "8cd55a1128fbdf6327bb38a199d206225896d146") (:authors ("Toon Claes" . "toon@iotcl.com")) (:maintainer "Toon Claes" . "toon@iotcl.com") (:keywords "convenience" "extensions" "tools") (:url . "https://gitlab.com/to1ne/use-package-hydra"))]) + (use-proxy . [(20201209 853) ((exec-path-from-shell (1 12)) (emacs (26 2))) "Enable/Disable proxies respecting your HTTP/HTTPS env" single ((:commit . "43499194224483b27628fdf99f6f9ff6e731d844") (:authors ("Ray Wang" . "ray.hackmylife@gmail.com")) (:maintainer "Ray Wang" . "ray.hackmylife@gmail.com") (:keywords "proxy" "comm") (:url . "https://github.com/rayw000/use-proxy"))]) + (use-ttf . [(20201021 1620) ((emacs (24 4)) (s (1 12 0))) "Keep font consistency across different OSs" single ((:commit . "408c01423d7036463891d83e4a21227250ed2a14") (:authors ("Shen, Jen-Chieh" . "jcs090218@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:url . "https://github.com/jcs-elpa/use-ttf"))]) + (utimeclock . [(20210418 1050) ((emacs (24 4))) "Simple utility for manual time tracking" single ((:commit . "21e74953a88ea5a0a17b86a951bf649dc9a0eaf4") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-utimeclock"))]) + (utop . [(20210607 1941) ((emacs (24)) (tuareg (2 2 0))) "Universal toplevel for OCaml" single ((:commit . "bac3946079a98df00f31656dc10c6c9f1a8bc422") (:authors ("Jeremie Dimino" . "jeremie@dimino.org")) (:maintainer "Jeremie Dimino" . "jeremie@dimino.org") (:keywords "ocaml" "languages") (:url . "https://github.com/diml/utop"))]) + (uuid . [(20120910 851) nil "UUID's for EmacsLisp" single ((:commit . "1519bfeb0e31602b840bc8dd35d7c7e732c159fe") (:authors ("James Mastros")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:keywords "lisp"))]) + (uuidgen . [(20200816 1308) nil "Provides various UUID generating functions" single ((:commit . "b50e6fef2de4199a8f207b46588c2cb3890ddd85") (:authors ("Kan-Ru Chen" . "kanru@kanru.info")) (:maintainer "Kan-Ru Chen" . "kanru@kanru.info") (:keywords "extensions" "lisp" "tools"))]) + (v-mode . [(20210608 629) ((emacs (25 1)) (dash (2 17 0)) (hydra (0 15 0))) "A major mode for the V programming language" single ((:commit . "3afbd72180417ada6aeeec861081495aca962124") (:keywords "languages" "programming") (:url . "https://github.com/damon-kwok/v-mode"))]) + (v2ex-mode . [(20160720 345) ((cl-lib (0 5)) (request (0 2)) (let-alist (1 0 3))) "Major mode for visit http://v2ex.com/ site." single ((:commit . "b7d19bb594b43ea3824a6f215dd1e5d1d4c0e8ad") (:authors ("Aborn Jiang" . "aborn.jiang@gmail.com")) (:maintainer "Aborn Jiang" . "aborn.jiang@gmail.com") (:keywords "v2ex" "v2ex.com") (:url . "https://github.com/aborn/v2ex-mode"))]) + (vagrant . [(20170301 2206) nil "Manage a vagrant box from emacs" single ((:commit . "636ce2f9af32ea199170335a9cf1201b64873440") (:authors ("Robert Crim" . "rob@servermilk.com")) (:maintainer "Robert Crim" . "rob@servermilk.com") (:keywords "vagrant" "chef") (:url . "https://github.com/ottbot/vagrant.el"))]) + (vagrant-tramp . [(20210217 704) ((dash (2 12 0))) "Vagrant method for TRAMP" tar ((:commit . "5f00b42a0c023c461cef7af4de7652d90c788b4d") (:authors ("Doug MacEachern" . "dougm@vmware.com") ("Ryan Prior " . "ryanprior@gmail.com")) (:maintainer "Doug MacEachern" . "dougm@vmware.com") (:keywords "vagrant") (:url . "https://github.com/dougm/vagrant-tramp"))]) + (vala-mode . [(20201218 2109) nil "Vala mode derived mode" single ((:commit . "d696a8177e94c81ea557ad364a3b3dcc3abbc50f") (:authors ("2005 Dylan R. E. Moonfire") (" 2008 Étienne BERSAC")) (:maintainer "Étienne BERSAC" . "bersace03@laposte.net") (:keywords "vala" "languages" "oop"))]) + (vala-snippets . [(20150429 352) ((yasnippet (0 8 0))) "Yasnippets for Vala" tar ((:commit . "671439501060449bd100b9fffd524a86064fbfbb") (:authors ("Daniel Gopar")) (:maintainer "Daniel Gopar") (:url . "https://github.com/gopar/vala-snippets"))]) + (vale-mode . [(20190725 125) ((emacs (25))) "Major mode for writing Vale vaf files" single ((:commit . "48bbc4b4ee5bf0b1b73e52705c0fbc112b255cd0") (:authors ("Jay Bosamiya" . "jaybosamiya@gmail.com")) (:maintainer "Jay Bosamiya" . "jaybosamiya@gmail.com") (:keywords "convenience" "languages") (:url . "https://github.com/jaybosamiya/vale-mode.el"))]) + (validate-html . [(20210420 2344) ((emacs (25 1))) "Compilation mode for W3C HTML Validator" single ((:commit . "748e874d50c3a95c61590ae293778e26de05c5f9") (:authors ("Arthur A. Gleckler" . "melpa4aag@speechcode.com")) (:maintainer "Arthur A. Gleckler" . "melpa4aag@speechcode.com") (:keywords "languages" "tools") (:url . "https://github.com/arthurgleckler/validate-html"))]) + (vbasense . [(20140221 2353) ((auto-complete (1 4 0)) (log4e (0 2 0)) (yaxception (0 1))) "provide a environment like Visual Basic Editor." tar ((:commit . "8c61a492d7c15218ae1a96e2aebfe6f78bfff6db") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "vba" "completion") (:url . "https://github.com/aki2o/emacs-vbasense"))]) + (vc-auto-commit . [(20210216 1517) nil "Auto-committing feature for your repository" tar ((:commit . "56f478016a541b395092a9d3cdc0da84a37b30a1") (:authors ("Sylvain Rousseau <thisirs at gmail dot com>")) (:maintainer "Sylvain Rousseau <thisirs at gmail dot com>") (:keywords "vc" "convenience") (:url . "http://github.com/thisirs/vc-auto-commit.git"))]) + (vc-check-status . [(20210216 1525) nil "Warn you when quitting emacs and leaving repo dirty." tar ((:commit . "d95ef8f0799cd3dd83726ffa9b01b076f378ce34") (:authors ("Sylvain Rousseau <thisirs at gmail dot com>")) (:maintainer "Sylvain Rousseau <thisirs at gmail dot com>") (:keywords "vc" "convenience") (:url . "https://github.com/thisirs/vc-check-status"))]) + (vc-darcs . [(20170905 320) ((emacs (24))) "a VC backend for darcs" single ((:commit . "390fb1ebdda1ffac45b9be02626dde3b6d95ac11") (:authors ("Jorgen Schaefer" . "forcer@forcix.cx") ("Juliusz Chroboczek" . "jch@pps.univ-paris-diderot.fr")) (:maintainer "Libor Čapák" . "capak@inputwish.com") (:keywords "vc"))]) + (vc-defer . [(20201116 701) ((emacs (25 1))) "Defer non-essential vc.el work" single ((:commit . "aeafc419c1788b3ac4f0590c635374eefd7c220c") (:authors ("Matt Armstrong" . "marmstrong@google.com")) (:maintainer "Tom Fitzhenry" . "tomfitzhenry@google.com") (:keywords "vc" "tools") (:url . "https://github.com/google/vc-defer"))]) + (vc-fossil . [(20210124 812) nil "VC backend for the fossil sofware configuraiton management system" single ((:commit . "5d66231e25f34aaedb4befa0fcd80a9c30d7e607") (:authors ("Venkat Iyer" . "venkat@comit.com")) (:maintainer "Venkat Iyer" . "venkat@comit.com"))]) + (vc-hgcmd . [(20210608 1030) ((emacs (25 1))) "VC mercurial backend that uses hg command server" single ((:commit . "c00d792b34219a387832f8f9b4a689d7972f592a") (:authors ("Andrii Kolomoiets" . "andreyk.mad@gmail.com")) (:maintainer "Andrii Kolomoiets" . "andreyk.mad@gmail.com") (:keywords "vc") (:url . "https://github.com/muffinmad/emacs-vc-hgcmd"))]) + (vc-msg . [(20201210 157) ((emacs (24 4)) (popup (0 5 0))) "Show commit information of current line" tar ((:commit . "6c94578b5c692ade27c8b34bf5d99333ee7b4680") (:authors ("Chen Bin <chenbin DOT sh AT gmail DOT com>")) (:maintainer "Chen Bin <chenbin DOT sh AT gmail DOT com>") (:keywords "git" "vc" "svn" "hg" "messenger") (:url . "http://github.com/redguardtoo/vc-msg"))]) + (vc-osc . [(20190402 2349) nil "non-resident support for osc version-control" single ((:commit . "bf5a515ed85f7d7cdfe66ed5bf4ef7554f8561e5") (:authors ("Adam Spiers (see vc.el for full credits)")) (:maintainer "Adam Spiers" . "aspiers@suse.com"))]) + (vcomp . [(20190128 20) nil "compare version strings" single ((:commit . "f839b3b3257a564b19d7f9557dc8bcbbe0b95842") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "versions") (:url . "https://github.com/tarsius/vcomp"))]) + (vcsh . [(20200226 1339) ((emacs (25 1))) "vcsh integration" single ((:commit . "7e376436b8f450a5571e19246136ccf77bbdd4f1") (:authors ("Štěpán Němec" . "stepnem@gmail.com")) (:maintainer "Štěpán Němec" . "stepnem@gmail.com") (:keywords "vc" "files") (:url . "https://gitlab.com/stepnem/vcsh-el"))]) + (vdf-mode . [(20210303 714) ((emacs (24 3))) "Major mode for editing Valve VDF files." single ((:commit . "0910d4f847e9c817eb8da5434b3879048ec4ac92") (:authors ("Philipp Middendorf")) (:maintainer "Philipp Middendorf") (:url . "https://github.com/plapadoo/vdf-mode"))]) + (vdiff . [(20210426 155) ((emacs (24 4)) (hydra (0 13 0))) "A diff tool similar to vimdiff" single ((:commit . "84b8243d9f5d8082b05794dbc998d43dbdd7676a") (:authors ("Justin Burkett" . "justin@burkett.cc")) (:maintainer "Justin Burkett" . "justin@burkett.cc") (:keywords "diff") (:url . "https://github.com/justbur/emacs-vdiff"))]) + (vdiff-magit . [(20190304 1707) ((emacs (24 4)) (vdiff (0 3)) (magit (2 10 0)) (transient (0 1 0))) "magit integration for vdiff" single ((:commit . "b100d126c69e5c26a61ae05aa1778bcc4302b597") (:authors ("Justin Burkett" . "justin@burkett.cc")) (:maintainer "Justin Burkett" . "justin@burkett.cc") (:keywords "diff") (:url . "https://github.com/justbur/emacs-vdiff-magit"))]) + (vdirel . [(20190430 624) ((emacs (24 4)) (org-vcard (0 1 0)) (helm (1 7 0)) (seq (1 11))) "Manipulate vdir (i.e., vCard) repositories" single ((:commit . "a9ef32a70a1f14416e3dc5fee478ce138cc011d3") (:authors ("Damien Cassou" . "damien@cassou.me")) (:maintainer "Damien Cassou" . "damien@cassou.me") (:url . "https://github.com/DamienCassou/vdirel"))]) + (vdm-comint . [(20181127 2023) ((emacs (25)) (vdm-mode (0 0 4))) "REPL support for vdm-mode" single ((:commit . "89e7db6ee1a89b8c1f7ce36ce6800c32b5c4ba2d") (:authors ("Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com")) (:maintainer "Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com") (:keywords "languages") (:url . "https://github.com/peterwvj/vdm-mode"))]) + (vdm-mode . [(20190328 1408) ((emacs (25))) "Major mode for the Vienna Development Method" tar ((:commit . "89e7db6ee1a89b8c1f7ce36ce6800c32b5c4ba2d") (:authors ("Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com")) (:maintainer "Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com") (:keywords "languages") (:url . "https://github.com/peterwvj/vdm-mode"))]) + (vdm-snippets . [(20190313 1122) ((emacs (24)) (yasnippet (0 13 0))) "YASnippets for VDM mode" tar ((:commit . "89e7db6ee1a89b8c1f7ce36ce6800c32b5c4ba2d") (:authors ("Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com")) (:maintainer "Peter W. V. Tran-Jørgensen" . "peter.w.v.jorgensen@gmail.com") (:keywords "languages") (:url . "https://github.com/peterwvj/vdm-mode"))]) + (vector-utils . [(20140508 2041) nil "Vector-manipulation utility functions" single ((:commit . "c38ca1c6a23b2b51a6ac36c2c64e50e21cbe9d21") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "extensions") (:url . "http://github.com/rolandwalker/vector-utils"))]) + (vega-view . [(20210401 1115) ((emacs (25)) (cider (0 24 0)) (parseedn (0 1))) "Vega visualization viewer" single ((:commit . "3793025a523a86acc6255b4183b12ebfc95e1116") (:authors ("Jack Rusher" . "jack@appliedscience.studio")) (:maintainer "Jack Rusher" . "jack@appliedscience.studio") (:keywords "multimedia") (:url . "https://www.github.com/applied-science/emacs-vega-view"))]) + (verb . [(20210525 2135) ((emacs (25 1))) "Organize and send HTTP requests" tar ((:commit . "9e3e8a1edd82f7d056d3744f9e40cf8a5bac4ecc") (:authors ("Federico Tedin" . "federicotedin@gmail.com")) (:maintainer "Federico Tedin" . "federicotedin@gmail.com") (:keywords "tools") (:url . "https://github.com/federicotdn/verb"))]) + (veri-kompass . [(20200213 934) ((emacs (25)) (cl-lib (0 5)) (org (8 2 0))) "verilog codebase navigation facility" single ((:commit . "271903cdf92db05898ee7cffb65641f30fa08280") (:maintainer nil . "andrea_corallo@yahoo.it") (:keywords "languages" "extensions" "verilog" "hardware" "rtl") (:url . "https://gitlab.com/koral/veri-kompass"))]) + (verify-url . [(20160426 1228) ((cl-lib (0 5))) "find out invalid urls in the buffer or region" single ((:commit . "d6f3623cda8cd526a2d198619b137059cb1ba1ab") (:authors ("DarkSun" . "lujun9972@gmail.com")) (:maintainer "DarkSun" . "lujun9972@gmail.com") (:keywords "convenience" "usability" "url") (:url . "https://github.com/lujun9972/verify-url"))]) + (verona-mode . [(20200823 536) ((emacs (25 1)) (dash (2 17 0)) (hydra (0 15 0))) "A major mode for the Verona programming language" single ((:commit . "72dd31ef847344d79409503f3c42169041eb3da4") (:keywords "languages" "programming") (:url . "https://github.com/damon-kwok/verona-mode"))]) + (versuri . [(20200316 852) ((emacs (26 1)) (dash (2 16 0)) (request (0 3 0)) (anaphora (1 0 4)) (esxml (0 1 0)) (s (1 12 0)) (esqlite (0 3 1)) (ivy (0 11 0))) "The lyrics package" single ((:commit . "41e20583d1080beeeda0e36d1b2e6d74b9c57920") (:authors ("Mihai Olteanu" . "mihai_olteanu@fastmail.fm")) (:maintainer "Mihai Olteanu" . "mihai_olteanu@fastmail.fm") (:keywords "multimedia") (:url . "https://github.com/mihaiolteanu/versuri/"))]) + (vertica . [(20131217 1511) ((sql (3 0))) "Vertica SQL mode extension" single ((:commit . "3c9647b425c5c13c30bf0cba483646af18196588") (:authors ("Roman Scherer" . "roman@burningswell.com")) (:maintainer "Roman Scherer" . "roman@burningswell.com") (:keywords "sql" "vertica"))]) + (vertica-snippets . [(20200423 1200) ((yasnippet (0 6 1))) "Yasnippets for Vertica" tar ((:commit . "6ced718d9120878878700592fab430a8542b748f") (:authors ("Andreas Gerler" . "baron@bundesbrandschatzamt.de")) (:maintainer "Andreas Gerler" . "baron@bundesbrandschatzamt.de") (:keywords "convenience" "snippets") (:url . "https://github.com/baron42bba/vertica-snippets"))]) + (vertigo . [(20180829 2230) ((dash (2 11 0))) "Jump across lines using the home row." single ((:commit . "6303d17270ea92290a6960890bca515274f1682b") (:authors ("Fox Kiester" . "noct@posteo.net")) (:maintainer "Fox Kiester" . "noct@posteo.net") (:keywords "vim" "vertigo") (:url . "https://github.com/noctuid/vertigo.el"))]) + (vhdl-capf . [(20160221 1734) nil "Completion at point function (capf) for vhdl-mode." single ((:commit . "290abe217050f33532bc9ccb04f894123402f414") (:authors ("sh-ow" . "sh-ow@users.noreply.github.com")) (:maintainer "sh-ow" . "sh-ow@users.noreply.github.com") (:keywords "convenience" "usability" "vhdl" "completion") (:url . "https://github.com/sh-ow/vhdl-capf"))]) + (vhdl-tools . [(20200330 1819) ((ggtags (0 9 0)) (emacs (26 2)) (helm-rg (0 1)) (outshine (3 1 -1))) "Utilities for navigating vhdl sources" single ((:commit . "b5d1eec90bb43ba10178219245afbddb6601e85b") (:authors ("Cayetano Santos")) (:maintainer "Cayetano Santos") (:keywords "convenience" "languages" "vhdl") (:url . "https://gitlab.com/emacs-elisp/vhdl-tools/-/wikis/home"))]) + (vi-tilde-fringe . [(20141028 242) ((emacs (24))) "Displays tildes in the fringe on empty lines a la Vi." single ((:commit . "f1597a8d54535bb1d84b442577b2024e6f910308") (:authors ("Sylvain Benner" . "sylvain.benner@gmail.com")) (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com") (:keywords "emulation") (:url . "https://github.com/syl20bnr/vi-tilde-fringe"))]) + (viewer . [(20170107 202) nil "View-mode extension" single ((:commit . "6c8db025bf4021428f7f2c3ef9d74fb13f5d267a") (:authors ("rubikitch" . "rubikitch@ruby-lang.org")) (:maintainer "rubikitch" . "rubikitch@ruby-lang.org") (:keywords "view" "extensions") (:url . "http://github.com/rubikitch/viewer/"))]) + (viking-mode . [(20160705 2027) nil "kill first, ask later" single ((:commit . "c76aa265d13ad91d6890d242e142d05e31f0340b") (:authors ("T.v.Dein" . "tlinden@cpan.org")) (:maintainer "T.v.Dein" . "tlinden@cpan.org") (:keywords "kill" "delete") (:url . "https://github.com/tlinden/viking-mode"))]) + (vim-empty-lines-mode . [(20150111 426) ((emacs (23))) "Vim-like empty line indicator at end of files." single ((:commit . "d4a5034ca8ea0c962ad6e92c86c0fa2a74d2964b") (:authors ("Jonne Mickelin" . "jonne@ljhms.com")) (:maintainer "Jonne Mickelin" . "jonne@ljhms.com") (:keywords "emulations") (:url . "https://github.com/jmickelin/vim-empty-lines-mode"))]) + (vim-region . [(20140329 1624) ((expand-region (20140127))) "Select region as vim" single ((:commit . "7c4a99ce3678fee40c83ab88e8ad075d2a935fdf") (:authors ("ongaeshi" . "ongaeshi0621@gmail.com")) (:maintainer "ongaeshi" . "ongaeshi0621@gmail.com") (:url . "https://github.com/ongaeshi/emacs-vim-region"))]) + (vimgolf . [(20200205 1420) nil "VimGolf interface for the One True Editor" single ((:commit . "f565447ed294898588a19438d56c116555d8c628") (:authors ("Tim Visher" . "tim.visher@gmail.com")) (:maintainer "Tim Visher" . "tim.visher@gmail.com") (:keywords "games" "vimgolf" "vim") (:url . "https://github.com/timvisher/vimgolf.el"))]) + (vimish-fold . [(20201205 1156) ((emacs (24 4)) (cl-lib (0 5)) (f (0 18 0))) "Fold text like in Vim" single ((:commit . "a6501cbfe3db791f9ca17fd986c7202a87f3adb8") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:keywords "convenience") (:url . "https://github.com/mrkkrp/vimish-fold"))]) + (vimrc-mode . [(20181116 1919) nil "Major mode for vimrc files" single ((:commit . "13bc150a870d5d4a95f1111e4740e2b22813c30e") (:keywords "languages" "vim") (:url . "https://github.com/mcandre/vimrc-mode"))]) + (virtual-auto-fill . [(20200906 2038) ((emacs (25 2)) (adaptive-wrap (0 7)) (visual-fill-column (1 9))) "Readably display text without adding line breaks" single ((:commit . "ac8bf947a1f87efe8967cb18166178f5fd93a8e1") (:authors ("Luis Gerhorst" . "virtual-auto-fill@luisgerhorst.de")) (:maintainer "Luis Gerhorst" . "virtual-auto-fill@luisgerhorst.de") (:keywords "convenience" "mail" "outlines" "files" "wp") (:url . "https://github.com/luisgerhorst/virtual-auto-fill"))]) + (virtual-comment . [(20210210 255) ((emacs (26 1))) "Virtual Comments" single ((:commit . "dadf36158c7ff89291bea4695999860cca2d094e") (:authors ("Thanh Vuong" . "thanhvg@gmail.com")) (:maintainer "Thanh Vuong" . "thanhvg@gmail.com") (:url . "https://github.com/thanhvg/emacs-virtual-comment"))]) + (virtualenv . [(20140220 2301) nil "Virtualenv for Python" single ((:commit . "276c0f4d6493b402dc4d22ecdf17b2b072e911b3") (:authors ("Aaron Culich" . "aculich@gmail.com")) (:maintainer "Aaron Culich" . "aculich@gmail.com") (:keywords "python" "virtualenv"))]) + (virtualenvwrapper . [(20190223 1919) ((dash (1 5 0)) (s (1 6 1))) "a featureful virtualenv tool for Emacs" single ((:commit . "c7e84505db4142fd1beebf38ffe37c3f42444ca3") (:authors ("James J Porter" . "porterjamesj@gmail.com")) (:maintainer "James J Porter" . "porterjamesj@gmail.com") (:keywords "python" "virtualenv" "virtualenvwrapper") (:url . "http://github.com/porterjamesj/virtualenvwrapper.el"))]) + (visible-mark . [(20150624 450) nil "Make marks visible." single ((:commit . "a584db9bc88953b23a9648b3e14ade90767207f8") (:authors ("Ian Kelling" . "ian@iankelling.org")) (:maintainer "Ian Kelling" . "ian@iankelling.org") (:keywords "marking" "color" "faces") (:url . "https://gitlab.com/iankelling/visible-mark"))]) + (visual-ascii-mode . [(20150129 1046) nil "Visualize ascii code (small integer) on buffer." single ((:commit . "99285a099a17472ddd9f1b4f74e9d092dd8c5947") (:authors ("Dewdrops" . "v_v_4474@126.com")) (:maintainer "Dewdrops" . "v_v_4474@126.com") (:keywords "presentation") (:url . "https://github.com/Dewdrops/visual-ascii-mode"))]) + (visual-fill-column . [(20210419 857) ((emacs (25 1))) "fill-column for visual-line-mode" single ((:commit . "6fa9e7912af412533aec0da8b8f62c227f9f3f54") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm") (:url . "https://github.com/joostkremers/visual-fill-column"))]) + (visual-regexp . [(20210502 2019) ((cl-lib (0 2))) "A regexp/replace command for Emacs with interactive visual feedback" single ((:commit . "48457d42a5e0fe10fa3a9c15854f1f127ade09b5") (:authors ("Marko Bencun" . "mbencun@gmail.com")) (:maintainer "Marko Bencun" . "mbencun@gmail.com") (:keywords "regexp" "replace" "visual" "feedback") (:url . "https://github.com/benma/visual-regexp.el/"))]) + (visual-regexp-steroids . [(20170222 253) ((visual-regexp (1 1))) "Extends visual-regexp to support other regexp engines" tar ((:commit . "a6420b25ec0fbba43bf57875827092e1196d8a9e") (:authors ("Marko Bencun" . "mbencun@gmail.com")) (:maintainer "Marko Bencun" . "mbencun@gmail.com") (:keywords "external" "foreign" "regexp" "replace" "python" "visual" "feedback") (:url . "https://github.com/benma/visual-regexp-steroids.el/"))]) + (vlc . [(20200328 1143) ((emacs (25 1))) "VideoLAN VLC Media Player Control" single ((:commit . "932840f874e7510ee86e796bb5dc20d44514e31a") (:authors ("Xu Chunyang")) (:maintainer "Xu Chunyang") (:keywords "tools") (:url . "https://github.com/xuchunyang/vlc.el"))]) + (vlf . [(20191126 2250) nil "View Large Files" tar ((:commit . "cc02f2533782d6b9b628cec7e2dcf25b2d05a27c") (:maintainer "Andrey Kotlarski" . "m00naticus@gmail.com") (:keywords "large files" "utilities") (:url . "https://github.com/m00natic/vlfi"))]) + (vmd-mode . [(20210524 27) ((emacs (24 3))) "Fast Github-flavored Markdown preview using a vmd subprocess." single ((:commit . "b2bdf2ab54f8fc37780e6b473e4ad69c0e9ff4a6") (:authors ("Blake Miller" . "blak3mill3r@gmail.com")) (:maintainer "Blake Miller" . "blak3mill3r@gmail.com") (:keywords "markdown" "preview" "live" "vmd") (:url . "https://github.com/blak3mill3r/vmd-mode"))]) + (voca-builder . [(20161101 1645) ((popup (0 5 2))) "Helps you build up your vocabulary" single ((:commit . "51573beec8cd8308477b0faf453aad93e17f57c5") (:authors ("Yi Tang" . "yi.tang.uk@me.com")) (:maintainer "Yi Tang" . "yi.tang.uk@me.com") (:keywords "english" "vocabulary") (:url . "https://github.com/yitang/voca-builder"))]) + (volatile-highlights . [(20160612 155) nil "Minor mode for visual feedback on some operations." single ((:commit . "9a20091f0ce7fc0a6b3e641a6a46d5f3ac4d8392") (:authors ("K-talo Miyazaki <Keitaro dot Miyazaki at gmail dot com>")) (:maintainer "K-talo Miyazaki <Keitaro dot Miyazaki at gmail dot com>") (:keywords "emulations" "convenience" "wp") (:url . "http://www.emacswiki.org/emacs/download/volatile-highlights.el"))]) + (volume . [(20201002 1022) nil "tweak your sound card volume from Emacs" single ((:commit . "afb75a5f7fe41eb28c8dbb1378e80d103eea05c7") (:authors ("Daniel Brockman" . "daniel@brockman.se")) (:maintainer "Daniel Brockman" . "daniel@brockman.se") (:url . "http://www.brockman.se/software/volume-el/"))]) + (vs-dark-theme . [(20210427 727) ((emacs (24 1))) "Visual Studio IDE dark theme" single ((:commit . "5a826e6ea3e9edd9241e3253ce97333955c8ae1a") (:authors ("Jen-Chieh Shen")) (:maintainer "Jen-Chieh Shen") (:url . "https://github.com/jcs090218/vs-dark-theme"))]) + (vs-light-theme . [(20210427 727) ((emacs (24 1))) "Visual Studio IDE light theme" single ((:commit . "e324120248c1d513a6516edff250d161f876aad9") (:authors ("Jen-Chieh Shen")) (:maintainer "Jen-Chieh Shen") (:url . "https://github.com/jcs090218/vs-light-theme"))]) + (vscdark-theme . [(20191212 107) ((emacs (24 1))) "VS Code Dark+ like theme" single ((:commit . "8eba74059e8a9db974e4056ee024e52fe54da485") (:authors ("Alexander L. Belikoff")) (:maintainer "Alexander L. Belikoff") (:url . "https://github.com/abelikoff/vscdark-theme"))]) + (vscode-dark-plus-theme . [(20210530 629) nil "Default Visual Studio Code Dark+ theme" single ((:commit . "961c8c1fdd7eb874d4e2ce386d5e6d1f318b5b72") (:authors ("Ian Y.E. Pan")) (:maintainer "Ian Y.E. Pan") (:url . "https://github.com/ianpan870102/vscode-dark-plus-emacs-theme"))]) + (vscode-icon . [(20201214 2227) ((emacs (25 1))) "Utility package to provide Vscode style icons" tar ((:commit . "909151c8105861aa300f5601e333909d36d0ebf5") (:authors ("James Nguyen" . "james@jojojames.com")) (:maintainer "James Nguyen" . "james@jojojames.com") (:keywords "files" "tools") (:url . "https://github.com/jojojames/vscode-icon-emacs"))]) + (vterm . [(20210409 1558) ((emacs (25 1))) "Fully-featured terminal emulator" tar ((:commit . "2b1392cb2b14ec5bd0b7355197d5f353aa5d3983") (:authors ("Lukas Fürmetz" . "fuermetz@mailbox.org")) (:maintainer "Lukas Fürmetz" . "fuermetz@mailbox.org") (:keywords "terminals") (:url . "https://github.com/akermu/emacs-libvterm"))]) + (vterm-toggle . [(20210531 1453) ((emacs (25 1)) (vterm (0 0 1))) "Toggles between the vterm buffer and other buffers." single ((:commit . "afe60b814d9d045b968f4a464bbedb241b35392b") (:authors (nil . "jixiuf jixiuf@qq.com")) (:maintainer nil . "jixiuf jixiuf@qq.com") (:keywords "vterm" "terminals") (:url . "https://github.com/jixiuf/vterm-toggle"))]) + (vtm . [(20200921 338) nil "Manages vterm buffers with configuration files" tar ((:commit . "d770fd8cff7c24688199392ad93c01485c6a9569") (:keywords "convenience") (:url . "https://github.com/laishulu/emacs-vterm-manager"))]) + (vue-html-mode . [(20180428 2035) nil "Major mode for editing Vue.js templates" single ((:commit . "1514939804bad558584feeb6298b38d22eadf64e") (:authors ("Adam Niederer" . "adam.niederer@gmail.com")) (:maintainer "Adam Niederer" . "adam.niederer@gmail.com") (:keywords "languages" "vue" "template") (:url . "http://github.com/AdamNiederer/vue-html-mode"))]) + (vue-mode . [(20190415 231) ((mmm-mode (0 5 5)) (vue-html-mode (0 2)) (ssass-mode (0 2)) (edit-indirect (0 1 4))) "Major mode for vue component based on mmm-mode" single ((:commit . "031edd1f97db6e7d8d6c295c0e6d58dd128b9e71") (:authors ("codefalling" . "code.falling@gmail.com")) (:maintainer "codefalling" . "code.falling@gmail.com") (:keywords "languages"))]) + (vuiet . [(20210323 911) ((emacs (26 1)) (lastfm (1 1)) (versuri (1 0)) (s (1 12 0)) (bind-key (2 4)) (mpv (0 1 0))) "The music player and explorer for Emacs" single ((:commit . "43b9364042922950f612ac57d8c526921a01b291") (:authors ("Mihai Olteanu" . "mihai_olteanu@fastmail.fm")) (:maintainer "Mihai Olteanu" . "mihai_olteanu@fastmail.fm") (:keywords "multimedia") (:url . "https://github.com/mihaiolteanu/vuiet"))]) + (vulpea . [(20210503 624) ((emacs (27 1)) (org (9 4 4)) (org-roam (1 2 3)) (s (1 12))) "A collection of org-roam note-taking functions" tar ((:commit . "0f73528e603b1901cbe36eccd536a9113ef0439d") (:authors ("Boris Buliga" . "boris@d12frosted.io")) (:maintainer "Boris Buliga" . "boris@d12frosted.io") (:url . "https://github.com/d12frosted/vulpea"))]) + (vyper-mode . [(20180707 1935) ((emacs (24 3))) "Major mode for the Vyper programming language" single ((:commit . "323dfddfc38f0b11697e9ebaf04d1b53297e54e5") (:authors ("Alex Stokes" . "r.alex.stokes@gmail.com")) (:maintainer "Alex Stokes" . "r.alex.stokes@gmail.com") (:keywords "languages") (:url . "https://github.com/ralexstokes/vyper-mode"))]) + (w32-browser . [(20170101 1954) nil "Run Windows application associated with a file." single ((:commit . "e5c60eafd8f8d3546a0fa295ad5af2414d36b4e6") (:authors ("Emacs Wiki, Drew Adams")) (:maintainer nil . "Drew Adams (concat \"drew.adams\" \"@\" \"oracle\" \".com\")") (:keywords "mouse" "dired" "w32" "explorer") (:url . "http://www.emacswiki.org/w32-browser.el"))]) + (w32-ime . [(20201107 143) ((emacs (24 4))) "Windows IME UI/UX controler" single ((:commit . "9c62273dce0ba685a591577885b1e216ba832ec1") (:authors ("H.Miyashita") ("MIYOSHI Masanori") ("KOBAYASHI Yasuhiro") ("NTEmacsJP") ("ksugita (gnupack)") ("rzl24ozi") ("TANE") ("Masamichi Hosoda" . "trueroad@trueroad.jp") ("Naoya Yamashita" . "conao3@gmail.com")) (:maintainer "Masamichi Hosoda" . "trueroad@trueroad.jp") (:url . "https://github.com/trueroad/w32-ime.el"))]) + (w3m . [(20210606 2300) nil "an Emacs interface to w3m" tar ((:commit . "e2151425cc4e1681a0c6753e82807f2b8ef27b72") (:keywords "w3m" "www" "hypermedia"))]) + (wacspace . [(20180311 2350) ((dash (1 2 0)) (cl-lib (0 2))) "The WACky WorkSPACE manager for emACS" tar ((:commit . "54d19aab6fd2bc5945b7ffc58104e695064927e2") (:authors ("Emanuel Evans" . "emanuel.evans@gmail.com")) (:maintainer "Emanuel Evans" . "emanuel.evans@gmail.com") (:keywords "workspace") (:url . "http://github.com/shosti/wacspace.el"))]) + (waf-mode . [(20170403 1940) nil "Waf integration for Emacs" single ((:commit . "20c75eabd1d54fbce8e0dbef785c9fb68577ee4f") (:authors ("Denys Valchuk" . "dvalchuk@gmail.com")) (:maintainer "Denys Valchuk" . "dvalchuk@gmail.com") (:url . "https://bitbucket.org/dvalchuk/waf-mode"))]) + (waher-theme . [(20141115 1230) ((emacs (24 1))) "Emacs 24 theme based on waher for st2 by dduckster" single ((:commit . "60d31519fcfd8e797723d47961b255ae2f2e2c0a") (:authors ("Jasonm23" . "jasonm23@gmail.com")) (:maintainer "Jasonm23" . "jasonm23@gmail.com") (:url . "https://github.com/jasonm23/emacs-waher-theme"))]) + (wakatime-mode . [(20200730 240) nil "Automatic time tracking extension for WakaTime" single ((:commit . "5e6deddda7a70f4b79832e9e8b6636418812e162") (:authors ("Gabor Torok" . "gabor@20y.hu")) (:maintainer "Alan Hamlett" . "alan@wakatime.com") (:keywords "calendar" "comm"))]) + (wakib-keys . [(20201001 1448) ((emacs (24 4))) "Minor Mode for Modern Keybindings" single ((:commit . "b803fcaef31539e070a08202b9039bbeb29e8f66") (:authors ("Abdulla Bubshait")) (:maintainer "Abdulla Bubshait") (:keywords "convenience" "keybindings" "keys") (:url . "https://github.com/darkstego/wakib-keys/"))]) + (walkclj . [(20201116 735) ((emacs (25)) (parseclj (0 1 0)) (treepy (0 1 0))) "Manipulate Clojure parse trees" single ((:commit . "2077475eb3c8d1a170c3a3b0e836420469024f0f") (:authors ("Arne Brasseur")) (:maintainer "Arne Brasseur") (:keywords "languages") (:url . "https://github.com/plexus/walkclj"))]) + (walkman . [(20201229 1811) ((transient (0 1 0)) (org (8 3 5)) (json-mode (1 6 0)) (emacs (26 3))) "Write HTTP requests in Org mode" single ((:commit . "00b4fd5cae7fe27085995dbb178828fb765c7edc") (:authors ("Adrien Brochard")) (:maintainer "Adrien Brochard") (:keywords "walkman" "http" "curl" "org" "comm") (:url . "https://github.com/abrochard/walkman"))]) + (wallpaper . [(20201019 2123) ((emacs (25 1))) "Setting the wallpaper" single ((:commit . "cc0101726dd2fa2b4eda06924c7abfae54f663e2") (:authors ("Farlado" . "farlado@sdf.org")) (:maintainer "Farlado" . "farlado@sdf.org") (:keywords "unix" "wallpaper" "extensions") (:url . "https://github.com/farlado/emacs-wallpaper"))]) + (wand . [(20210511 725) ((dash (2 15 0)) (s (0 1 1))) "Magic wand for Emacs - Select and execute" tar ((:commit . "08c3d9156517a31dd98ea64bfc269fae730b643c") (:authors ("Ha-Duong Nguyen <cmpitgATgmail>")) (:maintainer "Ha-Duong Nguyen <cmpitgATgmail>") (:keywords "extensions" "tools") (:url . "https://github.com/cmpitg/wand"))]) + (wandbox . [(20170603 1231) ((emacs (24)) (request (0 3 0)) (s (1 10 0))) "Wandbox client" tar ((:commit . "e002fe41f2cd9b4ce2b1dc80b83301176e9117f1") (:authors ("KOBAYASHI Shigeru (kosh)" . "shigeru.kb@gmail.com")) (:maintainer "KOBAYASHI Shigeru (kosh)" . "shigeru.kb@gmail.com") (:keywords "tools") (:url . "https://github.com/kosh04/emacs-wandbox"))]) + (wanderlust . [(20210312 843) ((emacs (24 5)) (apel (10 8)) (flim (1 14 9)) (semi (1 14 7))) "Yet Another Message Interface on Emacsen" tar ((:commit . "6e189fc944a9bbde76c5a6d9b6a38d57e85e6390"))]) + (warm-night-theme . [(20161101 1428) ((emacs (24))) "Emacs 24 theme with a dark background." single ((:commit . "020f084d23409b5035150508ba6e57c2509edd64") (:authors ("martin haesler")) (:maintainer "martin haesler"))]) + (watch-buffer . [(20120331 2044) nil "run a shell command when saving a buffer" single ((:commit . "761fd7252e6d7bf5148283c2a7ee935f087d9427") (:authors ("Michael Steger" . "mjsteger1@gmail.com")) (:maintainer "Michael Steger" . "mjsteger1@gmail.com") (:keywords "automation" "convenience") (:url . "https://github.com/mjsteger/watch-buffer"))]) + (wavefront-obj-mode . [(20170808 1716) nil "Major mode for Wavefront obj files" single ((:commit . "34027915de6496460d8e68b5991dd24d47d54859") (:authors ("Sasha Kovar" . "sasha-emacs@arcocene.org")) (:maintainer "Sasha Kovar" . "sasha-emacs@arcocene.org") (:url . "http://github.com/abend/wavefront-obj-mode"))]) + (wc-goal-mode . [(20140829 1359) nil "Running word count with goals (minor mode)" single ((:commit . "bf21ab9c5a449bcc20dd207a4915dcec218d2699") (:authors ("Benjamin Beckwith")) (:maintainer "Benjamin Beckwith") (:url . "https://github.com/bnbeckwith/wc-goal-mode"))]) + (wc-mode . [(20210418 47) ((emacs (24 1))) "Running word count with goals (minor mode)" single ((:commit . "63be1433b8a63cdc3239cc751e36360429c42b51") (:authors ("Benjamin Beckwith")) (:maintainer "Benjamin Beckwith") (:url . "https://github.com/bnbeckwith/wc-mode"))]) + (wdl-mode . [(20180831 1946) nil "WDL (Workflow Definition Language) major mode" single ((:commit . "cef86e5afc136ae5ad9324cd6e6d6f860b889bcf") (:authors ("Xiaowei Zhan" . "zhanxw@gmail.com")) (:maintainer "Xiaowei Zhan" . "zhanxw@gmail.com") (:keywords "languages") (:url . "http://github.com/zhanxw/wdl-mode"))]) + (weak-ref . [(20200217 2200) ((emacs (24 3))) "Weak references for Emacs Lisp" single ((:commit . "24e8c37da6465e65ce9f866267bd3fa53c8899c6") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/elisp-weak-ref"))]) + (weather-metno . [(20150901 107) ((emacs (24)) (cl-lib (0 3))) "Weather data from met.no in Emacs" tar ((:commit . "bfc7137095e0ee71aad70ac46f2af677f3c051b6") (:authors ("Rüdiger Sonderfeld" . "ruediger@c-plusplus.de")) (:maintainer "Rüdiger Sonderfeld" . "ruediger@c-plusplus.de") (:keywords "comm") (:url . "https://github.com/ruediger/weather-metno-el"))]) + (web . [(20141231 2001) ((dash (2 9 0)) (s (1 5 0))) "useful HTTP client" single ((:commit . "483188dac4bc6b409b985c9dae45f3324a425efd") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:keywords "lisp" "http" "hypermedia") (:url . "http://github.com/nicferrier/emacs-web"))]) + (web-beautify . [(20161115 2247) nil "Format HTML, CSS and JavaScript/JSON" single ((:commit . "e1b45321d8c11b404b12c8e55afe55eaa7c84ee9") (:authors ("Yasuyuki Oka" . "yasuyk@gmail.com")) (:maintainer "Yasuyuki Oka" . "yasuyk@gmail.com") (:url . "https://github.com/yasuyk/web-beautify"))]) + (web-completion-data . [(20160318 848) nil "Shared completion data for ac-html and company-web" tar ((:commit . "c272c94e8a71b779c29653a532f619acad433a4f") (:authors ("Olexandr Sydorchuk" . "olexandr.syd@gmail.com")) (:maintainer "Olexandr Sydorchuk" . "olexandr.syd@gmail.com") (:keywords "html" "auto-complete" "company") (:url . "https://github.com/osv/web-completion-data"))]) + (web-mode . [(20210131 1758) ((emacs (23 1))) "major mode for editing web templates" single ((:commit . "8ef47935d638902ba35a557cae5edd6ab6ab1346") (:authors ("François-Xavier Bois <fxbois AT Google Mail Service>")) (:maintainer "François-Xavier Bois") (:keywords "languages") (:url . "https://web-mode.org"))]) + (web-mode-edit-element . [(20190531 852) ((emacs (24 4)) (web-mode (14))) "Helper-functions for attribute- and element-handling" tar ((:commit . "ad5d7e4dc2420bdd00ce65d9adffbd38a5904afa") (:authors ("Julian T. Knabenschuh" . "jtkdevelopments@gmail.com")) (:maintainer "Julian T. Knabenschuh" . "jtkdevelopments@gmail.com") (:keywords "languages" "convenience") (:url . "https://github.com/jtkDvlp/web-mode-edit-element"))]) + (web-narrow-mode . [(20170407 210) ((web-mode (14 0 27))) "quick narrow code block in web-mode" single ((:commit . "73bdcb7d0701abe65dab4fc295d944885e05ae33") (:authors ("Qquanwei" . "quanwei9958@126.com")) (:maintainer "Johan Andersson" . "quanwei9958@126.com") (:keywords "web-mode" "react" "narrow" "web") (:url . "https://github.com/Qquanwei/web-narrow-mode"))]) + (web-search . [(20190620 602) ((emacs (24 3))) "Open a web search" tar ((:commit . "a22cbdc663a1895d5a5b69de91e1e3b9eb64b92f") (:authors ("Xu Chunyang" . "mail@xuchunyang.me")) (:maintainer "Xu Chunyang" . "mail@xuchunyang.me") (:keywords "web" "search") (:url . "https://github.com/xuchunyang/web-search.el"))]) + (web-server . [(20210209 58) ((emacs (24 1)) (cl-lib (0 6))) "Emacs Web Server" tar ((:commit . "3aa5084bcb733aa77997b9210b4437903f6f29ce") (:authors ("Eric Schulte" . "schulte.eric@gmail.com")) (:maintainer "Eric Schulte" . "schulte.eric@gmail.com") (:keywords "http" "server" "network") (:url . "https://github.com/eschulte/emacs-web-server"))]) + (webkit-color-picker . [(20180325 736) ((emacs (26 0)) (posframe (0 1 0))) "Insert and adjust colors using Webkit Widgets" tar ((:commit . "765cac80144cad4bc0bf59025ea0199f0486f737") (:authors ("Ozan Sener" . "hi@ozan.email")) (:maintainer "Ozan Sener" . "hi@ozan.email") (:keywords "tools") (:url . "https://github.com/osener/emacs-webkit-color-picker"))]) + (weblio . [(20210511 2105) ((request (0 3 3)) (emacs (25 1))) "Look up Japanese words on Weblio.jp" single ((:commit . "ba0b745c3c11a93eaac826f74232f9eefbbae7a1") (:authors ("Simon Zelazny")) (:maintainer "Simon Zelazny") (:keywords "langauges" "i18n") (:url . "https://github.com/pzel/weblio"))]) + (weblogger . [(20110926 1618) ((xml-rpc (1 6 8))) "Weblog maintenance via XML-RPC APIs" single ((:commit . "b3dd4aead9d3a87e6d85e7fef4f4f3bd40d87b53") (:keywords "weblog" "blogger" "cms" "movable" "type" "openweblog" "blog") (:url . "http://launchpad.net/weblogger-el"))]) + (weblorg . [(20210526 129) ((templatel (0 1 5)) (emacs (26 1))) "Static Site Generator for org-mode" tar ((:commit . "ffea6a93f5d35fed8532f1187463a27eb46bff0a") (:authors ("Lincoln Clarete" . "lincoln@clarete.li")) (:maintainer "Lincoln Clarete" . "lincoln@clarete.li") (:url . "https://emacs.love/weblorg"))]) + (webpaste . [(20210306 1215) ((emacs (24 4)) (request (0 2 0)) (cl-lib (0 5))) "Paste to pastebin-like services" single ((:commit . "87ea8b15f417037bb1a46ac849b2f60f08c0bfeb") (:authors ("Elis \"etu\" Hirwing")) (:maintainer "Elis \"etu\" Hirwing") (:keywords "convenience" "comm" "paste") (:url . "https://github.com/etu/webpaste.el"))]) + (websocket . [(20210110 17) ((cl-lib (0 5))) "Emacs WebSocket client and server" single ((:commit . "34e11124fdd9d73e431499ba8a6b6a8023519664") (:authors ("Andrew Hyatt" . "ahyatt@gmail.com")) (:maintainer "Andrew Hyatt" . "ahyatt@gmail.com") (:keywords "communication" "websocket" "server") (:url . "https://github.com/ahyatt/emacs-websocket"))]) + (wedge-ws . [(20140714 2149) nil "Wedge whitespace between columns in text" single ((:commit . "4669115f02d9c6fee067cc5369bb38c0f9db88b2") (:authors ("Anders Eurenius" . "aes@spotify.com")) (:maintainer "Anders Eurenius" . "aes@spotify.com") (:keywords "formatting" "indentation"))]) + (weechat . [(20190520 1551) ((s (1 3 1)) (cl-lib (0 2)) (emacs (24)) (tracking (1 2))) "Chat via WeeChat's relay protocol in Emacs" tar ((:commit . "d9a13306ea8be27367f92e9202d116a88fa1f441") (:authors ("Moritz Ulrich" . "moritz@tarn-vedra.de") ("Rüdiger Sonderfeld" . "ruediger@c-plusplus.de") ("Aristid Breitkreuz" . "aristidb@gmail.com")) (:maintainer "Moritz Ulrich" . "moritz@tarn-vedra.de") (:keywords "irc" "chat" "network" "weechat") (:url . "https://github.com/the-kenny/weechat.el"))]) + (weechat-alert . [(20160416 1248) ((weechat (0 3 1)) (cl-lib (0 5)) (alert (1 2))) "Weechat notifier using alerts" single ((:commit . "a8fd557c8f335322f132c1c6c08b6741d6394e2e") (:authors ("Andreas Klein" . "git@kungi.org")) (:maintainer "Andreas Klein" . "git@kungi.org") (:keywords "irc" "chat" "network" "weechat") (:url . "https://github.com/kungi/weechat-alert"))]) + (weibo . [(20150307 2242) ((cl-lib (0 5))) "Weibo client for Emacs" tar ((:commit . "a8abb50b7602fe15fe2bc6400ac29780e956b390") (:authors ("Austin" . "austiny.cn@gmail.com")) (:maintainer "Austin" . "austiny.cn@gmail.com") (:keywords "weibo") (:url . "https://github.com/austin-----/weibo.emacs"))]) + (weyland-yutani-theme . [(20210530 1418) ((emacs (24 1))) "Emacs theme based off Alien movie franchise" single ((:commit . "a56c56de048900409d271f91fd08a408fd9bf32e") (:authors ("Joe Staursky")) (:maintainer "Joe Staursky") (:url . "https://github.com/jstaursky/weyland-yutani-theme"))]) + (wgrep . [(20210322 2207) nil "Writable grep buffer and apply the changes to files" single ((:commit . "f9687c28bbc2e84f87a479b6ce04407bb97cfb23") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "grep" "edit" "extensions") (:url . "http://github.com/mhayashi1120/Emacs-wgrep/raw/master/wgrep.el"))]) + (wgrep-ack . [(20200128 109) ((wgrep (2 1 1))) "Writable ack-and-a-half buffer and apply the changes to files" single ((:commit . "f9687c28bbc2e84f87a479b6ce04407bb97cfb23") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "grep" "edit" "extensions") (:url . "http://github.com/mhayashi1120/Emacs-wgrep/raw/master/wgrep-ack.el"))]) + (wgrep-ag . [(20200217 1028) ((wgrep (2 3 2))) "Writable ag buffer and apply the changes to files" single ((:commit . "f9687c28bbc2e84f87a479b6ce04407bb97cfb23") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "grep" "edit" "extensions") (:url . "http://github.com/mhayashi1120/Emacs-wgrep/raw/master/wgrep-ag.el"))]) + (wgrep-helm . [(20210322 2148) ((wgrep (2 1 1))) "Writable helm-grep-mode buffer and apply the changes to files" single ((:commit . "f9687c28bbc2e84f87a479b6ce04407bb97cfb23") (:authors ("Masahiro Hayashi" . "mhayashi1120@gmail.com")) (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "grep" "edit" "extensions") (:url . "http://github.com/mhayashi1120/Emacs-wgrep/raw/master/wgrep-helm.el"))]) + (wgrep-pt . [(20200128 109) ((wgrep (2 1 5))) "Writable pt buffer and apply the changes to files" single ((:commit . "f9687c28bbc2e84f87a479b6ce04407bb97cfb23") (:authors ("Masahiro Hayashi <mhayashi1120@gmail.com>, Bailey Ling" . "bling@live.ca")) (:maintainer "Masahiro Hayashi <mhayashi1120@gmail.com>, Bailey Ling" . "bling@live.ca") (:keywords "grep" "edit" "extensions") (:url . "http://github.com/mhayashi1120/Emacs-wgrep/raw/master/wgrep-pt.el"))]) + (what-the-commit . [(20150901 1316) nil "Random commit message generator" single ((:commit . "868c80a1b8614bcbd2225cd0290142c72f2a7956") (:authors ("Dan Barbarito" . "dan@barbarito.me")) (:maintainer "Dan Barbarito" . "dan@barbarito.me") (:keywords "git" "commit" "message") (:url . "http://barbarito.me/"))]) + (which-key . [(20210601 252) ((emacs (24 4))) "Display available keybindings in popup" single ((:commit . "fc29864395fdaf688e2ef5111831663bad89a020") (:authors ("Justin Burkett" . "justin@burkett.cc")) (:maintainer "Justin Burkett" . "justin@burkett.cc") (:url . "https://github.com/justbur/emacs-which-key"))]) + (which-key-posframe . [(20190427 1103) ((emacs (26 0)) (posframe (0 4 3)) (which-key (3 3 2))) "Using posframe to show which-key" single ((:commit . "e7f28608c7fc9507e407c6b840dff09062df533a") (:authors ("Yanghao Xie")) (:maintainer "Yanghao Xie" . "yhaoxie@gmail.com") (:keywords "convenience" "bindings" "tooltip") (:url . "https://github.com/yanghaoxie/which-key-posframe"))]) + (whitaker . [(20210203 1149) ((emacs (25))) "Comint interface for Whitaker's Words" single ((:commit . "a6fda24ccb69a18c0706633326d5cc4fcfaed83a") (:authors ("Matus Goljer" . "matus.goljer@gmail.com")) (:maintainer "Matus Goljer" . "matus.goljer@gmail.com") (:keywords "processes"))]) + (white-sand-theme . [(20210131 813) ((emacs (24))) "Emacs theme with a light background." single ((:commit . "729dd52cc1936250183d6761eed406c4be514a71") (:authors ("Martin Haesler")) (:maintainer "Martin Haesler"))]) + (white-theme . [(20160917 1743) ((emacs (24))) "Minimalistic light color theme inspired by basic-theme" single ((:commit . "e9e6d5b9d43da6eb15e86f5fbc8b1ba83abe8c78") (:authors ("Anler Hernandez Peral" . "inbox@anler.me")) (:maintainer "Anler Hernandez Peral" . "inbox@anler.me") (:keywords "color" "theme" "minimal" "basic" "simple" "white") (:url . "http://github.com/anler/white-theme.el"))]) + (whitespace-cleanup-mode . [(20210510 533) ((emacs (24 1))) "Intelligently call whitespace-cleanup on save" single ((:commit . "b108b73ddf8f7e747d5a20a681560171e02ad037") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "convenience") (:url . "https://github.com/purcell/whitespace-cleanup-mode"))]) + (whizzml-mode . [(20201013 239) ((emacs (24 4))) "Programming mode for editing WhizzML files" tar ((:commit . "3dce3be0c32b9b2d259e462b4b27c530af47466a") (:authors ("Jose Antonio Ortega Ruiz" . "jao@bigml.com")) (:maintainer "Jose Antonio Ortega Ruiz" . "jao@bigml.com") (:keywords "languages" "lisp"))]) + (whois . [(20210429 805) ((emacs (24))) "Syntax highlighted domain name queries using system whois" single ((:commit . "6ce65ec5c992b1e1cb538610f1c3708e9d467c39") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:keywords "network" "comm") (:url . "https://github.com/lassik/emacs-whois"))]) + (whole-line-or-region . [(20201214 650) ((emacs (24 1)) (cl-lib (0 6))) "Operate on current line if region undefined" single ((:commit . "3c1a55103e52c7a3010ee0043af22484d23a441e") (:authors ("Joe Casadonte" . "emacs@northbound-train.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "convenience" "wp") (:url . "https://github.com/purcell/whole-line-or-region"))]) + (wide-column . [(20170925 1613) nil "Calls functions dependant on column position." single ((:commit . "ce9ef4675485a7bea381077866368ef875226b10") (:authors ("Phillip Lord" . "p.lord@russet.org.uk")) (:maintainer "Phillip Lord" . "p.lord@russet.org.uk") (:keywords "minor mode" "cursor colour" "column width"))]) + (widget-mvc . [(20150102 406) nil "MVC framework for the emacs widgets" single ((:commit . "ff5a85880df7b87f9f480fe3c28438a0712b7b87") (:authors ("SAKURAI Masashi <m.sakurai at kiwanami.net>")) (:maintainer "SAKURAI Masashi <m.sakurai at kiwanami.net>") (:keywords "lisp" "widget"))]) + (widgetjs . [(20160719 1504) ((makey (0 3)) (js2-mode (20140114)) (js2-refactor (0 6 1)) (s (1 9 0))) "Widgetjs mode" single ((:commit . "58a0e556b4b96e1d23082a7ec2e8c0d4183a1a24") (:authors ("Nicolas Petton" . "petton.nicolas@gmail.com")) (:maintainer "Nicolas Petton" . "petton.nicolas@gmail.com") (:keywords "help"))]) + (wiki-nav . [(20200309 1323) ((button-lock (1 0 2)) (nav-flash (1 0 0))) "Simple file navigation using [[WikiStrings]]" single ((:commit . "9afe0f4d05910b0cccc94cb6d4d880119f3b0528") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "mouse" "button" "hypermedia" "navigation") (:url . "http://github.com/rolandwalker/button-lock"))]) + (wiki-summary . [(20181010 1824) ((emacs (24))) "View Wikipedia summaries in Emacs easily." single ((:commit . "fa41ab6e50b3b80e54148af9d4bac18fd0405000") (:authors ("Danny Gratzer")) (:maintainer "Danny Gratzer") (:keywords "wikipedia" "utility") (:url . "https://github.com/jozefg/wiki-summary.el"))]) + (wikinfo . [(20210121 1642) ((emacs (27 1))) "Scrape Wikipedia Infoboxes" single ((:commit . "afa32f2b3c23e6d1565698faf9697fa445059bb9") (:authors ("Nicholas Vollmer" . "progfolio@protonmail.com")) (:maintainer "Nicholas Vollmer" . "progfolio@protonmail.com") (:keywords "org" "convenience") (:url . "https://github.com/progfolio/wikinfo"))]) + (wikinforg . [(20210602 1459) ((emacs (27 1)) (wikinfo (0 0 0)) (org (9 3))) "Org-mode wikinfo integration" single ((:commit . "3aecd23e68b9117a03c65fafa85a0805b58609d1") (:authors ("Nicholas Vollmer" . "progfolio@protonmail.com")) (:maintainer "Nicholas Vollmer" . "progfolio@protonmail.com") (:keywords "org" "convenience") (:url . "https://github.com/progfolio/wikinforg"))]) + (wilt . [(20180220 854) ((emacs (24 3)) (dash (2 12 0)) (s (1 10 0))) "An extensions for calculating WILT in a buffer." single ((:commit . "04dbe37fa35d0b24c791421785d2c97a8cbfe2cc") (:authors ("Austin Bingham" . "austin@sixty-north.com")) (:maintainer "Austin Bingham" . "austin@sixty-north.com") (:url . "https://github.com/sixty-north/emacs-wilt"))]) + (win-switch . [(20161009 1627) nil "fast, dynamic bindings for window-switching/resizing" single ((:commit . "954eb5e4c5737f0c06368c42a7f1c3dd374d782f") (:authors ("Christopher Genovese" . "genovese@cmu.edu")) (:maintainer "Christopher R. Genovese" . "genovese@cmu.edu") (:keywords "window" "switch" "key bindings" "ergonomic" "efficient") (:url . "http://www.stat.cmu.edu/~genovese/emacs/win-switch/"))]) + (windata . [(20090830 1040) nil "convert window configuration to list" single ((:commit . "a723fc446ceaec23d5f29ecc8245d94c99d91625") (:authors (nil . "wenbinye@gmail.com")) (:maintainer nil . "wenbinye@gmail.com") (:keywords "convenience" "frames"))]) + (window-end-visible . [(20140508 2041) nil "Find the last visible point in a window" single ((:commit . "525500fb2ebc08f3f9ea493972e5f2e1d79f89ef") (:authors ("Roland Walker" . "walker@pobox.com")) (:maintainer "Roland Walker" . "walker@pobox.com") (:keywords "extensions") (:url . "http://github.com/rolandwalker/window-end-visible"))]) + (window-jump . [(20170809 2208) nil "Move left/right/up/down through your windows." single ((:commit . "6bdb51e9a346907d60a9625f6180bddd06be6674") (:authors ("Steven Thomas")) (:maintainer "Steven Thomas") (:keywords "frames" "convenience") (:url . "https://github.com/chumpage/chumpy-windows"))]) + (window-layout . [(20170215 33) nil "window layout manager" single ((:commit . "cd2e4f967b610c2bbef53182829e47250d027056") (:authors ("SAKURAI Masashi <m.sakurai atmark kiwanami.net>")) (:maintainer "SAKURAI Masashi <m.sakurai atmark kiwanami.net>") (:keywords "window" "layout"))]) + (window-number . [(20170801 151) nil "Select windows by numbers." single ((:commit . "d41722de646ffeb3f70d26e4a86a5a1ba5c6be87") (:authors ("Johann \"Myrkraverk\" Oskarsson" . "myrkraverk@users.sourceforge.net")) (:maintainer "Nik Nyby" . "niknyby@riseup.net") (:keywords "windows") (:url . "https://github.com/nikolas/window-number"))]) + (window-numbering . [(20160809 1810) nil "Numbered window shortcuts" single ((:commit . "10809b3993a97c7b544240bf5d7ce9b1110a1b89") (:authors ("Nikolaj Schumacher <bugs * nschum de>")) (:maintainer "Nikolaj Schumacher <bugs * nschum de>") (:keywords "faces" "matching") (:url . "http://nschum.de/src/emacs/window-numbering-mode/"))]) + (window-purpose . [(20210423 454) ((emacs (24 4)) (let-alist (1 0 3)) (imenu-list (0 1))) "Purpose-based window management for Emacs" tar ((:commit . "1a556294131a78b557f88bd28d42b43d5c6bd79a") (:authors ("Bar Magal")) (:maintainer "Bar Magal") (:keywords "frames") (:url . "https://github.com/bmag/emacs-purpose"))]) + (winds . [(20201121 123) ((emacs (25 1))) "Window configuration switcher grouped by workspaces" single ((:commit . "5827e890059d0ce67ebb4779da63c15afccf0973") (:authors ("Javier A. Pollak" . "javi.po.123@gmail.com")) (:maintainer "Javier A. Pollak" . "javi.po.123@gmail.com") (:keywords "convenience") (:url . "https://github.com/Javyre/winds.el"))]) + (windsize . [(20181029 2257) nil "Simple, intuitive window resizing" single ((:commit . "62c2846bbe95b0a73e996c75e4a644d05f57aaaa") (:authors ("Chris Perkins" . "chrisperkins99@gmail.com")) (:maintainer "Chris Perkins" . "chrisperkins99@gmail.com") (:keywords "window" "resizing" "convenience") (:url . "http://github.com/grammati/windsize"))]) + (windswap . [(20200722 411) ((emacs (24 3))) "Like windmove, but swaps buffers while moving point" single ((:commit . "1a334f6543e0a30c55ea1e6071e9732d948f9e4b") (:authors ("Steve Purcell" . "steve@sanityinc.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:keywords "frames" "convenience") (:url . "https://github.com/purcell/windswap"))]) + (windwow . [(20170816 148) ((dash (2 11 0)) (cl-lib (0 6 1)) (emacs (24))) "simple workspace management" single ((:commit . "77bad26f651744b68d31b389389147014d250f23") (:authors ("Viju Mathew" . "viju.jm@gmail.com")) (:maintainer "Viju Mathew" . "viju.jm@gmail.com") (:keywords "frames") (:url . "github.com/vijumathew/windwow"))]) + (winnow . [(20210105 1919) ((emacs (24))) "winnow ag/grep results by matching/excluding lines" single ((:commit . "761b15bc31696a4f80c5fd508c84b1f5b4190ec2") (:authors ("Charles L.G. Comstock" . "dgtized@gmail.com")) (:maintainer "Charles L.G. Comstock" . "dgtized@gmail.com") (:keywords "matching") (:url . "https://github.com/dgtized/winnow.el"))]) + (winpoint . [(20131023 1713) nil "Remember buffer positions per-window, not per buffer" single ((:commit . "e6050093c076308184566fa1d1012423d6934773") (:authors ("Jorgen Schaefer" . "forcer@forcix.cx")) (:maintainer "Jorgen Schaefer" . "forcer@forcix.cx") (:keywords "convenience") (:url . "https://github.com/jorgenschaefer/winpoint"))]) + (winring . [(20180530 18) nil "Window configuration rings" single ((:commit . "f2d072bd446b73e93b127523f19ea82b99b9267f") (:authors ("1997-2018 Barry A. Warsaw")) (:maintainer "1997-2018 Barry A. Warsaw") (:keywords "frames" "tools") (:url . "https://gitlab.com/warsaw/winring"))]) + (winum . [(20190911 1607) ((cl-lib (0 5)) (dash (2 13 0))) "Navigate windows and frames using numbers." single ((:commit . "c5455e866e8a5f7eab6a7263e2057aff5f1118b9") (:authors ("Thomas de Beauchêne" . "thomas.de.beauchene@gmail.com")) (:maintainer "Thomas de Beauchêne" . "thomas.de.beauchene@gmail.com") (:keywords "convenience" "frames" "windows" "multi-screen") (:url . "http://github.com/deb0ch/winum.el"))]) + (wisp-mode . [(20210405 1410) ((emacs (24 4))) "Tools for wisp: the Whitespace-to-Lisp preprocessor" single ((:commit . "c67784cc0c44dc7c590f1f1f5a979a36b1e8c11d") (:authors ("Arne Babenhauserheide" . "arne_bab@web.de")) (:maintainer "Arne Babenhauserheide" . "arne_bab@web.de") (:keywords "languages" "lisp" "scheme") (:url . "http://www.draketo.de/english/wisp"))]) + (wispjs-mode . [(20170720 1919) ((clojure-mode (0))) "Major mode for Wisp code." single ((:commit . "60f9f5fd9d1556e2d008939f67eb1b1d0f325fa8") (:authors ("Kris Jenkins" . "krisajenkins@gmail.com")) (:maintainer "Kris Jenkins" . "krisajenkins@gmail.com") (:url . "https://github.com/krisajenkins/wispjs-mode"))]) + (with-editor . [(20210524 1654) ((emacs (24 4))) "Use the Emacsclient as $EDITOR" tar ((:commit . "5519b6a67ecd66865b4fdd5447425eee900c54f4") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:keywords "tools") (:url . "https://github.com/magit/with-editor"))]) + (with-emacs . [(20200210 1543) ((emacs (24 4))) "Evaluate Emacs Lisp expressions in a separate Emacs process" single ((:commit . "9f99bec56f87e53deb9f33b364eda77677a17eb9") (:authors ("Gong Qijian" . "gongqijian@gmail.com")) (:maintainer "Gong Qijian" . "gongqijian@gmail.com") (:keywords "tools") (:url . "https://github.com/twlz0ne/with-emacs.el"))]) + (with-namespace . [(20130407 1822) ((dash (1 1 0)) (loop (1 1))) "interoperable elisp namespaces" single ((:commit . "8ac52da3a09cf46087720e30cf730d00f140cde6") (:authors ("Wilfred Hughes" . "me@wilfred.me.uk")) (:maintainer "Wilfred Hughes" . "me@wilfred.me.uk") (:keywords "namespaces"))]) + (with-proxy . [(20200510 414) ((emacs (24 4))) "Evaluate expressions with proxy" single ((:commit . "93b1ed2f3060f305009fa71f4fb5bb10173a10e3") (:authors ("Gong Qijian" . "gongqijian@gmail.com")) (:maintainer "Gong Qijian" . "gongqijian@gmail.com") (:keywords "comm") (:url . "https://github.com/twlz0ne/with-proxy.el"))]) + (with-shell-interpreter . [(20200828 1217) ((emacs (25 1)) (cl-lib (0 6 1))) "Helper for shell command APIs" single ((:commit . "3fd1ea892e44f7fe6f86df2b5c0a0a1e0f3913fa") (:keywords "processes" "terminals") (:url . "https://github.com/p3r7/with-shell-interpreter"))]) + (with-simulated-input . [(20210527 2320) ((emacs (24 4))) "A macro to simulate user input non-interactively" single ((:commit . "0f43fe46d4ab098c18a90b9df18cb96bab8e4a35") (:authors ("Ryan C. Thompson" . "rct@thompsonclan.org") ("Nikita Bloshchanevich" . "nikblos@outlook.com")) (:maintainer "Ryan C Thompson" . "rct@thompsonclan.org") (:keywords "lisp" "tools" "extensions") (:url . "https://github.com/DarwinAwardWinner/with-simulated-input"))]) + (with-venv . [(20200125 1620) ((cl-lib (0 5)) (emacs (24 4))) "Execute with Python virtual environment activated" single ((:commit . "51ba19ac75a2796d494587b3b20ce51d4eb178a5") (:authors ("10sr <8.slashes [at] gmail [dot] com>")) (:maintainer "10sr <8.slashes [at] gmail [dot] com>") (:keywords "processes" "python" "venv") (:url . "https://github.com/10sr/with-venv-el"))]) + (wn-mode . [(20151110 552) ((emacs (24))) "numeric window switching shortcuts" single ((:commit . "f05c3151523e529af5a0a3fa8c948b61fb369f6e") (:authors ("Anonymous")) (:maintainer "Luís Oliveira" . "luismbo@gmail.com") (:keywords "buffers" "windows" "switching-windows") (:url . "https://github.com/luismbo/wn-mode"))]) + (wolfram . [(20190805 1007) nil "Wolfram Alpha Integration" single ((:commit . "a172712d5045834f5434cca2843a7c3506805db8") (:authors ("Hans Sjunnesson" . "hans.sjunnesson@gmail.com")) (:maintainer "Hans Sjunnesson" . "hans.sjunnesson@gmail.com") (:keywords "math"))]) + (wolfram-mode . [(20180307 13) ((emacs (24 3))) "Mathematica editing and inferior mode." single ((:commit . "be680190cac6ccf579dbce107deaae495928d1b3") (:authors ("Daichi Mochihashi <daichi at cslab.kecl.ntt.co.jp>")) (:maintainer "Daichi Mochihashi <daichi at cslab.kecl.ntt.co.jp>") (:keywords "languages" "processes" "tools") (:url . "https://github.com/kawabata/wolfram-mode/"))]) + (wonderland . [(20130913 119) ((dash (2 0 0)) (dash-functional (1 0 0)) (multi (2 0 0)) (emacs (24))) "declarative configuration for Emacsen" single ((:commit . "89d274ad694b0e748efdac23ccd60b7d8b73d7c6") (:authors ("Christina Whyte" . "kurisu.whyte@gmail.com")) (:maintainer "Christina Whyte" . "kurisu.whyte@gmail.com") (:keywords "configuration" "profile" "wonderland") (:url . "http://github.com/kurisuwhyte/emacs-wonderland"))]) + (wordgen . [(20170803 1820) ((emacs (24)) (cl-lib (0 5))) "Random word generator" single ((:commit . "aacad928ae99a953e034a831dfd0ebdf7d52ac1d") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/wordgen.el"))]) + (wordnut . [(20180313 443) ((emacs (24 4))) "Major mode interface to WordNet" tar ((:commit . "feac531404041855312c1a046bde7ea18c674915"))]) + (wordsmith-mode . [(20171025 1430) nil "Syntax analysis and NLP text-processing in Emacs (OSX-only)" single ((:commit . "589a97412138145bea70e0450eeddeb7f138d538") (:authors ("istib" . "istib@thebati.net")) (:maintainer "istib" . "istib@thebati.net"))]) + (worf . [(20210504 1132) ((swiper (0 11 0)) (ace-link (0 1 0)) (hydra (0 13 0)) (zoutline (0 1 0))) "A warrior does not press so many keys! (in org-mode)" tar ((:commit . "c99ef5478183d0ab56b0abe943206491c802e003") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "lisp") (:url . "https://github.com/abo-abo/worf"))]) + (workgroups . [(20110726 1641) nil "workgroups for windows (for Emacs)" single ((:commit . "9572b3492ee09054dc329f64ed846c962b395e39") (:authors ("tlh" . "thunkout@gmail.com")) (:maintainer "tlh" . "thunkout@gmail.com") (:keywords "session" "management" "window-configuration" "persistence"))]) + (workgroups2 . [(20210511 1128) ((emacs (25 1))) "New workspaces for Emacs" single ((:commit . "f74a58f3cfb2e94cee4c4527b2f7aeb8fa5ab46c") (:authors ("Sergey Pashinin <sergey at pashinin dot com>")) (:maintainer "Sergey Pashinin <sergey at pashinin dot com>") (:keywords "session" "management" "window-configuration" "persistence") (:url . "https://github.com/pashinin/workgroups2"))]) + (world-time-mode . [(20140627 807) nil "show whole days of world-time diffs" single ((:commit . "ce7a3b45c87eb24cfe61eee453175d64f741d7cc") (:authors ("Nic Ferrier" . "nferrier@ferrier.me.uk")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk") (:keywords "tools" "calendar"))]) + (wotd . [(20170328 1948) ((emacs (24 4)) (org (8 2 10))) "Fetch word-of-the-day from multiple online sources" single ((:commit . "d2937a3d91e014f8028a1f33d21c18cc0b065a64") (:authors ("Junpeng Qiu" . "qjpchmail@gmail.com")) (:maintainer "Junpeng Qiu" . "qjpchmail@gmail.com") (:keywords "extensions"))]) + (wrap-region . [(20140117 720) ((dash (1 0 3))) "Wrap text with punctation or tag" single ((:commit . "fbae9b0f106187af19823f1a6260b5c68b7252e6") (:authors ("Johan Andersson" . "johan.rejeep@gmail.com")) (:maintainer "Johan Andersson" . "johan.rejeep@gmail.com") (:keywords "speed" "convenience") (:url . "http://github.com/rejeep/wrap-region"))]) + (writefreely . [(20190628 1606) ((emacs (24 3)) (org (9 0)) (ox-gfm (0 0)) (request (0 3))) "Push your Org files as markdown to a writefreely instance" single ((:commit . "83a487e48e0d8342c372deb74d04c0b43474268c") (:authors ("Daniel Gomez <d.gomez at posteo dot org>")) (:maintainer "Daniel Gomez <d.gomez at posteo dot org>") (:keywords "convenience") (:url . "https://github.com/dangom/writefreely.el"))]) + (writegood-mode . [(20210418 110) nil "Polish up poor writing on the fly" single ((:commit . "ed42d918d98826ad88928b7af9f2597502afc6b0") (:authors ("Benjamin Beckwith")) (:maintainer "Benjamin Beckwith") (:keywords "writing" "weasel-words" "grammar") (:url . "http://github.com/bnbeckwith/writegood-mode"))]) + (writeroom-mode . [(20201229 2242) ((emacs (25 1)) (visual-fill-column (2 2))) "Minor mode for distraction-free writing" tar ((:commit . "b648b340172ce4e44307375697e190bc723203e0") (:authors ("Joost Kremers" . "joostkremers@fastmail.fm")) (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm") (:keywords "text") (:url . "https://github.com/joostkremers/writeroom-mode"))]) + (ws-butler . [(20201117 1528) nil "Unobtrusively remove trailing whitespace." single ((:commit . "e3a38d93e01014cd47bf5af4924459bd145fd7c4") (:authors ("Le Wang")) (:maintainer "Le Wang") (:url . "https://github.com/lewang/ws-butler"))]) + (wsd-mode . [(20191031 1211) nil "Emacs major-mode for www.websequencediagrams.com" tar ((:commit . "53330a2a43c4875f8682457df1a869a4c9028660") (:authors ("Jostein Kjønigsen" . "jostein@gmail.com")) (:maintainer "Jostein Kjønigsen" . "jostein@gmail.com") (:keywords "wsd" "diagrams" "design" "process" "modelling" "uml") (:url . "https://github.com/josteink/wsd-mode"))]) + (wttrin . [(20170614 1206) ((emacs (24 4)) (xterm-color (1 0))) "Emacs frontend for weather web service wttr.in" single ((:commit . "df5427ce2a5ad4dab652dbb1c4a1834d7ddc2abc") (:authors ("Carl X. Su" . "bcbcarl@gmail.com") ("ono hiroko (kuanyui)" . "azazabc123@gmail.com")) (:maintainer "Carl X. Su" . "bcbcarl@gmail.com") (:keywords "comm" "weather" "wttrin") (:url . "https://github.com/bcbcarl/emacs-wttrin"))]) + (wucuo . [(20210316 156) ((emacs (25 1))) "Fastest solution to spell check camel case code or plain text" tar ((:commit . "2e57f792edc371e7105ee388f878d52d5801f5de") (:authors ("Chen Bin <chenbin DOT sh AT gmail DOT com>")) (:maintainer "Chen Bin <chenbin DOT sh AT gmail DOT com>") (:keywords "convenience") (:url . "http://github.com/redguardtoo/wucuo"))]) + (wwg . [(20210503 656) ((emacs (25 1))) "Writer word goals" single ((:commit . "ef94f78b2c4e4fcf1a59d492637cbc84396cb032") (:authors (nil . "Andrea andrea-dev@hotmail.com>")) (:maintainer nil . "Andrea andrea-dev@hotmail.com>") (:keywords "wp") (:url . "https://github.com/ag91/writer-word-goals"))]) + (wwtime . [(20151122 1610) nil "Insert a time of day with appropriate world-wide localization" single ((:commit . "d04d8fa814b5d3644efaeb28f25520ada69acbbd") (:authors ("Norman Walsh" . "ndw@nwalsh.com")) (:maintainer "Norman Walsh" . "ndw@nwalsh.com") (:keywords "time"))]) + (www-synonyms . [(20170128 2251) ((request (0 2 0)) (cl-lib (0 5))) "insert synonym for a word" single ((:commit . "7e37ea35064ff31c9945f0198a653647d408c936") (:authors ("Bernhard Specht" . "bernhard@specht.net")) (:maintainer "Bernhard Specht" . "bernhard@specht.net") (:keywords "lisp"))]) + (x-path-walker . [(20201220 628) ((helm-core (1 9 2))) "Navigation feature for JSON/XML/HTML based on path (imenu like)" tar ((:commit . "e553968b6ddebe39ea00904a2e9ff4cff6096985") (:authors (nil . "<lompik@ArchOrion>")) (:maintainer nil . "<lompik@ArchOrion>") (:keywords "convenience"))]) + (x509-mode . [(20210407 627) ((emacs (24 1)) (cl-lib (0 5))) "View certificates, CRLs and keys using OpenSSL." tar ((:commit . "470769edba111aed8eabce58a3f2a02da0767624") (:authors ("Fredrik Axelsson" . "f.axelsson@gmai.com")) (:maintainer "Fredrik Axelsson" . "f.axelsson@gmai.com") (:url . "https://github.com/jobbflykt/x509-mode"))]) + (x86-lookup . [(20210412 2022) ((emacs (24 3)) (cl-lib (0 3))) "jump to x86 instruction documentation" single ((:commit . "1573d61cc4457737b94624598a891c837fb52c16") (:authors ("Christopher Wellons" . "wellons@nullprogram.com")) (:maintainer "Christopher Wellons" . "wellons@nullprogram.com") (:url . "https://github.com/skeeto/x86-lookup"))]) + (xah-css-mode . [(20201229 837) ((emacs (24 3))) "Major mode for editing CSS code." single ((:commit . "5d9db23bbb982c28cbcf351957ef96ecd80e4c0b") (:authors ("Xah Lee ( http://xahlee.info/ )")) (:maintainer "Xah Lee ( http://xahlee.info/ )") (:keywords "languages" "convenience" "css" "color") (:url . "http://ergoemacs.org/emacs/xah-css-mode.html"))]) + (xah-elisp-mode . [(20210208 2056) ((emacs (24 3))) "Major mode for editing emacs lisp." single ((:commit . "3ae341944297d59bf33f5580364af2858198781e") (:authors ("Xah Lee ( http://xahlee.info/ )")) (:maintainer "Xah Lee ( http://xahlee.info/ )") (:keywords "lisp" "languages") (:url . "http://ergoemacs.org/emacs/xah-elisp-mode.html"))]) + (xah-find . [(20210111 334) ((emacs (24 1))) "find replace in pure emacs lisp. Purpose similar to grep/sed." single ((:commit . "8948fa8f18023868731a1666f9893abc08f370e1") (:authors ("Xah Lee ( http://xahlee.info/ )")) (:maintainer "Xah Lee ( http://xahlee.info/ )") (:keywords "convenience" "extensions" "files" "tools" "unix") (:url . "http://ergoemacs.org/emacs/elisp-xah-find-text.html"))]) + (xah-fly-keys . [(20210520 540) ((emacs (24 1))) "ergonomic modal keybinding minor mode." single ((:commit . "3022cbf1e0b16c4fe632d03bd49832afac12510c") (:authors ("Xah Lee ( http://xahlee.info/ )")) (:maintainer "Xah Lee ( http://xahlee.info/ )") (:keywords "convenience" "emulations" "vim" "ergoemacs") (:url . "http://ergoemacs.org/misc/ergoemacs_vi_mode.html"))]) + (xah-get-thing . [(20170821 1053) ((emacs (24 1))) "get thing or selection at point." single ((:commit . "e3ef069ea9fea3a092689d45c94c6211b51d0ea4") (:authors ("Xah Lee ( http://xahlee.info/ )")) (:maintainer "Xah Lee ( http://xahlee.info/ )") (:keywords "extensions" "lisp" "tools") (:url . "http://ergoemacs.org/emacs/elisp_get-selection-or-unit.html"))]) + (xah-lookup . [(20200420 1528) ((emacs (24 1))) "look up word on internet." single ((:commit . "c97a43dc0cebbfc519d0cce5b547dcc5e22b2085") (:authors ("Xah Lee ( http://xahlee.info/ )")) (:maintainer "Xah Lee ( http://xahlee.info/ )") (:keywords "help" "docs" "convenience") (:url . "http://ergoemacs.org/emacs/xah-lookup.html"))]) + (xah-math-input . [(20210419 1833) ((emacs (24 1))) "a minor mode for inputting math and Unicode symbols." single ((:commit . "6ccd3ca21aa71a2c1f831fabbdfc9e32c02e180d") (:authors ("Xah Lee ( http://xahlee.info/ )")) (:maintainer "Xah Lee ( http://xahlee.info/ )") (:keywords "abbrev" "convenience" "unicode" "math" "latex") (:url . "http://ergoemacs.org/emacs/xmsi-math-symbols-input.html"))]) + (xah-reformat-code . [(20200913 1701) nil "commands to reformat source code." single ((:commit . "c4682148759051b8c27f7be573981f8fc92447e9") (:authors ("Xah Lee ( http://xahlee.info/ )")) (:maintainer "Xah Lee ( http://xahlee.info/ )") (:keywords "convenience") (:url . "http://ergoemacs.org/emacs/emacs_reformat_lines.html"))]) + (xah-replace-pairs . [(20210109 1741) ((emacs (24 1))) "emacs lisp functions for multi-pair find/replace." single ((:commit . "a051568c21b0bd7907dffebdbe04d0110c038be0") (:authors ("Xah Lee ( http://xahlee.info/ )")) (:maintainer "Xah Lee ( http://xahlee.info/ )") (:keywords "lisp" "tools" "find replace") (:url . "http://ergoemacs.org/emacs/elisp_replace_string_region.html"))]) + (xahk-mode . [(20170821 1107) ((emacs (24 1))) "Major mode for editing AutoHotkey scripts." single ((:commit . "02012b20603c00e3b2ef32159a690ed1e05d12c3") (:authors ("Xah Lee ( http://xahlee.info/ )")) (:maintainer "Xah Lee ( http://xahlee.info/ )") (:keywords "languages") (:url . "http://xahlee.info/mswin/emacs_autohotkey_mode.html"))]) + (xbm-life . [(20210508 1640) ((emacs (24 1))) "A XBM version of Conway's Game of Life" single ((:commit . "ec6abb0182068294a379cb49ad5346b1d757457d") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:keywords "games") (:url . "https://depp.brause.cc/xbm-life"))]) + (xcode-mode . [(20160907 1208) ((emacs (24 4)) (s (1 10 0)) (dash (2 11 0)) (multiple-cursors (1 0 0))) "A minor mode for emacs to perform Xcode like actions." single ((:commit . "2ae4f512d6c601ea39d5ab785c2b5288eac24b59") (:authors ("Nickolas Lanasa" . "nick@nytekproductions.com")) (:maintainer "Nickolas Lanasa" . "nick@nytekproductions.com") (:keywords "conveniences"))]) + (xcode-project . [(20200810 2010) ((emacs (25))) "A package for reading Xcode project files." tar ((:commit . "11743f0a2212c840a108e1b905b1f20afcff8156") (:authors ("John Buckley" . "john@olivetoast.com")) (:maintainer "John Buckley" . "john@olivetoast.com") (:keywords "languages" "tools") (:url . "https://github.com/nhojb/xcode-project.git"))]) + (xcscope . [(20201025 2002) nil "cscope interface for (X)Emacs" single ((:commit . "8e441efab0757778fe3594ff68c378bf90f539f9") (:authors ("Darryl Okahata" . "darrylo@sonic.net") ("Dima Kogan" . "dima@secretsauce.net")) (:maintainer "Dima Kogan" . "dima@secretsauce.net") (:keywords "languages" "c") (:url . "https://github.com/dkogan/xcscope.el"))]) + (xenops . [(20210504 1106) ((emacs (26 1)) (aio (1 0)) (auctex (12 2 0)) (avy (0 5 0)) (dash (2 18 0)) (f (0 20 0)) (s (1 12 0))) "A LaTeX editing environment for mathematical documents" tar ((:commit . "4994ae4a660ee94d341ce1905c12b4cf39fee574") (:authors ("Dan Davison" . "dandavison7@gmail.com")) (:maintainer "Dan Davison" . "dandavison7@gmail.com") (:url . "https://github.com/dandavison/xenops"))]) + (xkcd . [(20160419 1130) ((json (1 3))) "View xkcd from Emacs" single ((:commit . "66e928706fd660cfdab204c98a347b49c4267bdf") (:authors ("Vibhav Pant" . "vibhavp@gmail.com")) (:maintainer "Vibhav Pant" . "vibhavp@gmail.com") (:keywords "xkcd" "webcomic") (:url . "https://github.com/vibhavp/emacs-xkcd"))]) + (xmind-org . [(20201202 1605) ((emacs (27 1)) (org-ml (5 3)) (dash (2 12))) "Import XMind mindmaps into Org" single ((:commit . "ee09e382b3fefb67ccf3cd4db96a8dd2acc34045") (:authors ("Akira Komamura" . "akira.komamura@gmail.com")) (:maintainer "Akira Komamura" . "akira.komamura@gmail.com") (:keywords "outlines" "wp" "files") (:url . "https://github.com/akirak/xmind-org-el"))]) + (xml+ . [(20170727 2351) ((emacs (24 4)) (dash (2 12 0))) "Utilities for xml and html trees" single ((:commit . "232fa863c08fc159b21dd58c39ea45dce3334895") (:authors ("Ben Dean" . "bendean837@gmail.com")) (:maintainer "Ben Dean" . "bendean837@gmail.com") (:keywords "xml" "html") (:url . "https://github.com/bddean/xml-plus"))]) + (xml-format . [(20191011 1148) ((emacs (25)) (reformatter (0 4))) "XML reformatter using xmllint" single ((:commit . "2861c4e33e18b077112efa072316b031bca4236c") (:authors ("wouter bolsterlee" . "wouter@bolsterl.ee")) (:maintainer "wouter bolsterlee" . "wouter@bolsterl.ee") (:keywords "languages") (:url . "https://github.com/wbolster/emacs-xml-format"))]) + (xml-quotes . [(20200301 1222) nil "read quotations from an XML document" tar ((:commit . "8fc21e43b45f9a50b24642412f05afcc3a316a1f") (:authors ("Norman Walsh" . "ndw@nwalsh.com")) (:maintainer "Norman Walsh" . "ndw@nwalsh.com") (:keywords "xml" "quotations") (:url . "https://github.com/ndw/xml-quotes"))]) + (xml-rpc . [(20200907 42) nil "An elisp implementation of clientside XML-RPC" single ((:commit . "8020ccd176986d8e49e0bb5dd9f4e756cf12eafc") (:maintainer "Mark A. Hershberger" . "mah@everybody.org") (:keywords "xml" "rpc" "network") (:url . "http://github.com/xml-rpc-el/xml-rpc-el"))]) + (xmlgen . [(20170411 1317) nil "A DSL for generating XML." single ((:commit . "dba66681f0c5e621a9e70e8afb34903c9ffe93c4") (:authors ("Philip Jackson" . "phil@shellarchive.co.uk")) (:maintainer "Philip Jackson" . "phil@shellarchive.co.uk"))]) + (xmlunicode . [(20200823 755) nil "Unicode support for XML" tar ((:commit . "0c2ee59888042d516f79a7b96526cbeae611c9bc") (:authors ("Norman Walsh" . "ndw@nwalsh.com")) (:maintainer "Norman Walsh" . "ndw@nwalsh.com") (:keywords "utf-8" "unicode" "xml" "characters"))]) + (xo . [(20160403 646) nil "XO linter integration with compilation mode" single ((:commit . "72fcd867cfa332fdb82f732925cf8977e690af78") (:authors ("J.A" . "jer.github@gmail.com")) (:maintainer "J.A" . "jer.github@gmail.com") (:keywords "processes"))]) + (xonsh-mode . [(20201020 52) ((emacs (24 3))) "Major mode for editing xonshrc files" single ((:commit . "7fa581524533a9b6b770426e4445e571a69e469d") (:authors ("Sean Farley" . "sean@farley.io")) (:maintainer "Sean Farley" . "sean@farley.io") (:keywords "languages") (:url . "https://github.com/seanfarley/xonsh-mode"))]) + (xquery-mode . [(20170214 1119) ((cl-lib (0 5))) "A simple mode for editing xquery programs" single ((:commit . "1b655ccf83d02a7bd473d2cf02359ed60bdf7369") (:url . "https://github.com/xquery-mode/xquery-mode"))]) + (xquery-tool . [(20200907 811) nil "A simple interface to saxonb's xquery." single ((:commit . "885184298ce1b6eb5d18922ea331623973082a15") (:authors ("Patrick McAllister" . "pma@rdorte.org")) (:maintainer "Patrick McAllister" . "pma@rdorte.org") (:keywords "xml" "xquery" "emacs") (:url . "https://github.com/paddymcall/xquery-tool.el"))]) + (xref-js2 . [(20210310 1238) ((emacs (25 1)) (js2-mode (20150909))) "Jump to references/definitions using ag & js2-mode's AST" single ((:commit . "fd6b723e7f1f9793d189a815e1904364dc026b03") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr") (:keywords "javascript" "convenience" "tools") (:url . "https://github.com/NicolasPetton/xref-js2"))]) + (xref-rst . [(20210320 1123) ((emacs (26 1))) "Lookup reStructuredText symbols" single ((:commit . "8d8e00352e6f7e86d38d9ea4330f6cb2380fb2ec") (:authors ("Campbell Barton" . "ideasman42@gmail.com")) (:maintainer "Campbell Barton" . "ideasman42@gmail.com") (:url . "https://gitlab.com/ideasman42/emacs-xref-rst"))]) + (xresources-theme . [(20190108 1851) nil "Use your .Xresources as your emacs theme" single ((:commit . "5239acb51aa2dfa89a207e57012108d8fcf60562") (:authors ("Marten Lienen" . "marten.lienen@gmail.com")) (:maintainer "Marten Lienen" . "marten.lienen@gmail.com") (:keywords "xresources" "theme"))]) + (xterm-color . [(20200605 2017) ((emacs (24 4))) "ANSI, XTERM 256 and Truecolor support" single ((:commit . "1a4012854c69a5cdaeb5a73d2ad705011892fca3") (:authors ("xristos" . "xristos@sdf.org")) (:maintainer "xristos" . "xristos@sdf.org") (:keywords "faces") (:url . "https://github.com/atomontage/xterm-color"))]) + (xterm-keybinder . [(20160523 56) ((emacs (24 3)) (cl-lib (0 5)) (let-alist (1 0 1))) "Let you extra keybinds in xterm/urxvt" tar ((:commit . "b29c4f700b0fa0c9f627f6725b36462b8fab06d6") (:authors ("Yuta Yamada <cokesboy\"at\"gmail.com>")) (:maintainer "Yuta Yamada <cokesboy\"at\"gmail.com>") (:keywords "convenient"))]) + (xtest . [(20141214 1706) ((cl-lib (0 5))) "Simple Testing with Emacs & ERT" single ((:commit . "2c2bdf32667506dd9ddf6eb311832add616bdf1c") (:authors ("Mustafa Shameem")) (:maintainer "Mustafa Shameem") (:keywords "testing" "ert") (:url . "https://github.com/promethial/xtest"))]) + (xwidgete . [(20171118 2116) ((emacs (25))) "enhances usability of current xwidget browser" single ((:commit . "e4e8410fe32176df85b46234717824519443fb04") (:authors ("Tu, Do Hoang" . "tuhdo1710@gmail.com")) (:maintainer "Tu, Do Hoang") (:keywords "xwidgete" "tools") (:url . "https://github.com/tuhdo/xwidgete"))]) + (xwidgets-reuse . [(20200817 147) ((emacs (26 1))) "Reuse xwidgets sessions to reduce resource consumption" single ((:commit . "5d56472dda53e43e0a11edcd373b44c0dbab47ce") (:authors ("Boris Glavic" . "lordpretzel@gmail.com")) (:maintainer "Boris Glavic" . "lordpretzel@gmail.com") (:keywords "hypermedia") (:url . "https://github.com/lordpretzel/xwidgets-reuse"))]) + (xwwp . [(20200917 643) ((emacs (26 1))) "Enhance xwidget webkit browser" tar ((:commit . "f67e070a6e1b233e60274deb717274b000923231") (:authors ("Damien Merenne")) (:maintainer "Damien Merenne") (:keywords "convenience") (:url . "https://github.com/canatella/xwwp"))]) + (xwwp-follow-link-helm . [(20200917 642) ((emacs (26 1)) (xwwp (0 1))) "Link navigation in `xwidget-webkit' sessions using `helm'" single ((:commit . "f67e070a6e1b233e60274deb717274b000923231") (:authors ("Damien Merenne")) (:maintainer "Damien Merenne") (:keywords "convenience") (:url . "https://github.com/canatella/xwwp"))]) + (xwwp-follow-link-ivy . [(20200917 642) ((emacs (26 1)) (xwwp (0 1))) "Link navigation in `xwidget-webkit' sessions using `ivy'" single ((:commit . "f67e070a6e1b233e60274deb717274b000923231") (:authors ("Damien Merenne")) (:maintainer "Damien Merenne") (:keywords "convenience") (:url . "https://github.com/canatella/xwwp"))]) + (yabin . [(20140206 351) nil "Yet Another Bignum package (A thin wrapper of calc.el)." single ((:commit . "db8c404507560ef9147fcce2b94cd706fbfa03b5") (:authors ("Daisuke Kobayashi" . "d5884jp@gmail.com")) (:maintainer "Daisuke Kobayashi" . "d5884jp@gmail.com") (:keywords "data"))]) + (yafolding . [(20200119 1353) nil "Folding code blocks based on indentation" single ((:commit . "4c1888ae45f9241516519ae0ae3a899f2efa05ba") (:authors ("Zeno Zeng" . "zenoofzeng@gmail.com")) (:maintainer "Zeno Zeng" . "zenoofzeng@gmail.com") (:keywords "folding"))]) + (yagist . [(20160418 508) ((cl-lib (0 3))) "Yet Another Emacs integration for gist.github.com" single ((:commit . "dcdbd84f348414815d02f3da8a6ee0ac271632d4") (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com") (:keywords "tools") (:url . "https://github.com/mhayashi1120/yagist.el"))]) + (yahtzee . [(20200511 2005) ((emacs (24 3))) "The yahtzee game" single ((:commit . "96068216a4f0c4894bf780cd36164fe840cf81d5") (:authors ("Dimitar Dimitrov" . "mail.mitko@gmail.com")) (:maintainer "Dimitar Dimitrov" . "mail.mitko@gmail.com") (:keywords "games") (:url . "https://github.com/drdv/yahtzee"))]) + (yalinum . [(20130217 1043) nil "yet another display line numbers." single ((:commit . "d3e0cbe3f4f5ca311e3298e684901d6fea3ad973") (:authors ("tm8st" . "tm8st@hotmail.co.jp")) (:maintainer "tm8st" . "tm8st@hotmail.co.jp") (:keywords "convenience" "tools"))]) + (yaml . [(20210604 1500) ((emacs (25 1))) "YAML parser for Elisp" single ((:commit . "5b352258f50ec9d2e7ff8bd16323a24fb484b52b") (:authors ("Zachary Romero" . "zkry@posteo.org")) (:maintainer "Zachary Romero" . "zkry@posteo.org") (:keywords "tools") (:url . "https://github.com/zkry/yaml.el"))]) + (yaml-imenu . [(20210530 251) ((emacs (24 4)) (yaml-mode (0))) "Enhancement of the imenu support in yaml-mode." tar ((:commit . "01741205fb33d2ed511502d1cd65a711e07a3117") (:authors ("Akinori MUSHA" . "knu@iDaemons.org")) (:maintainer "Akinori MUSHA" . "knu@iDaemons.org") (:keywords "outlining" "convenience" "imenu") (:url . "https://github.com/knu/yaml-imenu.el"))]) + (yaml-mode . [(20210508 1641) ((emacs (24 1))) "Major mode for editing YAML files" single ((:commit . "3a57058468211f3cb18e71aecc630dcacb87636b") (:authors ("Yoshiki Kurihara" . "clouder@gmail.com") ("Marshall T. Vandegrift" . "llasram@gmail.com")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:keywords "data" "yaml") (:url . "https://github.com/yoshiki/yaml-mode"))]) + (yaml-tomato . [(20151123 753) ((s (1 9))) "copy or show the yaml path currently under cursor." single ((:commit . "f9df1c9bdfcec629b03031b2d2032f9dc533cb14") (:authors ("qrczeno")) (:maintainer "qrczeno") (:keywords "yaml"))]) + (yandex-weather . [(20160311 2037) nil "Fetch Yandex Weather forecasts." tar ((:commit . "6f823fd9e04ff9efb2aa65f333079e9f7e6e5b28"))]) + (yang-mode . [(20190507 724) nil "major mode for editing YANG files" single ((:commit . "4b4ab4d4a79d37d6c31c6ea7cccbc425e0b1eded") (:authors ("Martin Bjorklund" . "mbj4668@gmail.com")) (:maintainer "Martin Bjorklund" . "mbj4668@gmail.com"))]) + (yankpad . [(20210205 1318) ((emacs (25 1))) "Paste snippets from an org-mode file" single ((:commit . "fb9cb7753af971701dcd96a51efb4d70e2b2a18f") (:authors ("Erik Sjöstrand")) (:maintainer "Erik Sjöstrand") (:keywords "abbrev" "convenience") (:url . "http://github.com/Kungsgeten/yankpad"))]) + (yapfify . [(20200406 830) nil "(automatically) format python buffers using YAPF." single ((:commit . "3df4e8ce65f55fd69479b3417525ce83a2b00b45") (:authors ("Joris Engbers" . "info@jorisengbers.nl")) (:maintainer "Joris Engbers" . "info@jorisengbers.nl") (:url . "https://github.com/JorisE/yapfify"))]) + (yara-mode . [(20210520 1318) ((emacs (24))) "Major mode for editing yara rule file" single ((:commit . "345cf782926414f92f57d7f1b129974dc38a545b") (:authors (nil . "binjo.cn@gmail.com")) (:maintainer nil . "binjo.cn@gmail.com") (:keywords "yara") (:url . "not distributed yet"))]) + (yard-mode . [(20170817 1237) nil "Minor mode for Ruby YARD comments" single ((:commit . "ba74a47463b0320ae152bd42a7dd7aeecd7b5748") (:authors ("Kyle Hargraves")) (:maintainer "Kyle Hargraves") (:url . "https://github.com/pd/yard-mode.el"))]) + (yari . [(20151128 739) nil "Yet Another RI interface for Emacs" single ((:commit . "a2cb9656ee5dfe1fc2ee3854f3079a1c8e85dbe9") (:authors ("Aleksei Gusev" . "aleksei.gusev@gmail.com")) (:maintainer "Aleksei Gusev" . "aleksei.gusev@gmail.com") (:keywords "tools"))]) + (yarn-mode . [(20200208 2332) ((emacs (24 3))) "Major mode for yarn.lock files." single ((:commit . "8239d4dc7d8a52fa1e3fa81bd32c904a359fcfc1") (:authors ("Nicolás Salas V." . "nikosalas@gmail.com")) (:maintainer "Nicolás Salas V." . "nikosalas@gmail.com") (:keywords "convenience") (:url . "https://github.com/anachronic/yarn-mode"))]) + (yascroll . [(20210610 1516) ((emacs (26 1))) "Yet Another Scroll Bar Mode" single ((:commit . "631faad69ade592679261afcf7022a2717292a6e") (:authors ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) (:maintainer "Shen, Jen-Chieh" . "jcs090218@gmail.com") (:keywords "convenience") (:url . "https://github.com/emacsorphanage/yascroll"))]) + (yasnippet . [(20200604 246) ((cl-lib (0 5))) "Yet another snippet extension for Emacs" single ((:commit . "5cbdbf0d2015540c59ed8ee0fcf4788effdf75b6") (:maintainer "Noam Postavsky" . "npostavs@gmail.com") (:keywords "convenience" "emulation") (:url . "http://github.com/joaotavora/yasnippet"))]) + (yasnippet-lean . [(20200526 326) ((yasnippet (0 8 0))) "Collection of snippets for the Lean prover" tar ((:commit . "e0933f55d59da5425d0604bdcdbbf3cb85967563") (:maintainer "Simon Hudon" . "simon.hudon@gmail.com") (:keywords "convenience" "snippets" "leanprover") (:url . "https://github.com/leanprover-community/yasnippet-lean"))]) + (yasnippet-snippets . [(20210408 1234) ((yasnippet (0 8 0))) "Collection of yasnippet snippets" tar ((:commit . "be823d7e1a1a46454d60a9f3dabb16b68b5dd853") (:authors ("Andrea Crotti" . "andrea.crotti.0@gmail.com")) (:maintainer "Andrea Crotti" . "andrea.crotti.0@gmail.com") (:keywords "snippets") (:url . "https://github.com/AndreaCrotti/yasnippet-snippets"))]) + (yatemplate . [(20200625 1336) ((yasnippet (0 8 1)) (emacs (24 3))) "File templates with yasnippet" single ((:commit . "399564fc1afa100aa6049ac6de11fb065882d230") (:authors ("Wieland Hoffmann" . "themineo+yatemplate@gmail.com")) (:maintainer "Wieland Hoffmann" . "themineo+yatemplate@gmail.com") (:keywords "files" "convenience") (:url . "https://github.com/mineo/yatemplate"))]) + (yatex . [(20200208 931) nil "Yet Another tex-mode for emacs //野鳥//" tar ((:commit . "f4c2dca86202c2da5b4f0f6ec97c49dd1cb01e6c"))]) + (yaxception . [(20150105 1452) nil "Provide framework about exception like Java for Elisp" single ((:commit . "4e94cf3e0b9b5631b0e90eb4b7de597ee7185875") (:authors ("Hiroaki Otsu" . "ootsuhiroaki@gmail.com")) (:maintainer "Hiroaki Otsu" . "ootsuhiroaki@gmail.com") (:keywords "exception" "error" "signal") (:url . "https://github.com/aki2o/yaxception"))]) + (ycm . [(20150822 1836) nil "Emacs client for the YouCompleteMe auto-completion server." single ((:commit . "4da8a14abcd0f4fa3235042ade2e12b5068c0601") (:authors ("Ajay Gopinathan" . "ajay@gopinathan.net")) (:maintainer "Ajay Gopinathan" . "ajay@gopinathan.net") (:keywords "c" "abbrev"))]) + (ycmd . [(20190416 807) ((emacs (24 4)) (dash (2 13 0)) (s (1 11 0)) (deferred (0 5 1)) (cl-lib (0 6 1)) (let-alist (1 0 5)) (request (0 3 0)) (request-deferred (0 3 0)) (pkg-info (0 6))) "emacs bindings to the ycmd completion server" tar ((:commit . "c17ff9e0250a9b39d23af37015a2b300e2f36fed") (:url . "https://github.com/abingham/emacs-ycmd"))]) + (ydk-mode . [(20170113 921) nil "Language support for Yu-Gi-Oh! deck files" single ((:commit . "f3f125b29408e0b0a34fec27dcb7c02c5dbfd04e") (:authors ("Jackson Ray Hamilton" . "jackson@jacksonrayhamilton.com")) (:maintainer "Jackson Ray Hamilton" . "jackson@jacksonrayhamilton.com") (:keywords "faces" "games" "languages" "ydk" "yugioh" "yu-gi-oh") (:url . "https://github.com/jacksonrayhamilton/ydk-mode"))]) + (yequake . [(20200219 2323) ((emacs (25 2)) (dash (2 14 1))) "Drop-down frames, like Yakuake" single ((:commit . "d18166e597414350117d0b82a29e509fc53c636d") (:authors ("Adam Porter" . "adam@alphapapa.net")) (:maintainer "Adam Porter" . "adam@alphapapa.net") (:keywords "convenience" "window-system" "frames") (:url . "http://github.com/alphapapa/yequake"))]) + (yesql-ghosts . [(20150220 1237) ((s (1 9 0)) (dash (2 10 0)) (cider (0 8 0))) "Display ghostly yesql defqueries inline" single ((:commit . "8f1faf0137b85a5072d13e1240a463d9a35ce2bb") (:authors ("Magnar Sveen" . "magnars@gmail.com")) (:maintainer "Magnar Sveen" . "magnars@gmail.com"))]) + (yesterbox . [(20200327 52) ((emacs (24 3))) "Count number of inbox messages by day" single ((:commit . "10591342f1759e25756f5865371a53c132d8b0a0") (:authors ("Stephen J. Eglen" . "sje30@cam.ac.uk")) (:maintainer "Stephen J. Eglen" . "sje30@cam.ac.uk") (:keywords "mail") (:url . "http://github.com/sje30/yesterbox"))]) + (ynab . [(20200607 2008) ((emacs (26 3)) (cl-lib (0 5)) (ts (0 2))) "Major mode for YNAB (you need a budget)" single ((:commit . "2c6beb4d2c4996017f6b3c62c26db52a61e5c479") (:authors ("Jim Anders <https://github.com/janders223>")) (:maintainer "Jim Anders" . "jimanders223@gmail.com") (:keywords "ynab" "budget" "convenience") (:url . "https://github.com/janders223/ynab.el"))]) + (yoficator . [(20190509 1620) nil "Interactively yoficate Russian texts" tar ((:commit . "fa914f9648515bca54b5e558ca57d2b65fa57491") (:authors ("Eugene Minkovskii" . "emin@mccme.ru") ("Alexander Krotov" . "ilabdsf@gmail.com")) (:maintainer "Eugene Minkovskii" . "emin@mccme.ru") (:url . "https://gitlab.com/link2xt/yoficator"))]) + (yoshi-theme . [(20210509 520) nil "Theme named after my cat" single ((:commit . "9a26f361083ed1d0dd56e659fae913ffea51c739") (:authors ("Tom Willemse" . "tom@ryuslash.org")) (:maintainer "Tom Willemse" . "tom@ryuslash.org") (:keywords "faces") (:url . "http://projects.ryuslash.org/yoshi-theme/"))]) + (youdao-dictionary . [(20200722 1705) ((popup (0 5 0)) (pos-tip (0 4 6)) (chinese-word-at-point (0 2)) (names (0 5)) (emacs (24))) "Youdao Dictionary interface for Emacs" single ((:commit . "8a4815a43565b9bfd257246e4895b8bfafb9d573") (:authors ("Chunyang Xu" . "xuchunyang56@gmail.com")) (:maintainer "Chunyang Xu" . "xuchunyang56@gmail.com") (:keywords "convenience" "chinese" "dictionary") (:url . "https://github.com/xuchunyang/youdao-dictionary.el"))]) + (ytdious . [(20210228 2111) ((emacs (25 3))) "Query / Preview YouTube via Invidious" single ((:commit . "941460b51e43ef6764e15e2b9c4af54c3e56115f") (:authors ("Stefan Huchler") ("Gabriele Rastello")) (:maintainer "Stefan Huchler") (:keywords "youtube" "matching" "multimedia") (:url . "https://github.com/spiderbit/ytdious"))]) + (ytdl . [(20210506 914) ((emacs (26 1)) (async (1 9 4)) (transient (0 2 0)) (dash (2 17 0))) "Emacs Interface for youtube-dl" single ((:commit . "23da64f5c38b8cb83dbbadf704171b86cc0fa937") (:authors ("Arnaud Hoffmann" . "tuedachu@gmail.com")) (:maintainer "Arnaud Hoffmann" . "tuedachu@gmail.com") (:keywords "comm" "multimedia") (:url . "https://gitlab.com/tuedachu/ytdl"))]) + (ytel . [(20200725 1056) ((emacs (25 3))) "Query YouTube via Invidious" single ((:commit . "d40bc7ead8d4d7e4d16b03b66a93d63bef51cc5f") (:authors ("Gabriele Rastello")) (:maintainer "Gabriele Rastello") (:keywords "youtube" "matching" "multimedia") (:url . "https://github.com/grastello/ytel"))]) + (z3-mode . [(20151120 2255) ((flycheck (0 23)) (emacs (24))) "A z3/SMTLIBv2 interactive development environment" single ((:commit . "163dc01d59e9880b4dc188d4e1ad84d6c0c852e1") (:authors ("Zephyr Pellerin" . "zephyr.pellerin@gmail.com")) (:maintainer "Zephyr Pellerin" . "zephyr.pellerin@gmail.com") (:keywords "z3" "yices" "mathsat" "smt" "beaver") (:url . "https://github.com/zv/z3-mode"))]) + (zeal-at-point . [(20180131 2354) nil "Search the word at point with Zeal" single ((:commit . "0fc3263f44e95acd3e9d91057677621ce4d297ee") (:authors ("Jinzhu" . "wosmvp@gmail.com")) (:maintainer "Jinzhu" . "wosmvp@gmail.com") (:url . "https://github.com/jinzhu/zeal-at-point"))]) + (zel . [(20171014 832) ((emacs (25)) (frecency (0 1))) "Access frecent files easily" single ((:commit . "9dae2d212224d1deae1f62561fa8e4d689fd09f2") (:authors ("Sebastian Christ" . "rudolfo.christ@gmail.com")) (:maintainer "Sebastian Christ" . "rudolfo.christ@gmail.com") (:keywords "convenience" "files" "matching") (:url . "https://github.com/rudolfochrist/zel"))]) + (zen-and-art-theme . [(20120622 1437) nil "zen and art color theme for GNU Emacs 24" single ((:commit . "a7226cbce0bca2501d69a620cb2aeabfc396c232") (:authors ("Nick Parker")) (:maintainer "Nick Parker"))]) + (zen-mode . [(20200609 822) ((emacs (24 3))) "A major mode for the Zen programming language" single ((:commit . "c1b1806358f3cce6c04b30699987d82dc7d42559") (:authors ("Andrea Orru <andreaorru1991@gmail.com>, Andrew Kelley <superjoe30@gmail.com>, kristopher tate <kt@connectfree.co.jp>, Yoshitaka Takemoto" . "yt.3b8@connectfree.co.jp")) (:maintainer "Andrea Orru <andreaorru1991@gmail.com>, Andrew Kelley <superjoe30@gmail.com>, kristopher tate <kt@connectfree.co.jp>, Yoshitaka Takemoto" . "yt.3b8@connectfree.co.jp") (:keywords "zen" "languages") (:url . "https://github.com/zenlang/zen-mode"))]) + (zenburn-theme . [(20201121 1050) nil "A low contrast color theme for Emacs." single ((:commit . "ea9b8f3aedc6640cb0d15d77f7bb5d98830abe97") (:authors ("Bozhidar Batsov" . "bozhidar@batsov.com")) (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.com") (:url . "http://github.com/bbatsov/zenburn-emacs"))]) + (zencoding-mode . [(20140213 822) nil "Unfold CSS-selector-like expressions to markup" single ((:commit . "58e42af182c98cb9941d27cd042d227fbf4e146c") (:authors ("Chris Done" . "chrisdone@gmail.com")) (:maintainer "Chris Done" . "chrisdone@gmail.com") (:keywords "convenience") (:url . "https://github.com/rooney/zencoding"))]) + (zenity-color-picker . [(20160302 1154) ((emacs (24 4))) "Insert and adjust colors using Zenity" single ((:commit . "4f4f46676a461ebc881487fb70c8c181e323db5e") (:authors ("Samuel Laurén" . "samuel.lauren@iki.fi")) (:maintainer "Samuel Laurén" . "samuel.lauren@iki.fi") (:keywords "colors") (:url . "https://bitbucket.org/Soft/zenity-color-picker.el"))]) + (zeno-theme . [(20181027 118) ((emacs (24))) "A dark theme using different shades of blue" single ((:commit . "0914c4a5b1b9499e7f1ca5699b1c3ea2f4be3f1a") (:authors ("Bharat Joshi" . "jbharat@outlook.com")) (:maintainer "Bharat Joshi" . "jbharat@outlook.com") (:keywords "faces" "theme" "dark" "blue") (:url . "https://github.com/jbharat/zeno-theme"))]) + (zenscript-mode . [(20210102 1350) ((emacs (25 1))) "Major mode for ZenScript" tar ((:commit . "c33b4525502459fe60dd76b383e19919d450aeb8") (:url . "https://github.com/eutropius225/zenscript-mode"))]) + (zephir-mode . [(20200417 830) ((cl-lib (0 5)) (pkg-info (0 4)) (emacs (25 1))) "Major mode for editing Zephir code" tar ((:commit . "4e9618b77dff67c1c7b6fff78605a62311db88b8") (:authors ("Serghei Iakovlev" . "egrep@protonmail.ch")) (:maintainer "Serghei Iakovlev" . "egrep@protonmail.ch") (:keywords "languages") (:url . "https://github.com/zephir-lang/zephir-mode"))]) + (zero-input . [(20200405 1220) ((emacs (24 3)) (s (1 2 0))) "Zero Chinese input method framework" single ((:commit . "729da9f4b99acb744ee6974ed7f3d4e252fd19da") (:url . "https://gitlab.emacsos.com/sylecn/zero-el"))]) + (zerodark-theme . [(20210216 1640) ((all-the-icons (2 0 0))) "A dark, medium contrast theme for Emacs" single ((:commit . "ee49ea9e875d7a3da63386880ca3a9e10b1051e5") (:authors ("Nicolas Petton" . "nicolas@petton.fr")) (:maintainer "Nicolas Petton" . "nicolas@petton.fr") (:keywords "themes") (:url . "https://github.com/NicolasPetton/zerodark-theme"))]) + (zetteldeft . [(20210602 841) ((emacs (25 1)) (deft (0 8)) (ace-window (0 7 0))) "Turn deft into a zettelkasten system" tar ((:commit . "b71f24d382887aeefde9c47fb6aa521d0ebeb806") (:authors ("EFLS <Elias Storms>")) (:maintainer "EFLS <Elias Storms>") (:keywords "deft" "zettelkasten" "zetteldeft" "wp" "files") (:url . "https://efls.github.io/zetteldeft/"))]) + (zetz-mode . [(20200823 536) ((emacs (25 1)) (dash (2 17 0)) (hydra (0 15 0))) "A major mode for the ZetZ programming language" single ((:commit . "04da33f4ffa9db5b3556f423276f4fd1db13ec67") (:keywords "languages" "programming") (:url . "https://github.com/damon-kwok/zetz-mode"))]) + (zig-mode . [(20210605 513) ((emacs (24 3))) "A major mode for the Zig programming language" single ((:commit . "0babe7ec524f59d57c01e2fc66294d1afa01f5eb") (:authors ("Andrea Orru <andreaorru1991@gmail.com>, Andrew Kelley" . "superjoe30@gmail.com")) (:maintainer "Andrea Orru <andreaorru1991@gmail.com>, Andrew Kelley" . "superjoe30@gmail.com") (:keywords "zig" "languages") (:url . "https://github.com/zig-lang/zig-mode"))]) + (zim-wiki-mode . [(20200908 218) ((emacs (25 1)) (helm-ag (0 58)) (helm-projectile (0 14 0)) (dokuwiki-mode (0 1 1)) (link-hint (0 1)) (pretty-hydra (0 2 2))) "Zim Desktop Wiki edit mode" single ((:commit . "f65a2da6ea762532355fc726319ba3e3dd217ec2") (:authors ("Will Foran" . "willforan+zim-wiki-mode@gmail.com")) (:maintainer "Will Foran" . "willforan+zim-wiki-mode@gmail.com") (:keywords "outlines") (:url . "https://github.com/WillForan/zim-wiki-mode"))]) + (zimports . [(20200809 2035) ((emacs (26 1)) (projectile (2 1 0))) "Reformat python imports with zimports" single ((:commit . "4067b20a2ea25327504b0a42f443903728aa7966") (:url . "https://github.com/schmir/zimports.el"))]) + (zlc . [(20151011 157) nil "Provides zsh like completion system to Emacs" single ((:commit . "4dd2ba267ecdeac845a7cbb3147294ee7daa25f4") (:authors ("mooz" . "stillpedant@gmail.com")) (:maintainer "mooz" . "stillpedant@gmail.com") (:keywords "matching" "convenience"))]) + (zmq . [(20210424 1943) ((cl-lib (0 5)) (emacs (26))) "ZMQ bindings in elisp" tar ((:commit . "790033363cf0e78c616cfe117a2f681381e96f29") (:authors ("Nathaniel Nicandro" . "nathanielnicandro@gmail.com")) (:maintainer "Nathaniel Nicandro" . "nathanielnicandro@gmail.com") (:keywords "comm") (:url . "https://github.com/nnicandro/emacs-zmq"))]) + (znc . [(20210304 2337) ((cl-lib (0 2))) "ZNC + ERC" single ((:commit . "57d89fc1e17d94a8e9f3365b0d647a80520cc4a8") (:authors ("Yaroslav Shirokov")) (:maintainer "Yaroslav Shirokov") (:url . "https://github.com/sshirokov/ZNC.el"))]) + (zombie . [(20141222 1616) nil "major mode for editing ZOMBIE programs" single ((:commit . "ff8cd1b4cdbb4b0b9b8fd1ec8f6fb93eba249345") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))]) + (zombie-trellys-mode . [(20150304 1448) ((emacs (24)) (cl-lib (0 5)) (haskell-mode (1 5))) "A minor mode for interaction with Zombie Trellys" single ((:commit . "7f0c45fdda3a44c3b6d1762d116abb1421b8fba2") (:authors ("David Raymond Christiansen" . "david@davidchristiansen.dk")) (:maintainer "David Raymond Christiansen" . "david@davidchristiansen.dk") (:keywords "languages"))]) + (zone-nyan . [(20210508 1642) ((emacs (24 3)) (esxml (0 3 1))) "Zone out with nyan cat" single ((:commit . "38b6e9f1f5871e9166b00a1db44680caa56773be") (:authors ("Vasilij Schneidermann" . "mail@vasilij.de")) (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de") (:keywords "games") (:url . "https://depp.brause.cc/zone-nyan"))]) + (zone-rainbow . [(20160120 1334) ((emacs (24 3))) "Zone out with rainbow." single ((:commit . "2ba4f1a87c69c4712124ebf12c1f3ea171e1af36") (:authors ("KAWABATA, Taichi <kawabata.taichi_at_gmail.com>")) (:maintainer "KAWABATA, Taichi <kawabata.taichi_at_gmail.com>") (:keywords "games") (:url . "https://github.com/kawabata/zone-rainbow"))]) + (zone-select . [(20160118 1419) ((emacs (24 3)) (dash (2 8))) "Select zone programs." single ((:commit . "bf30da12f1625fe6563448fccf3c506acad10af7") (:authors ("KAWABATA, Taichi <kawabata.taichi_at_gmail.com>")) (:maintainer "KAWABATA, Taichi <kawabata.taichi_at_gmail.com>") (:keywords "games") (:url . "https://github.com/kawabata/zone-select"))]) + (zone-sl . [(20160201 1210) ((emacs (24 3))) "Zone out with steam locomotives." single ((:commit . "7ec22e3661c6348382f9fc39a9d0063dbd2352ff") (:authors ("KAWABATA, Taichi <kawabata.taichi_at_gmail.com>")) (:maintainer "KAWABATA, Taichi <kawabata.taichi_at_gmail.com>") (:keywords "games") (:url . "https://github.com/kawabata/zone-sl"))]) + (zoom . [(20201215 1913) ((emacs (24 4))) "Fixed and automatic balanced window layout" single ((:commit . "c7beef180bc4037404e2d56b9ab9b7c76d1713a0") (:authors ("Andrea Cardaci" . "cyrus.and@gmail.com")) (:maintainer "Andrea Cardaci" . "cyrus.and@gmail.com") (:keywords "frames") (:url . "https://github.com/cyrus-and/zoom"))]) + (zoom-window . [(20201205 1038) ((emacs (24 3))) "Zoom window like tmux" single ((:commit . "474ca4723517d95356145950b134652d5dc0c7f7") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/syohex/emacs-zoom-window"))]) + (zop-to-char . [(20160212 1554) ((cl-lib (0 5))) "A replacement of zap-to-char." single ((:commit . "00152aa666354b27e56e20565f186b363afa0dce") (:authors ("Thierry Volpiatto" . "thierry.volpiatto@gmail.com")) (:maintainer "Thierry Volpiatto" . "thierry.volpiatto@gmail.com") (:url . "https://github.com/thierryvolpiatto/zop-to-char"))]) + (zotelo . [(20160602 949) ((cl-lib (0 5))) "Manage Zotero collections from emacs" single ((:commit . "d9dc089b9adfcc70a63f2a84269a12eb7cb4c748") (:authors ("Spinu Vitalie")) (:maintainer "Spinu Vitalie") (:keywords "zotero" "emacs" "reftex" "bibtex" "mozrepl" "bibliography manager") (:url . "https://github.com/vitoshka/zotelo"))]) + (zotero . [(20210512 820) ((emacs (27 1)) (ht (2 2)) (oauth (1 0 4)) (s (1 12 0))) "Library for the Zotero API" tar ((:commit . "15eb7a8d099c93440f0a8920499633103f00fc83") (:authors ("Folkert van der Beek" . "folkertvanderbeek@gmail.com")) (:maintainer "Folkert van der Beek" . "folkertvanderbeek@gmail.com") (:keywords "zotero" "hypermedia") (:url . "https://gitlab.com/fvdbeek/emacs-zotero"))]) + (zotxt . [(20210222 347) ((request (0 3 2)) (deferred (0 5 1))) "Tools to integrate emacs with Zotero via the zotxt plugin." tar ((:commit . "45961801f9e0350d7457d0d84c5004f63aed9070") (:authors ("Erik Hetzner" . "egh@e6h.org")) (:maintainer "Erik Hetzner" . "egh@e6h.org") (:keywords "bib"))]) + (zoutline . [(20190520 1819) nil "Simple outline library." single ((:commit . "63756846f8540b6faf89d885438186e4fe1c7d8a") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:keywords "outline") (:url . "https://github.com/abo-abo/zoutline"))]) + (zpl-mode . [(20180906 1059) ((emacs (24 3))) "ZIMPL major mode" single ((:commit . "35e7e23c6baf31b5e65dd7405c8ab9b13c70637e") (:url . "https://github.com/ax487/zpl-mode.git"))]) + (zpresent . [(20200417 309) ((emacs (25 1)) (org-parser (0 4)) (dash (2 12 0)) (request (0 3 0))) "Simple presentation mode based on org files." single ((:commit . "406967322b7692492a5942d901335d626cace4d0") (:keywords "comm") (:url . "https://hg.sr.ht/~zck/zpresent"))]) + (zprint-format . [(20210602 146) ((emacs (24)) (reformatter (0 3))) "Reformat Clojure code using zprint" single ((:commit . "6051a5709ea6182974d7239f26e04c9731e04447") (:authors ("Derek Passen" . "dpassen1@gmail.com")) (:maintainer "Derek Passen" . "dpassen1@gmail.com") (:keywords "clojure" "zprint" "tools" "languages") (:url . "http://www.github.com/dpassen/zprint-format"))]) + (zprint-mode . [(20200731 1238) ((emacs (24 3))) "Reformat Clojure(Script) code using zprint" tar ((:commit . "b9b72b4918156f2f44aa544be9e19ea391937c2a") (:authors ("Paulus Esterhazy" . "pesterhazy@gmail.com")) (:maintainer "Paulus Esterhazy" . "pesterhazy@gmail.com") (:keywords "tools") (:url . "https://github.com/pesterhazy/zprint-mode.el"))]) + (ztree . [(20210415 1947) ((cl-lib (0))) "Text mode directory tree" tar ((:commit . "f05677f9696e573c8c607e8876fb4a0cccbc491f") (:authors ("Alexey Veretennikov" . "alexey.veretennikov@gmail.com")) (:maintainer "Alexey Veretennikov" . "alexey.veretennikov@gmail.com") (:keywords "files" "tools") (:url . "https://github.com/fourier/ztree"))]) + (zweilight-theme . [(20170113 605) nil "A dark color theme for Emacs." single ((:commit . "7f45ab9e23164d65538edb2beb9692ecdc24c31e") (:authors ("Philip Arvidsson" . "contact@philiparvidsson.com")) (:maintainer "Philip Arvidsson" . "contact@philiparvidsson.com") (:url . "http://github.com/philiparvidsson/zweilight-emacs"))]) + (zygospore . [(20140703 852) nil "reversible C-x 1 (delete-other-windows)" single ((:commit . "1af5ee663f5a7aa08d96a77cacff834dcdf55ea8") (:authors ("Louis Kottmann" . "louis.kottmann@gmail.com")) (:maintainer "Louis Kottmann" . "louis.kottmann@gmail.com") (:url . "https://github.com/louiskottmann/zygospore.el"))]) + (zzz-to-char . [(20210321 1707) ((emacs (24 4)) (cl-lib (0 5)) (avy (0 3 0))) "Fancy version of `zap-to-char' command" single ((:commit . "18d26571b91a9c56b6a7e0d2a58188e833ab5d0f") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:keywords "convenience") (:url . "https://github.com/mrkkrp/zzz-to-char"))])) \ No newline at end of file diff --git a/.emacs.d/elpa/atom-dark-theme-20181022.1602/atom-dark-theme-autoloads.el b/.emacs.d/elpa/atom-dark-theme-20181022.1602/atom-dark-theme-autoloads.el new file mode 100644 index 0000000..0d6adf7 --- /dev/null +++ b/.emacs.d/elpa/atom-dark-theme-20181022.1602/atom-dark-theme-autoloads.el @@ -0,0 +1,25 @@ +;;; atom-dark-theme-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "atom-dark-theme" "atom-dark-theme.el" (0 0 +;;;;;; 0 0)) +;;; Generated autoloads from atom-dark-theme.el + +(and load-file-name (boundp 'custom-theme-load-path) (add-to-list 'custom-theme-load-path (file-name-as-directory (file-name-directory load-file-name)))) + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "atom-dark-theme" '("atom-dark"))) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; atom-dark-theme-autoloads.el ends here diff --git a/.emacs.d/elpa/atom-dark-theme-20181022.1602/atom-dark-theme-pkg.el b/.emacs.d/elpa/atom-dark-theme-20181022.1602/atom-dark-theme-pkg.el new file mode 100644 index 0000000..105cb50 --- /dev/null +++ b/.emacs.d/elpa/atom-dark-theme-20181022.1602/atom-dark-theme-pkg.el @@ -0,0 +1,2 @@ +;;; Generated package description from atom-dark-theme.el -*- no-byte-compile: t -*- +(define-package "atom-dark-theme" "20181022.1602" "An Emacs port of the Atom Dark theme from Atom.io." 'nil :commit "5c8610d0b45a536b8f7f9777297c86362685a357" :authors '((nil . "Jeremy Whitlock <jwhitlock@apache.org")) :maintainer '(nil . "Jeremy Whitlock <jwhitlock@apache.org") :keywords '("themes" "atom" "dark") :url "https://github.com/whitlockjc/atom-dark-theme-emacs") diff --git a/.emacs.d/elpa/atom-dark-theme-20181022.1602/atom-dark-theme.el b/.emacs.d/elpa/atom-dark-theme-20181022.1602/atom-dark-theme.el new file mode 100644 index 0000000..8458aca --- /dev/null +++ b/.emacs.d/elpa/atom-dark-theme-20181022.1602/atom-dark-theme.el @@ -0,0 +1,227 @@ +;;; atom-dark-theme.el --- An Emacs port of the Atom Dark theme from Atom.io. +;; +;; +;; Author: Jeremy Whitlock <jwhitlock@apache.org +;; Version: 0.2 +;; Package-Version: 20181022.1602 +;; Package-Commit: 5c8610d0b45a536b8f7f9777297c86362685a357 +;; Keywords: themes atom dark +;; URL: https://github.com/whitlockjc/atom-dark-theme-emacs +;; +;; This file is not part of GNU Emacs. +;; +;; Licenese: +;; +;; This is free software; you can redistribute it and/or modify it under +;; the terms of the GNU General Public License as published by the Free +;; Software Foundation; either version 2, or (at your option) any later +;; version. +;; +;; This is distributed in the hope that it will be useful, but WITHOUT +;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +;; for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this file. If not, see <http://www.gnu.org/licenses/>. +;; +;;; Commentary +;; +;; An Emacs port of the Atom Dark theme from Atom.io. +;; +;;; Code + +(deftheme atom-dark + "Atom Dark - An Emacs port of the Atom Dark theme from Atom.io.") + +;; Testing +(custom-theme-set-faces + 'atom-dark + + ;; Basic + '(button ((t (:inherit (link))))) + '(cursor ((((background light)) (:background "black")) (((background dark)) (:background "white")))) + '(default ((t (:foreground "#c5c8c6" :background "#1d1f21" :weight normal :slant normal :underline nil :overline nil :strike-through nil :box nil :inverse-video nil :stipple nil :inherit nil)))) + '(escape-glyph ((t (:foreground "#FF8000")))) + '(fixed-pitch ((t (:family "Monospace")))) + '(header-line ((t (:foreground "grey90" :background "grey20")))) + '(highlight ((t (:background "#444")))) + '(lazy-highlight ((((class color) (min-colors 88) (background light)) (:background "paleturquoise")) (((class color) (min-colors 88) (background dark)) (:background "paleturquoise4")) (((class color) (min-colors 16)) (:background "turquoise3")) (((class color) (min-colors 8)) (:background "turquoise3")) (t (:underline (:color foreground-color :style line))))) + '(link ((t (:inherit font-lock-keyword-face :underline t)))) + '(link-visited ((default (:inherit (link))) (((class color) (background light)) (:foreground "magenta4")) (((class color) (background dark)) (:foreground "violet")))) + '(match ((((class color) (min-colors 88) (background light)) (:background "yellow1")) (((class color) (min-colors 88) (background dark)) (:background "RoyalBlue3")) (((class color) (min-colors 8) (background light)) (:foreground "black" :background "yellow")) (((class color) (min-colors 8) (background dark)) (:foreground "white" :background "blue")) (((type tty) (class mono)) (:inverse-video t)) (t (:background "gray")))) + '(minibuffer-prompt ((t (:foreground "#FF8000")))) + '(next-error ((t (:inherit (region))))) + '(query-replace ((t (:inherit (isearch))))) + '(region ((t (:background "grey70")))) + '(secondary-selection ((t (:background "#262626")))) + '(shadow ((t (:foreground "#7c7c7c")))) + '(tooltip ((t (:inherit variable-pitch :background "#fff" :foreground "#333")))) + '(trailing-whitespace ((t (:background "#562d56" :foreground "#FD5FF1")))) + '(variable-pitch ((t (:family "Sans Serif")))) + + ;; Font-lock + '(font-lock-builtin-face ((t (:foreground "#DAD085")))) + '(font-lock-comment-delimiter-face ((default (:inherit (font-lock-comment-face))))) + '(font-lock-comment-face ((t (:foreground "#7C7C7C")))) + '(font-lock-constant-face ((t (:foreground "#99CC99")))) + '(font-lock-doc-face ((t (:inherit (font-lock-string-face))))) + '(font-lock-function-name-face ((t (:foreground "#FFD2A7")))) + '(font-lock-keyword-face ((t (:foreground "#96CBFE")))) + '(font-lock-preprocessor-face ((t (:foreground "#8996A8")))) + '(font-lock-regexp-grouping-backslash ((t (:inherit font-lock-string-face)))) + '(font-lock-regexp-grouping-construct ((t (:foreground "#C6A24F")))) + '(font-lock-string-face ((t (:foreground "#8AE234")))) + '(font-lock-type-face ((t (:foreground "#CFCB90")))) +;; '(font-lock-type-face ((t (:foreground "#FFFFB6" :underline t)))) + '(font-lock-variable-name-face ((t (:inherit (default))))) + '(font-lock-warning-face ((t (:foreground "#ff982d" :weight bold)))) + + ;; mode-line + '(mode-line ((t (:background "grey10" :foreground "#96CBFE")))) + '(mode-line-buffer-id ((t (:weight bold)))) + '(mode-line-emphasis ((t (:weight bold)))) + '(mode-line-highlight ((((class color) (min-colors 88)) (:box (:line-width 2 :color "#1d1f21" :style released-button))) (t (:inherit (highlight))))) + '(mode-line-inactive ((default (:inherit (mode-line))) (((class color) (min-colors 88) (background light)) (:background "#7c7c7c" :foreground "grey20" :box (:line-width -1 :color "grey75" :style nil) :weight light)) (((class color) (min-colors 88) (background dark)) (:background "grey30" :foreground "grey80" :box (:line-width -1 :color "grey40" :style nil) :weight light)))) + + ;; isearch + '(isearch ((((class color) (min-colors 88) (background light)) (:foreground "lightskyblue1" :background "magenta3")) (((class color) (min-colors 88) (background dark)) (:foreground "brown4" :background "palevioletred2")) (((class color) (min-colors 16)) (:foreground "cyan1" :background "magenta4")) (((class color) (min-colors 8)) (:foreground "cyan1" :background "magenta4")) (t (:inverse-video t)))) + '(isearch-fail ((((class color) (min-colors 88) (background light)) (:background "RosyBrown1")) (((class color) (min-colors 88) (background dark)) (:background "red4")) (((class color) (min-colors 16)) (:background "red")) (((class color) (min-colors 8)) (:background "red")) (((class color grayscale)) (:foreground "grey")) (t (:inverse-video t)))) + + ;; ido-mode + '(ido-first-match ((t (:foreground "violet" :weight bold)))) + '(ido-only-match ((t (:foreground "#ff982d" :weight bold)))) + '(ido-subdir ((t (:foreground "#8AE234")))) + '(ido-virtual ((t (:foreground "#7c7c7c")))) + + ;; diff-hl (https://github.com/dgutov/diff-hl) + '(diff-hl-change ((t (:foreground "#E9C062" :background "#8b733a")))) + '(diff-hl-delete ((t (:foreground "#CC6666" :background "#7a3d3d")))) + '(diff-hl-insert ((t (:foreground "#A8FF60" :background "#547f30")))) + + ;; dired-mode + '(dired-directory ((t (:inherit (font-lock-keyword-face))))) + '(dired-flagged ((t (:inherit (diff-hl-delete))))) + '(dired-symlink ((t (:foreground "#FD5FF1")))) + + ;; guide-key (https://github.com/kai2nenobu/guide-key) + '(guide-key/highlight-command-face ((t (:inherit (cursor))))) + '(guide-key/key-face ((t (:inherit (font-lock-warning-face))))) + '(guide-key/prefix-command-face ((t (:inherit (font-lock-keyword-face))))) + + ;; flx-ido (https://github.com/lewang/flx) + '(flx-highlight-face ((t (:inherit (link) :weight bold)))) + + ;; markdown-mode (http://jblevins.org/projects/markdown-mode/) + ;; + ;; Note: Atom Dark Theme for Atom.io does not currently theme some things that markdown-mode does. For cases where + ;; Atom.io does not provide theming, this theme will leave the theming done by markdown-mode as-is. Where both + ;; Atom.io and markdown-mode provide theming, markdown-mode's theming will be changed to match that of Atom.io. + '(markdown-blockquote-face ((t :foreground "#555"))) + '(markdown-header-face ((t :foreground "#eee"))) + '(markdown-header-delimiter-face ((t (:inherit (markdown-header-face))))) + '(markdown-header-rule-face ((t (:inherit (font-lock-comment-face))))) + + ;; Js2-mode (https://github.com/mooz/js2-mode) + '(js2-error ((t (:foreground "#c00")))) + '(js2-external-variable ((t (:inherit (font-lock-builtin-face))))) + '(js2-function-param ((t (:foreground "#C6C5FE")))) + '(js2-jsdoc-html-tag-delimiter ((t (:foreground "#96CBFE")))) + '(js2-jsdoc-html-tag-name ((t (:foreground "#96CBFE")))) + '(js2-jsdoc-tag ((t (:inherit (font-lock-doc-face):weight bold)))) + '(js2-jsdoc-type ((t (:inherit (font-lock-type-face))))) + '(js2-jsdoc-value ((t (:inherit (js2-function-param))))) + + ;; minimap (https://github.com/dengste/minimap) + '(minimap-active-region-background ((t (:inherit (highlight))))) + + ;; powerline (https://github.com/milkypostman/powerline) + '(powerline-active2 ((t (:background "grey10")))) + + ;; realgud + `(realgud-overlay-arrow1 ((t (:foreground "#7fff00")))) + `(realgud-overlay-arrow2 ((t (:foreground "#5FAF44")))) + `(realgud-overlay-arrow3 ((t (:foreground "#116600")))) + + ;; speedbar + '(speedbar-button-face ((t (:foreground "#AAAAAA")))) + '(speedbar-directory-face ((t (:inherit (font-lock-keyword-face))))) + '(speedbar-file-face ((t (:inherit (default))))) + '(speedbar-highlight-face ((t (:inherit (highlight))))) + '(speedbar-selected-face ((t (:background "#4182C4" :foreground "#FFFFFF")))) + '(speedbar-separator-face ((t (:background "grey11" :foreground "#C5C8C6" :overline "#7C7C7C")))) + '(speedbar-tag-face ((t (:inherit (font-lock-function-name-face))))) + + ;; whitespace + '(whitespace-empty ((t (:foreground "#333333")))) + '(whitespace-hspace ((t (:inherit (whitespace-empty))))) + '(whitespace-indentation ((t (:inherit (whitespace-empty))))) + '(whitespace-line ((t (:inherit (trailing-whitespace))))) + '(whitespace-newline ((t (:inherit (whitespace-empty))))) + '(whitespace-space ((t (:inherit (whitespace-empty))))) + '(whitespace-space-after-tab ((t (:inherit (whitespace-empty))))) + '(whitespace-space-before-tab ((t (:inherit (whitespace-empty))))) + '(whitespace-tab ((t (:inherit (whitespace-empty))))) + '(whitespace-trailing ((t (:inherit (trailing-whitespace))))) + + ;; company + '(company-preview ((t (:foreground "#96CBFE")))) + '(company-preview-common ((t (:inherit company-preview :underline "#96CBFE")))) + '(company-preview-search ((t (:inherit company-preview)))) + '(company-scrollbar-bg ((t (:inherit company-tooltip :background "dim grey")))) + '(company-scrollbar-fg ((t (:background "black")))) + '(company-tooltip ((t (:background "#c5c8c6" :foreground "#1d1f21")))) + '(company-tooltip-common ((t (:inherit company-tooltip :foreground "red4")))) + '(company-tooltip-common-selection ((t (:inherit company-tooltip-selection :background "#96CBFE")))) + '(company-tooltip-selection ((t (:inherit company-tooltip :background "#96CBFE")))) + ) + +(defvar atom-dark-theme-force-faces-for-mode t + "If t, atom-dark-theme will use Face Remapping to alter the theme faces for +the current buffer based on its mode in an attempt to mimick the Atom Dark +Theme from Atom.io as best as possible. + +The reason this is required is because some modes (html-mode, yaml-mode, ...) +do not provide the necessary faces to do theming without conflicting with other +modes. + +Current modes, and their faces, impacted by this variable: + +* html-mode: font-lock-variable-name-face +* markdown-mode: default +* yaml-mode: font-lock-variable-name-face +") + +;; Many modes in Emacs do not define their own faces and instead use standard Emacs faces when it comes to theming. +;; That being said, to have a real "Atom Dark Theme" for Emacs, we need to work around this so that these themes look +;; as much like "Atom Dark Theme" as possible. This means using per-buffer faces via "Face Remapping": +;; +;; http://www.gnu.org/software/emacs/manual/html_node/elisp/Face-Remapping.html +;; +;; Of course, this might be confusing to some when in one mode they see keywords highlighted in one face and in another +;; mode they see a different face. That being said, you can set the `atom-dark-theme-force-faces-for-mode` variable to +;; `nil` to disable this feature. +(defun atom-dark-theme-change-faces-for-mode () + (interactive) + (and (eq atom-dark-theme-force-faces-for-mode t) + (cond + ((member major-mode '(conf-mode conf-javaprop-mode html-mode yaml-mode)) + (face-remap-add-relative 'font-lock-variable-name-face '(:inherit (font-lock-keyword-face)))) + ((eq major-mode 'java-mode) + (face-remap-add-relative 'font-lock-variable-name-face '(:inherit (js2-function-param)))) + ((eq major-mode 'markdown-mode) + (face-remap-add-relative 'default '(:foreground "#999"))) + ((member major-mode '(javascript-mode js2-mode)) + (face-remap-add-relative 'font-lock-doc-face '(:inherit (font-lock-comment-face))))))) + +(add-hook 'after-change-major-mode-hook 'atom-dark-theme-change-faces-for-mode) + +;;;###autoload +(and load-file-name + (boundp 'custom-theme-load-path) + (add-to-list 'custom-theme-load-path + (file-name-as-directory (file-name-directory load-file-name)))) + +(provide-theme 'atom-dark) + +;;; atom-dark-theme.el ends here diff --git a/.emacs.d/elpa/atom-dark-theme-20181022.1602/atom-dark-theme.elc b/.emacs.d/elpa/atom-dark-theme-20181022.1602/atom-dark-theme.elc new file mode 100644 index 0000000..4e3e8ca Binary files /dev/null and b/.emacs.d/elpa/atom-dark-theme-20181022.1602/atom-dark-theme.elc differ diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/auto-complete-autoloads.el b/.emacs.d/elpa/auto-complete-20201213.1255/auto-complete-autoloads.el new file mode 100644 index 0000000..58a1f63 --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/auto-complete-autoloads.el @@ -0,0 +1,76 @@ +;;; auto-complete-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "auto-complete" "auto-complete.el" (0 0 0 0)) +;;; Generated autoloads from auto-complete.el + +(autoload 'auto-complete "auto-complete" "\ +Start auto-completion at current point. + +\(fn &optional SOURCES)" t nil) + +(autoload 'auto-complete-mode "auto-complete" "\ +AutoComplete mode + +If called interactively, enable Auto-Complete mode if ARG is +positive, and disable it if ARG is zero or negative. If called +from Lisp, also enable the mode if ARG is omitted or nil, and +toggle it if ARG is `toggle'; disable the mode otherwise. + +\(fn &optional ARG)" t nil) + +(put 'global-auto-complete-mode 'globalized-minor-mode t) + +(defvar global-auto-complete-mode nil "\ +Non-nil if Global Auto-Complete mode is enabled. +See the `global-auto-complete-mode' command +for a description of this minor mode. +Setting this variable directly does not take effect; +either customize it (see the info node `Easy Customization') +or call the function `global-auto-complete-mode'.") + +(custom-autoload 'global-auto-complete-mode "auto-complete" nil) + +(autoload 'global-auto-complete-mode "auto-complete" "\ +Toggle Auto-Complete mode in all buffers. +With prefix ARG, enable Global Auto-Complete mode if ARG is positive; +otherwise, disable it. If called from Lisp, enable the mode if +ARG is omitted or nil. + +Auto-Complete mode is enabled in all buffers where +`auto-complete-mode-maybe' would do it. +See `auto-complete-mode' for more information on Auto-Complete mode. + +\(fn &optional ARG)" t nil) + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "auto-complete" '("ac-" "auto-complete-mode"))) + +;;;*** + +;;;### (autoloads nil "auto-complete-config" "auto-complete-config.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from auto-complete-config.el + +(autoload 'ac-config-default "auto-complete-config" "\ +No documentation." nil nil) + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "auto-complete-config" '("ac-"))) + +;;;*** + +;;;### (autoloads nil nil ("auto-complete-pkg.el") (0 0 0 0)) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; auto-complete-autoloads.el ends here diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/auto-complete-config.el b/.emacs.d/elpa/auto-complete-20201213.1255/auto-complete-config.el new file mode 100644 index 0000000..8ebbc88 --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/auto-complete-config.el @@ -0,0 +1,588 @@ +;;; auto-complete-config.el --- auto-complete additional configuations + +;; Copyright (C) 2009-2010 Tomohiro Matsuyama + +;; Author: Tomohiro Matsuyama <m2ym.pub@gmail.com> +;; Keywords: convenience +;; Version: 1.5.0 + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: + +;; + +;;; Code: + +(require 'cl-lib) +(require 'auto-complete) + +(declare-function semantic-analyze-current-context "semantic/analyze") +(declare-function semantic-tag-class "semantic/tag") +(declare-function semantic-tag-function-arguments "semantic/tag") +(declare-function semantic-format-tag-type "semantic/format") +(declare-function semantic-format-tag-name "semantic/format") +(declare-function yas-expand-snippet "yasnippet") +(declare-function oref "eieio" (obj slot)) + + + +;;;; Additional sources + +;; imenu + +(defvar ac-imenu-index nil) + +(ac-clear-variable-every-10-minutes 'ac-imenu-index) + +(defun ac-imenu-candidates () + "No documentation." + (cl-loop with i = 0 + with stack = (progn + (unless (local-variable-p 'ac-imenu-index) + (make-local-variable 'ac-imenu-index)) + (or ac-imenu-index + (setq ac-imenu-index + (ignore-errors + (with-no-warnings + (imenu--make-index-alist)))))) + with result + while (and stack (or (not (integerp ac-limit)) + (< i ac-limit))) + for node = (pop stack) + if (consp node) + do + (let ((car (car node)) + (cdr (cdr node))) + (if (consp cdr) + (mapc (lambda (child) + (push child stack)) + cdr) + (when (and (stringp car) + (string-match (concat "^" (regexp-quote ac-prefix)) car)) + ;; Remove extra characters + (if (string-match "^.*\\(()\\|=\\|<>\\)$" car) + (setq car (substring car 0 (match-beginning 1)))) + (push car result) + (cl-incf i)))) + finally return (nreverse result))) + +(ac-define-source imenu + '((depends imenu) + (candidates . ac-imenu-candidates) + (symbol . "s"))) + +;; gtags + +(defface ac-gtags-candidate-face + '((t (:inherit ac-candidate-face :foreground "navy"))) + "Face for gtags candidate" + :group 'auto-complete) + +(defface ac-gtags-selection-face + '((t (:inherit ac-selection-face :background "navy"))) + "Face for the gtags selected candidate." + :group 'auto-complete) + +(defun ac-gtags-candidate () + "No documentation." + (ignore-errors + (split-string (shell-command-to-string (format "global -ciq %s" ac-prefix)) "\n"))) + +(ac-define-source gtags + '((candidates . ac-gtags-candidate) + (candidate-face . ac-gtags-candidate-face) + (selection-face . ac-gtags-selection-face) + (requires . 3) + (symbol . "s"))) + +;; yasnippet + +(defface ac-yasnippet-candidate-face + '((t (:inherit ac-candidate-face + :background "sandybrown" :foreground "black"))) + "Face for yasnippet candidate." + :group 'auto-complete) + +(defface ac-yasnippet-selection-face + '((t (:inherit ac-selection-face :background "coral3"))) + "Face for the yasnippet selected candidate." + :group 'auto-complete) + +(defun ac-yasnippet-table-hash (table) + "No documentation, TABLE." + (cond + ((fboundp 'yas/snippet-table-hash) + (yas/snippet-table-hash table)) + ((fboundp 'yas/table-hash) + (yas/table-hash table)))) + +(defun ac-yasnippet-table-parent (table) + "No documentation, TABLE." + (cond + ((fboundp 'yas/snippet-table-parent) + (yas/snippet-table-parent table)) + ((fboundp 'yas/table-parent) + (yas/table-parent table)))) + +(defun ac-yasnippet-candidate-1 (table) + "No documentation, TABLE." + (with-no-warnings + (let ((hashtab (ac-yasnippet-table-hash table)) + (parent (ac-yasnippet-table-parent table)) + candidates) + (maphash (lambda (key value) + (push key candidates)) + hashtab) + (setq candidates (all-completions ac-prefix (nreverse candidates))) + (when parent + (setq candidates + (append candidates (ac-yasnippet-candidate-1 parent)))) + candidates))) + +(defun ac-yasnippet-candidates () + "No documentation." + (with-no-warnings + (cond (;; 0.8 onwards + (fboundp 'yas-active-keys) + (all-completions ac-prefix (yas-active-keys))) + (;; >0.6.0 + (fboundp 'yas/get-snippet-tables) + (apply 'append (mapcar 'ac-yasnippet-candidate-1 + (condition-case nil + (yas/get-snippet-tables major-mode) + (wrong-number-of-arguments + (yas/get-snippet-tables))))) + ) + (t + (let ((table + (if (fboundp 'yas/snippet-table) + ;; <0.6.0 + (yas/snippet-table major-mode) + ;; 0.6.0 + (yas/current-snippet-table)))) + (when table + (ac-yasnippet-candidate-1 table))))))) + +(ac-define-source yasnippet + '((depends yasnippet) + (candidates . ac-yasnippet-candidates) + (action . yas/expand) + (candidate-face . ac-yasnippet-candidate-face) + (selection-face . ac-yasnippet-selection-face) + (symbol . "a"))) + +;; semantic + +(defun ac-semantic-candidates (prefix) + "No documentation, PREFIX." + (with-no-warnings + (delete "" ; semantic sometimes returns an empty string + (mapcar (lambda (elem) + (cons (semantic-tag-name elem) + (semantic-tag-clone elem))) + (ignore-errors + (or (semantic-analyze-possible-completions + (semantic-analyze-current-context)) + (senator-find-tag-for-completion prefix))))))) + +(defun ac-semantic-doc (symbol) + "No documentation, SYMBOL." + (with-no-warnings + (let* ((proto (semantic-format-tag-summarize-with-file symbol nil t)) + (doc (semantic-documentation-for-tag symbol)) + (res proto)) + (when doc + (setq res (concat res "\n\n" doc))) + res))) + +(defun ac-semantic-action () + "No documentation." + (when (and (boundp 'yas-minor-mode) yas-minor-mode) + (let* ((tag (car (last (oref (semantic-analyze-current-context) prefix)))) + (class (semantic-tag-class tag)) + (args)) + (when (eq class 'function) + (setq args (semantic-tag-function-arguments tag)) + (yas-expand-snippet + (concat "(" + (mapconcat + (lambda (arg) + (let ((arg-type (semantic-format-tag-type arg nil)) + (arg-name (semantic-format-tag-name arg nil))) + (concat "${" + (if (string= arg-name "") + arg-type + (concat arg-type " " arg-name)) + "}"))) + args + ", ") + ")$0")))))) + +(ac-define-source semantic + '((available . (or (require 'semantic-ia nil t) + (require 'semantic/ia nil t))) + (candidates . (ac-semantic-candidates ac-prefix)) + (document . ac-semantic-doc) + (action . ac-semantic-action) + (prefix . cc-member) + (requires . 0) + (symbol . "m"))) + +(ac-define-source semantic-raw + '((available . (or (require 'semantic-ia nil t) + (require 'semantic/ia nil t))) + (candidates . (ac-semantic-candidates ac-prefix)) + (document . ac-semantic-doc) + (action . ac-semantic-action) + (symbol . "s"))) + +;; eclim + +(defun ac-eclim-candidates () + "No documentation." + (with-no-warnings + (cl-loop for c in (eclim/java-complete) + collect (nth 1 c)))) + +(ac-define-source eclim + '((candidates . ac-eclim-candidates) + (prefix . c-dot) + (requires . 0) + (symbol . "f"))) + +;; css + +;; Copied from company-css.el +(defconst ac-css-property-alist + ;; see http://www.w3.org/TR/CSS21/propidx.html + '(("azimuth" angle "left-side" "far-left" "left" "center-left" "center" + "center-right" "right" "far-right" "right-side" "behind" "leftwards" + "rightwards") + ("background" background-color background-image background-repeat + background-attachment background-position) + ("background-attachment" "scroll" "fixed") + ("background-color" color "transparent") + ("background-image" uri "none") + ("background-position" percentage length "left" "center" "right" percentage + length "top" "center" "bottom" "left" "center" "right" "top" "center" + "bottom") + ("background-repeat" "repeat" "repeat-x" "repeat-y" "no-repeat") + ("border" border-width border-style border-color) + ("border-bottom" border) + ("border-bottom-color" border-color) + ("border-bottom-style" border-style) + ("border-bottom-width" border-width) + ("border-collapse" "collapse" "separate") + ("border-color" color "transparent") + ("border-left" border) + ("border-left-color" border-color) + ("border-left-style" border-style) + ("border-left-width" border-width) + ("border-right" border) + ("border-right-color" border-color) + ("border-right-style" border-style) + ("border-right-width" border-width) + ("border-spacing" length length) + ("border-style" border-style) + ("border-top" border) + ("border-top-color" border-color) + ("border-top-style" border-style) + ("border-top-width" border-width) + ("border-width" border-width) + ("bottom" length percentage "auto") + ("caption-side" "top" "bottom") + ("clear" "none" "left" "right" "both") + ("clip" shape "auto") + ("color" color) + ("content" "normal" "none" string uri counter "attr()" "open-quote" + "close-quote" "no-open-quote" "no-close-quote") + ("counter-increment" identifier integer "none") + ("counter-reset" identifier integer "none") + ("cue" cue-before cue-after) + ("cue-after" uri "none") + ("cue-before" uri "none") + ("cursor" uri "*" "auto" "crosshair" "default" "pointer" "move" "e-resize" + "ne-resize" "nw-resize" "n-resize" "se-resize" "sw-resize" "s-resize" + "w-resize" "text" "wait" "help" "progress") + ("direction" "ltr" "rtl") + ("display" "inline" "block" "list-item" "run-in" "inline-block" "table" + "inline-table" "table-row-group" "table-header-group" "table-footer-group" + "table-row" "table-column-group" "table-column" "table-cell" + "table-caption" "none") + ("elevation" angle "below" "level" "above" "higher" "lower") + ("empty-cells" "show" "hide") + ("float" "left" "right" "none") + ("font" font-style font-variant font-weight font-size "/" line-height + font-family "caption" "icon" "menu" "message-box" "small-caption" + "status-bar") + ("font-family" family-name generic-family) + ("font-size" absolute-size relative-size length percentage) + ("font-style" "normal" "italic" "oblique") + ("font-variant" "normal" "small-caps") + ("font-weight" "normal" "bold" "bolder" "lighter" "100" "200" "300" "400" + "500" "600" "700" "800" "900") + ("height" length percentage "auto") + ("left" length percentage "auto") + ("letter-spacing" "normal" length) + ("line-height" "normal" number length percentage) + ("list-style" list-style-type list-style-position list-style-image) + ("list-style-image" uri "none") + ("list-style-position" "inside" "outside") + ("list-style-type" "disc" "circle" "square" "decimal" "decimal-leading-zero" + "lower-roman" "upper-roman" "lower-greek" "lower-latin" "upper-latin" + "armenian" "georgian" "lower-alpha" "upper-alpha" "none") + ("margin" margin-width) + ("margin-bottom" margin-width) + ("margin-left" margin-width) + ("margin-right" margin-width) + ("margin-top" margin-width) + ("max-height" length percentage "none") + ("max-width" length percentage "none") + ("min-height" length percentage) + ("min-width" length percentage) + ("orphans" integer) + ("outline" outline-color outline-style outline-width) + ("outline-color" color "invert") + ("outline-style" border-style) + ("outline-width" border-width) + ("overflow" "visible" "hidden" "scroll" "auto") + ("padding" padding-width) + ("padding-bottom" padding-width) + ("padding-left" padding-width) + ("padding-right" padding-width) + ("padding-top" padding-width) + ("page-break-after" "auto" "always" "avoid" "left" "right") + ("page-break-before" "auto" "always" "avoid" "left" "right") + ("page-break-inside" "avoid" "auto") + ("pause" time percentage) + ("pause-after" time percentage) + ("pause-before" time percentage) + ("pitch" frequency "x-low" "low" "medium" "high" "x-high") + ("pitch-range" number) + ("play-during" uri "mix" "repeat" "auto" "none") + ("position" "static" "relative" "absolute" "fixed") + ("quotes" string string "none") + ("richness" number) + ("right" length percentage "auto") + ("speak" "normal" "none" "spell-out") + ("speak-header" "once" "always") + ("speak-numeral" "digits" "continuous") + ("speak-punctuation" "code" "none") + ("speech-rate" number "x-slow" "slow" "medium" "fast" "x-fast" "faster" + "slower") + ("stress" number) + ("table-layout" "auto" "fixed") + ("text-align" "left" "right" "center" "justify") + ("text-decoration" "none" "underline" "overline" "line-through" "blink") + ("text-indent" length percentage) + ("text-transform" "capitalize" "uppercase" "lowercase" "none") + ("top" length percentage "auto") + ("unicode-bidi" "normal" "embed" "bidi-override") + ("vertical-align" "baseline" "sub" "super" "top" "text-top" "middle" + "bottom" "text-bottom" percentage length) + ("visibility" "visible" "hidden" "collapse") + ("voice-family" specific-voice generic-voice "*" specific-voice + generic-voice) + ("volume" number percentage "silent" "x-soft" "soft" "medium" "loud" + "x-loud") + ("white-space" "normal" "pre" "nowrap" "pre-wrap" "pre-line") + ("widows" integer) + ("width" length percentage "auto") + ("word-spacing" "normal" length) + ("z-index" "auto" integer)) + "A list of CSS properties and their possible values.") + +(defconst ac-css-value-classes + '((absolute-size "xx-small" "x-small" "small" "medium" "large" "x-large" + "xx-large") + (border-style "none" "hidden" "dotted" "dashed" "solid" "double" "groove" + "ridge" "inset" "outset") + (color "aqua" "black" "blue" "fuchsia" "gray" "green" "lime" "maroon" "navy" + "olive" "orange" "purple" "red" "silver" "teal" "white" "yellow" + "rgb") + (counter "counter") + (family-name "Courier" "Helvetica" "Times") + (generic-family "serif" "sans-serif" "cursive" "fantasy" "monospace") + (generic-voice "male" "female" "child") + (margin-width "auto") ;; length percentage + (relative-size "larger" "smaller") + (shape "rect") + (uri "url")) + "A list of CSS property value classes and their contents.") + +(defconst ac-css-pseudo-classes + '("active" "after" "before" "first" "first-child" "first-letter" "first-line" + "focus" "hover" "lang" "left" "link" "right" "visited") + "Identifiers for CSS pseudo-elements and pseudo-classes.") + +(defvar ac-css-property nil + "Current editing property.") + +(defun ac-css-prefix () + "No documentation." + (when (save-excursion + (or (and (re-search-backward "\\_<\\(.+?\\)\\_>\\s *:[^;]*\\=" nil t) + (setq ac-css-property (match-string 1))) + (and (re-search-backward "\\(?:^\\|;\\)\\s *[^:]*\\=" nil t) + (setq ac-css-property t)))) + (or (ac-prefix-symbol) (point)))) + +(defun ac-css-property-candidates () + "No documentation." + (if (not (stringp ac-css-property)) + (mapcar 'car ac-css-property-alist) + (let ((list (assoc-default ac-css-property ac-css-property-alist))) + (if list + (cl-loop with seen + with value + while (setq value (pop list)) + if (symbolp value) + do (unless (memq value seen) + (push value seen) + (setq list + (append list + (or (assoc-default value ac-css-value-classes) + (assoc-default (symbol-name value) ac-css-property-alist))))) + else collect value) + ac-css-pseudo-classes)))) + +(ac-define-source css-property + '((candidates . ac-css-property-candidates) + (prefix . ac-css-prefix) + (requires . 0))) + +;; slime +(ac-define-source slime + '((depends slime) + (candidates . (car (slime-simple-completions ac-prefix))) + (symbol . "s") + (cache))) + +;; ghc-mod +(ac-define-source ghc-mod + '((depends ghc) + (candidates . (ghc-select-completion-symbol)) + (symbol . "s") + (cache))) + + + +;;;; Not maintained sources + +;; ropemacs + +(defvar ac-ropemacs-loaded nil) + +(defun ac-ropemacs-require () + "No documentation." + (with-no-warnings + (unless ac-ropemacs-loaded + (pymacs-load "ropemacs" "rope-") + (when (boundp 'ropemacs-enable-autoimport) + (setq ropemacs-enable-autoimport t)) + (setq ac-ropemacs-loaded t)))) + +(defun ac-ropemacs-setup () + "No documentation." + (ac-ropemacs-require) + ;;(setq ac-sources (append (list 'ac-source-ropemacs) ac-sources)) + (setq ac-omni-completion-sources '(("\\." ac-source-ropemacs)))) + +(defun ac-ropemacs-initialize () + "No documentation." + (autoload 'pymacs-apply "pymacs") + (autoload 'pymacs-call "pymacs") + (autoload 'pymacs-eval "pymacs" nil t) + (autoload 'pymacs-exec "pymacs" nil t) + (autoload 'pymacs-load "pymacs" nil t) + (add-hook 'python-mode-hook 'ac-ropemacs-setup) + t) + +(defvar ac-ropemacs-completions-cache nil) +(defvar ac-source-ropemacs + '((init + . (lambda () + (setq ac-ropemacs-completions-cache + (mapcar + (lambda (completion) + (concat ac-prefix completion)) + (ignore-errors + (rope-completions)))))) + (candidates . ac-ropemacs-completions-cache))) + +;; rcodetools + +(defvar ac-source-rcodetools + '((init . (lambda () + (require 'rcodetools) + (condition-case x + (save-excursion + (rct-exec-and-eval rct-complete-command-name "--completion-emacs-icicles")) + (error) (setq rct-method-completion-table nil)))) + (candidates . (lambda () + (all-completions + ac-prefix + (mapcar + (lambda (completion) + (replace-regexp-in-string "\t.*$" "" (car completion))) + rct-method-completion-table)))))) + + + +;;;; Default settings + +(defun ac-common-setup () + "No documentation." + ;; TODO: Don't know this is commented; leave an empty function. + ;;(add-to-list 'ac-sources 'ac-source-filename) + ) + +(defun ac-emacs-lisp-mode-setup () + "No documentation." + (setq ac-sources (cl-union '(ac-source-features + ac-source-functions + ac-source-yasnippet + ac-source-variables + ac-source-symbols) + ac-sources))) + +(defun ac-cc-mode-setup () + "No documentation." + (setq ac-sources (cl-union '(ac-source-yasnippet ac-source-gtags) + ac-sources))) + +(defun ac-ruby-mode-setup () + "No documentation." + ;; TODO: Don't know this is commented; leave an empty function. + ) + +(defun ac-css-mode-setup () + "No documentation." + (setq ac-sources (cl-union '(ac-source-css-property) + ac-sources))) + +;;;###autoload +(defun ac-config-default () + "No documentation." + (setq-default ac-sources '(ac-source-abbrev ac-source-dictionary ac-source-words-in-same-mode-buffers)) + (add-hook 'emacs-lisp-mode-hook 'ac-emacs-lisp-mode-setup) + (add-hook 'c-mode-common-hook 'ac-cc-mode-setup) + (add-hook 'ruby-mode-hook 'ac-ruby-mode-setup) + (add-hook 'css-mode-hook 'ac-css-mode-setup) + (add-hook 'auto-complete-mode-hook 'ac-common-setup) + (global-auto-complete-mode t)) + +(provide 'auto-complete-config) +;;; auto-complete-config.el ends here diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/auto-complete-config.elc b/.emacs.d/elpa/auto-complete-20201213.1255/auto-complete-config.elc new file mode 100644 index 0000000..e6ca64b Binary files /dev/null and b/.emacs.d/elpa/auto-complete-20201213.1255/auto-complete-config.elc differ diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/auto-complete-pkg.el b/.emacs.d/elpa/auto-complete-20201213.1255/auto-complete-pkg.el new file mode 100644 index 0000000..3cc2d21 --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/auto-complete-pkg.el @@ -0,0 +1,13 @@ +(define-package "auto-complete" "20201213.1255" "Auto Completion for GNU Emacs" + '((popup "0.5.0") + (cl-lib "0.5")) + :commit "aafd3f566a8002a1e9b3e197721a2660c0a835ff" :authors + '(("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) + :maintainer + '("Tomohiro Matsuyama" . "m2ym.pub@gmail.com") + :keywords + '("completion" "convenience") + :url "https://github.com/auto-complete/auto-complete") +;; Local Variables: +;; no-byte-compile: t +;; End: diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/auto-complete.el b/.emacs.d/elpa/auto-complete-20201213.1255/auto-complete.el new file mode 100644 index 0000000..8d4b355 --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/auto-complete.el @@ -0,0 +1,2234 @@ +;;; auto-complete.el --- Auto Completion for GNU Emacs + +;; Copyright (C) 2008-2015 Tomohiro Matsuyama + +;; Author: Tomohiro Matsuyama <m2ym.pub@gmail.com> +;; URL: https://github.com/auto-complete/auto-complete +;; Keywords: completion, convenience +;; Version: 1.5.1 + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: +;; +;; This extension provides a way to complete with popup menu like: +;; +;; def-!- +;; +-----------------+ +;; |defun::::::::::::| +;; |defvar | +;; |defmacro | +;; | ... | +;; +-----------------+ +;; +;; You can complete by typing and selecting menu. +;; +;; Entire documents are located in doc/ directory. +;; Take a look for information. +;; +;; Enjoy! + +;;; Code: + + + +(defconst ac-version "1.5.1" + "Version of `auto-complete' in string format. +Use `version-to-list' to get version component.") + +(defconst ac-version-major (car (version-to-list ac-version)) + "Major version number of `auto-complete'.") + +(defconst ac-version-minor (cadr (version-to-list ac-version)) + "Minor version number of `auto-complete'.") + +(require 'cl-lib) +(require 'popup) + +;;;; Global stuff + +(defun ac-error (&optional var) + "Report an error and disable 'auto-complete-mode'. + +An optional argument VAR is the message related to the current error." + (ignore-errors + (message "auto-complete error: %s" var) + (auto-complete-mode -1) + var)) + + + +;;;; Customization + +(defgroup auto-complete nil + "Auto completion." + :group 'completion + :prefix "ac-") + +(defcustom ac-delay 0.1 + "Delay to completions will be available." + :type 'float + :group 'auto-complete) + +(defcustom ac-auto-show-menu 0.8 + "Non-nil means completion menu will be automatically shown." + :type '(choice (const :tag "Yes" t) + (const :tag "Never" nil) + (float :tag "Timer")) + :group 'auto-complete) + +(defcustom ac-show-menu-immediately-on-auto-complete t + "Non-nil means menu will be showed immediately on `auto-complete'." + :type 'boolean + :group 'auto-complete) + +(defcustom ac-expand-on-auto-complete t + "Non-nil means expand whole common part on first time `auto-complete'." + :type 'boolean + :group 'auto-complete) + +(defcustom ac-disable-faces '(font-lock-comment-face font-lock-string-face font-lock-doc-face) + "Non-nil means disable automatic completion on specified faces." + :type '(repeat symbol) + :group 'auto-complete) + +(defcustom ac-stop-flymake-on-completing t + "Non-nil means disble flymake temporarily on completing." + :type 'boolean + :group 'auto-complete) + +(defcustom ac-flycheck-poll-completion-end-interval 0.5 + "Polling interval to restart automatically flycheck's checking after completion is end." + :type 'float + :group 'auto-complete) + +(defcustom ac-use-fuzzy (and (locate-library "fuzzy") t) + "Non-nil means use fuzzy matching." + :type 'boolean + :group 'auto-complete) + +(defcustom ac-fuzzy-cursor-color "red" + "Cursor color in fuzzy mode." + :type 'string + :group 'auto-complete) + +(defcustom ac-use-comphist t + "Non-nil means use intelligent completion history." + :type 'boolean + :group 'auto-complete) + +(defcustom ac-comphist-threshold 0.7 + "Percentage of ignoring low scored candidates." + :type 'float + :group 'auto-complete) + +(defcustom ac-comphist-file + (expand-file-name (concat (if (boundp 'user-emacs-directory) + user-emacs-directory + "~/.emacs.d/") + "/ac-comphist.dat")) + "Completion history file name." + :type 'string + :group 'auto-complete) + +(defcustom ac-user-dictionary nil + "User defined dictionary." + :type '(repeat string) + :group 'auto-complete) + +(defcustom ac-dictionary-files '("~/.dict") + "Dictionary files." + :type '(repeat string) + :group 'auto-complete) +(defvaralias 'ac-user-dictionary-files 'ac-dictionary-files) + +(defcustom ac-dictionary-directories + (ignore-errors + (when load-file-name + (let ((installed-dir (file-name-directory load-file-name))) + (cl-loop for name in '("ac-dict" "dict") + for dir = (concat installed-dir name) + if (file-directory-p dir) + collect dir)))) + "Dictionary directories." + :type '(repeat string) + :group 'auto-complete) + +(defcustom ac-use-quick-help t + "Non-nil means use quick help." + :type 'boolean + :group 'auto-complete) + +(defcustom ac-quick-help-delay 1.5 + "Delay to show quick help." + :type 'float + :group 'auto-complete) + +(defcustom ac-menu-height 10 + "Max height of candidate menu." + :type 'integer + :group 'auto-complete) +(defvaralias 'ac-candidate-menu-height 'ac-menu-height) + +(defcustom ac-quick-help-height 20 + "Max height of quick help." + :type 'integer + :group 'auto-complete) + +(defcustom ac-quick-help-prefer-pos-tip t + "Prefer native tooltip with pos-tip than overlay popup for displaying quick help." + :type 'boolean + :group 'auto-complete) +(defvaralias 'ac-quick-help-prefer-x 'ac-quick-help-prefer-pos-tip) + +(defcustom ac-candidate-limit nil + "Limit number of candidates. Non-integer means no limit." + :type 'integer + :group 'auto-complete) +(defvaralias 'ac-candidate-max 'ac-candidate-limit) + +(defcustom ac-modes + (append + '(emacs-lisp-mode lisp-mode lisp-interaction-mode) + '(slime-repl-mode) + '(nim-mode c-mode cc-mode c++-mode objc-mode swift-mode go-mode) + '(java-mode malabar-mode clojure-mode clojurescript-mode scala-mode) + '(scheme-mode) + '(ocaml-mode tuareg-mode coq-mode haskell-mode agda-mode agda2-mode) + '(perl-mode cperl-mode python-mode ruby-mode lua-mode tcl-mode) + '(ecmascript-mode javascript-mode js-mode js-jsx-mode js2-mode js2-jsx-mode) + '(coffee-mode php-mode css-mode scss-mode less-css-mode) + '(elixir-mode) + '(makefile-mode sh-mode fortran-mode f90-mode ada-mode) + '(xml-mode sgml-mode web-mode) + '(ts-mode) + '(sclang-mode) + '(verilog-mode) + '(qml-mode) + '(apples-mode)) + "Major modes 'auto-complete-mode' can run on." + :type '(repeat symbol) + :group 'auto-complete) + +(defcustom ac-compatible-packages-regexp + "^ac-" + "Regexp to indicate what packages can work with `auto-complete'." + :type 'string + :group 'auto-complete) + +(defcustom ac-non-trigger-commands + '(*table--cell-self-insert-command + electric-buffer-list) + "Commands that can't be used as triggers of `auto-complete'." + :type '(repeat symbol) + :group 'auto-complete) + +(defcustom ac-trigger-commands + '(self-insert-command) + "Trigger commands that specify whether `auto-complete' should start or not." + :type '(repeat symbol) + :group 'auto-complete) + +(defcustom ac-trigger-commands-on-completing + '(delete-backward-char + backward-delete-char + backward-delete-char-untabify + ;; autopair + autopair-backspace + ;; paredit + paredit-backward-delete + paredit-backward-delete-word) + "Trigger commands that specify whether `auto-complete' should continue or not." + :type '(repeat symbol) + :group 'auto-complete) + +(defcustom ac-trigger-key nil + "Non-nil means `auto-complete' will start by typing this key. +If you specify this TAB, for example, `auto-complete' will start by typing TAB, +and if there is no completions, an original command will be fallbacked." + :type '(choice (const :tag "None" nil) + (string :tag "Key")) + :group 'auto-complete + :set (lambda (symbol value) + (set-default symbol value) + (when (and value + (fboundp 'ac-set-trigger-key)) + (ac-set-trigger-key value)))) + +(defcustom ac-auto-start 2 + "Non-nil means completion will be started automatically. +Positive integer means if a length of a word you entered is larger than +the value, completion will be started automatically. +If you specify 'nil', never be started automatically." + :type '(choice (const :tag "Yes" t) + (const :tag "Never" nil) + (integer :tag "Require")) + :group 'auto-complete) + +(defcustom ac-stop-words nil + "List of string to stop completion." + :type '(repeat string) + :group 'auto-complete) +(defvaralias 'ac-ignores 'ac-stop-words) + +(defcustom ac-use-dictionary-as-stop-words t + "Non-nil means a buffer related dictionary will be thought of as stop words." + :type 'boolean + :group 'auto-complete) + +(defcustom ac-ignore-case 'smart + "Non-nil means `auto-complete' ignores case. +If this value is `smart', `auto-complete' ignores case only when +a prefix doesn't contain any upper case letters." + :type '(choice (const :tag "Yes" t) + (const :tag "Smart" smart) + (const :tag "No" nil)) + :group 'auto-complete) + +(defcustom ac-dwim t + "Non-nil means `auto-complete' works based on Do What I Mean." + :type 'boolean + :group 'auto-complete) + +(defcustom ac-use-menu-map nil + "Non-nil means a special keymap `ac-menu-map' on completing menu will be used." + :type 'boolean + :group 'auto-complete) + +(defcustom ac-use-overriding-local-map nil + "Non-nil means `overriding-local-map' will be used to hack for overriding key events on auto-completion." + :type 'boolean + :group 'auto-complete) + +(defcustom ac-disable-inline nil + "Non-nil disable inline completion visibility." + :type 'boolean + :group 'auto-complete) + +(defcustom ac-candidate-menu-min 1 + "Number of candidates required to display menu." + :type 'integer + :group 'auto-complete) + +(defcustom ac-max-width nil + "Maximum width for `auto-complete' menu to have." + :type '(choice (const :tag "No limit" nil) + (const :tag "Character Limit" 25) + (const :tag "Window Ratio Limit" 0.5)) + :group 'auto-complete) + +(defface ac-completion-face + '((t (:foreground "darkgray" :underline t))) + "Face for inline completion" + :group 'auto-complete) + +(defface ac-candidate-face + '((t (:inherit popup-face))) + "Face for candidate." + :group 'auto-complete) + +(defface ac-candidate-mouse-face + '((t (:inherit popup-menu-mouse-face))) + "Mouse face for candidate." + :group 'auto-complete) + +(defface ac-selection-face + '((t (:inherit popup-menu-selection-face))) + "Face for selected candidate." + :group 'auto-complete) + +(defvar auto-complete-mode-hook nil + "Hook for 'auto-complete-mode'.") + + + +;;;; Internal variables + +(defvar auto-complete-mode nil + "Dummy variable to suppress compiler warnings.") + +(defvar ac-cursor-color nil + "Old cursor color.") + +(defvar ac-inline nil + "Inline completion instance.") + +(defvar ac-menu nil + "Menu instance.") + +(defvar ac-show-menu nil + "Flag to show menu on timer tick.") + +(defvar ac-last-completion nil + "Cons of prefix marker and selected item of last completion.") + +(defvar ac-quick-help nil + "Quick help instance.") + +(defvar ac-completing nil + "Non-nil means 'auto-complete-mode' is now working on completion.") + +(defvar ac-buffer nil + "Buffer where `auto-complete' is started.") + +(defvar ac-point nil + "Start point of prefix.") + +(defvar ac-last-point nil + "Last point of updating pattern.") + +(defvar ac-prefix nil + "Prefix string.") +(defvaralias 'ac-target 'ac-prefix) + +(defvar ac-selected-candidate nil + "Last selected candidate.") + +(defvar ac-common-part nil + "Common part string of meaningful candidates. +If there is no common part, this will be nil.") + +(defvar ac-whole-common-part nil + "Common part string of whole candidates. +If there is no common part, this will be nil.") + +(defvar ac-prefix-overlay nil + "Overlay for prefix string.") + +(defvar ac-timer nil + "Completion idle timer.") + +(defvar ac-show-menu-timer nil + "Show menu idle timer.") + +(defvar ac-quick-help-timer nil + "Quick help idle timer.") + +(defvar ac-triggered nil + "Flag to update.") + +(defvar ac-limit nil + "Limit number of candidates for each sources.") + +(defvar ac-candidates nil + "Current candidates.") + +(defvar ac-candidates-cache nil + "Candidates cache for individual sources.") + +(defvar ac-fuzzy-enable nil + "Non-nil means fuzzy matching is enabled.") + +(defvar ac-dwim-enable nil + "Non-nil means DWIM completion will be allowed.") + +(defvar ac-mode-map (make-sparse-keymap) + "Auto-complete mode map. It is also used for trigger key command. +See also `ac-trigger-key'.") + +(defvar ac-completing-map + (let ((map (make-sparse-keymap))) + (define-key map "\t" 'ac-expand) + (define-key map [tab] 'ac-expand) + (define-key map "\r" 'ac-complete) + (define-key map (kbd "M-TAB") 'auto-complete) + + (define-key map "\M-n" 'ac-next) + (define-key map "\M-p" 'ac-previous) + (define-key map [down] 'ac-next) + (define-key map [up] 'ac-previous) + + (define-key map [f1] 'ac-help) + (define-key map [M-f1] 'ac-persist-help) + (define-key map (kbd "C-?") 'ac-help) + (define-key map (kbd "C-M-?") 'ac-persist-help) + + (define-key map [C-down] 'ac-quick-help-scroll-down) + (define-key map [C-up] 'ac-quick-help-scroll-up) + (define-key map "\C-\M-n" 'ac-quick-help-scroll-down) + (define-key map "\C-\M-p" 'ac-quick-help-scroll-up) + + (dotimes (i 9) + (let ((symbol (intern (format "ac-complete-select-%d" (1+ i))))) + (fset symbol + `(lambda () + (interactive) + (when (and (ac-menu-live-p) (popup-select ac-menu ,i)) + (ac-complete)))) + (define-key map (read-kbd-macro (format "M-%s" (1+ i))) symbol))) + + map) + "Keymap for completion.") +(defvaralias 'ac-complete-mode-map 'ac-completing-map) + +(defvar ac-menu-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map ac-completing-map) + (define-key map (kbd "RET") 'ac-complete) + (define-key map "\C-n" 'ac-next) + (define-key map "\C-p" 'ac-previous) + (define-key map "\C-s" 'ac-isearch) + (define-key map [mouse-1] 'ac-mouse-1) + (define-key map [down-mouse-1] 'ac-ignore) + (if (string-equal system-type "gnu/linux") + (progn + (define-key map [mouse-4] 'ac-mouse-4) + (define-key map [mouse-5] 'ac-mouse-5)) + (define-key map [wheel-up] 'ac-mouse-4) + (define-key map [wheel-down] 'ac-mouse-5)) + map) + "Keymap for completion on completing menu.") + +(defvar ac-current-map + (let ((map (make-sparse-keymap))) + (set-keymap-parent map ac-completing-map) + map)) + +(defvar ac-match-function 'all-completions + "Default match function.") + +(defvar ac-prefix-definitions + '((symbol . ac-prefix-symbol) + (file . ac-prefix-file) + (valid-file . ac-prefix-valid-file) + (c-dot . ac-prefix-c-dot) + (c-dot-ref . ac-prefix-c-dot-ref) + (cc-member . ac-prefix-cc-member)) + "Prefix definitions for common use.") + +(defvar ac-sources '(ac-source-words-in-same-mode-buffers) + "Sources for completion.") +(make-variable-buffer-local 'ac-sources) + +(defvar ac-compiled-sources nil + "Compiled source of `ac-sources'.") + +(defvar ac-current-sources nil + "Current working sources. This is sublist of 'ac-compiled-sources'.") + +(defvar ac-omni-completion-sources nil + "Do not use this anymore.") + +(defvar ac-current-prefix-def nil) + +(defvar ac-ignoring-prefix-def nil) + + + +;;;; Intelligent completion history + +(defvar ac-comphist nil + "Database of completion history.") + +(defsubst ac-comphist-make-tab () + "No documentation." + (make-hash-table :test 'equal)) + +(defsubst ac-comphist-tab (db) + "No documentation, DB." + (nth 0 db)) + +(defsubst ac-comphist-cache (db) + "No documentation, DB." + (nth 1 db)) + +(defun ac-comphist-make (&optional tab) + "No documentation, TAB." + (list (or tab (ac-comphist-make-tab)) (make-hash-table :test 'equal :weakness t))) + +(defun ac-comphist-get (db string &optional create) + "No documentation, DB, STRING, CREATE." + (let* ((tab (ac-comphist-tab db)) + (index (gethash string tab))) + (when (and create (null index)) + (setq index (make-vector (length string) 0)) + (puthash string index tab)) + index)) + +(defun ac-comphist-add (db string prefix) + "No documentation, DB, STRING, PREFIX." + (setq prefix (min prefix (1- (length string)))) + (when (<= 0 prefix) + (setq string (substring-no-properties string)) + (let ((stat (ac-comphist-get db string t))) + (cl-incf (aref stat prefix)) + (remhash string (ac-comphist-cache db))))) + +(defun ac-comphist-score (db string prefix) + "No documentation, DB, STRING, PREFIX." + (setq prefix (min prefix (1- (length string)))) + (if (<= 0 prefix) + (let ((cache (gethash string (ac-comphist-cache db)))) + (or (and cache (aref cache prefix)) + (let ((stat (ac-comphist-get db string)) + (score 0.0)) + (when stat + (cl-loop for p from 0 below (length string) + ;; sigmoid function + with a = 5 + with b = (/ 700.0 a) ; bounds for avoiding range error in `exp' + with d = (/ 6.0 a) + for x = (max (- b) (min b (- d (abs (- prefix p))))) + for r = (/ 1.0 (1+ (exp (* (- a) x)))) + do + (cl-incf score (* (aref stat p) r)))) + ;; Weight by distance + (cl-incf score (max 0.0 (- 0.3 (/ (- (length string) prefix) 100.0)))) + (unless cache + (setq cache (make-vector (length string) nil)) + (puthash string cache (ac-comphist-cache db))) + (aset cache prefix score) + score))) + 0.0)) + +(defun ac-comphist-sort (db collection prefix &optional threshold) + "No documentation, DB, COLLECTION, PREFIX, THRESHOLD." + (let ((n 0) (total 0) (cur 0) result) + (setq result + (mapcar (lambda (a) + (when (and cur threshold) + (if (>= cur (* total threshold)) + (setq cur nil) + (cl-incf n) + (cl-incf cur (cdr a)))) + (car a)) + (sort (mapcar (lambda (string) + (let ((score (ac-comphist-score db string prefix))) + (cl-incf total score) + (cons string score))) + collection) + (lambda (a b) (< (cdr b) (cdr a)))))) + (if threshold (cons n result) result))) + +(defun ac-comphist-serialize (db) + "No documentation, DB." + (let (alist) + (maphash (lambda (k v) + (push (cons k v) alist)) + (ac-comphist-tab db)) + (list alist))) + +(defun ac-comphist-deserialize (sexp) + "No documentation, SEXP." + (condition-case nil + (ac-comphist-make (let ((tab (ac-comphist-make-tab))) + (mapc (lambda (cons) + (puthash (car cons) (cdr cons) tab)) + (nth 0 sexp)) + tab)) + (error (message "Invalid comphist db.") nil))) + +(defun ac-comphist-init () + "No documentation." + (ac-comphist-load) + (add-hook 'kill-emacs-hook 'ac-comphist-save)) + +(defun ac-comphist-load () + "No documentation." + (interactive) + (let ((db (if (file-exists-p ac-comphist-file) + (ignore-errors + (with-temp-buffer + (insert-file-contents ac-comphist-file) + (goto-char (point-min)) + (ac-comphist-deserialize (read (current-buffer)))))))) + (setq ac-comphist (or db (ac-comphist-make))))) + +(defun ac-comphist-save () + "No documentation." + (interactive) + (require 'pp) + (ignore-errors + (with-temp-buffer + (pp (ac-comphist-serialize ac-comphist) (current-buffer)) + (write-region (point-min) (point-max) ac-comphist-file)))) + + + +;;;; Dictionary +(defvar ac-buffer-dictionary nil + "No documentation.") +(defvar ac-file-dictionary (make-hash-table :test 'equal) + "No documentation.") + +(defun ac-clear-dictionary-cache () + "No documentation." + (interactive) + (dolist (buffer (buffer-list)) + (with-current-buffer buffer + (when (local-variable-p 'ac-buffer-dictionary) + (kill-local-variable 'ac-buffer-dictionary)))) + (clrhash ac-file-dictionary)) + +(defun ac-file-dictionary (filename) + "No documentation, FILENAME." + (let ((cache (gethash filename ac-file-dictionary 'none))) + (if (and cache (not (eq cache 'none))) + cache + (let (result) + (ignore-errors + (with-temp-buffer + (insert-file-contents filename) + (setq result (split-string (buffer-string) "\n" t)))) + (puthash filename result ac-file-dictionary) + result)))) + +(defun ac-mode-dictionary (mode) + "No documentation, MODE." + (cl-loop for name in (cons (symbol-name mode) + (ignore-errors (list (file-name-extension (buffer-file-name))))) + append (cl-loop for dir in ac-dictionary-directories + for file = (concat dir "/" name) + if (file-exists-p file) + append (ac-file-dictionary file)))) + +(defun ac-buffer-dictionary (&optional buffer) + "No documentation, BUFFER." + (with-current-buffer (or buffer (current-buffer)) + (if (local-variable-p 'ac-buffer-dictionary) + ac-buffer-dictionary + (make-local-variable 'ac-buffer-dictionary) + (setq ac-buffer-dictionary + (apply 'append + ac-user-dictionary + (ac-mode-dictionary major-mode) + (mapcar 'ac-file-dictionary ac-dictionary-files)))))) + + + +;;;; Auto completion internals + +(defun ac-menu-at-wrapper-line-p () + "Return non-nil if current line is long and wrapped to next visual line." + (and (not truncate-lines) + (eq (line-beginning-position) + (save-excursion + (vertical-motion 1) + (line-beginning-position))))) + +(defun ac-stop-word-p (word) + "No documentation, WORD." + (or (member word ac-stop-words) + (when ac-use-dictionary-as-stop-words + (member word (ac-buffer-dictionary))))) + +(defun ac-prefix-default () + "Same as `ac-prefix-symbol' but ignore a number prefix." + (let ((start (ac-prefix-symbol)) + (case-fold-search t)) + (when (and start + (not (string-match-p "\\`\\(?:0[xbo][0-9a-f]+\\|[0-9]+\\)" + (buffer-substring-no-properties start (point))))) + start))) + +(defun ac-prefix-symbol () + "Default prefix definition function." + (require 'thingatpt) + (car-safe (bounds-of-thing-at-point 'symbol))) + +(defun ac-prefix-file () + "File prefix." + (let ((point (re-search-backward "[\"<>' \t\r\n]" nil t))) + (when point (1+ point)))) + +(defsubst ac-windows-remote-file-p (file) + "No documentation, FILE." + (and (memq system-type '(ms-dos windows-nt cygwin)) + (string-match-p "\\`\\(?://\\|\\\\\\\\\\)" file))) + +(defun ac-prefix-valid-file () + "Existed (or to be existed) file prefix." + (let* ((line-beg (line-beginning-position)) + (end (point)) + (start (or (let ((point (re-search-backward "[\"<>'= \t\r\n]" line-beg t))) + (if point (1+ point))) + line-beg)) + (file (buffer-substring start end))) + (if (and file (or (string-match "^/" file) + (and (setq file (and (string-match "^[^/]*/" file) + (match-string 0 file))) + (file-directory-p file)))) + (unless (ac-windows-remote-file-p file) + start)))) + +(defun ac-prefix-c-dot () + "C-like languages dot(.) prefix." + (if (re-search-backward "\\.\\(\\(?:[a-zA-Z0-9][_a-zA-Z0-9]*\\)?\\)\\=" nil t) + (match-beginning 1))) + +(defun ac-prefix-c-dot-ref () + "C-like languages dot(.) and reference(->) prefix." + (if (re-search-backward "\\(?:\\.\\|->\\)\\(\\(?:[a-zA-Z0-9][_a-zA-Z0-9]*\\)?\\)\\=" nil t) + (match-beginning 1))) + +(defun ac-prefix-cc-member () + "C-like languages member(.)(->)(::) prefix." + (when (re-search-backward "\\(?:\\.\\|->\\|::\\)\\(\\(?:[a-zA-Z0-9][_a-zA-Z0-9]*\\)?\\)\\=" nil t) + (match-beginning 1))) + +(defun ac-define-prefix (name prefix) + "Define new prefix definition. +You can not use it in source definition like (PREFIX . `NAME')." + (push (cons name prefix) ac-prefix-definitions)) + +(defun ac-match-substring (prefix candidates) + "No documentation, PREFIX, CANDIDATES." + (cl-loop with regexp = (regexp-quote prefix) + for candidate in candidates + if (string-match regexp candidate) + collect candidate)) + +(defsubst ac-source-entity (source) + "No documentation, SOURCE." + (if (symbolp source) (symbol-value source) source)) + +(defun ac-source-available-p (source) + "No documentation, SOURCE." + (if (and (symbolp source) + (get source 'available)) + (eq (get source 'available) t) + (let* ((src (ac-source-entity source)) + (avail-pair (assq 'available src)) + (avail-cond (cdr avail-pair)) + (available (and (if avail-pair + (cond + ((symbolp avail-cond) + (funcall avail-cond)) + ((listp avail-cond) + (eval avail-cond))) + t) + (cl-loop for feature in (assoc-default 'depends src) + unless (require feature nil t) return nil + finally return t)))) + (when (symbolp source) + (put source 'available (if available t 'no))) + available))) + +(defun ac-compile-sources (sources) + "Compiled `SOURCES' into expanded sources style." + (cl-loop for source in sources + if (ac-source-available-p source) + do + (setq source (ac-source-entity source)) + ;; prefix + (let* ((prefix (assoc 'prefix source)) + (real (assoc-default (cdr prefix) ac-prefix-definitions))) + (cond + (real + (add-to-list 'source (cons 'prefix real))) + ((null prefix) + (add-to-list 'source (cons 'prefix 'ac-prefix-default))))) + ;; match + (let ((match (assq 'match source))) + (cond + ((eq (cdr match) 'substring) + (setcdr match 'ac-match-substring)))) + and collect source)) + +(defun ac-compiled-sources () + "No documentation." + (or ac-compiled-sources + (setq ac-compiled-sources (ac-compile-sources ac-sources)))) + +(defsubst ac-menu-live-p () + "Return non-nil if menu is alive." + (popup-live-p ac-menu)) + +(defun ac-menu-create (point width height) + "No documentation POINT, WIDTH, HEIGHT." + (setq ac-menu + (popup-create point width height + :around t + :face 'ac-candidate-face + :max-width ac-max-width + :mouse-face 'ac-candidate-mouse-face + :selection-face 'ac-selection-face + :symbol t + :scroll-bar t + :margin-left 1 + :keymap ac-menu-map))) + +(defun ac-menu-delete () + "Delete the completion menu." + (when ac-menu + (popup-delete ac-menu) + (setq ac-menu nil))) + +(defsubst ac-inline-overlay () + "No documentation." + (nth 0 ac-inline)) + +(defsubst ac-inline-live-p () + "No documentation." + (and ac-inline (ac-inline-overlay) t)) + +(defun ac-inline-show (point string) + "No documentation, POINT, STRING." + (unless ac-inline + (setq ac-inline (list nil))) + (save-excursion + (let ((overlay (ac-inline-overlay)) + (width 0) + (string-width (string-width string)) + (length 0) + (original-string string)) + ;; Calculate string space to show completion + (goto-char point) + (let (c) + (while (and (not (eolp)) + (< width string-width) + (setq c (char-after)) + (not (eq c ?\t))) ; special case for tab + (cl-incf width (char-width c)) + (cl-incf length) + (forward-char))) + + ;; Show completion + (goto-char point) + (cond + ((= width 0) + ;; End-of-line + ;; Do nothing + ) + ((<= width string-width) + ;; No space to show + ;; Do nothing + ) + ((> width string-width) + ;; Need to fill space + (setq string (concat string (make-string (- width string-width) ? ))))) + (setq string (propertize string 'face 'ac-completion-face)) + (if overlay + (progn + (move-overlay overlay point (+ point length)) + (overlay-put overlay 'invisible nil)) + (setq overlay (make-overlay point (+ point length))) + (setf (nth 0 ac-inline) overlay) + (overlay-put overlay 'priority 9999) + ;; Help prefix-overlay in some cases + (overlay-put overlay 'keymap ac-current-map)) + ;; TODO no width but char + (if (eq length 0) + ;; Case: End-of-line + (progn + (put-text-property 0 1 'cursor t string) + (overlay-put overlay 'after-string string)) + (let ((display (substring string 0 1)) + (after-string (substring string 1))) + (overlay-put overlay 'display display) + (overlay-put overlay 'after-string after-string))) + (overlay-put overlay 'string original-string)))) + +(defun ac-inline-delete () + "No documentation." + (when (ac-inline-live-p) + (ac-inline-hide) + (delete-overlay (ac-inline-overlay)) + (setq ac-inline nil))) + +(defun ac-inline-hide () + "No documentation." + (when (ac-inline-live-p) + (let ((overlay (ac-inline-overlay)) (buffer-undo-list t)) + (when overlay + (move-overlay overlay (point-min) (point-min)) + (overlay-put overlay 'invisible t) + (overlay-put overlay 'display nil) + (overlay-put overlay 'after-string nil))))) + +(defun ac-inline-update () + "No documentation." + (if (and ac-completing ac-prefix (stringp ac-common-part)) + (let ((common-part-length (length ac-common-part)) + (prefix-length (length ac-prefix))) + (if (> common-part-length prefix-length) + (progn + (ac-inline-hide) + (ac-inline-show (point) (substring ac-common-part prefix-length))) + (ac-inline-delete))) + (ac-inline-delete))) + +(defun ac-put-prefix-overlay () + "No documentation." + (unless ac-prefix-overlay + (let (newline) + ;; Insert newline to make sure that cursor always on the overlay + (when (eobp) + (popup-save-buffer-state + (insert "\n")) + (setq newline t)) + (setq ac-prefix-overlay (make-overlay ac-point (1+ (point)) nil t t)) + (overlay-put ac-prefix-overlay 'priority 9999) + (overlay-put ac-prefix-overlay 'keymap (make-sparse-keymap)) + (overlay-put ac-prefix-overlay 'newline newline)))) + +(defun ac-remove-prefix-overlay () + "No documentation." + (when ac-prefix-overlay + (when (overlay-get ac-prefix-overlay 'newline) + ;; Remove inserted newline + (popup-save-buffer-state + (goto-char (point-max)) + (when (eq (char-before) ?\n) + (delete-char -1)))) + (delete-overlay ac-prefix-overlay))) + +(defun ac-activate-completing-map () + "No documentation." + (if (and ac-show-menu ac-use-menu-map) + (set-keymap-parent ac-current-map ac-menu-map)) + (when (and ac-use-overriding-local-map + (null overriding-terminal-local-map)) + (setq overriding-terminal-local-map ac-current-map)) + (when ac-prefix-overlay + (set-keymap-parent (overlay-get ac-prefix-overlay 'keymap) ac-current-map))) + +(defun ac-deactivate-completing-map () + "No documentation." + (set-keymap-parent ac-current-map ac-completing-map) + (when (and ac-use-overriding-local-map + (eq overriding-terminal-local-map ac-current-map)) + (setq overriding-terminal-local-map nil)) + (when ac-prefix-overlay + (set-keymap-parent (overlay-get ac-prefix-overlay 'keymap) nil))) + +(defsubst ac-selected-candidate () + "No documentation." + (when ac-menu (popup-selected-item ac-menu))) + +(defun ac-prefix (requires ignore-list) + "No documentation, REQUIRES, IGNORE-LIST." + (cl-loop with current = (point) + with point + with point-def + with prefix-def + with sources + for source in (ac-compiled-sources) + for prefix = (assoc-default 'prefix source) + for req = (or (assoc-default 'requires source) requires 1) + + do + (unless (member prefix ignore-list) + (save-excursion + (setq point (cond + ((symbolp prefix) + (funcall prefix)) + ((stringp prefix) + (and (re-search-backward (concat prefix "\\=") nil t) + (or (match-beginning 1) (match-beginning 0)))) + ((stringp (car-safe prefix)) + (let ((regexp (nth 0 prefix)) + (end (nth 1 prefix)) + (group (nth 2 prefix))) + (and (re-search-backward (concat regexp "\\=") nil t) + (funcall (if end 'match-end 'match-beginning) + (or group 0))))) + (t + (eval prefix)))) + (if (and point + (integerp req) + (< (- current point) req)) + (setq point nil)) + (when point + (when (null prefix-def) + (setq prefix-def prefix + point-def point)) + (when (equal point point-def) + (push source sources))))) + + finally return + (and point-def (list prefix-def point-def (nreverse sources))))) + +(defun ac-init () + "Initialize current sources to start completion." + (setq ac-candidates-cache nil) + (cl-loop for source in ac-current-sources + for function = (assoc-default 'init source) + if function do + (save-excursion + (cond ((functionp function) (funcall function)) + (t (eval function)))))) + +(defun ac-candidates-1 (source) + "No documentation, SOURCE." + (let* ((do-cache (assq 'cache source)) + (function (assoc-default 'candidates source)) + (action (assoc-default 'action source)) + (document (assoc-default 'document source)) + (symbol (assoc-default 'symbol source)) + (ac-limit (or (assoc-default 'limit source) ac-limit)) + (face (or (assoc-default 'face source) (assoc-default 'candidate-face source))) + (selection-face (assoc-default 'selection-face source)) + (cache (and do-cache (assq source ac-candidates-cache))) + (candidates (cdr cache))) + (unless cache + (setq candidates (save-excursion + (cond + ((functionp function) + (funcall function)) + (t + (eval function))))) + ;; Convert (name value) format candidates into name with text properties. + (setq candidates (mapcar (lambda (candidate) + (if (consp candidate) + (propertize (car candidate) 'value (cdr candidate)) + candidate)) + candidates)) + (when do-cache + (push (cons source candidates) ac-candidates-cache))) + (setq candidates (funcall (or (assoc-default 'match source) + ac-match-function) + ac-prefix candidates)) + ;; Remove extra items regarding to ac-limit + (if (and (integerp ac-limit) (> ac-limit 1) (> (length candidates) ac-limit)) + (setcdr (nthcdr (1- ac-limit) candidates) nil)) + ;; Put candidate properties + (setq candidates (mapcar (lambda (candidate) + (popup-item-propertize candidate + 'action action + 'symbol symbol + 'document document + 'popup-face face + 'selection-face selection-face)) + candidates)) + candidates)) + +(defun ac-delete-duplicated-candidates (candidates) + "No documentation, CANDIDATES." + (cl-delete-duplicates + candidates + :test (lambda (x y) + ;; We assume two candidates are same if their titles are + ;; equal and their actions are equal. + (and (equal x y) + (eq (popup-item-property x 'action) + (popup-item-property y 'action)))) + :from-end t)) + +(defun ac-reduce-candidates (candidates) + "No documentation, CANDIDATES." + ;; Call `ac-delete-duplicated-candidates' on first portion of + ;; candidate list for speed. + (let ((size 20)) + (if (< (length candidates) size) + (ac-delete-duplicated-candidates candidates) + (cl-loop for c on candidates by 'cdr + repeat (1- size) + finally return + (let ((rest (cdr c))) + (setcdr c nil) + (append (ac-delete-duplicated-candidates candidates) (copy-sequence rest))))))) + +(defun ac-candidates () + "Produce candidates for current sources." + (cl-loop with completion-ignore-case = (or ac-ignore-case + (and (eq ac-ignore-case 'smart) + (let ((case-fold-search nil)) (not (string-match "[[:upper:]]" ac-prefix))))) + with case-fold-search = completion-ignore-case + with prefix-len = (length ac-prefix) + for source in ac-current-sources + append (ac-candidates-1 source) into candidates + finally return + (progn + (if (and ac-use-comphist ac-comphist) + (if ac-show-menu + (let* ((pair (ac-comphist-sort ac-comphist candidates prefix-len ac-comphist-threshold)) + (n (car pair)) + (result (ac-reduce-candidates (cdr pair))) + (cons (if (> n 0) (nthcdr (1- n) result))) + (cdr (cdr cons))) + ;; XXX ugly + (when cons (setcdr cons nil)) + (setq ac-common-part (try-completion ac-prefix result)) + (setq ac-whole-common-part (try-completion ac-prefix candidates)) + (when cons (setcdr cons cdr)) + result) + (setq candidates (ac-comphist-sort ac-comphist candidates prefix-len)) + (setq ac-common-part (when candidates (popup-x-to-string (car candidates)))) + (setq ac-whole-common-part (try-completion ac-prefix candidates)) + candidates) + (when ac-show-menu + (setq candidates (ac-reduce-candidates candidates))) + (setq ac-common-part (try-completion ac-prefix candidates)) + (setq ac-whole-common-part ac-common-part) + candidates)))) + +(defun ac-update-candidates (cursor scroll-top) + "Update candidates of menu to 'ac-candidates' and redraw it. + +TODO Missing documentation CURSOR, SCROLL-TOP." + (setf (popup-cursor ac-menu) cursor + (popup-scroll-top ac-menu) scroll-top) + (setq ac-dwim-enable (= (length ac-candidates) 1)) + (if ac-candidates + (progn + (setq ac-completing t) + (ac-activate-completing-map)) + (setq ac-completing nil) + (ac-deactivate-completing-map)) + (unless ac-disable-inline + (ac-inline-update)) + (popup-set-list ac-menu ac-candidates) + (if (and (not ac-fuzzy-enable) + (<= (length ac-candidates) ac-candidate-menu-min)) + (popup-hide ac-menu) + (when ac-show-menu + (popup-draw ac-menu)))) + +(defun ac-reposition () + "Force to redraw candidate menu with current 'ac-candidates'." + (let ((cursor (popup-cursor ac-menu)) + (scroll-top (popup-scroll-top ac-menu)) + (height (popup-height ac-menu))) + (ac-menu-delete) + (ac-menu-create ac-point (popup-preferred-width ac-candidates) height) + (ac-update-candidates cursor scroll-top))) + +(defun ac-cleanup () + "Cleanup auto completion." + (when ac-cursor-color + (set-cursor-color ac-cursor-color)) + (when (and ac-use-comphist ac-comphist) + (when (and (null ac-selected-candidate) (member ac-prefix ac-candidates)) + ;; Assume candidate is selected by just typing + (setq ac-selected-candidate ac-prefix) + (setq ac-last-point ac-point)) + (when ac-selected-candidate + (ac-comphist-add ac-comphist + ac-selected-candidate + (if ac-last-point + (- ac-last-point ac-point) + (length ac-prefix))))) + (ac-deactivate-completing-map) + (ac-remove-prefix-overlay) + (ac-remove-quick-help) + (ac-inline-delete) + (ac-menu-delete) + (ac-cancel-timer) + (ac-cancel-show-menu-timer) + (ac-cancel-quick-help-timer) + (setq ac-cursor-color nil + ac-inline nil + ac-show-menu nil + ac-menu nil + ac-completing nil + ac-point nil + ac-last-point nil + ac-prefix nil + ac-prefix-overlay nil + ac-selected-candidate nil + ac-common-part nil + ac-whole-common-part nil + ac-triggered nil + ac-limit nil + ac-candidates nil + ac-candidates-cache nil + ac-fuzzy-enable nil + ac-dwim-enable nil + ac-compiled-sources nil + ac-current-sources nil + ac-current-prefix-def nil + ac-ignoring-prefix-def nil)) + +(defsubst ac-abort () + "Abort completion." + (ac-cleanup)) + +(defun ac-extend-region-to-delete (string) + "Determine the boundary of the region to delete before inserting the \ +completed string. This will be either the position of current point, or +the end of the symbol at point, if the text from point to end of symbol +is the right part of the completed STRING." + (let* ((end-of-symbol (or (cdr-safe (bounds-of-thing-at-point 'symbol)) + (point))) + (remaindar (buffer-substring-no-properties (point) end-of-symbol)) + (remaindar-length (length remaindar))) + (if (and (>= (length string) remaindar-length) + (string= (substring-no-properties string (- remaindar-length)) + remaindar)) + end-of-symbol + (point)))) + +(defun ac-expand-string (string &optional remove-undo-boundary) + "Expand `STRING' into the buffer and update 'ac-prefix' to `STRING'. +This function records deletion and insertion sequences by `undo-boundary'. +If REMOVE-UNDO-BOUNDARY is non-nil, this function also removes `undo-boundary' +that have been made before in this function. When `buffer-undo-list' is +'t', REMOVE-UNDO-BOUNDARY has no effect." + (when (eq buffer-undo-list t) + (setq remove-undo-boundary nil)) + (when (not (equal string (buffer-substring ac-point (point)))) + (undo-boundary) + ;; We can't use primitive-undo since it undoes by + ;; groups, divided by boundaries. + ;; We don't want boundary between deletion and insertion. + ;; So do it manually. + ;; Delete region silently for undo: + (if remove-undo-boundary + (progn + (let (buffer-undo-list) + (save-excursion + (delete-region ac-point (ac-extend-region-to-delete string)))) + (setq buffer-undo-list + (nthcdr 2 buffer-undo-list))) + (delete-region ac-point (ac-extend-region-to-delete string))) + (insert (substring-no-properties string)) + ;; Sometimes, possible when omni-completion used, (insert) added + ;; to buffer-undo-list strange record about position changes. + ;; Delete it here: + (when (and remove-undo-boundary + (integerp (cadr buffer-undo-list))) + (setcdr buffer-undo-list (nthcdr 2 buffer-undo-list))) + (undo-boundary) + (setq ac-selected-candidate string) + (setq ac-prefix string))) + +(defun ac-set-trigger-key (key) + "Set `ac-trigger-key' to `KEY'. It is recommemded to use this function instead of calling `setq'." + ;; Remove old mapping + (when ac-trigger-key + (define-key ac-mode-map (read-kbd-macro ac-trigger-key) nil)) + + ;; Make new mapping + (setq ac-trigger-key key) + (when key + (define-key ac-mode-map (read-kbd-macro key) 'ac-trigger-key-command))) + +(defun ac-set-timer () + "Safe way to start the completion menu timer." + (unless ac-timer + (setq ac-timer (run-with-idle-timer ac-delay ac-delay 'ac-update-greedy)))) + +(defun ac-cancel-timer () + "Safe way to cancel timer." + (when (timerp ac-timer) + (cancel-timer ac-timer) + (setq ac-timer nil))) + +(defun ac-update (&optional force) + "No documentation, FORCE." + (when (and auto-complete-mode + ac-prefix + (or ac-triggered force) + (not isearch-mode)) + (ac-put-prefix-overlay) + (setq ac-candidates (ac-candidates)) + (let ((preferred-width (popup-preferred-width ac-candidates))) + ;; Reposition if needed + (when (or (null ac-menu) + (>= (popup-width ac-menu) preferred-width) + (<= (popup-width ac-menu) (- preferred-width 10)) + (and (> (popup-direction ac-menu) 0) + (ac-menu-at-wrapper-line-p))) + (ac-inline-hide) ; Hide overlay to calculate correct column + (ac-remove-quick-help) + (ac-menu-delete) + (ac-menu-create ac-point preferred-width ac-menu-height))) + (ac-update-candidates 0 0) + t)) + +(defun ac-update-greedy (&optional force) + "No documentation, FORCE." + (let (result) + (while (when (and (setq result (ac-update force)) + (null ac-candidates)) + (add-to-list 'ac-ignoring-prefix-def ac-current-prefix-def) + (ac-start :force-init t) + ac-current-prefix-def)) + result)) + +(defun ac-set-show-menu-timer () + "No documentation." + (when (and (or (integerp ac-auto-show-menu) (floatp ac-auto-show-menu)) + (null ac-show-menu-timer)) + (setq ac-show-menu-timer (run-with-idle-timer ac-auto-show-menu ac-auto-show-menu 'ac-show-menu)))) + +(defun ac-cancel-show-menu-timer () + "No documentation." + (when (timerp ac-show-menu-timer) + (cancel-timer ac-show-menu-timer) + (setq ac-show-menu-timer nil))) + +(defun ac-show-menu () + "No documentation." + (unless (eq ac-show-menu t) + (setq ac-show-menu t) + (ac-inline-hide) + (ac-remove-quick-help) + (ac-update t))) + +(defun ac-help (&optional persist) + "No documentation, PERSIST." + (interactive "P") + (when ac-menu (popup-menu-show-help ac-menu persist))) + +(defun ac-persist-help () + "No documentation." + (interactive) + (ac-help t)) + +(defun ac-last-help (&optional persist) + "No documentation, PERSIST." + (interactive "P") + (when ac-last-completion (popup-item-show-help (cdr ac-last-completion) persist))) + +(defun ac-last-persist-help () + "No documentation." + (interactive) + (ac-last-help t)) + +(defun ac-set-quick-help-timer () + "No documentation." + (when (and ac-use-quick-help + (null ac-quick-help-timer)) + (setq ac-quick-help-timer (run-with-idle-timer ac-quick-help-delay ac-quick-help-delay 'ac-quick-help)))) + +(defun ac-cancel-quick-help-timer () + "No documentation." + (when (timerp ac-quick-help-timer) + (cancel-timer ac-quick-help-timer) + (setq ac-quick-help-timer nil))) + +(defun ac-pos-tip-show-quick-help (menu &optional item &rest args) + "No documentation, MENU, ITEM, ARGS." + (let* ((point (plist-get args :point)) + (around nil) + (parent-offset (popup-offset menu)) + (doc (popup-menu-documentation menu item))) + (when (stringp doc) + (if (popup-hidden-p menu) (setq around t) (setq point nil)) + (with-no-warnings + (pos-tip-show doc + 'popup-tip-face + (or point + (and menu + (popup-child-point menu parent-offset)) + (point)) + nil 300 + popup-tip-max-width + nil nil + (and (not around) 0)) + (unless (plist-get args :nowait) + (clear-this-command-keys) + (unwind-protect + (push (read-event (plist-get args :prompt)) unread-command-events) + (pos-tip-hide)) + t))))) + +(defun ac-quick-help-use-pos-tip-p () + "No documentation." + (and ac-quick-help-prefer-pos-tip + window-system + (featurep 'pos-tip))) + +(defun ac-quick-help (&optional force) + "No documentation, FORCE." + (interactive) + ;; TODO don't use FORCE + (when (and (or force + (with-no-warnings + ;; called-interactively-p can take no args + (called-interactively-p)) + ;; ac-isearch'ing + (null this-command)) + (ac-menu-live-p) + (null ac-quick-help)) + (setq ac-quick-help + (funcall (if (ac-quick-help-use-pos-tip-p) + 'ac-pos-tip-show-quick-help + 'popup-menu-show-quick-help) + ac-menu nil + :point ac-point + :height ac-quick-help-height + :nowait t)))) + +(defun ac-remove-quick-help () + "No documentation." + (when (ac-quick-help-use-pos-tip-p) + (with-no-warnings (pos-tip-hide))) + (when ac-quick-help + (popup-delete ac-quick-help) + (setq ac-quick-help nil))) + +(defun ac-last-quick-help () + "No documentation." + (interactive) + (when (and ac-last-completion + (eq (marker-buffer (car ac-last-completion)) (current-buffer))) + (let ((doc (popup-item-documentation (cdr ac-last-completion))) + (point (marker-position (car ac-last-completion)))) + (when (stringp doc) + (if (ac-quick-help-use-pos-tip-p) + (with-no-warnings (pos-tip-show doc nil point nil 300)) + (popup-tip doc + :point point + :around t + :scroll-bar t + :margin t)))))) + +(defmacro ac-define-quick-help-command (name arglist &rest body) + "No documentation, NAME, ARGLIST, BODY." + (declare (indent 2)) + `(progn + (defun ,name ,arglist ,@body) + (put ',name 'ac-quick-help-command t))) + +(ac-define-quick-help-command ac-quick-help-scroll-down () + (interactive) + (when ac-quick-help + (popup-scroll-down ac-quick-help))) + +(ac-define-quick-help-command ac-quick-help-scroll-up () + (interactive) + (when ac-quick-help + (popup-scroll-up ac-quick-help))) + + + +;;;; Auto completion isearch + +(defun ac-isearch-callback (list) + "No documentation, LIST." + (setq ac-dwim-enable (eq (length list) 1))) + +(defun ac-isearch () + "No documentation." + (interactive) + (when (ac-menu-live-p) + (ac-cancel-show-menu-timer) + (ac-show-menu) + (if ac-use-quick-help + (let ((popup-menu-show-quick-help-function + (if (ac-quick-help-use-pos-tip-p) + 'ac-pos-tip-show-quick-help + 'popup-menu-show-quick-help))) + (popup-isearch ac-menu + :callback 'ac-isearch-callback + :help-delay ac-quick-help-delay)) + (popup-isearch ac-menu :callback 'ac-isearch-callback)))) + + + +;;;; Auto completion commands + +(cl-defun auto-complete-1 (&key sources (triggered 'command)) + "No documentation." + (let ((menu-live (ac-menu-live-p)) + (inline-live (ac-inline-live-p)) + started) + (ac-abort) + (let ((ac-sources (or sources ac-sources))) + (if (or ac-show-menu-immediately-on-auto-complete inline-live) + (setq ac-show-menu t)) + (setq started (ac-start :triggered triggered))) + (when (ac-update-greedy t) + ;; TODO Not to cause inline completion to be disrupted. + (when (ac-inline-live-p) (ac-inline-hide)) + ;; Not to expand when it is first time to complete + (when (and (or (and (not ac-expand-on-auto-complete) + (> (length ac-candidates) 1) + (not menu-live)) + (not (let ((ac-common-part ac-whole-common-part)) + (ac-expand-common)))) + ac-use-fuzzy + (null ac-candidates)) + (ac-fuzzy-complete))) + started)) + +;;;###autoload +(defun auto-complete (&optional sources) + "Start auto-completion at current point." + (interactive) + (auto-complete-1 :sources sources)) + +(defun ac-fuzzy-complete () + "Start fuzzy completion at current point." + (interactive) + (if (not (require 'fuzzy nil t)) + (message "Please install fuzzy.el if you use fuzzy completion") + (unless (ac-menu-live-p) + (ac-start)) + (let ((ac-match-function 'fuzzy-all-completions)) + (when ac-fuzzy-cursor-color + (unless ac-cursor-color + (setq ac-cursor-color (frame-parameter (selected-frame) 'cursor-color))) + (set-cursor-color ac-fuzzy-cursor-color)) + (setq ac-show-menu t) + (setq ac-fuzzy-enable t) + (setq ac-triggered nil) + (ac-update t))) + t) + +(defun ac-next () + "Select next candidate." + (interactive) + (when (ac-menu-live-p) + (when (popup-hidden-p ac-menu) + (ac-show-menu)) + (popup-next ac-menu) + (when (eq this-command 'ac-next) + (setq ac-dwim-enable t)))) + +(defun ac-previous () + "Select previous candidate." + (interactive) + (when (ac-menu-live-p) + (when (popup-hidden-p ac-menu) + (ac-show-menu)) + (popup-previous ac-menu) + (if (eq this-command 'ac-previous) + (setq ac-dwim-enable t)))) + +(defun ac-expand (arg) + "Try expand, and if expanded twice, select next candidate. +If given a prefix argument, select the previous candidate." + (interactive "P") + (unless (ac-expand-common) + (let ((string (ac-selected-candidate))) + (when string + (when (equal ac-prefix string) + (if (not arg) + (ac-next) + (ac-previous)) + (setq string (ac-selected-candidate))) + (ac-expand-string string + (or (eq last-command 'ac-expand) + (eq last-command 'ac-expand-previous))) + ;; Do reposition if menu at long line + (if (and (> (popup-direction ac-menu) 0) + (ac-menu-at-wrapper-line-p)) + (ac-reposition)) + (setq ac-show-menu t) + string)))) + +(defun ac-expand-previous (arg) + "Like `ac-expand', but select previous candidate." + (interactive "P") + (ac-expand (not arg))) + +(defun ac-expand-common () + "Try to expand meaningful common part." + (interactive) + (if (and ac-dwim ac-dwim-enable) + (ac-complete) + (when (and (ac-inline-live-p) ac-common-part) + (ac-inline-hide) + (ac-expand-string ac-common-part (eq last-command this-command)) + (setq ac-common-part nil) + t))) + +(defun ac-complete-1 (candidate) + "No documentation, CANDIDATE." + (let ((action (popup-item-property candidate 'action)) + (fallback nil)) + (when candidate + (unless (ac-expand-string candidate) + (setq fallback t)) + ;; Remember to show help later + (when (and ac-point candidate) + (unless ac-last-completion + (setq ac-last-completion (cons (make-marker) nil))) + (set-marker (car ac-last-completion) ac-point ac-buffer) + (setcdr ac-last-completion candidate))) + (ac-abort) + (cond (action (funcall action)) + (fallback (ac-fallback-command))) + candidate)) + +(defun ac-complete () + "Try complete." + (interactive) + (ac-complete-1 (ac-selected-candidate))) + +(cl-defun ac-start (&key + requires + force-init + (triggered (or ac-triggered t))) + "Start completion." + (interactive) + (if (not auto-complete-mode) + (message "auto-complete-mode is not enabled") + (let* ((info (ac-prefix requires ac-ignoring-prefix-def)) + (prefix-def (nth 0 info)) + (point (nth 1 info)) + (sources (nth 2 info)) + prefix + (init (or force-init (not (eq ac-point point))))) + (if (or (null point) + (progn + (setq prefix (buffer-substring-no-properties point (point))) + (and (not (eq triggered 'command)) + (ac-stop-word-p prefix)))) + (prog1 nil + (ac-abort)) + (when (and ac-use-fuzzy ac-fuzzy-cursor-color) + (unless ac-cursor-color + (setq ac-cursor-color (frame-parameter (selected-frame) 'cursor-color)))) + (setq ac-show-menu (or ac-show-menu (if (eq ac-auto-show-menu t) t)) + ac-current-sources sources + ac-buffer (current-buffer) + ac-point point + ac-prefix prefix + ac-limit ac-candidate-limit + ac-triggered triggered + ac-current-prefix-def prefix-def) + (when (or init (null ac-prefix-overlay)) + (ac-init)) + (ac-set-timer) + (ac-set-show-menu-timer) + (ac-set-quick-help-timer) + (ac-put-prefix-overlay) + t)))) + +(defun ac-stop () + "Stop completing." + (interactive) + (setq ac-selected-candidate nil) + (ac-abort)) + +(defun ac-ignore (&rest ignore) + "Same as `ignore'." + (interactive)) + +(defun ac-mouse-1 (event) + "No documentation, EVENT." + (interactive "e") + (popup-awhen (popup-menu-item-of-mouse-event event) + (ac-complete-1 it))) + +(defun ac-mouse-4 (event) + "No documentation, EVENT." + (interactive "e") + (ac-previous)) + +(defun ac-mouse-5 (event) + "No documentation, EVENT." + (interactive "e") + (ac-next)) + +(defun ac-trigger-key-command (&optional force) + "No documentation, FORCE." + (interactive "P") + (let (started) + (when (or force (ac-trigger-command-p last-command)) + (setq started (auto-complete-1 :triggered 'trigger-key))) + (unless started + (ac-fallback-command 'ac-trigger-key-command)))) + + + +;;;; Basic cache facility + +(defvar ac-clear-variables-every-minute-timer nil) +(defvar ac-clear-variables-after-save nil) +(defvar ac-clear-variables-every-minute nil) +(defvar ac-minutes-counter 0) + +(defun ac-clear-variable-after-save (variable &optional pred) + "No documentation." + (add-to-list 'ac-clear-variables-after-save (cons variable pred))) + +(defun ac-clear-variables-after-save () + "No documentation." + (dolist (pair ac-clear-variables-after-save) + (when (or (null (cdr pair)) (funcall (cdr pair))) + (set (car pair) nil)))) + +(defun ac-clear-variable-every-minutes (variable minutes) + "No documentation." + (add-to-list 'ac-clear-variables-every-minute (cons variable minutes))) + +(defun ac-clear-variable-every-minute (variable) + "No documentation." + (ac-clear-variable-every-minutes variable 1)) + +(defun ac-clear-variable-every-10-minutes (variable) + "No documentation." + (ac-clear-variable-every-minutes variable 10)) + +(defun ac-clear-variables-every-minute () + "No documentation." + (cl-incf ac-minutes-counter) + (dolist (pair ac-clear-variables-every-minute) + (when (eq (% ac-minutes-counter (cdr pair)) 0) + (set (car pair) nil)))) + + + +;;;; Auto complete mode + +(defun ac-cursor-on-diable-face-p (&optional point) + "No documentation." + (memq (get-text-property (or point (point)) 'face) ac-disable-faces)) + +(defun ac-trigger-command-p (command) + "Return non-nil if `COMMAND' is a trigger command." + (and (symbolp command) + (not (memq command ac-non-trigger-commands)) + (or (memq command ac-trigger-commands) + (string-match "self-insert-command" (symbol-name command)) + (string-match "electric" (symbol-name command))))) + +(defun ac-fallback-key-sequence () + "No documentation." + (setq unread-command-events + (append (this-single-command-raw-keys) + unread-command-events)) + (read-key-sequence-vector "")) + +(defun ac-fallback-command (&optional except-command) + "No documentation." + (let* ((auto-complete-mode nil) + (keys (ac-fallback-key-sequence)) + (command (and keys (key-binding keys)))) + (when (and (commandp command) + (not (eq command except-command))) + (setq this-command command) + (call-interactively command)))) + +(defun ac-compatible-package-command-p (command) + "Return non-nil if `COMMAND' is compatible with auto-complete." + (and (symbolp command) + (string-match ac-compatible-packages-regexp (symbol-name command)))) + +(defun ac-handle-pre-command () + (condition-case var + (if (or (setq ac-triggered (and (not ac-fuzzy-enable) ; ignore key storkes in fuzzy mode + (or (eq this-command 'auto-complete) ; special case + (ac-trigger-command-p this-command) + (and ac-completing + (memq this-command ac-trigger-commands-on-completing))) + (not (ac-cursor-on-diable-face-p)) + (or ac-triggered t))) + (ac-compatible-package-command-p this-command)) + (progn + (when (or (not (symbolp this-command)) + (not (get this-command 'ac-quick-help-command))) + (ac-remove-quick-help)) + ;; Not to cause inline completion to be disrupted. + (ac-inline-hide)) + (ac-abort)) + (error (ac-error var)))) + +(defun ac-handle-post-command () + "No documentation." + (condition-case var + (when (and ac-triggered + (or ac-auto-start ac-completing) + (not isearch-mode)) + (setq ac-last-point (point)) + (ac-start :requires (unless ac-completing ac-auto-start)) + (unless ac-disable-inline + (ac-inline-update))) + (error (ac-error var)))) + +(defvar ac-flycheck-poll-completion-end-timer nil + "Timer to poll end of completion.") + +(defun ac-syntax-checker-workaround () + "No documentation." + (if ac-stop-flymake-on-completing + (progn + (make-local-variable 'ac-flycheck-poll-completion-end-timer) + (when (require 'flymake nil t) + (defadvice flymake-on-timer-event (around ac-flymake-stop-advice activate) + (unless ac-completing + ad-do-it))) + (when (require 'flycheck nil t) + (defadvice flycheck-handle-idle-change (around ac-flycheck-stop-advice activate) + (if ac-completing + (setq ac-flycheck-poll-completion-end-timer + (run-at-time ac-flycheck-poll-completion-end-interval + nil + #'flycheck-handle-idle-change)) + ad-do-it)))) + (when (featurep 'flymake) + (ad-disable-advice 'flymake-on-timer-event 'around 'ac-flymake-stop-advice)) + (when (featurep 'flycheck) + (ad-disable-advice 'flycheck-handle-idle-change 'around 'ac-flycheck-stop-advice)))) + +(defun ac-setup () + "No documentation." + (when ac-trigger-key (ac-set-trigger-key ac-trigger-key)) + (when ac-use-comphist (ac-comphist-init)) + (unless ac-clear-variables-every-minute-timer + (setq ac-clear-variables-every-minute-timer (run-with-timer 60 60 'ac-clear-variables-every-minute))) + (ac-syntax-checker-workaround)) + +;;;###autoload +(define-minor-mode auto-complete-mode + "AutoComplete mode" + :lighter " AC" + :keymap ac-mode-map + :group 'auto-complete + (if auto-complete-mode + (progn + (ac-setup) + (add-hook 'pre-command-hook 'ac-handle-pre-command nil t) + (add-hook 'post-command-hook 'ac-handle-post-command nil t) + (add-hook 'after-save-hook 'ac-clear-variables-after-save nil t) + (run-hooks 'auto-complete-mode-hook)) + (remove-hook 'pre-command-hook 'ac-handle-pre-command t) + (remove-hook 'post-command-hook 'ac-handle-post-command t) + (remove-hook 'after-save-hook 'ac-clear-variables-after-save t) + (ac-abort))) + +(defun auto-complete-mode-maybe () + "What buffer `auto-complete-mode' prefers." + (when (and (not (minibufferp (current-buffer))) + (memq major-mode ac-modes)) + (auto-complete-mode 1))) + +;;;###autoload +(define-global-minor-mode global-auto-complete-mode + auto-complete-mode auto-complete-mode-maybe + :group 'auto-complete) + + + +;;;; Compatibilities with other extensions + +(defun ac-flyspell-workaround () + "Flyspell uses `sit-for' for delaying its process. Unfortunatelly, +it stops auto completion which is trigger with `run-with-idle-timer'. +This workaround avoid flyspell processes when auto completion is being started." + (interactive) + (defadvice flyspell-post-command-hook (around ac-flyspell-workaround activate) + (unless ac-triggered + ad-do-it))) + +(defun ac-linum-workaround () + "linum-mode tries to display the line numbers even for the +completion menu. This workaround stops that annoying behavior." + (interactive) + (defadvice linum-update (around ac-linum-update-workaround activate) + (unless ac-completing + ad-do-it))) + + + +;;;; Standard sources + +(defmacro ac-define-source (name source) + "Source definition macro. It defines a complete command also." + (declare (indent 1)) + `(progn + (defvar ,(intern (format "ac-source-%s" name))) + ;; Use `setq' to reset ac-source-NAME every time + ;; `ac-define-source' is called. This is useful, for example + ;; when evaluating `ac-define-source' using C-M-x (`eval-defun'). + (setq ,(intern (format "ac-source-%s" name)) ,source) + (defun ,(intern (format "ac-complete-%s" name)) () + (interactive) + (auto-complete '(,(intern (format "ac-source-%s" name))))))) + +;; Words in buffer source +(defvar ac-word-index nil) + +(defun ac-candidate-words-in-buffer (point prefix limit) + "No documentation." + (let ((i 0) candidate candidates + (regexp (concat "\\_<" (regexp-quote prefix) "\\(\\sw\\|\\s_\\)+\\_>"))) + (save-excursion + ;; Search backward + (goto-char point) + (while (and (or (not (integerp limit)) (< i limit)) + (re-search-backward regexp nil t)) + (setq candidate (match-string-no-properties 0)) + (unless (member candidate candidates) + (push candidate candidates) + (cl-incf i))) + ;; Search backward + (goto-char (+ point (length prefix))) + (while (and (or (not (integerp limit)) (< i limit)) + (re-search-forward regexp nil t)) + (setq candidate (match-string-no-properties 0)) + (unless (member candidate candidates) + (push candidate candidates) + (cl-incf i))) + (nreverse candidates)))) + +(defun ac-incremental-update-word-index () + "No documentation." + (unless (local-variable-p 'ac-word-index) + (make-local-variable 'ac-word-index)) + (if (null ac-word-index) + (setq ac-word-index (cons nil nil))) + ;; Mark incomplete + (if (car ac-word-index) + (setcar ac-word-index nil)) + (let ((index (cdr ac-word-index)) + (words (ac-candidate-words-in-buffer ac-point ac-prefix (or (and (integerp ac-limit) ac-limit) 10)))) + (dolist (word words) + (unless (member word index) + (push word index) + (setcdr ac-word-index index))))) + +(defun ac-update-word-index-1 () + "No documentation." + (unless (local-variable-p 'ac-word-index) + (make-local-variable 'ac-word-index)) + (when (and (not (car ac-word-index)) + (< (buffer-size) 1048576)) ; NOTE: Not sure 1048576 means + ;; Complete index + (setq ac-word-index + (cons t + (split-string (buffer-substring-no-properties (point-min) (point-max)) + "\\(?:^\\|\\_>\\).*?\\(?:\\_<\\|$\\)"))))) + +(defun ac-update-word-index () + "No documentation." + (dolist (buffer (buffer-list)) + (when (or ac-fuzzy-enable + (not (eq buffer (current-buffer)))) + (with-current-buffer buffer + (ac-update-word-index-1))))) + +(defun ac-word-candidates (&optional buffer-pred) + "No documentation." + (cl-loop initially (unless ac-fuzzy-enable (ac-incremental-update-word-index)) + for buffer in (buffer-list) + if (and (or (not (integerp ac-limit)) (< (length candidates) ac-limit)) + (if buffer-pred (funcall buffer-pred buffer) t)) + append (funcall ac-match-function + ac-prefix + (and (local-variable-p 'ac-word-index buffer) + (cdr (buffer-local-value 'ac-word-index buffer)))) + into candidates + finally return (delete-dups candidates))) + +(ac-define-source words-in-buffer + '((candidates . ac-word-candidates))) + +(ac-define-source words-in-all-buffer + '((init . ac-update-word-index) + (candidates . ac-word-candidates))) + +(ac-define-source words-in-same-mode-buffers + '((init . ac-update-word-index) + (candidates . (ac-word-candidates + (lambda (buffer) + (derived-mode-p (buffer-local-value 'major-mode buffer))))))) + +;; Lisp symbols source +(defvar ac-symbols-cache nil) +(ac-clear-variable-every-10-minutes 'ac-symbols-cache) + +(defun ac-symbol-file (symbol type) + "No documentation." + (if (fboundp 'find-lisp-object-file-name) + (find-lisp-object-file-name symbol type) + (let ((file-name (with-no-warnings + (describe-simplify-lib-file-name + (symbol-file symbol type))))) + (when (equal file-name "loaddefs.el") + ;; Find the real def site of the preloaded object. + (let ((location (condition-case nil + (if (eq type 'defun) + (find-function-search-for-symbol symbol nil + "loaddefs.el") + (find-variable-noselect symbol file-name)) + (error nil)))) + (when location + (with-current-buffer (car location) + (when (cdr location) + (goto-char (cdr location))) + (when (re-search-backward + "^;;; Generated autoloads from \\(.*\\)" nil t) + (setq file-name (match-string 1))))))) + (if (and (null file-name) + (or (eq type 'defun) + (integerp (get symbol 'variable-documentation)))) + ;; It's a object not defined in Elisp but in C. + (if (get-buffer " *DOC*") + (if (eq type 'defun) + (help-C-file-name (symbol-function symbol) 'subr) + (help-C-file-name symbol 'var)) + 'C-source) + file-name)))) + +(defun ac-symbol-documentation (symbol) + "No documentation." + (if (stringp symbol) + (setq symbol (intern-soft symbol))) + (ignore-errors + (with-temp-buffer + (let ((standard-output (current-buffer))) + (prin1 symbol) + (princ " is ") + (cond + ((fboundp symbol) + ;; import help-xref-following + (require 'help-mode) + (let ((help-xref-following t) + (major-mode 'help-mode)) ; avoid error in Emacs 24 + (describe-function-1 symbol)) + (buffer-string)) + ((boundp symbol) + (let ((file-name (ac-symbol-file symbol 'defvar))) + (princ "a variable") + (when file-name + (princ " defined in `") + (princ (if (eq file-name 'C-source) + "C source code" + (file-name-nondirectory file-name)))) + (princ "'.\n\n") + (princ (or (documentation-property symbol 'variable-documentation t) + "Not documented.")) + (buffer-string))) + ((facep symbol) + (let ((file-name (ac-symbol-file symbol 'defface))) + (princ "a face") + (when file-name + (princ " defined in `") + (princ (if (eq file-name 'C-source) + "C source code" + (file-name-nondirectory file-name)))) + (princ "'.\n\n") + (princ (or (documentation-property symbol 'face-documentation t) + "Not documented.")) + (buffer-string))) + (t + (let ((doc (documentation-property symbol 'group-documentation t))) + (when doc + (princ "a group.\n\n") + (princ doc) + (buffer-string))))))))) + +(defun ac-symbol-candidates () + "No documentation." + (or ac-symbols-cache + (setq ac-symbols-cache + (cl-loop for x being the symbols + if (or (fboundp x) + (boundp x) + (symbol-plist x)) + collect (symbol-name x))))) + +(ac-define-source symbols + '((candidates . ac-symbol-candidates) + (document . ac-symbol-documentation) + (symbol . "s") + (cache))) + +;; Lisp functions source +(defvar ac-functions-cache nil) +(ac-clear-variable-every-10-minutes 'ac-functions-cache) + +(defun ac-function-candidates () + "No documentation." + (or ac-functions-cache + (setq ac-functions-cache + (cl-loop for x being the symbols + if (fboundp x) + collect (symbol-name x))))) + +(ac-define-source functions + '((candidates . ac-function-candidates) + (document . ac-symbol-documentation) + (symbol . "f") + (prefix . "(\\(\\(?:\\sw\\|\\s_\\)+\\)") + (cache))) + +;; Lisp variables source +(defvar ac-variables-cache nil) +(ac-clear-variable-every-10-minutes 'ac-variables-cache) + +(defun ac-variable-candidates () + "No documentation." + (or ac-variables-cache + (setq ac-variables-cache + (cl-loop for x being the symbols + if (boundp x) + collect (symbol-name x))))) + +(ac-define-source variables + '((candidates . ac-variable-candidates) + (document . ac-symbol-documentation) + (symbol . "v") + (cache))) + +;; Lisp features source +(defvar ac-emacs-lisp-features nil) +(ac-clear-variable-every-10-minutes 'ac-emacs-lisp-features) + +(defun ac-emacs-lisp-feature-candidates () + "No documentation." + (or ac-emacs-lisp-features + (if (fboundp 'find-library-suffixes) + (let ((suffix (concat (regexp-opt (find-library-suffixes) t) "\\'"))) + (setq ac-emacs-lisp-features + (append (mapcar 'prin1-to-string features) + (cl-loop for dir in load-path + if (file-directory-p dir) + append (cl-loop for file in (directory-files dir) + if (string-match suffix file) + collect (substring file 0 (match-beginning 0)))))))))) + +(ac-define-source features + '((depends find-func) + (candidates . ac-emacs-lisp-feature-candidates) + (prefix . "require +'\\(\\(?:\\sw\\|\\s_\\)*\\)") + (requires . 0))) + +(defvaralias 'ac-source-emacs-lisp-features 'ac-source-features) + +;; Abbrev source +(ac-define-source abbrev + '((candidates . (mapcar 'popup-x-to-string (append (vconcat local-abbrev-table global-abbrev-table) nil))) + (action . expand-abbrev) + (symbol . "a") + (cache))) + +;; Files in current directory source +(ac-define-source files-in-current-dir + '((candidates . (directory-files default-directory)) + (cache))) + +;; Filename source +(defvar ac-filename-cache nil) + +(defun ac-filename-candidate () + "No documentation." + (let (file-name-handler-alist) + (unless (or (and comment-start-skip + (string-match comment-start-skip ac-prefix)) + (file-regular-p ac-prefix)) + (ignore-errors + (cl-loop with dir = (file-name-directory ac-prefix) + with files = (or (assoc-default dir ac-filename-cache) + (let ((files (directory-files dir nil "^[^.]"))) + (push (cons dir files) ac-filename-cache) + files)) + for file in files + for path = (concat dir file) + collect (if (file-directory-p path) + (concat path "/") + path)))))) + +(ac-define-source filename + '((init . (setq ac-filename-cache nil)) + (candidates . ac-filename-candidate) + (prefix . valid-file) + (requires . 0) + (action . ac-start) + (limit . nil))) + +;; Dictionary source +(ac-define-source dictionary + '((candidates . ac-buffer-dictionary) + (symbol . "d"))) + +(provide 'auto-complete) +;;; auto-complete.el ends here diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/auto-complete.elc b/.emacs.d/elpa/auto-complete-20201213.1255/auto-complete.elc new file mode 100644 index 0000000..36b376e Binary files /dev/null and b/.emacs.d/elpa/auto-complete-20201213.1255/auto-complete.elc differ diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/dict/ada-mode b/.emacs.d/elpa/auto-complete-20201213.1255/dict/ada-mode new file mode 100644 index 0000000..bea538f --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/dict/ada-mode @@ -0,0 +1,72 @@ +abort +abs +abstract +accept +access +aliased +all +and +array +at +begin +body +case +constant +declare +delay +delta +digits +do +else +elsif +end +entry +exception +exit +for +function +generic +goto +if +in +interface +is +limited +loop +mod +new +not +null +of +or +others +out +overriding +package +pragma +private +procedure +protected +raise +range +record +rem +renames +requeue +return +reverse +select +separate +subtype +synchronized +tagged +task +terminate +then +type +until +use +when +while +with +xor diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/dict/c++-mode b/.emacs.d/elpa/auto-complete-20201213.1255/dict/c++-mode new file mode 100644 index 0000000..292dd8a --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/dict/c++-mode @@ -0,0 +1,99 @@ +alignas +alignof +and +and_eq +asm +auto +bitand +bitor +bool +break +case +catch +char +char16_t +char32_t +class +compl +concept +const +const_cast +constexpr +continue +decltype +default +define +defined +delete +do +double +dynamic_cast +elif +else +endif +enum +error +explicit +export +extern +false +final +float +for +friend +goto +if +ifdef +ifndef +include +inline +int +line +long +mutable +namespace +new +noexcept +not +not_eq +nullptr +operator +or +or_eq +override +pragma +_Pragma +private +protected +public +register +reinterpret_cast +requires +return +short +signed +sizeof +static +static_assert +static_cast +struct +switch +template +this +thread_local +throw +true +try +typedef +typeid +typename +union +unsigned +using +virtual +void +volatile +wchar_t +while +xor +xor_eq diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/dict/c-mode b/.emacs.d/elpa/auto-complete-20201213.1255/dict/c-mode new file mode 100644 index 0000000..a4a8bac --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/dict/c-mode @@ -0,0 +1,55 @@ +auto +_Alignas +_Alignof +_Atomic +_Bool +break +case +char +_Complex +const +continue +default +define +defined +do +double +elif +else +endif +enum +error +extern +float +for +goto +_Generic +if +ifdef +ifndef +_Imaginary +include +inline +int +line +long +_Noreturn +pragma +register +restrict +return +short +signed +sizeof +static +struct +switch +_Static_assert +typedef +_Thread_local +undef +union +unsigned +void +volatile +while diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/dict/caml-mode b/.emacs.d/elpa/auto-complete-20201213.1255/dict/caml-mode new file mode 100644 index 0000000..e709f9f --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/dict/caml-mode @@ -0,0 +1,231 @@ +# OCaml 3.12.1 + +# Keywords +and +as +assert +begin +class +constraint +do +done +downto +else +end +exception +external +false +for +fun +function +functor +if +in +include +inherit +initializer +lazy +let +match +method +module +mutable +new +object +of +open +or +private +rec +sig +struct +then +to +true +try +type +val +virtual +when +while +with + +# Pervasives +! +!= +& +&& +* +** +*. ++ ++. +- +-. +/ +/. +:= +< +<= +<> += +== +> +>= +@ +FP_infinite +FP_nan +FP_normal +FP_subnormal +FP_zero +LargeFile +Open_append +Open_binary +Open_creat +Open_nonblock +Open_rdonly +Open_text +Open_trunc +Open_wronly +Oupen_excl +^ +^^ +abs +abs_float +acos +asin +asr +at_exit +atan +atan2 +bool_of_string +ceil +char_of_int +classify_float +close_in +close_in_noerr +close_out +close_out_noerr +compare +cos +cosh +decr +do_at_exit +epsilon_float +exit +exp +expm1 +failwith +float +float_of_int +float_of_string +floor +flush +flush_all +format +format4 +format_of_string +fpclass +frexp +fst +ignore +in_channel +in_channel_length +incr +infinity +input +input_binary_int +input_byte +input_char +input_line +input_value +int_of_char +int_of_float +int_of_string +invalid_arg +land +ldexp +lnot +log +log10 +log1p +lor +lsl +lsr +lxor +max +max_float +max_int +min +min_float +min_int +mod +mod_float +modf +nan +neg_infinity +not +open_flag +open_in +open_in_bin +open_in_gen +open_out +open_out_bin +open_out_gen +or +out_channel +out_channel_length +output +output_binary_int +output_byte +output_char +output_string +output_value +pos_in +pos_out +pred +prerr_char +prerr_endline +prerr_float +prerr_int +prerr_newline +prerr_string +print_char +print_endline +print_float +print_int +print_newline +print_string +raise +read_float +read_int +read_line +really_input +ref +seek_in +seek_out +set_binary_mode_in +set_binary_mode_out +sin +sinh +snd +sqrt +stderr +stdin +stdout +string_of_bool +string_of_float +string_of_format +string_of_int +succ +tan +tanh +truncate +unsafe_really_input +valid_float_lexem +|| +~ +~+ +~+. +~- +~-. diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/dict/clojure-mode b/.emacs.d/elpa/auto-complete-20201213.1255/dict/clojure-mode new file mode 100644 index 0000000..9dc2c73 --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/dict/clojure-mode @@ -0,0 +1,580 @@ +*agent* +*allow-unresolved-vars* +*assert* +*clojure-version* +*command-line-args* +*compile-files* +*compile-path* +*compiler-options* +*data-readers* +*default-data-reader-fn* +*err* +*file* +*flush-on-newline* +*fn-loader* +*in* +*math-context* +*ns* +*out* +*print-dup* +*print-length* +*print-level* +*print-meta* +*print-readably* +*read-eval* +*source-path* +*unchecked-math* +*use-context-classloader* +*verbose-defrecords* +*warn-on-reflection* +->ArrayChunk +->Vec +->VecNode +->VecSeq +-cache-protocol-fn +-reset-methods +accessor +aclone +add-classpath +add-watch +agent +agent-error +agent-errors +aget +alength +alias +all-ns +alter +alter-meta! +alter-var-root +amap +ancestors +and +apply +areduce +array-map +as-> +aset +aset-boolean +aset-byte +aset-char +aset-double +aset-float +aset-int +aset-long +aset-short +assert +assoc +assoc! +assoc-in +associative? +atom +await +await-for +await1 +bases +bean +bigdec +bigint +biginteger +binding +bit-and +bit-and-not +bit-clear +bit-flip +bit-not +bit-or +bit-set +bit-shift-left +bit-shift-right +bit-test +bit-xor +boolean +boolean-array +booleans +bound-fn +bound-fn* +bound? +butlast +byte +byte-array +bytes +case +cast +char +char-array +char-escape-string +char-name-string +char? +chars +chunk +chunk-append +chunk-buffer +chunk-cons +chunk-first +chunk-next +chunk-rest +chunked-seq? +class +class? +clear-agent-errors +clojure-version +coll? +comment +commute +comp +comparator +compare +compare-and-set! +compile +complement +concat +cond +cond-> +cond->> +condp +conj +conj! +cons +constantly +construct-proxy +contains? +count +counted? +create-ns +create-struct +cycle +dec +dec' +decimal? +declare +default-data-readers +definline +definterface +defmacro +defmethod +defmulti +defn +defn- +defonce +defprotocol +defrecord +defstruct +deftype +delay +delay? +deliver +denominator +deref +derive +descendants +destructure +disj +disj! +dissoc +dissoc! +distinct +distinct? +doall +doc +dorun +doseq +dosync +dotimes +doto +double +double-array +doubles +drop +drop-last +drop-while +dtype +empty +empty? +ensure +enumeration-seq +error-handler +error-mode +eval +even? +every-pred +every? +ex-data +ex-info +extend +extend-class +extend-protocol +extend-type +extenders +extends? +false? +ffirst +file-seq +filter +filterv +find +find-doc +find-keyword +find-ns +find-protocol-impl +find-protocol-method +find-var +first +flatten +float +float-array +float? +floats +flush +fn +fn? +fnext +fnil +for +force +format +frequencies +future +future-call +future-cancel +future-cancelled? +future-done? +future? +gen-class +gen-interface +gensym +get +get-in +get-method +get-proxy-class +get-thread-bindings +get-validator +group-by +hash +hash-combine +hash-map +hash-set +identical? +identity +if-let +if-not +ifn? +import +in-ns +inc +inc' +init-proxy +instance? +int +int-array +integer? +interleave +intern +interpose +into +into-array +ints +io! +isa? +iterate +iterator-seq +juxt +keep +keep-indexed +key +keys +keyword +keyword? +last +lazy-cat +lazy-seq +let +letfn +line-seq +list +list* +list? +load +load-file +load-reader +load-string +loaded-libs +locking +long +long-array +longs +loop +macroexpand +macroexpand-1 +make-array +make-hierarchy +map +map-indexed +map? +mapcat +mapv +max +max-key +memfn +memoize +merge +merge-with +meta +method-sig +methods +min +min-key +mod +munge +name +namespace +namespace-munge +neg? +newline +next +nfirst +nil? +nnext +not +not-any? +not-empty +not-every? +not= +ns +ns-aliases +ns-imports +ns-interns +ns-map +ns-name +ns-publics +ns-refers +ns-resolve +ns-unalias +ns-unmap +nth +nthnext +nthrest +num +number? +numerator +object-array +odd? +or +parents +partial +partition +partition-all +partition-by +pcalls +peek +persistent! +pmap +pop +pop! +pop-thread-bindings +pos? +pr +pr-str +prefer-method +prefers +primitives-classnames +print +print-ctor +print-dup +print-method +print-namespace-doc +print-simple +print-str +printf +println +println-str +prn +prn-str +promise +proxy +proxy-call-with-super +proxy-mappings +proxy-name +proxy-super +push-thread-bindings +pvalues +quot +rand +rand-int +rand-nth +range +ratio? +rational? +rationalize +re-find +re-groups +re-matcher +re-matches +re-pattern +re-seq +read +read-line +read-string +realized? +reduce +reduce-kv +reduced +reduced? +reductions +ref +ref-history-count +ref-max-history +ref-min-history +ref-set +refer +refer-clojure +reify +release-pending-sends +rem +remove +remove-all-methods +remove-method +remove-ns +remove-watch +repeat +repeatedly +replace +replicate +require +reset! +reset-meta! +resolve +rest +restart-agent +resultset-seq +reverse +reversible? +rseq +rsubseq +satisfies? +second +select-keys +send +send-off +send-via +seq +seq? +seque +sequence +sequential? +set +set-agent-send-executor! +set-agent-send-off-executor! +set-error-handler! +set-error-mode! +set-validator! +set? +short +short-array +shorts +shuffle +shutdown-agents +slurp +some +some-> +some->> +some-fn +sort +sort-by +sorted-map +sorted-map-by +sorted-set +sorted-set-by +sorted? +special-form-anchor +special-symbol? +spit +split-at +split-with +str +stream? +string? +struct +struct-map +subs +subseq +subvec +supers +swap! +symbol +symbol? +sync +syntax-symbol-anchor +take +take-last +take-nth +take-while +test +the-ns +thread-bound? +time +to-array +to-array-2d +trampoline +transient +tree-seq +true? +type +unchecked-add +unchecked-add-int +unchecked-byte +unchecked-char +unchecked-dec +unchecked-dec-int +unchecked-divide +unchecked-divide-int +unchecked-double +unchecked-float +unchecked-inc +unchecked-inc-int +unchecked-int +unchecked-long +unchecked-multiply +unchecked-multiply-int +unchecked-negate +unchecked-negate-int +unchecked-remainder +unchecked-remainder-int +unchecked-short +unchecked-subtract +unchecked-subtract-int +underive +unquote +unquote-splicing +update-in +update-proxy +use +val +vals +var-get +var-set +var? +vary-meta +vec +vector +vector-of +vector? +when +when-first +when-let +when-not +while +with-bindings +with-bindings* +with-in-str +with-loading-context +with-local-vars +with-meta +with-open +with-out-str +with-precision +with-redefs +with-redefs-fn +xml-seq +zero? +zipmap diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/dict/clojurescript-mode b/.emacs.d/elpa/auto-complete-20201213.1255/dict/clojurescript-mode new file mode 100644 index 0000000..add64b3 --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/dict/clojurescript-mode @@ -0,0 +1,475 @@ +*agent* +*clojure-version* +*command-line-args* +*compile-files* +*compile-path* +*err* +*file* +*flush-on-newline* +*in* +*ns* +*out* +*print-dup* +*print-length* +*print-level* +*print-meta* +*print-readably* +*read-eval* +*warn-on-reflection* +accessor +aclone +add-classpath +add-watch +agent +agent-error +agent-errors +aget +alength +alias +all-ns +alter +alter-meta! +alter-var-root +amap +ancestors +and +apply +areduce +array-map +aset +aset-boolean +aset-byte +aset-char +aset-double +aset-float +aset-int +aset-long +aset-short +assert +assoc +assoc! +assoc-in +associative? +atom +await +await-for +bases +bean +bigdec +bigint +binding +bit-and +bit-and-not +bit-clear +bit-flip +bit-not +bit-or +bit-set +bit-shift-left +bit-shift-right +bit-test +bit-xor +boolean +boolean-array +booleans +bound-fn +bound-fn* +butlast +byte +byte-array +bytes +case +cast +char +char-array +char-escape-string +char-name-string +char? +chars +class +class? +clear-agent-errors +clojure-version +coll? +comment +commute +comp +comparator +compare +compare-and-set! +compile +complement +concat +cond +condp +conj +conj! +cons +constantly +construct-proxy +contains? +count +counted? +create-ns +create-struct +cycle +dec +decimal? +declare +definline +defmacro +defmethod +defmulti +defn +defn- +defonce +defprotocol +defstruct +deftype +delay +delay? +deliver +deref +derive +descendants +disj +disj! +dissoc +dissoc! +distinct +distinct? +doall +doc +dorun +doseq +dosync +dotimes +doto +double +double-array +doubles +drop +drop-last +drop-while +dtype +empty +empty? +ensure +enumeration-seq +error-handler +error-mode +eval +even? +every? +extend +extend-class +extend-protocol +extend-type +extenders +extends? +false? +ffirst +file-seq +filter +find +find-doc +find-ns +find-var +first +float +float-array +float? +floats +flush +fn +fn? +fnext +for +force +format +future +future-call +future-cancel +future-cancelled? +future-done? +future? +gen-class +gen-interface +gensym +get +get-in +get-method +get-proxy-class +get-thread-bindings +get-validator +hash +hash-map +hash-set +identical? +identity +if-let +if-not +ifn? +import +in-ns +inc +init-proxy +instance? +int +int-array +integer? +interleave +intern +interpose +into +into-array +ints +io! +isa? +iterate +iterator-seq +juxt +key +keys +keyword +keyword? +last +lazy-cat +lazy-seq +let +letfn +line-seq +list +list* +list? +load +load-file +load-reader +load-string +loaded-libs +locking +long +long-array +longs +loop +macroexpand +macroexpand-1 +make-array +make-hierarchy +map +map? +mapcat +max +max-key +memfn +memoize +merge +merge-with +meta +methods +min +min-key +mod +name +namespace +neg? +newline +next +nfirst +nil? +nnext +not +not-any? +not-empty +not-every? +not= +ns +ns-aliases +ns-imports +ns-interns +ns-map +ns-name +ns-publics +ns-refers +ns-resolve +ns-unalias +ns-unmap +nth +nthnext +num +number? +object-array +odd? +or +parents +partial +partition +pcalls +peek +persistent! +pmap +pop +pop! +pop-thread-bindings +pos? +pr +pr-str +prefer-method +prefers +print +print-namespace-doc +print-str +printf +println +println-str +prn +prn-str +promise +proxy +proxy-mappings +proxy-super +push-thread-bindings +pvalues +quot +rand +rand-int +range +ratio? +rationalize +re-find +re-groups +re-matcher +re-matches +re-pattern +re-seq +read +read-line +read-string +reduce +ref +ref-history-count +ref-max-history +ref-min-history +ref-set +refer +refer-clojure +reify +release-pending-sends +rem +remove +remove-method +remove-ns +remove-watch +repeat +repeatedly +replace +replicate +require +reset! +reset-meta! +resolve +rest +restart-agent +resultset-seq +reverse +reversible? +rseq +rsubseq +satisfies? +second +select-keys +send +send-off +seq +seq? +seque +sequence +sequential? +set +set-error-handler! +set-error-mode! +set-validator! +set? +short +short-array +shorts +shutdown-agents +slurp +some +sort +sort-by +sorted-map +sorted-map-by +sorted-set +sorted-set-by +sorted? +special-form-anchor +special-symbol? +split-at +split-with +str +stream? +string? +struct +struct-map +subs +subseq +subvec +supers +swap! +symbol +symbol? +sync +syntax-symbol-anchor +take +take-last +take-nth +take-while +test +the-ns +time +to-array +to-array-2d +trampoline +transient +tree-seq +true? +type +unchecked-add +unchecked-dec +unchecked-divide +unchecked-inc +unchecked-multiply +unchecked-negate +unchecked-remainder +unchecked-subtract +underive +update-in +update-proxy +use +val +vals +var-get +var-set +var? +vary-meta +vec +vector +vector-of +vector? +when +when-first +when-let +when-not +while +with-bindings +with-bindings* +with-in-str +with-local-vars +with-meta +with-open +with-out-str +with-precision +xml-seq +zero? +zipmap diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/dict/coq-mode b/.emacs.d/elpa/auto-complete-20201213.1255/dict/coq-mode new file mode 100644 index 0000000..219448f --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/dict/coq-mode @@ -0,0 +1,278 @@ +# Generated by the following form. +# (loop for regexp in (append +# coq-solve-tactics +# coq-keywords +# coq-reserved +# coq-tactics +# coq-tacticals +# (list "Set" "Type" "Prop")) +# append (split-string regexp (regexp-quote "\\s-+")) into words +# finally (loop initially (goto-char (point-max)) +# for word in (delete-dups (sort words 'string<)) +# do (insert word) (newline))) + +Abort +About +Abstract +Add +Admit +Admitted +All +Arguments +AutoInline +Axiom +Bind +Canonical +Cd +Chapter +Check +Close +CoFixpoint +CoInductive +Coercion +Coercions +Comments +Conjecture +Constant +Constructors +Corollary +Declare +Defined +Definition +Delimit +Dependent +Depth +Derive +End +Eval +Export +Extern +Extract +Extraction +Fact +False +Field +File +Fixpoint +Focus +Function +Functional +Goal +Hint +Hypotheses +Hypothesis +Hyps +Identity +If +Immediate +Implicit +Import +Inductive +Infix +Inline +Inlined +Inspect +Inversion +Language +Lemma +Let +Library +Limit +LoadPath +Local +Locate +Ltac +ML +Module +Morphism +Next Obligation +NoInline +Notation +Notations +Obligation +Obligations +Off +On +Opaque +Open +Optimize +Parameter +Parameters +Path +Print +Printing +Program +Proof +Prop +Pwd +Qed +Rec +Record +Recursive +Remark +Remove +Require +Reserved +Reset +Resolve +Rewrite +Ring +Save +Scheme +Scope +Search +SearchAbout +SearchPattern +SearchRewrite +Section +Semi +Set +Setoid +Show +Solve +Sort +Strict +Structure +Synth +Tactic +Test +Theorem +Time +Transparent +True +Type +Undo +Unfocus +Unfold +Unset +Variable +Variables +Width +Wildcard +abstract +absurd +after +apply +as +assert +assumption +at +auto +autorewrite +beta +by +case +cbv +change +clear +clearbody +cofix +coinduction +compare +compute +congruence +constructor +contradiction +cut +cutrewrite +decide +decompose +delta +dependent +dest +destruct +discrR +discriminate +do +double +eapply +eauto +econstructor +eexists +eleft +elim +else +end +equality +esplit +exact +exists +fail +field +first +firstorder +fix +fold +forall +fourier +fun +functional +generalize +hnf +idtac +if +in +induction +info +injection +instantiate +into +intro +intros +intuition +inversion +inversion_clear +iota +lapply +lazy +left +let +linear +load +match +move +omega +pattern +pose +progress +prolog +quote +record +red +refine +reflexivity +rename +repeat +replace +return +rewrite +right +ring +set +setoid +setoid_replace +setoid_rewrite +simpl +simple +simplify_eq +solve +specialize +split +split_Rabs +split_Rmult +stepl +stepr +struct +subst +sum +symmetry +tauto +then +transitivity +trivial +try +unfold +until +using +with +zeta diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/dict/css-mode b/.emacs.d/elpa/auto-complete-20201213.1255/dict/css-mode new file mode 100644 index 0000000..f25e400 --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/dict/css-mode @@ -0,0 +1,874 @@ +!important +@font-face +@font-feature-values +@keyframes +ActiveBorder +ActiveCaption +Alpha +AppWorkspace +Background +Barn +BasicImage +Blinds +Blur +ButtonFace +ButtonHighlight +ButtonShadow +ButtonText +CaptionText +CheckerBoard +Chroma +Compositor +CradientWipe +DXImageTransform +DropShadow +Emboss +Engrave +Fade +FlipH +FlipV +Glow +Gray +GrayText +Highlight +HighlightText +Hz +ICMFilter +InactiveBorder +InactiveCaption +InactiveCaptionText +InfoBackground +InfoText +Inset +Invert +Iris +Light +MaskFilter +Matrix +Menu +MenuText +Microsoft +MotionBlur +Pixelate +RadialWipe +RandomBars +RandomDissolve +RevealTrans +Scrollbar +Shadow +Slide +Spiral +Stretch +Strips +ThreeDDarkShadow +ThreeDFace +ThreeDHighlight +ThreeDLightShadow +ThreeDShadow +Wave +Wheel +Window +WindowFrame +WindowText +Xray +Zigzag +_azimuth +_background +_background-position-x +_background-position-y +_border +_bottom +_caption +_clear +_clip +_color +_content +_counter +_cue +_cursor +_direction +_display +_elevation +_empty +_filter +_filter:progid:DXImageTransform.Microsoft +_float +_font +_height +_ime +_ime-mode +_layout +_layout-flow +_layout-grid +_layout-grid-char +_layout-grid-line +_layout-grid-mode +_layout-grid-type +_left +_letter +_line +_line-break +_list +_margin +_orphans +_outline +_overflow +_overflow-x +_overflow-y +_padding +_page +_pause +_pitch +_play +_position +_quotes +_richness +_right +_ruby +_ruby-align +_ruby-overhang +_ruby-position +_scrollbar +_scrollbar-3dlight-color +_scrollbar-arrow-color +_scrollbar-base-color +_scrollbar-darkshadow-color +_scrollbar-face-color +_scrollbar-highlight-color +_scrollbar-track-color +_speak +_speech +_stress +_table +_text +_text-align-last +_text-autospace +_text-justify +_text-kashida-space +_text-overflow +_text-underline-position +_top +_unicode +_vertical +_visibility +_voice +_volume +_white +_widows +_width +_word +_word-break +_word-wrap +_writing +_writing-mode +_z +_zoom +above +active +adjust +after +aliceblue +align +align-content +align-items +align-self +always +animation +animation-delay +animation-direction +animation-duration +animation-fill-mode +animation-iteration-count +animation-name +animation-play-state +animation-timing-function +antiquewhite +aqua +aquamarine +armenian +arrow +attachment +auto +autospace +avoid +azimuth +azure +backface-visibility +background +background-attachment +background-clip +background-color +background-image +background-origin +background-position +background-repeat +background-size +bar +base +baseline +before +behind +beige +below +bidi +bidi-override +bisque +black +blanchedalmond +blink +block +blue +blueviolet +bold +bolder +border +border-bottom +border-bottom-color +border-bottom-left-radius +border-bottom-right-radius +border-bottom-style +border-bottom-width +border-collapse +border-color +border-image +border-image-outset +border-image-repeat +border-image-slice +border-image-source +border-image-width +border-left +border-left-color +border-left-style +border-left-width +border-radius +border-right +border-right-color +border-right-style +border-right-width +border-spacing +border-style +border-top +border-top-color +border-top-left-radius +border-top-right-radius +border-top-style +border-top-width +border-width +both +bottom +box +box-decoration-break +box-shadow +box-sizing +break +break-after +break-before +break-inside +brown +burlwood +cadetblue +capitalize +caps +caption +caption-side +cell +cells +center +center-left +center-right +char +chartreuse +chocolate +circle +cjk +cjk-ideographic +clear +clip +close +close-quote +cm +code +collapse +color +column +column-count +column-fill +column-gap +column-rule +column-rule-color +column-rule-style +column-rule-width +column-span +column-width +columns +compact +condensed +content +continuous +coral +cornflowerblue +cornsilk +counter +counter-increment +counter-reset +crimson +crop +cross +crosshair +cue +cue-after +cue-before +cursive +cursor +cyan +darkblue +darkcyan +darkgoldenrod +darkgray +darkgreen +darkkhaki +darkmagenta +darkolivegreen +darkorange +darkorchid +darkred +darksalmon +darkseagreen +darkshadow +darkslateblue +darkslategray +darkturquoise +darkviolet +dashed +decimal +decimal-leading-zero +decoration +deeppink +deepskyblue +default +deg +digits +dimgray +direction +disc +display +dodgerblue +dotted +double +during +e +e-resize +elevation +em +embed +empty +empty-cells +ex +expanded +extra +extra-condensed +extra-expanded +face +family +fantasy +far +far-left +far-right +fast +faster +filter +firebrick +first +first-child +first-letter +first-line +fixed +flex +flex-basis +flex-direction +flex-flow +flex-grow +flex-shrink +flex-wrap +float +floralwhite +flow +focus +font +font-family +font-feature-setting +font-kerning +font-language-override +font-size +font-size-adjust +font-stretch +font-style +font-synthesis +font-variant +font-variant-alternates +font-variant-caps +font-variant-east-asian +font-variant-ligatures +font-variant-numeric +font-variant-position +font-weight +footer +forestgreen +fuchsia +gainsboro +georgian +ghostwhite +gold +goldenrod +gray +greek +green +greenyellow +grid +groove +group +hanging-punctuation +header +hebrew +height +help +hidden +hide +high +higher +hiragana +hiragana-iroha +honeydew +hotpink +hover +hyphens +icon +ideographic +image +image-orientation +image-rendering +image-resolution +ime-mode +in +increment +indent +index +indianred +indigo +inherit +inline +inline-block +inline-table +inset +inside +iroha +italic +item +ivory +justify +justify-content +kHz +kashida +katakana +katakana-iroha +khaki +landscape +lang() +large +larger +last +latin +lavender +lavenderblush +lawngreen +layout +leading +left +left-side +leftwards +lenonchiffon +letter +letter-spacing +level +lightblue +lightcoral +lightcyan +lighter +lightgoldenrodyellow +lightgray +lightgreen +lightgrey +lightpink +lightsalmon +lightseagreen +lightskyblue +lightslategray +lightsteelblue +lightyellow +lime +limegreen +line +line-break +line-height +line-through +linen +link +list +list-item +list-style +list-style-image +list-style-position +list-style-type +loud +low +lower +lower-alpha +lower-greek +lower-latin +lower-roman +lowercase +ltr +magenta +margin +margin-bottom +margin-left +margin-right +margin-top +mark +mark-after +mark-before +marker +marker-offset +marks +maroon +marquee-direction +marquee-play-count +marquee-speed +marquee-style +mask +mask-type +max +max-height +max-width +medium +mediumaquamarine +mediumblue +mediumorchid +mediumpurple +mediumseagreen +mediumslateblue +mediumspringgreen +mediumturquoise +mediumvioletred +menu +message +message-box +middle +midnightblue +min +min-height +min-width +mintcream +mistyrose +mix +mm +moccasin +mode +monospace +move +ms +n +n-resize +naby +narrower +nav-down +nav-index +nav-left +nav-right +nav-up +navajowhite +ne +ne-resize +no +no-close-quote +no-open-quote +no-repeat +none +normal +nowrap +number +numeral +nw +nw-resize +object-fit +object-position +oblique +offset +oldlace +olive +olivedrab +once +opacity +open +open-quote +orange +orangered +orchid +order +orphans +out +outline +outline-color +outline-offset +outline-style +outline-width +outset +outside +overflow +overflow-wrap +overflow-x +overflow-y +overhang +overline +override +padding +padding-bottom +padding-left +padding-right +padding-top +page +page-break-after +page-break-before +page-break-inside +palegoldenrod +palegreen +paleturquoise +palevioletred +papayawhip +pause +pause-after +pause-before +pc +peachpuff +perspective +perspective-origin +peru +phonemes +pink +pitch +pitch-range +play +play-during +plum +pointer +portrait +position +powderblue +pre +pre-line +pre-wrap +progid +progress +pt +punctuation +purple +px +quote +quotes +rad +range +rate +red +relative +repeat +repeat-x +repeat-y +reset +resize +rest +rest-after +rest-before +richness +ridge +right +right-side +rightwards +roman +rosybrown +row +royalblue +rtl +run +run-in +s +s-resize +saddlebrown +salmon +sandybrown +sans-serif +scroll +se +se-resize +seagreen +seashell +semi +semi-condensed +semi-expanded +separate +serif +shadow +show +side +sienna +silent +silever +silver +size +skyblue +slateblue +slategray +slow +slower +small +small-caps +small-caption +smaller +snow +soft +solid +space +spacing +speak +speak-header +speak-numeral +speak-punctuation +specific +specific-voice +speech +speech-rate +spell +spell-out +springgreen +square +static +status +status-bar +steelblue +stress +stretch +style +sub +super +sw +sw-resize +tab-size +table +table-caption +table-cell +table-column +table-column-group +table-footer-group +table-header-group +table-layout +table-row +table-row-group +tan +teal +text +text-align +text-align-last +text-bottom +text-combine-horizontal +text-decoration +text-decoration-color +text-decoration-line +text-decoration-style +text-indent +text-justify +text-orientation +text-overflow +text-shadow +text-top +text-transform +text-underline-position +thick +thin +thistle +through +tomato +top +track +transform +transform-origin +transform-style +transition +transition-delay +transition-duration +transition-property +transition-timing-function +transparent +turquoise +type +ultra +ultra-condensed +ultra-expanded +underline +unicode +unicode-bidi +upper +upper-alpha +upper-latin +upper-roman +uppercase +variant +vertical +vertical-align +violet +visibility +visible +visited +voice +voice-balance +voice-duration +voice-family +voice-pitch +voice-pitch-range +voice-rate +voice-stress +voice-volume +volume +w +w-resize +wait +weight +wheat +white +white-space +whitesmoke +wider +widows +width +word +word-break +word-spacing +word-wrap +wrap +writing-mode +x +x-fast +x-high +x-large +x-loud +x-low +x-slow +x-small +x-soft +xx +xx-large +xx-small +y +yellow +yellowgreen +z +z-index +zero diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/dict/erlang-mode b/.emacs.d/elpa/auto-complete-20201213.1255/dict/erlang-mode new file mode 100644 index 0000000..960f2b8 --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/dict/erlang-mode @@ -0,0 +1,216 @@ +after +begin +catch +case +cond +end +fun +if +let +of +query +receive +try +when +and +andalso +band +bnot +bor +bsl +bsr +bxor +div +not +or +orelse +rem +xor +is_atom +is_binary +is_bitstring +is_boolean +is_float +is_function +is_integer +is_list +is_number +is_pid +is_port +is_record +is_reference +is_tuple +atom +binary +bitstring +boolean +function +integer +list +number +pid +port +record +reference +tuple +abs +adler32 +adler32_combine +alive +apply +atom_to_binary +atom_to_list +binary_to_atom +binary_to_existing_atom +binary_to_list +binary_to_term +bit_size +bitstring_to_list +byte_size +check_process_code +contact_binary +crc32 +crc32_combine +date +decode_packet +delete_module +disconnect_node +element +erase +exit +float +float_to_list +garbage_collect +get +get_keys +group_leader +halt +hd +integer_to_list +internal_bif +iolist_size +iolist_to_binary +is_alive +is_atom +is_binary +is_bitstring +is_boolean +is_float +is_function +is_integer +is_list +is_number +is_pid +is_port +is_process_alive +is_record +is_reference +is_tuple +length +link +list_to_atom +list_to_binary +list_to_bitstring +list_to_existing_atom +list_to_float +list_to_integer +list_to_pid +list_to_tuple +load_module +make_ref +module_loaded +monitor_node +node +node_link +node_unlink +nodes +notalive +now +open_port +pid_to_list +port_close +port_command +port_connect +port_control +pre_loaded +process_flag +process_info +processes +purge_module +put +register +registered +round +self +setelement +size +spawn +spawn_link +spawn_monitor +spawn_opt +split_binary +statistics +term_to_binary +time +throw +tl +trunc +tuple_size +tuple_to_list +unlink +unregister +whereis +append_element +bump_reductions +cancel_timer +demonitor +display +fun_info +fun_to_list +function_exported +get_cookie +get_stacktrace +hash +integer_to_list +is_builtin +list_to_integer +loaded +localtime +localtime_to_universaltime +make_tuple +max +md5 +md5_final +md5_init +md5_update +memory +min +monitor +monitor_node +phash +phash2 +port_call +port_info +port_to_list +ports +process_display +read_timer +ref_to_list +resume_process +send +send_after +send_nosuspend +set_cookie +start_timer +suspend_process +system_flag +system_info +system_monitor +system_profile +trace +trace_delivered +trace_info +trace_pattern +universaltime +universaltime_to_localtime +yield diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/dict/ess-julia-mode b/.emacs.d/elpa/auto-complete-20201213.1255/dict/ess-julia-mode new file mode 100644 index 0000000..3a4ad7d --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/dict/ess-julia-mode @@ -0,0 +1,37 @@ +abstract +break +case +catch +const +continue +do +else +elseif +end +eval +export +false +finally +for +function +global +if +ifelse +immutable +import +importall +in +let +macro +module +otherwise +quote +return +switch +throw +true +try +type +typealias +using +while diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/dict/go-mode b/.emacs.d/elpa/auto-complete-20201213.1255/dict/go-mode new file mode 100644 index 0000000..b943a16 --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/dict/go-mode @@ -0,0 +1,25 @@ +break +case +chan +const +continue +default +defer +else +fallthrough +for +func +go +goto +if +import +interface +map +package +range +return +select +struct +switch +type +var diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/dict/haskell-mode b/.emacs.d/elpa/auto-complete-20201213.1255/dict/haskell-mode new file mode 100644 index 0000000..ac1bd2a --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/dict/haskell-mode @@ -0,0 +1,679 @@ +Arrows +BangPatterns +Bool +Bounded +CPP +Char +Complex +ConstrainedClassMethods +Control.Applicative +Control.Arrow +Control.Category +Control.Concurrent +Control.Concurrent.MVar +Control.Concurrent.QSem +Control.Concurrent.QSemN +Control.Concurrent.STM +Control.Concurrent.STM.TArray +Control.Concurrent.STM.TChan +Control.Concurrent.STM.TMVar +Control.Concurrent.STM.TVar +Control.Concurrent.SampleVar +Control.Exception +Control.Exception.Base +Control.Monad +Control.Monad.Cont +Control.Monad.Cont.Class +Control.Monad.Error +Control.Monad.Error.Class +Control.Monad.Fix +Control.Monad.Identity +Control.Monad.Instances +Control.Monad.List +Control.Monad.RWS +Control.Monad.RWS.Class +Control.Monad.RWS.Lazy +Control.Monad.RWS.Strict +Control.Monad.Reader +Control.Monad.Reader.Class +Control.Monad.ST +Control.Monad.ST.Lazy +Control.Monad.ST.Strict +Control.Monad.STM +Control.Monad.State +Control.Monad.State.Class +Control.Monad.State.Lazy +Control.Monad.State.Strict +Control.Monad.Trans +Control.Monad.Writer +Control.Monad.Writer.Class +Control.Monad.Writer.Lazy +Control.Monad.Writer.Strict +Control.OldException +Control.Parallel +Control.Parallel.Strategies +DEPRECATED +Data.Array +Data.Array.Diff +Data.Array.IArray +Data.Array.IO +Data.Array.IO.Internals +Data.Array.MArray +Data.Array.Paralell +Data.Array.Paralell.Arr +Data.Array.Paralell.Base +Data.Array.Paralell.Int +Data.Array.Paralell.Lifted +Data.Array.Paralell.PArray +Data.Array.Paralell.Prelude +Data.Array.Paralell.Prelude.Double +Data.Array.Paralell.Stream +Data.Array.Paralell.Unlifted +Data.Array.Paralell.Unlifted.Distributed +Data.Array.Paralell.Unlifted.Paralell +Data.Array.Paralell.Unlifted.Sqeuential +Data.Array.Paralell.Word8 +Data.Array.ST +Data.Array.Storable +Data.Array.Unboxed +Data.Bits +Data.Bool +Data.ByteString +Data.ByteString.Char8 +Data.ByteString.Fusion +Data.ByteString.Internal +Data.ByteString.Lazy +Data.ByteString.Lazy.Char8 +Data.ByteString.Lazy.Fusion +Data.ByteString.Lazy.Internal +Data.ByteString.Unsafe +Data.Char +Data.Complex +Data.Data +Data.Dynamic +Data.Either +Data.Eq +Data.Fixed +Data.Foldable +Data.Function +Data.Generics +Data.Generics.Aliases +Data.Generics.Basics +Data.Generics.Instances +Data.Generics.Schemes +Data.Generics.Text +Data.Generics.Twins +Data.Graph +Data.HashTable +Data.IORef +Data.Int +Data.IntMap +Data.IntSet +Data.Ix +Data.List +Data.Map +Data.Maybe +Data.Monoid +Data.Ord +Data.Ratio +Data.STRef +Data.STRef.Lazy +Data.STRef.Strict +Data.Sequence +Data.Set +Data.String +Data.Time +Data.Time.Calendar +Data.Time.Calendar.Easter +Data.Time.Calendar.Julian +Data.Time.Calendar.MonthDay +Data.Time.Calendar.OrdinalDate +Data.Time.Calendar.WeekDate +Data.Time.Clock +Data.Time.Clock.POSIX +Data.Time.Clock.TAI +Data.Time.Format +Data.Time.LocalTime +Data.Traversable +Data.Tree +Data.Tuple +Data.Typeable +Data.Unique +Data.Version +Data.Word +Debug.Trace +DeriveDataTypeable +DisambiguateRecordFields +Distribution.Compat.ReadP +Distribution.Compiler +Distribution.InstalledPackageInfo +Distribution.License +Distribution.Make +Distribution.ModuleName +Distribution.Package +Distribution.PackageDescription +Distribution.PackageDescription.Check +Distribution.PackageDescription.Configuration +Distribution.PackageDescription.Parse +Distribution.ParseUtils +Distribution.ReadE +Distribution.Simple +Distribution.Simple.Build +Distribution.Simple.Build.Macros +Distribution.Simple.Build.PathsModule +Distribution.Simple.BuildPaths +Distribution.Simple.Command +Distribution.Simple.Compiler +Distribution.Simple.Configure +Distribution.Simple.GHC +Distribution.Simple.Haddock +Distribution.Simple.Hugs +Distribution.Simple.Install +Distribution.Simple.InstallDirs +Distribution.Simple.JHC +Distribution.Simple.LocalBuildInfo +Distribution.Simple.NHC +Distribution.Simple.PackageIndex +Distribution.Simple.PreProcess +Distribution.Simple.PreProcess.Unlit +Distribution.Simple.Program +Distribution.Simple.Register +Distribution.Simple.Setup +Distribution.Simple.SrcDist +Distribution.Simple.UserHooks +Distribution.Simple.Utils +Distribution.System +Distribution.Text +Distribution.Verbosity +Distribution.Version +Double +EQ +Either +EmptyDataDecls +Enum +Eq +ExistentialQuantification +ExtendedDefaultRules +False +FilePath +FlexibleContexts +FlexibleInstances +Float +Floating +Foreign +Foreign.C +Foreign.C.Error +Foreign.C.String +Foreign.C.Types +Foreign.Concurrent +Foreign.ForeignPtr +Foreign.Marshal +Foreign.Marshal.Alloc +Foreign.Marshal.Array +Foreign.Marshal.Error +Foreign.Marshal.Pool +Foreign.Marshal.Utils +Foreign.Ptr +Foreign.StablePtr +Foreign.Storable +ForeignFunctionInterface +Fractional +FunctionnalDependencies +Functor +GADTs +GHC.Arr +GHC.Bool +GHC.Conc +GHC.ConsoleHandler +GHC.Desugar +GHC.Environment +GHC.Err +GHC.Exts +GHC.Generics +GHC.Handle +GHC.Ordering +GHC.PArr +GHC.Prim +GHC.PrimopWrappers +GHC.Tuple +GHC.Types +GHC.Unicode +GHC.Unit +GT +GeneralizedNewtypeDeriving +Generics +INCLUDE +INLINE +IO +IOError +IOException +ImplicitParams +ImplicitPrelude +ImpredicativeTypes +IncoherentInstances +Int +Integer +Integral +Just +KindSignatures +LANGUAGE +LINE +LT +Language.Haskell.Extension +Language.Haskell.Lexer +Language.Haskell.ParseMonad +Language.Haskell.ParseUtils +Language.Haskell.Parser +Language.Haskell.Pretty +Language.Haskell.Syntax +Language.Haskell.TH +Language.Haskell.TH.Lib +Language.Haskell.TH.Ppr +Language.Haskell.TH.PprLib +Language.Haskell.TH.Quote +Language.Haskell.TH.Syntax +Left +LiberalTypeSynonyms +MagicHash +Maybe +Monad +MonoPatBinds +MonomorphismRestriction +MultiParamTypeClasses +NOINLINE +NamedFieldPuns +Network +Network.BSD +Network.Socket +Network.URI +NewQualifiedOperators +NoArrows +NoBangPatterns +NoCPP +NoConstrainedClassMethods +NoDeriveDataTypeable +NoDisambiguateRecordFields +NoEmptyDataDecls +NoExistentialQuantification +NoExtendedDefaultRules +NoFlexibleContexts +NoFlexibleInstances +NoForeignFunctionInterface +NoFunctionnalDependencies +NoGADTs +NoGeneralizedNewtypeDeriving +NoGenerics +NoImplicitParams +NoImplicitPrelude +NoImpredicativeTypes +NoIncoherentInstances +NoKindSignatures +NoLiberalTypeSynonyms +NoMagicHash +NoMonoPatBinds +NoMonomorphismRestriction +NoMultiParamTypeClasses +NoNamedFieldPuns +NoNewQualifiedOperators +NoOverlappingInstances +NoOverloadedStrings +NoPArr +NoPackageImports +NoParallelListComp +NoPatternGuards +NoPolymorphicComponents +NoQuasiQuotes +NoRank2Types +NoRankNTypes +NoRecordWildCards +NoRecursiveDo +NoRelaxedPolyRec +NoScopedTypeVariables +NoStandaloneDeriving +NoTemplateHaskell +NoTransformListComp +NoTypeFamilies +NoTypeOperators +NoTypeSynonymInstances +NoUnboxedTuples +NoUndecidableInstances +NoUnicodeSyntax +NoUnliftedFFITypes +NoViewPatterns +Nothing +Num +Numeric +OPTIONS_GHC +Ord +Ordering +OverlappingInstances +OverloadedStrings +PArr +PackageImports +ParallelListComp +PatternGuards +PolymorphicComponents +Prelude +QuasiQuotes +RULES +Rank2Types +RankNTypes +Ratio +Read +ReadS +Real +RealFloat +RealFrac +RecordWildCards +RecursiveDo +RelaxedPolyRec +Right +SOURCE +SPECIALIZE +ScopedTypeVariables +ShowS +StandaloneDeriving +String +System.CPUTime +System.Cmd +System.Console.Editline +System.Console.GetOpt +System.Console.Readline +System.Directory +System.Environment +System.Exit +System.FilePath +System.FilePath.Posix +System.FilePath.Windows +System.IO +System.IO.Error +System.IO.Unsafe +System.Info +System.Locale +System.Mem +System.Mem.StableName +System.Mem.Weak +System.Posix +System.Posix.Directory +System.Posix.DynamicLinker +System.Posix.DynamicLinker.Module +System.Posix.DynamicLinker.Prim +System.Posix.Env +System.Posix.Error +System.Posix.Files +System.Posix.IO +System.Posix.Process +System.Posix.Process.Internals +System.Posix.Resource +System.Posix.Semaphore +System.Posix.SharedMem +System.Posix.Signals +System.Posix.Signals.Exts +System.Posix.Temp +System.Posix.Terminal +System.Posix.Time +System.Posix.Types +System.Posix.Unistd +System.Posix.User +System.Process +System.Random +System.Time +System.Timeout +TemplateHaskell +Test.HUnit +Test.HUnit.Base +Test.HUnit.Lang +Test.HUnit.Terminal +Test.HUnit.Text +Test.QuickCheck +Test.QuickCheck.Batch +Test.QuickCheck.Poly +Test.QuickCheck.Utils +Text.Html +Text.Html.BlockTable +Text.ParserCombinators.Parsec +Text.ParserCombinators.Parsec.Char +Text.ParserCombinators.Parsec.Combinator +Text.ParserCombinators.Parsec.Error +Text.ParserCombinators.Parsec.Expr +Text.ParserCombinators.Parsec.Language +Text.ParserCombinators.Parsec.Perm +Text.ParserCombinators.Parsec.Pos +Text.ParserCombinators.Parsec.Prim +Text.ParserCombinators.Parsec.Token +Text.ParserCombinators.ReadP +Text.ParserCombinators.ReadPrec +Text.PrettyPrint +Text.PrettyPrint.HughesPJ +Text.Printf +Text.Read +Text.Read.Lex +Text.Regex.Base +Text.Regex.Base.Context +Text.Regex.Base.Impl +Text.Regex.Base.RegexLike +Text.Regex.Posix +Text.Regex.Posix.ByteString +Text.Regex.Posix.String +Text.Regex.Posix.Wrap +Text.Show +Text.Show.Functions +Text.XHtml +Text.XHtml.Debug +Text.XHtml.Frameset +Text.XHtml.Strict +Text.XHtml.Table +Text.XHtml.Transitional +Trace.Hpc.Mix +Trace.Hpc.Reflect +Trace.Hpc.Tix +Trace.Hpc.Util +TransformListComp +True +TypeFamilies +TypeOperators +TypeSynonymInstances +UNPACK +UnboxedTuples +UndecidableInstances +UnicodeSyntax +UnliftedFFITypes +Unsafe.Coerce +ViewPatterns +WARNING +abs +acos +acosh +all +and +any +appendFile +as +asTypeOf +asin +asinh +atan +atan2 +atanh +break +case +catch +ceiling +class +compare +concat +concatMap +const +cos +cosh +curry +cycle +data +decodeFloat +default +deriving +div +divMod +do +drop +dropWhile +either +elem +else +encodeFloat +enumFrom +enumFromThen +enumFromThenTo +enumFromTo +error +exp +exponent +fail +filter +flip +floatDigits +floatRadix +floatRange +floor +fmap +fold +fold1 +foldr +foldr1 +fromEnum +fromInteger +fromIntegral +fromRational +fst +gcd +getChar +getContents +getLine +head +hiding +id +if +import +in +infix +infixl +infixr +init +instance +intract +ioError +isDenormalized +isIEEE +isInfinite +isNan +isNegativeZero +iterate +last +lcm +length +let +lex +lines +log +logBase +lookup +map +mapM +mapM_ +max +maxBound +maximum +maybe +min +minBound +minimum +mod +module +negate +newtype +not +notElem +null +odd +of +or +otherwise +pi +pred +print +product +properFraction +putChar +putStr +putStrLn +qualified +quot +quotRem +read +readFile +readIO +readList +readLn +readParen +reads +readsPrec +realtoFrac +recip +rem +repeat +replicate +return +reverse +round +scaleFloat +scanl +scanl1 +scanr +scanr1 +seq +sequence +sequence_ +show +showChar +showList +showParen +showString +shows +showsPrec +significand +signum +sin +sinh +snd +span +splitAt +sqrt +subtract +succ +sum +tail +take +takeWhile +tan +tanh +then +toEnum +toInteger +toRational +truncate +type +uncurry +undefined +unlines +until +unwords +unzip +unzip3 +userError +where +words +writeFile +zip +zip3 +zipWith +zipWith3 diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/dict/java-mode b/.emacs.d/elpa/auto-complete-20201213.1255/dict/java-mode new file mode 100644 index 0000000..4a29d4c --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/dict/java-mode @@ -0,0 +1,53 @@ +abstract +assert +boolean +break +byte +case +catch +char +class +const +continue +default +do +double +else +enum +extends +final +finally +float +for +goto +if +implements +import +instanceof +int +interface +long +native +new +package +private +protected +public +return +short +static +strictfp +super +switch +synchronized +this +throw +throws +transient +try +void +volatile +while +@Override +@Deprecated +@SuppressWarnings diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/dict/js-mode b/.emacs.d/elpa/auto-complete-20201213.1255/dict/js-mode new file mode 100644 index 0000000..3d83f84 --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/dict/js-mode @@ -0,0 +1,148 @@ +Anchor +Area +Array +Boolean +Button +Checkbox +Date +Document +Element +FileUpload +Form +Frame +Function +Hidden +History +Image +Infinity +JavaArray +JavaClass +JavaObject +JavaPackage +Link +Location +Math +MimeType +NaN +Navigator +Number +Object +Option +Packages +Password +Plugin +Radio +RegExp +Reset +Select +String +Submit +Text +Textarea +Window +alert +arguments +assign +blur +break +callee +caller +captureEvents +case +clearInterval +clearTimeout +close +closed +comment +confirm +constructor +continue +default +defaultStatus +delete +do +document +else +escape +eval +export +find +focus +for +frames +function +getClass +history +home +if +import +in +innerHeight +innerWidth +isFinite +isNan +java +label +length +location +locationbar +menubar +moveBy +moveTo +name +navigate +navigator +netscape +new +onBlur +onError +onFocus +onLoad +onUnload +open +opener +outerHeight +outerWidth +pageXoffset +pageYoffset +parent +parseFloat +parseInt +personalbar +print +prompt +prototype +ref +releaseEvents +resizeBy +resizeTo +return +routeEvent +scroll +scrollBy +scrollTo +scrollbars +self +setInterval +setTimeout +status +statusbar +stop +sun +switch +taint +this +toString +toolbar +top +typeof +unescape +untaint +unwatch +valueOf +var +void +watch +while +window +with diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/dict/julia-mode b/.emacs.d/elpa/auto-complete-20201213.1255/dict/julia-mode new file mode 100644 index 0000000..3a4ad7d --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/dict/julia-mode @@ -0,0 +1,37 @@ +abstract +break +case +catch +const +continue +do +else +elseif +end +eval +export +false +finally +for +function +global +if +ifelse +immutable +import +importall +in +let +macro +module +otherwise +quote +return +switch +throw +true +try +type +typealias +using +while diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/dict/lua-mode b/.emacs.d/elpa/auto-complete-20201213.1255/dict/lua-mode new file mode 100644 index 0000000..d0de6a4 --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/dict/lua-mode @@ -0,0 +1,21 @@ +and +break +do +else +elseif +end +false +for +function +if +in +local +nil +not +or +repeat +return +then +true +until +while diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/dict/nim-mode b/.emacs.d/elpa/auto-complete-20201213.1255/dict/nim-mode new file mode 100644 index 0000000..393bf1a --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/dict/nim-mode @@ -0,0 +1,70 @@ +addr +and +as +asm +atomic +bind +block +break +case +cast +concept +const +continue +converter +defer +discard +distinct +div +do +elif +else +end +enum +except +export +finally +for +from +func +generic +if +import +in +include +interface +is +isnot +iterator +let +macro +method +mixin +mod +nil +not +notin +object +of +or +out +proc +ptr +raise +ref +return +shl +shr +static +template +try +tuple +type +using +var +when +while +with +without +xor +yield diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/dict/objc-mode b/.emacs.d/elpa/auto-complete-20201213.1255/dict/objc-mode new file mode 100644 index 0000000..6d90476 --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/dict/objc-mode @@ -0,0 +1,214 @@ +#not_keyword +#if +#ifdef +#ifndef +#elif +#else +#endif +#defined +#include +#__include_macros +#define +#undef +#line +#error +#pragma +#import +#include_next +#warning +#ident +#sccs +#assert +#unassert +#__public_macro +#__private_macro +auto +break +case +char +const +continue +default +do +double +else +enum +extern +float +for +goto +if +inline +int +long +register +restrict +return +short +signed +sizeof +static +struct +switch +typedef +union +unsigned +void +volatile +while +_Alignas +_Alignof +_Atomic +_Bool +_Complex +_Generic +_Imaginary +_Noreturn +_Static_assert +_Thread_local +__func__ +__objc_yes +__objc_no +asm +bool +false +true +wchar_t +_Float16 +_Accum +_Fract +_Sat +_Decimal32 +_Decimal64 +_Decimal128 +__alignof +__attribute +__builtin_choose_expr +__builtin_offsetof +__builtin_types_compatible_p +__builtin_va_arg +__extension__ +__float128 +__imag +__int128 +__label__ +__real +__thread +__FUNCTION__ +__PRETTY_FUNCTION__ +__auto_type +typeof +__private_extern__ +__module_private__ +__cdecl +__stdcall +__fastcall +__thiscall +__regcall +__vectorcall +__builtin_omp_required_simd_align +__pascal +__fp16 +__bridge +__bridge_transfer +__bridge_retained +__bridge_retain +__covariant +__contravariant +__kindof +__alignof__ +__asm +__asm__ +__attribute__ +__complex +__complex__ +__const +__const__ +__imag__ +__inline +__inline__ +__real__ +__restrict +__restrict__ +__signed +__signed__ +__typeof +__typeof__ +__volatile +__volatile__ +_Nonnull +_Nullable +_Null_unspecified +__builtin_convertvector +__builtin_available +@not_keyword +@class +@compatibility_alias +@defs +@encode +@end +@implementation +@interface +@private +@protected +@protocol +@public +@selector +@throw +@try +@catch +@finally +@synchronized +@autoreleasepool +@property +@package +@required +@optional +@synthesize +@dynamic +@import +@available +self +_cmd +instancetype +id +Class +SEL +getter= +setter= +readonly +readwrite +assign +retain +copy +nonatomic +atomic +strong +weak +unsafe_unretained +nonnull +nullable +null_unspecified +null_resettable +class +in +out +inout +oneway +bycopy +byref +super +__block +__strong +__weak +__unsafe_unretained +__autoreleasing +__nonnull +__nullable +__null_unspecified +IMP +BOOL +YES +NO +Nil +nil diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/dict/octave-mode b/.emacs.d/elpa/auto-complete-20201213.1255/dict/octave-mode new file mode 100644 index 0000000..77c4ea1 --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/dict/octave-mode @@ -0,0 +1,46 @@ +# GNU Octave, and probably proprietary MATLAB +# https://www.gnu.org/software/octave/doc/interpreter/Keywords.html + +__FILE__ +__LINE__ +break +case +catch +classdef +continue +do +else +elseif +end +end_try_catch +end_unwind_protect +endclassdef +endenumeration +endevents +endfor +endfunction +endif +endmethods +endparfor +endproperties +endswitch +endwhile +enumeration +events +for +function +global +if +methods +otherwise +parfor +persistent +properties +return +static +switch +try +unitl +unwind_protect +unwind_protect_cleanup +while diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/dict/php-mode b/.emacs.d/elpa/auto-complete-20201213.1255/dict/php-mode new file mode 100644 index 0000000..07f2e89 --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/dict/php-mode @@ -0,0 +1,6144 @@ +abs +acos +acosh +addcslashes +addslashes +aggregate +aggregate_info +aggregate_methods +aggregate_methods_by_list +aggregate_methods_by_regexp +aggregate_properties +aggregate_properties_by_list +aggregate_properties_by_regexp +aggregation_info +amqpconnection +amqpexchange +amqpqueue +and +apache_child_terminate +apache_getenv +apache_get_modules +apache_get_version +apache_lookup_uri +apache_note +apache_request_headers +apache_reset_timeout +apache_response_headers +apache_setenv +apc_add +apc_bin_dump +apc_bin_dumpfile +apc_bin_load +apc_bin_loadfile +apc_cache_info +apc_cas +apc_clear_cache +apc_compile_file +apc_dec +apc_define_constants +apc_delete +apc_delete_file +apc_exists +apc_fetch +apc_inc +apciterator +apc_load_constants +apc_sma_info +apc_store +apd_breakpoint +apd_callstack +apd_clunk +apd_continue +apd_croak +apd_dump_function_table +apd_dump_persistent_resources +apd_dump_regular_resources +apd_echo +apd_get_active_symbols +apd_set_pprof_trace +apd_set_session +apd_set_session_trace +apd_set_session_trace_socket +appenditerator +array +arrayaccess +array_change_key_case +array_chunk +array_combine +array_count_values +array_diff +array_diff_assoc +array_diff_key +array_diff_uassoc +array_diff_ukey +array_fill +array_fill_keys +array_filter +array_flip +array_intersect +array_intersect_assoc +array_intersect_key +array_intersect_uassoc +array_intersect_ukey +arrayiterator +array_key_exists +array_keys +array_map +array_merge +array_merge_recursive +array_multisort +arrayobject +array_pad +array_pop +array_product +array_push +array_rand +array_reduce +array_replace +array_replace_recursive +array_reverse +array_search +array_shift +array_slice +array_splice +array_sum +array_udiff +array_udiff_assoc +array_udiff_uassoc +array_uintersect +array_uintersect_assoc +array_uintersect_uassoc +array_unique +array_unshift +array_values +array_walk +array_walk_recursive +arsort +as +asin +asinh +asort +assert +assert_options +atan +atan2 +atanh +badfunctioncallexception +badmethodcallexception +base64_decode +base64_encode +base_convert +basename +bbcode_add_element +bbcode_add_smiley +bbcode_create +bbcode_destroy +bbcode_parse +bbcode_set_arg_parser +bbcode_set_flags +bcadd +bccomp +bcdiv +bcmod +bcmul +bcompiler_load +bcompiler_load_exe +bcompiler_parse_class +bcompiler_read +bcompiler_write_class +bcompiler_write_constant +bcompiler_write_exe_footer +bcompiler_write_file +bcompiler_write_footer +bcompiler_write_function +bcompiler_write_functions_from_file +bcompiler_write_header +bcompiler_write_included_filename +bcpow +bcpowmod +bcscale +bcsqrt +bcsub +bin2hex +bindec +bindtextdomain +bind_textdomain_codeset +break +bson_decode +bson_encode +bumpValue +bzclose +bzcompress +bzdecompress +bzerrno +bzerror +bzerrstr +bzflush +bzopen +bzread +bzwrite +cachingiterator +cairo +cairoantialias +cairocontent +cairocontext +cairo_create +cairoexception +cairoextend +cairofillrule +cairofilter +cairofontface +cairo_font_face_get_type +cairo_font_face_status +cairofontoptions +cairo_font_options_create +cairo_font_options_equal +cairo_font_options_get_antialias +cairo_font_options_get_hint_metrics +cairo_font_options_get_hint_style +cairo_font_options_get_subpixel_order +cairo_font_options_hash +cairo_font_options_merge +cairo_font_options_set_antialias +cairo_font_options_set_hint_metrics +cairo_font_options_set_hint_style +cairo_font_options_set_subpixel_order +cairo_font_options_status +cairofontslant +cairofonttype +cairofontweight +cairoformat +cairo_format_stride_for_width +cairogradientpattern +cairohintmetrics +cairohintstyle +cairoimagesurface +cairo_image_surface_create +cairo_image_surface_create_for_data +cairo_image_surface_create_from_png +cairo_image_surface_get_data +cairo_image_surface_get_format +cairo_image_surface_get_height +cairo_image_surface_get_stride +cairo_image_surface_get_width +cairolineargradient +cairolinecap +cairolinejoin +cairomatrix +cairo_matrix_create_scale +cairo_matrix_create_translate +cairo_matrix_invert +cairo_matrix_multiply +cairo_matrix_rotate +cairo_matrix_transform_distance +cairo_matrix_transform_point +cairo_matrix_translate +cairooperator +cairopath +cairopattern +cairo_pattern_add_color_stop_rgb +cairo_pattern_add_color_stop_rgba +cairo_pattern_create_for_surface +cairo_pattern_create_linear +cairo_pattern_create_radial +cairo_pattern_create_rgb +cairo_pattern_create_rgba +cairo_pattern_get_color_stop_count +cairo_pattern_get_color_stop_rgba +cairo_pattern_get_extend +cairo_pattern_get_filter +cairo_pattern_get_linear_points +cairo_pattern_get_matrix +cairo_pattern_get_radial_circles +cairo_pattern_get_rgba +cairo_pattern_get_surface +cairo_pattern_get_type +cairo_pattern_set_extend +cairo_pattern_set_filter +cairo_pattern_set_matrix +cairo_pattern_status +cairopatterntype +cairopdfsurface +cairo_pdf_surface_create +cairo_pdf_surface_set_size +cairo_ps_get_levels +cairopslevel +cairo_ps_level_to_string +cairopssurface +cairo_ps_surface_create +cairo_ps_surface_dsc_begin_page_setup +cairo_ps_surface_dsc_begin_setup +cairo_ps_surface_dsc_comment +cairo_ps_surface_get_eps +cairo_ps_surface_restrict_to_level +cairo_ps_surface_set_eps +cairo_ps_surface_set_size +cairoradialgradient +cairoscaledfont +cairo_scaled_font_create +cairo_scaled_font_extents +cairo_scaled_font_get_ctm +cairo_scaled_font_get_font_face +cairo_scaled_font_get_font_matrix +cairo_scaled_font_get_font_options +cairo_scaled_font_get_scale_matrix +cairo_scaled_font_get_type +cairo_scaled_font_glyph_extents +cairo_scaled_font_status +cairo_scaled_font_text_extents +cairosolidpattern +cairostatus +cairosubpixelorder +cairosurface +cairo_surface_copy_page +cairo_surface_create_similar +cairo_surface_finish +cairo_surface_flush +cairo_surface_get_content +cairo_surface_get_device_offset +cairo_surface_get_font_options +cairo_surface_get_type +cairo_surface_mark_dirty +cairo_surface_mark_dirty_rectangle +cairosurfacepattern +cairo_surface_set_device_offset +cairo_surface_set_fallback_resolution +cairo_surface_show_page +cairo_surface_status +cairosurfacetype +cairo_surface_write_to_png +cairosvgsurface +cairo_svg_surface_create +cairo_svg_surface_restrict_to_version +cairosvgversion +cairo_svg_version_to_string +cairotoyfontface +calculhmac +calcul_hmac +cal_days_in_month +cal_from_jd +cal_info +__call() +callbackfilteriterator +__callStatic() +call_user_func +call_user_func_array +call_user_method +call_user_method_array +cal_to_jd +case +catch +ceil +cfunction +chdb +chdb_create +chdir +checkdate +checkdnsrr +chgrp +chmod +chop +chown +chr +chroot +chunk_split +class +__CLASS__ +class_alias +class_exists +class_implements +classkit_import +classkit_method_add +classkit_method_copy +classkit_method_redefine +classkit_method_remove +classkit_method_rename +class_parents +clearstatcache +clone +__clone() +closedir +closelog +collator +com +com_addref +com_create_guid +com_event_sink +com_get +com_get_active_object +com_invoke +com_isenum +com_load +com_load_typelib +com_message_pump +compact +com_print_typeinfo +com_propget +com_propput +com_propset +com_release +com_set +connection_aborted +connection_status +connection_timeout +const +constant +construct +__construct() +continue +convert_cyr_string +convert_uudecode +convert_uuencode +copy +cos +cosh +count +countable +count_chars +counter_bump +counter_bump_value +counter_create +counter_get +counter_get_meta +counter_get_named +counter_get_value +counter_reset +counter_reset_value +crack_check +crack_closedict +crack_getlastmessage +crack_opendict +crc32 +create_function +crypt +ctype_alnum +ctype_alpha +ctype_cntrl +ctype_digit +ctype_graph +ctype_lower +ctype_print +ctype_punct +ctype_space +ctype_upper +ctype_xdigit +cubrid_affected_rows +cubrid_bind +cubrid_client_encoding +cubrid_close +cubrid_close_prepare +cubrid_close_request +cubrid_col_get +cubrid_col_size +cubrid_column_names +cubrid_column_types +cubrid_commit +cubrid_connect +cubrid_connect_with_url +cubrid_current_oid +cubrid_data_seek +cubrid_db_name +cubrid_disconnect +cubrid_drop +cubrid_errno +cubrid_error +cubrid_error_code +cubrid_error_code_facility +cubrid_error_msg +cubrid_execute +cubrid_fetch +cubrid_fetch_array +cubrid_fetch_assoc +cubrid_fetch_field +cubrid_fetch_lengths +cubrid_fetch_object +cubrid_fetch_row +cubrid_field_flags +cubrid_field_len +cubrid_field_name +cubrid_field_seek +cubrid_field_table +cubrid_field_type +cubrid_free_result +cubrid_get +cubrid_get_autocommit +cubrid_get_charset +cubrid_get_class_name +cubrid_get_client_info +cubrid_get_db_parameter +cubrid_get_server_info +cubrid_insert_id +cubrid_is_instance +cubrid_list_dbs +cubrid_load_from_glo +cubrid_lob_close +cubrid_lob_export +cubrid_lob_get +cubrid_lob_send +cubrid_lob_size +cubrid_lock_read +cubrid_lock_write +cubrid_move_cursor +cubrid_new_glo +cubrid_next_result +cubrid_num_cols +cubrid_num_fields +cubrid_num_rows +cubrid_ping +cubrid_prepare +cubrid_put +cubrid_query +cubrid_real_escape_string +cubrid_result +cubrid_rollback +cubrid_save_to_glo +cubrid_schema +cubrid_send_glo +cubrid_seq_drop +cubrid_seq_insert +cubrid_seq_put +cubrid_set_add +cubrid_set_autocommit +cubrid_set_db_parameter +cubrid_set_drop +cubrid_unbuffered_query +cubrid_version +curl_close +curl_copy_handle +curl_errno +curl_error +curl_exec +curl_getinfo +curl_init +curl_multi_add_handle +curl_multi_close +curl_multi_exec +curl_multi_getcontent +curl_multi_info_read +curl_multi_init +curl_multi_remove_handle +curl_multi_select +curl_setopt +curl_setopt_array +curl_version +current +cyrus_authenticate +cyrus_bind +cyrus_close +cyrus_connect +cyrus_query +cyrus_unbind +date +date_add +date_create +date_create_from_format +date_date_set +date_default_timezone_get +date_default_timezone_set +date_diff +date_format +date_get_last_errors +dateinterval +date_interval_create_from_date_string +date_interval_format +date_isodate_set +date_modify +date_offset_get +date_parse +date_parse_from_format +dateperiod +date_sub +date_sun_info +date_sunrise +date_sunset +datetime +date_time_set +date_timestamp_get +date_timestamp_set +datetimezone +date_timezone_get +date_timezone_set +db2_autocommit +db2_bind_param +db2_client_info +db2_close +db2_column_privileges +db2_columns +db2_commit +db2_connect +db2_conn_error +db2_conn_errormsg +db2_cursor_type +db2_escape_string +db2_exec +db2_execute +db2_fetch_array +db2_fetch_assoc +db2_fetch_both +db2_fetch_object +db2_fetch_row +db2_field_display_size +db2_field_name +db2_field_num +db2_field_precision +db2_field_scale +db2_field_type +db2_field_width +db2_foreign_keys +db2_free_result +db2_free_stmt +db2_get_option +db2_last_insert_id +db2_lob_read +db2_next_result +db2_num_fields +db2_num_rows +db2_pclose +db2_pconnect +db2_prepare +db2_primary_keys +db2_procedure_columns +db2_procedures +db2_result +db2_rollback +db2_server_info +db2_set_option +db2_special_columns +db2_statistics +db2_stmt_error +db2_stmt_errormsg +db2_table_privileges +db2_tables +dba_close +dba_delete +dba_exists +dba_fetch +dba_firstkey +dba_handlers +dba_insert +dba_key_split +dba_list +dba_nextkey +dba_open +dba_optimize +dba_popen +dba_replace +dbase_add_record +dbase_close +dbase_create +dbase_delete_record +dbase_get_header_info +dbase_get_record +dbase_get_record_with_names +dbase_numfields +dbase_numrecords +dbase_open +dbase_pack +dbase_replace_record +dba_sync +dbplus_add +dbplus_aql +dbplus_chdir +dbplus_close +dbplus_curr +dbplus_errcode +dbplus_errno +dbplus_find +dbplus_first +dbplus_flush +dbplus_freealllocks +dbplus_freelock +dbplus_freerlocks +dbplus_getlock +dbplus_getunique +dbplus_info +dbplus_last +dbplus_lockrel +dbplus_next +dbplus_open +dbplus_prev +dbplus_rchperm +dbplus_rcreate +dbplus_rcrtexact +dbplus_rcrtlike +dbplus_resolve +dbplus_restorepos +dbplus_rkeys +dbplus_ropen +dbplus_rquery +dbplus_rrename +dbplus_rsecindex +dbplus_runlink +dbplus_rzap +dbplus_savepos +dbplus_setindex +dbplus_setindexbynumber +dbplus_sql +dbplus_tcl +dbplus_tremove +dbplus_undo +dbplus_undoprepare +dbplus_unlockrel +dbplus_unselect +dbplus_update +dbplus_xlockrel +dbplus_xunlockrel +dbx_close +dbx_compare +dbx_connect +dbx_error +dbx_escape_string +dbx_fetch_row +dbx_query +dbx_sort +dcgettext +dcngettext +deaggregate +debug_backtrace +debug_print_backtrace +debug_zval_dump +decbin +dechex +declare +decoct +default +define +defined +define_syslog_variables +deg2rad +delete +__destruct() +dgettext +die +dio_close +dio_fcntl +dio_open +dio_read +dio_seek +dio_stat +dio_tcsetattr +dio_truncate +dio_write +dir +__DIR__ +directoryiterator +dirname +diskfreespace +disk_free_space +disk_total_space +dl +dngettext +dns_check_record +dns_get_mx +dns_get_record +do +domainexception +domattr +domattribute_name +domattribute_set_value +domattribute_specified +domattribute_value +domcharacterdata +domcomment +domdocument +domdocument_add_root +domdocument_create_attribute +domdocument_create_cdata_section +domdocument_create_comment +domdocument_create_element +domdocument_create_element_ns +domdocument_create_entity_reference +domdocument_create_processing_instruction +domdocument_create_text_node +domdocument_doctype +domdocument_document_element +domdocument_dump_file +domdocument_dump_mem +domdocumentfragment +domdocument_get_element_by_id +domdocument_get_elements_by_tagname +domdocument_html_dump_mem +domdocumenttype +domdocumenttype_entities +domdocumenttype_internal_subset +domdocumenttype_name +domdocumenttype_notations +domdocumenttype_public_id +domdocumenttype_system_id +domdocument_xinclude +domelement +domelement_get_attribute +domelement_get_attribute_node +domelement_get_elements_by_tagname +domelement_has_attribute +domelement_remove_attribute +domelement_set_attribute +domelement_set_attribute_node +domelement_tagname +domentity +domentityreference +domexception +domimplementation +dom_import_simplexml +domnamednodemap +domnode +domnode_add_namespace +domnode_append_child +domnode_append_sibling +domnode_attributes +domnode_child_nodes +domnode_clone_node +domnode_dump_node +domnode_first_child +domnode_get_content +domnode_has_attributes +domnode_has_child_nodes +domnode_insert_before +domnode_is_blank_node +domnode_last_child +domnodelist +domnode_next_sibling +domnode_node_name +domnode_node_type +domnode_node_value +domnode_owner_document +domnode_parent_node +domnode_prefix +domnode_previous_sibling +domnode_remove_child +domnode_replace_child +domnode_replace_node +domnode_set_content +domnode_set_name +domnode_set_namespace +domnode_unlink_node +domnotation +domprocessinginstruction +domprocessinginstruction_data +domprocessinginstruction_target +domtext +domxml_new_doc +domxml_open_file +domxml_open_mem +domxml_version +domxml_xmltree +domxml_xslt_stylesheet +domxml_xslt_stylesheet_doc +domxml_xslt_stylesheet_file +domxml_xslt_version +domxpath +domxsltstylesheet_process +domxsltstylesheet_result_dump_file +domxsltstylesheet_result_dump_mem +dotnet +dotnet_load +doubleval +each +easter_date +easter_days +echo +else +elseif +empty +emptyiterator +enchant_broker_describe +enchant_broker_dict_exists +enchant_broker_free +enchant_broker_free_dict +enchant_broker_get_error +enchant_broker_init +enchant_broker_list_dicts +enchant_broker_request_dict +enchant_broker_request_pwl_dict +enchant_broker_set_ordering +enchant_dict_add_to_personal +enchant_dict_add_to_session +enchant_dict_check +enchant_dict_describe +enchant_dict_get_error +enchant_dict_is_in_session +enchant_dict_quick_check +enchant_dict_store_replacement +enchant_dict_suggest +end +enddeclare +endfor +endforeach +endif +endswitch +endwhile +ereg +eregi +eregi_replace +ereg_replace +errorexception +error_get_last +error_log +error_reporting +escapeshellarg +escapeshellcmd +eval +event_add +event_base_free +event_base_loop +event_base_loopbreak +event_base_loopexit +event_base_new +event_base_priority_init +event_base_set +event_buffer_base_set +event_buffer_disable +event_buffer_enable +event_buffer_fd_set +event_buffer_free +event_buffer_new +event_buffer_priority_set +event_buffer_read +event_buffer_set_callback +event_buffer_timeout_set +event_buffer_watermark_set +event_buffer_write +event_del +event_free +event_new +event_set +exception +exec +exif_imagetype +exif_read_data +exif_tagname +exif_thumbnail +exit +exp +expect_expectl +expect_popen +explode +expm1 +export +extends +extension_loaded +extract +ezmlm_hash +fam_cancel_monitor +fam_close +fam_monitor_collection +fam_monitor_directory +fam_monitor_file +fam_next_event +fam_open +fam_pending +fam_resume_monitor +fam_suspend_monitor +fbsql_affected_rows +fbsql_autocommit +fbsql_blob_size +fbsql_change_user +fbsql_clob_size +fbsql_close +fbsql_commit +fbsql_connect +fbsql_create_blob +fbsql_create_clob +fbsql_create_db +fbsql_database +fbsql_database_password +fbsql_data_seek +fbsql_db_query +fbsql_db_status +fbsql_drop_db +fbsql_errno +fbsql_error +fbsql_fetch_array +fbsql_fetch_assoc +fbsql_fetch_field +fbsql_fetch_lengths +fbsql_fetch_object +fbsql_fetch_row +fbsql_field_flags +fbsql_field_len +fbsql_field_name +fbsql_field_seek +fbsql_field_table +fbsql_field_type +fbsql_free_result +fbsql_get_autostart_info +fbsql_hostname +fbsql_insert_id +fbsql_list_dbs +fbsql_list_fields +fbsql_list_tables +fbsql_next_result +fbsql_num_fields +fbsql_num_rows +fbsql_password +fbsql_pconnect +fbsql_query +fbsql_read_blob +fbsql_read_clob +fbsql_result +fbsql_rollback +fbsql_rows_fetched +fbsql_select_db +fbsql_set_characterset +fbsql_set_lob_mode +fbsql_set_password +fbsql_set_transaction +fbsql_start_db +fbsql_stop_db +fbsql_tablename +fbsql_table_name +fbsql_username +fbsql_warnings +fclose +fdf_add_doc_javascript +fdf_add_template +fdf_close +fdf_create +fdf_enum_values +fdf_errno +fdf_error +fdf_get_ap +fdf_get_attachment +fdf_get_encoding +fdf_get_file +fdf_get_flags +fdf_get_opt +fdf_get_status +fdf_get_value +fdf_get_version +fdf_header +fdf_next_field_name +fdf_open +fdf_open_string +fdf_remove_item +fdf_save +fdf_save_string +fdf_set_ap +fdf_set_encoding +fdf_set_file +fdf_set_flags +fdf_set_javascript_action +fdf_set_on_import_javascript +fdf_set_opt +fdf_set_status +fdf_set_submit_form_action +fdf_set_target_frame +fdf_set_value +fdf_set_version +feof +fflush +fgetc +fgetcsv +fgets +fgetss +file +__FILE__ +fileatime +filectime +file_exists +file_get_contents +filegroup +fileinode +filemtime +fileowner +fileperms +filepro +filepro_fieldcount +filepro_fieldname +filepro_fieldtype +filepro_fieldwidth +filepro_retrieve +filepro_rowcount +file_put_contents +filesize +filesystemiterator +filetype +filter_has_var +filter_id +filter_input +filter_input_array +filteriterator +filter_list +filter_var +filter_var_array +final +finfo_buffer +finfo_close +finfo_file +finfo_open +finfo_set_flags +floatval +flock +floor +flush +fmod +fnmatch +fopen +for +foreach +forward_static_call +forward_static_call_array +fpassthru +fprintf +fputcsv +fputs +fread +frenchtojd +fribidi_log2vis +fscanf +fseek +fsockopen +fstat +ftell +ftok +ftp_alloc +ftp_cdup +ftp_chdir +ftp_chmod +ftp_close +ftp_connect +ftp_delete +ftp_exec +ftp_fget +ftp_fput +ftp_get +ftp_get_option +ftp_login +ftp_mdtm +ftp_mkdir +ftp_nb_continue +ftp_nb_fget +ftp_nb_fput +ftp_nb_get +ftp_nb_put +ftp_nlist +ftp_pasv +ftp_put +ftp_pwd +ftp_quit +ftp_raw +ftp_rawlist +ftp_rename +ftp_rmdir +ftp_set_option +ftp_site +ftp_size +ftp_ssl_connect +ftp_systype +ftruncate +func_get_arg +func_get_args +func_num_args +function +__FUNCTION__ +function_exists +fwrite +gc_collect_cycles +gc_disable +gc_enable +gc_enabled +gd_info +gearmanclient +gearmanjob +gearmantask +gearmanworker +geoip_continent_code_by_name +geoip_country_code3_by_name +geoip_country_code_by_name +geoip_country_name_by_name +geoip_database_info +geoip_db_avail +geoip_db_filename +geoip_db_get_all_info +geoip_id_by_name +geoip_isp_by_name +geoip_org_by_name +geoip_record_by_name +geoip_region_by_name +geoip_region_name_by_code +geoip_time_zone_by_country_and_region +__get() +getallheaders +get_browser +get_called_class +get_cfg_var +get_class +get_class_methods +get_class_vars +getclosure +getconstant +getconstants +getconstructor +get_current_user +getcwd +getdate +get_declared_classes +get_declared_interfaces +getdefaultproperties +get_defined_constants +get_defined_functions +get_defined_vars +getdoccomment +getendline +getenv +getextension +get_extension_funcs +getextensionname +getfilename +get_headers +gethostbyaddr +gethostbyname +gethostbynamel +gethostname +get_html_translation_table +getimagesize +get_included_files +get_include_path +getinterfacenames +getinterfaces +getlastmod +get_loaded_extensions +get_magic_quotes_gpc +get_magic_quotes_runtime +getMeta +get_meta_tags +getmethod +getmethods +getmodifiers +getmxrr +getmygid +getmyinode +getmypid +getmyuid +getname +getNamed +getnamespacename +get_object_vars +getopt +getparentclass +get_parent_class +getproperties +getproperty +getprotobyname +getprotobynumber +getrandmax +get_required_files +get_resource_type +getrusage +getservbyname +getservbyport +getshortname +getstartline +getstaticproperties +getstaticpropertyvalue +gettext +gettimeofday +gettraitaliases +gettraitnames +gettraits +gettype +getValue +glob +global +globiterator +gmagick +gmagickdraw +gmagickpixel +gmdate +gmmktime +gmp_abs +gmp_add +gmp_and +gmp_clrbit +gmp_cmp +gmp_com +gmp_div +gmp_divexact +gmp_div_q +gmp_div_qr +gmp_div_r +gmp_fact +gmp_gcd +gmp_gcdext +gmp_hamdist +gmp_init +gmp_intval +gmp_invert +gmp_jacobi +gmp_legendre +gmp_mod +gmp_mul +gmp_neg +gmp_nextprime +gmp_or +gmp_perfect_square +gmp_popcount +gmp_pow +gmp_powm +gmp_prob_prime +gmp_random +gmp_scan0 +gmp_scan1 +gmp_setbit +gmp_sign +gmp_sqrt +gmp_sqrtrem +gmp_strval +gmp_sub +gmp_testbit +gmp_xor +gmstrftime +gnupg_adddecryptkey +gnupg_addencryptkey +gnupg_addsignkey +gnupg_cleardecryptkeys +gnupg_clearencryptkeys +gnupg_clearsignkeys +gnupg_decrypt +gnupg_decryptverify +gnupg_encrypt +gnupg_encryptsign +gnupg_export +gnupg_geterror +gnupg_getprotocol +gnupg_import +gnupg_init +gnupg_keyinfo +gnupg_setarmor +gnupg_seterrormode +gnupg_setsignmode +gnupg_sign +gnupg_verify +gopher_parsedir +goto +grapheme_extract +grapheme_stripos +grapheme_stristr +grapheme_strlen +grapheme_strpos +grapheme_strripos +grapheme_strrpos +grapheme_strstr +grapheme_substr +gregoriantojd +gupnp_context_get_host_ip +gupnp_context_get_port +gupnp_context_get_subscription_timeout +gupnp_context_host_path +gupnp_context_new +gupnp_context_set_subscription_timeout +gupnp_context_timeout_add +gupnp_context_unhost_path +gupnp_control_point_browse_start +gupnp_control_point_browse_stop +gupnp_control_point_callback_set +gupnp_control_point_new +gupnp_device_action_callback_set +gupnp_device_info_get +gupnp_device_info_get_service +gupnp_root_device_get_available +gupnp_root_device_get_relative_location +gupnp_root_device_new +gupnp_root_device_set_available +gupnp_root_device_start +gupnp_root_device_stop +gupnp_service_action_get +gupnp_service_action_return +gupnp_service_action_return_error +gupnp_service_action_set +gupnp_service_freeze_notify +gupnp_service_info_get +gupnp_service_info_get_introspection +gupnp_service_introspection_get_state_variable +gupnp_service_notify +gupnp_service_proxy_action_get +gupnp_service_proxy_action_set +gupnp_service_proxy_add_notify +gupnp_service_proxy_callback_set +gupnp_service_proxy_get_subscribed +gupnp_service_proxy_remove_notify +gupnp_service_proxy_set_subscribed +gupnp_service_thaw_notify +gzclose +gzcompress +gzdecode +gzdeflate +gzencode +gzeof +gzfile +gzgetc +gzgets +gzgetss +gzinflate +gzopen +gzpassthru +gzputs +gzread +gzrewind +gzseek +gztell +gzuncompress +gzwrite +halt_compiler +haruannotation +haruannotation_setborderstyle +haruannotation_sethighlightmode +haruannotation_seticon +haruannotation_setopened +harudestination +harudestination_setfit +harudestination_setfitb +harudestination_setfitbh +harudestination_setfitbv +harudestination_setfith +harudestination_setfitr +harudestination_setfitv +harudestination_setxyz +harudoc +harudoc_addpage +harudoc_addpagelabel +harudoc_construct +harudoc_createoutline +harudoc_getcurrentencoder +harudoc_getcurrentpage +harudoc_getencoder +harudoc_getfont +harudoc_getinfoattr +harudoc_getpagelayout +harudoc_getpagemode +harudoc_getstreamsize +harudoc_insertpage +harudoc_loadjpeg +harudoc_loadpng +harudoc_loadraw +harudoc_loadttc +harudoc_loadttf +harudoc_loadtype1 +harudoc_output +harudoc_readfromstream +harudoc_reseterror +harudoc_resetstream +harudoc_save +harudoc_savetostream +harudoc_setcompressionmode +harudoc_setcurrentencoder +harudoc_setencryptionmode +harudoc_setinfoattr +harudoc_setinfodateattr +harudoc_setopenaction +harudoc_setpagelayout +harudoc_setpagemode +harudoc_setpagesconfiguration +harudoc_setpassword +harudoc_setpermission +harudoc_usecnsencodings +harudoc_usecnsfonts +harudoc_usecntencodings +harudoc_usecntfonts +harudoc_usejpencodings +harudoc_usejpfonts +harudoc_usekrencodings +harudoc_usekrfonts +haruencoder +haruencoder_getbytetype +haruencoder_gettype +haruencoder_getunicode +haruencoder_getwritingmode +haruexception +harufont +harufont_getascent +harufont_getcapheight +harufont_getdescent +harufont_getencodingname +harufont_getfontname +harufont_gettextwidth +harufont_getunicodewidth +harufont_getxheight +harufont_measuretext +haruimage +haruimage_getbitspercomponent +haruimage_getcolorspace +haruimage_getheight +haruimage_getsize +haruimage_getwidth +haruimage_setcolormask +haruimage_setmaskimage +haruoutline +haruoutline_setdestination +haruoutline_setopened +harupage +harupage_arc +harupage_begintext +harupage_circle +harupage_closepath +harupage_concat +harupage_createdestination +harupage_createlinkannotation +harupage_createtextannotation +harupage_createurlannotation +harupage_curveto +harupage_curveto2 +harupage_curveto3 +harupage_drawimage +harupage_ellipse +harupage_endpath +harupage_endtext +harupage_eofill +harupage_eofillstroke +harupage_fill +harupage_fillstroke +harupage_getcharspace +harupage_getcmykfill +harupage_getcmykstroke +harupage_getcurrentfont +harupage_getcurrentfontsize +harupage_getcurrentpos +harupage_getcurrenttextpos +harupage_getdash +harupage_getfillingcolorspace +harupage_getflatness +harupage_getgmode +harupage_getgrayfill +harupage_getgraystroke +harupage_getheight +harupage_gethorizontalscaling +harupage_getlinecap +harupage_getlinejoin +harupage_getlinewidth +harupage_getmiterlimit +harupage_getrgbfill +harupage_getrgbstroke +harupage_getstrokingcolorspace +harupage_gettextleading +harupage_gettextmatrix +harupage_gettextrenderingmode +harupage_gettextrise +harupage_gettextwidth +harupage_gettransmatrix +harupage_getwidth +harupage_getwordspace +harupage_lineto +harupage_measuretext +harupage_movetextpos +harupage_moveto +harupage_movetonextline +harupage_rectangle +harupage_setcharspace +harupage_setcmykfill +harupage_setcmykstroke +harupage_setdash +harupage_setflatness +harupage_setfontandsize +harupage_setgrayfill +harupage_setgraystroke +harupage_setheight +harupage_sethorizontalscaling +harupage_setlinecap +harupage_setlinejoin +harupage_setlinewidth +harupage_setmiterlimit +harupage_setrgbfill +harupage_setrgbstroke +harupage_setrotate +harupage_setsize +harupage_setslideshow +harupage_settextleading +harupage_settextmatrix +harupage_settextrenderingmode +harupage_settextrise +harupage_setwidth +harupage_setwordspace +harupage_showtext +harupage_showtextnextline +harupage_stroke +harupage_textout +harupage_textrect +hasconstant +hash +hash_algos +hash_copy +hash_file +hash_final +hash_hmac +hash_hmac_file +hash_init +hash_update +hash_update_file +hash_update_stream +hasmethod +hasproperty +header +header_register_callback +header_remove +headers_list +headers_sent +hebrev +hebrevc +hex2bin +hexdec +highlight_file +highlight_string +htmlentities +html_entity_decode +htmlspecialchars +htmlspecialchars_decode +http_build_cookie +http_build_query +http_build_str +http_build_url +http_cache_etag +http_cache_last_modified +http_chunked_decode +http_date +http_deflate +httpdeflatestream +httpdeflatestream_construct +httpdeflatestream_factory +httpdeflatestream_finish +httpdeflatestream_flush +httpdeflatestream_update +http_get +http_get_request_body +http_get_request_body_stream +http_get_request_headers +http_head +http_inflate +httpinflatestream +httpinflatestream_construct +httpinflatestream_factory +httpinflatestream_finish +httpinflatestream_flush +httpinflatestream_update +http_match_etag +http_match_modified +http_match_request_header +httpmessage +httpmessage_addheaders +httpmessage_construct +httpmessage_detach +httpmessage_factory +httpmessage_fromenv +httpmessage_fromstring +httpmessage_getbody +httpmessage_getheader +httpmessage_getheaders +httpmessage_gethttpversion +httpmessage_getparentmessage +httpmessage_getrequestmethod +httpmessage_getrequesturl +httpmessage_getresponsecode +httpmessage_getresponsestatus +httpmessage_gettype +httpmessage_guesscontenttype +httpmessage_prepend +httpmessage_reverse +httpmessage_send +httpmessage_setbody +httpmessage_setheaders +httpmessage_sethttpversion +httpmessage_setrequestmethod +httpmessage_setrequesturl +httpmessage_setresponsecode +httpmessage_setresponsestatus +httpmessage_settype +httpmessage_tomessagetypeobject +httpmessage_tostring +http_negotiate_charset +http_negotiate_content_type +http_negotiate_language +http_parse_cookie +http_parse_headers +http_parse_message +http_parse_params +http_persistent_handles_clean +http_persistent_handles_count +http_persistent_handles_ident +http_post_data +http_post_fields +http_put_data +http_put_file +http_put_stream +httpquerystring +httpquerystring_construct +httpquerystring_get +httpquerystring_mod +httpquerystring_set +httpquerystring_singleton +httpquerystring_toarray +httpquerystring_tostring +httpquerystring_xlate +http_redirect +httprequest +http_request +httprequest_addcookies +httprequest_addheaders +httprequest_addpostfields +httprequest_addpostfile +httprequest_addputdata +httprequest_addquerydata +httprequest_addrawpostdata +httprequest_addssloptions +http_request_body_encode +httprequest_clearhistory +httprequest_construct +httprequest_enablecookies +httprequest_getcontenttype +httprequest_getcookies +httprequest_getheaders +httprequest_gethistory +httprequest_getmethod +httprequest_getoptions +httprequest_getpostfields +httprequest_getpostfiles +httprequest_getputdata +httprequest_getputfile +httprequest_getquerydata +httprequest_getrawpostdata +httprequest_getrawrequestmessage +httprequest_getrawresponsemessage +httprequest_getrequestmessage +httprequest_getresponsebody +httprequest_getresponsecode +httprequest_getresponsecookies +httprequest_getresponsedata +httprequest_getresponseheader +httprequest_getresponseinfo +httprequest_getresponsemessage +httprequest_getresponsestatus +httprequest_getssloptions +httprequest_geturl +http_request_method_exists +http_request_method_name +http_request_method_register +http_request_method_unregister +httprequestpool +httprequestpool_attach +httprequestpool_construct +httprequestpool_destruct +httprequestpool_detach +httprequestpool_getattachedrequests +httprequestpool_getfinishedrequests +httprequestpool_reset +httprequestpool_send +httprequestpool_socketperform +httprequestpool_socketselect +httprequest_resetcookies +httprequest_send +httprequest_setcontenttype +httprequest_setcookies +httprequest_setheaders +httprequest_setmethod +httprequest_setoptions +httprequest_setpostfields +httprequest_setpostfiles +httprequest_setputdata +httprequest_setputfile +httprequest_setquerydata +httprequest_setrawpostdata +httprequest_setssloptions +httprequest_seturl +httpresponse +httpresponse_capture +http_response_code +httpresponse_getbuffersize +httpresponse_getcache +httpresponse_getcachecontrol +httpresponse_getcontentdisposition +httpresponse_getcontenttype +httpresponse_getdata +httpresponse_getetag +httpresponse_getfile +httpresponse_getgzip +httpresponse_getheader +httpresponse_getlastmodified +httpresponse_getrequestbody +httpresponse_getrequestbodystream +httpresponse_getrequestheaders +httpresponse_getstream +httpresponse_getthrottledelay +httpresponse_guesscontenttype +httpresponse_redirect +httpresponse_send +httpresponse_setbuffersize +httpresponse_setcache +httpresponse_setcachecontrol +httpresponse_setcontentdisposition +httpresponse_setcontenttype +httpresponse_setdata +httpresponse_setetag +httpresponse_setfile +httpresponse_setgzip +httpresponse_setheader +httpresponse_setlastmodified +httpresponse_setstream +httpresponse_setthrottledelay +httpresponse_status +http_send_content_disposition +http_send_content_type +http_send_data +http_send_file +http_send_last_modified +http_send_status +http_send_stream +http_support +http_throttle +hwapi_attribute +hwapi_attribute_key +hwapi_attribute_langdepvalue +hwapi_attribute_value +hwapi_attribute_values +hwapi_checkin +hwapi_checkout +hwapi_children +hwapi_content +hwapi_content_mimetype +hwapi_content_read +hwapi_copy +hwapi_dbstat +hwapi_dcstat +hwapi_dstanchors +hwapi_dstofsrcanchor +hwapi_error_count +hwapi_error_reason +hwapi_find +hwapi_ftstat +hwapi_hgcsp +hwapi_hwstat +hwapi_identify +hwapi_info +hwapi_insert +hwapi_insertanchor +hwapi_insertcollection +hwapi_insertdocument +hwapi_link +hwapi_lock +hwapi_move +hwapi_new_content +hwapi_object +hwapi_object_assign +hwapi_object_attreditable +hwapi_objectbyanchor +hwapi_object_count +hwapi_object_insert +hwapi_object_new +hwapi_object_remove +hwapi_object_title +hwapi_object_value +hwapi_parents +hwapi_reason_description +hwapi_reason_type +hwapi_remove +hwapi_replace +hwapi_setcommittedversion +hwapi_srcanchors +hwapi_srcsofdst +hwapi_unlock +hwapi_user +hwapi_userlist +hw_array2objrec +hw_changeobject +hw_children +hw_childrenobj +hw_close +hw_connect +hw_connection_info +hw_cp +hw_deleteobject +hw_docbyanchor +hw_docbyanchorobj +hw_document_attributes +hw_document_bodytag +hw_document_content +hw_document_setcontent +hw_document_size +hw_dummy +hw_edittext +hw_error +hw_errormsg +hw_free_document +hw_getanchors +hw_getanchorsobj +hw_getandlock +hw_getchildcoll +hw_getchildcollobj +hw_getchilddoccoll +hw_getchilddoccollobj +hw_getobject +hw_getobjectbyquery +hw_getobjectbyquerycoll +hw_getobjectbyquerycollobj +hw_getobjectbyqueryobj +hw_getparents +hw_getparentsobj +hw_getrellink +hw_getremote +hw_getremotechildren +hw_getsrcbydestobj +hw_gettext +hw_getusername +hw_identify +hw_incollections +hw_info +hw_inscoll +hw_insdoc +hw_insertanchors +hw_insertdocument +hw_insertobject +hw_mapid +hw_modifyobject +hw_mv +hw_new_document +hw_objrec2array +hw_output_document +hw_pconnect +hw_pipedocument +hw_root +hw_setlinkroot +hw_stat +hw_unlock +hw_who +hypot +ibase_add_user +ibase_affected_rows +ibase_backup +ibase_blob_add +ibase_blob_cancel +ibase_blob_close +ibase_blob_create +ibase_blob_echo +ibase_blob_get +ibase_blob_import +ibase_blob_info +ibase_blob_open +ibase_close +ibase_commit +ibase_commit_ret +ibase_connect +ibase_db_info +ibase_delete_user +ibase_drop_db +ibase_errcode +ibase_errmsg +ibase_execute +ibase_fetch_assoc +ibase_fetch_object +ibase_fetch_row +ibase_field_info +ibase_free_event_handler +ibase_free_query +ibase_free_result +ibase_gen_id +ibase_maintain_db +ibase_modify_user +ibase_name_result +ibase_num_fields +ibase_num_params +ibase_param_info +ibase_pconnect +ibase_prepare +ibase_query +ibase_restore +ibase_rollback +ibase_rollback_ret +ibase_server_info +ibase_service_attach +ibase_service_detach +ibase_set_event_handler +ibase_timefmt +ibase_trans +ibase_wait_event +iconv +iconv_get_encoding +iconv_mime_decode +iconv_mime_decode_headers +iconv_mime_encode +iconv_set_encoding +iconv_strlen +iconv_strpos +iconv_strrpos +iconv_substr +id3_get_frame_long_name +id3_get_frame_short_name +id3_get_genre_id +id3_get_genre_list +id3_get_genre_name +id3_get_tag +id3_get_version +id3_remove_tag +id3_set_tag +idate +idn_to_ascii +idn_to_unicode +idn_to_utf8 +if +ifx_affected_rows +ifx_blobinfile_mode +ifx_byteasvarchar +ifx_close +ifx_connect +ifx_copy_blob +ifx_create_blob +ifx_create_char +ifx_do +ifx_error +ifx_errormsg +ifx_fetch_row +ifx_fieldproperties +ifx_fieldtypes +ifx_free_blob +ifx_free_char +ifx_free_result +ifx_get_blob +ifx_get_char +ifx_getsqlca +ifx_htmltbl_result +ifx_nullformat +ifx_num_fields +ifx_num_rows +ifx_pconnect +ifx_prepare +ifx_query +ifx_textasvarchar +ifx_update_blob +ifx_update_char +ifxus_close_slob +ifxus_create_slob +ifxus_free_slob +ifxus_open_slob +ifxus_read_slob +ifxus_seek_slob +ifxus_tell_slob +ifxus_write_slob +ignore_user_abort +iis_add_server +iis_get_dir_security +iis_get_script_map +iis_get_server_by_comment +iis_get_server_by_path +iis_get_server_rights +iis_get_service_state +iis_remove_server +iis_set_app_settings +iis_set_dir_security +iis_set_script_map +iis_set_server_rights +iis_start_server +iis_start_service +iis_stop_server +iis_stop_service +image2wbmp +imagealphablending +imageantialias +imagearc +imagechar +imagecharup +imagecolorallocate +imagecolorallocatealpha +imagecolorat +imagecolorclosest +imagecolorclosestalpha +imagecolorclosesthwb +imagecolordeallocate +imagecolorexact +imagecolorexactalpha +imagecolormatch +imagecolorresolve +imagecolorresolvealpha +imagecolorset +imagecolorsforindex +imagecolorstotal +imagecolortransparent +imageconvolution +imagecopy +imagecopymerge +imagecopymergegray +imagecopyresampled +imagecopyresized +imagecreate +imagecreatefromgd +imagecreatefromgd2 +imagecreatefromgd2part +imagecreatefromgif +imagecreatefromjpeg +imagecreatefrompng +imagecreatefromstring +imagecreatefromwbmp +imagecreatefromxbm +imagecreatefromxpm +imagecreatetruecolor +imagedashedline +imagedestroy +imageellipse +imagefill +imagefilledarc +imagefilledellipse +imagefilledpolygon +imagefilledrectangle +imagefilltoborder +imagefilter +imagefontheight +imagefontwidth +imageftbbox +imagefttext +imagegammacorrect +imagegd +imagegd2 +imagegif +imagegrabscreen +imagegrabwindow +imageinterlace +imageistruecolor +imagejpeg +imagelayereffect +imageline +imageloadfont +imagepalettecopy +imagepng +imagepolygon +imagepsbbox +imagepsencodefont +imagepsextendfont +imagepsfreefont +imagepsloadfont +imagepsslantfont +imagepstext +imagerectangle +imagerotate +imagesavealpha +imagesetbrush +imagesetpixel +imagesetstyle +imagesetthickness +imagesettile +imagestring +imagestringup +imagesx +imagesy +imagetruecolortopalette +imagettfbbox +imagettftext +imagetypes +image_type_to_extension +image_type_to_mime_type +imagewbmp +imagexbm +imagick +imagick_adaptiveblurimage +imagick_adaptiveresizeimage +imagick_adaptivesharpenimage +imagick_adaptivethresholdimage +imagick_addimage +imagick_addnoiseimage +imagick_affinetransformimage +imagick_animateimages +imagick_annotateimage +imagick_appendimages +imagick_averageimages +imagick_blackthresholdimage +imagick_blurimage +imagick_borderimage +imagick_charcoalimage +imagick_chopimage +imagick_clear +imagick_clipimage +imagick_clippathimage +imagick_clone +imagick_clutimage +imagick_coalesceimages +imagick_colorfloodfillimage +imagick_colorizeimage +imagick_combineimages +imagick_commentimage +imagick_compareimagechannels +imagick_compareimagelayers +imagick_compareimages +imagick_compositeimage +imagick_construct +imagick_contrastimage +imagick_contraststretchimage +imagick_convolveimage +imagick_cropimage +imagick_cropthumbnailimage +imagick_current +imagick_cyclecolormapimage +imagick_decipherimage +imagick_deconstructimages +imagick_deleteimageartifact +imagick_despeckleimage +imagick_destroy +imagick_displayimage +imagick_displayimages +imagick_distortimage +imagickdraw +imagickdraw_affine +imagickdraw_annotation +imagickdraw_arc +imagickdraw_bezier +imagickdraw_circle +imagickdraw_clear +imagickdraw_clone +imagickdraw_color +imagickdraw_comment +imagickdraw_composite +imagickdraw_construct +imagickdraw_destroy +imagickdraw_ellipse +imagickdraw_getclippath +imagickdraw_getcliprule +imagickdraw_getclipunits +imagickdraw_getfillcolor +imagickdraw_getfillopacity +imagickdraw_getfillrule +imagickdraw_getfont +imagickdraw_getfontfamily +imagickdraw_getfontsize +imagickdraw_getfontstyle +imagickdraw_getfontweight +imagickdraw_getgravity +imagickdraw_getstrokeantialias +imagickdraw_getstrokecolor +imagickdraw_getstrokedasharray +imagickdraw_getstrokedashoffset +imagickdraw_getstrokelinecap +imagickdraw_getstrokelinejoin +imagickdraw_getstrokemiterlimit +imagickdraw_getstrokeopacity +imagickdraw_getstrokewidth +imagickdraw_gettextalignment +imagickdraw_gettextantialias +imagickdraw_gettextdecoration +imagickdraw_gettextencoding +imagickdraw_gettextundercolor +imagickdraw_getvectorgraphics +imagick_drawimage +imagickdraw_line +imagickdraw_matte +imagickdraw_pathclose +imagickdraw_pathcurvetoabsolute +imagickdraw_pathcurvetoquadraticbezierabsolute +imagickdraw_pathcurvetoquadraticbezierrelative +imagickdraw_pathcurvetoquadraticbeziersmoothabsolute +imagickdraw_pathcurvetoquadraticbeziersmoothrelative +imagickdraw_pathcurvetorelative +imagickdraw_pathcurvetosmoothabsolute +imagickdraw_pathcurvetosmoothrelative +imagickdraw_pathellipticarcabsolute +imagickdraw_pathellipticarcrelative +imagickdraw_pathfinish +imagickdraw_pathlinetoabsolute +imagickdraw_pathlinetohorizontalabsolute +imagickdraw_pathlinetohorizontalrelative +imagickdraw_pathlinetorelative +imagickdraw_pathlinetoverticalabsolute +imagickdraw_pathlinetoverticalrelative +imagickdraw_pathmovetoabsolute +imagickdraw_pathmovetorelative +imagickdraw_pathstart +imagickdraw_point +imagickdraw_polygon +imagickdraw_polyline +imagickdraw_pop +imagickdraw_popclippath +imagickdraw_popdefs +imagickdraw_poppattern +imagickdraw_push +imagickdraw_pushclippath +imagickdraw_pushdefs +imagickdraw_pushpattern +imagickdraw_rectangle +imagickdraw_render +imagickdraw_rotate +imagickdraw_roundrectangle +imagickdraw_scale +imagickdraw_setclippath +imagickdraw_setcliprule +imagickdraw_setclipunits +imagickdraw_setfillalpha +imagickdraw_setfillcolor +imagickdraw_setfillopacity +imagickdraw_setfillpatternurl +imagickdraw_setfillrule +imagickdraw_setfont +imagickdraw_setfontfamily +imagickdraw_setfontsize +imagickdraw_setfontstretch +imagickdraw_setfontstyle +imagickdraw_setfontweight +imagickdraw_setgravity +imagickdraw_setstrokealpha +imagickdraw_setstrokeantialias +imagickdraw_setstrokecolor +imagickdraw_setstrokedasharray +imagickdraw_setstrokedashoffset +imagickdraw_setstrokelinecap +imagickdraw_setstrokelinejoin +imagickdraw_setstrokemiterlimit +imagickdraw_setstrokeopacity +imagickdraw_setstrokepatternurl +imagickdraw_setstrokewidth +imagickdraw_settextalignment +imagickdraw_settextantialias +imagickdraw_settextdecoration +imagickdraw_settextencoding +imagickdraw_settextundercolor +imagickdraw_setvectorgraphics +imagickdraw_setviewbox +imagickdraw_skewx +imagickdraw_skewy +imagickdraw_translate +imagick_edgeimage +imagick_embossimage +imagick_encipherimage +imagick_enhanceimage +imagick_equalizeimage +imagick_evaluateimage +imagick_extentimage +imagick_flattenimages +imagick_flipimage +imagick_floodfillpaintimage +imagick_flopimage +imagick_frameimage +imagick_fximage +imagick_gammaimage +imagick_gaussianblurimage +imagick_getcolorspace +imagick_getcompression +imagick_getcompressionquality +imagick_getcopyright +imagick_getfilename +imagick_getfont +imagick_getformat +imagick_getgravity +imagick_gethomeurl +imagick_getimage +imagick_getimagealphachannel +imagick_getimageartifact +imagick_getimagebackgroundcolor +imagick_getimageblob +imagick_getimageblueprimary +imagick_getimagebordercolor +imagick_getimagechanneldepth +imagick_getimagechanneldistortion +imagick_getimagechanneldistortions +imagick_getimagechannelextrema +imagick_getimagechannelmean +imagick_getimagechannelrange +imagick_getimagechannelstatistics +imagick_getimageclipmask +imagick_getimagecolormapcolor +imagick_getimagecolors +imagick_getimagecolorspace +imagick_getimagecompose +imagick_getimagecompression +imagick_getimagecompressionquality +imagick_getimagedelay +imagick_getimagedepth +imagick_getimagedispose +imagick_getimagedistortion +imagick_getimageextrema +imagick_getimagefilename +imagick_getimageformat +imagick_getimagegamma +imagick_getimagegeometry +imagick_getimagegravity +imagick_getimagegreenprimary +imagick_getimageheight +imagick_getimagehistogram +imagick_getimageindex +imagick_getimageinterlacescheme +imagick_getimageinterpolatemethod +imagick_getimageiterations +imagick_getimagelength +imagick_getimagemagicklicense +imagick_getimagematte +imagick_getimagemattecolor +imagick_getimageorientation +imagick_getimagepage +imagick_getimagepixelcolor +imagick_getimageprofile +imagick_getimageprofiles +imagick_getimageproperties +imagick_getimageproperty +imagick_getimageredprimary +imagick_getimageregion +imagick_getimagerenderingintent +imagick_getimageresolution +imagick_getimagesblob +imagick_getimagescene +imagick_getimagesignature +imagick_getimagesize +imagick_getimagetickspersecond +imagick_getimagetotalinkdensity +imagick_getimagetype +imagick_getimageunits +imagick_getimagevirtualpixelmethod +imagick_getimagewhitepoint +imagick_getimagewidth +imagick_getinterlacescheme +imagick_getiteratorindex +imagick_getnumberimages +imagick_getoption +imagick_getpackagename +imagick_getpage +imagick_getpixeliterator +imagick_getpixelregioniterator +imagick_getpointsize +imagick_getquantumdepth +imagick_getquantumrange +imagick_getreleasedate +imagick_getresource +imagick_getresourcelimit +imagick_getsamplingfactors +imagick_getsize +imagick_getsizeoffset +imagick_getversion +imagick_hasnextimage +imagick_haspreviousimage +imagick_identifyimage +imagick_implodeimage +imagick_labelimage +imagick_levelimage +imagick_linearstretchimage +imagick_liquidrescaleimage +imagick_magnifyimage +imagick_mapimage +imagick_mattefloodfillimage +imagick_medianfilterimage +imagick_mergeimagelayers +imagick_minifyimage +imagick_modulateimage +imagick_montageimage +imagick_morphimages +imagick_mosaicimages +imagick_motionblurimage +imagick_negateimage +imagick_newimage +imagick_newpseudoimage +imagick_nextimage +imagick_normalizeimage +imagick_oilpaintimage +imagick_opaquepaintimage +imagick_optimizeimagelayers +imagick_orderedposterizeimage +imagick_paintfloodfillimage +imagick_paintopaqueimage +imagick_painttransparentimage +imagick_pingimage +imagick_pingimageblob +imagick_pingimagefile +imagickpixel +imagickpixel_clear +imagickpixel_construct +imagickpixel_destroy +imagickpixel_getcolor +imagickpixel_getcolorasstring +imagickpixel_getcolorcount +imagickpixel_getcolorvalue +imagickpixel_gethsl +imagickpixel_issimilar +imagickpixeliterator +imagickpixeliterator_clear +imagickpixeliterator_construct +imagickpixeliterator_destroy +imagickpixeliterator_getcurrentiteratorrow +imagickpixeliterator_getiteratorrow +imagickpixeliterator_getnextiteratorrow +imagickpixeliterator_getpreviousiteratorrow +imagickpixeliterator_newpixeliterator +imagickpixeliterator_newpixelregioniterator +imagickpixeliterator_resetiterator +imagickpixeliterator_setiteratorfirstrow +imagickpixeliterator_setiteratorlastrow +imagickpixeliterator_setiteratorrow +imagickpixeliterator_synciterator +imagickpixel_setcolor +imagickpixel_setcolorvalue +imagickpixel_sethsl +imagick_polaroidimage +imagick_posterizeimage +imagick_previewimages +imagick_previousimage +imagick_profileimage +imagick_quantizeimage +imagick_quantizeimages +imagick_queryfontmetrics +imagick_queryfonts +imagick_queryformats +imagick_radialblurimage +imagick_raiseimage +imagick_randomthresholdimage +imagick_readimage +imagick_readimageblob +imagick_readimagefile +imagick_recolorimage +imagick_reducenoiseimage +imagick_removeimage +imagick_removeimageprofile +imagick_render +imagick_resampleimage +imagick_resetimagepage +imagick_resizeimage +imagick_rollimage +imagick_rotateimage +imagick_roundcorners +imagick_sampleimage +imagick_scaleimage +imagick_separateimagechannel +imagick_sepiatoneimage +imagick_setbackgroundcolor +imagick_setcolorspace +imagick_setcompression +imagick_setcompressionquality +imagick_setfilename +imagick_setfirstiterator +imagick_setfont +imagick_setformat +imagick_setgravity +imagick_setimage +imagick_setimagealphachannel +imagick_setimageartifact +imagick_setimagebackgroundcolor +imagick_setimagebias +imagick_setimageblueprimary +imagick_setimagebordercolor +imagick_setimagechanneldepth +imagick_setimageclipmask +imagick_setimagecolormapcolor +imagick_setimagecolorspace +imagick_setimagecompose +imagick_setimagecompression +imagick_setimagecompressionquality +imagick_setimagedelay +imagick_setimagedepth +imagick_setimagedispose +imagick_setimageextent +imagick_setimagefilename +imagick_setimageformat +imagick_setimagegamma +imagick_setimagegravity +imagick_setimagegreenprimary +imagick_setimageindex +imagick_setimageinterlacescheme +imagick_setimageinterpolatemethod +imagick_setimageiterations +imagick_setimagematte +imagick_setimagemattecolor +imagick_setimageopacity +imagick_setimageorientation +imagick_setimagepage +imagick_setimageprofile +imagick_setimageproperty +imagick_setimageredprimary +imagick_setimagerenderingintent +imagick_setimageresolution +imagick_setimagescene +imagick_setimagetickspersecond +imagick_setimagetype +imagick_setimageunits +imagick_setimagevirtualpixelmethod +imagick_setimagewhitepoint +imagick_setinterlacescheme +imagick_setiteratorindex +imagick_setlastiterator +imagick_setoption +imagick_setpage +imagick_setpointsize +imagick_setresolution +imagick_setresourcelimit +imagick_setsamplingfactors +imagick_setsize +imagick_setsizeoffset +imagick_settype +imagick_shadeimage +imagick_shadowimage +imagick_sharpenimage +imagick_shaveimage +imagick_shearimage +imagick_sigmoidalcontrastimage +imagick_sketchimage +imagick_solarizeimage +imagick_spliceimage +imagick_spreadimage +imagick_steganoimage +imagick_stereoimage +imagick_stripimage +imagick_swirlimage +imagick_textureimage +imagick_thresholdimage +imagick_thumbnailimage +imagick_tintimage +imagick_transformimage +imagick_transparentpaintimage +imagick_transposeimage +imagick_transverseimage +imagick_trimimage +imagick_uniqueimagecolors +imagick_unsharpmaskimage +imagick_valid +imagick_vignetteimage +imagick_waveimage +imagick_whitethresholdimage +imagick_writeimage +imagick_writeimagefile +imagick_writeimages +imagick_writeimagesfile +imap_8bit +imap_alerts +imap_append +imap_base64 +imap_binary +imap_body +imap_bodystruct +imap_check +imap_clearflag_full +imap_close +imap_create +imap_createmailbox +imap_delete +imap_deletemailbox +imap_errors +imap_expunge +imap_fetchbody +imap_fetchheader +imap_fetchmime +imap_fetch_overview +imap_fetchstructure +imap_fetchtext +imap_gc +imap_getacl +imap_getmailboxes +imap_get_quota +imap_get_quotaroot +imap_getsubscribed +imap_header +imap_headerinfo +imap_headers +imap_last_error +imap_list +imap_listmailbox +imap_listscan +imap_listsubscribed +imap_lsub +imap_mail +imap_mailboxmsginfo +imap_mail_compose +imap_mail_copy +imap_mail_move +imap_mime_header_decode +imap_msgno +imap_num_msg +imap_num_recent +imap_open +imap_ping +imap_qprint +imap_rename +imap_renamemailbox +imap_reopen +imap_rfc822_parse_adrlist +imap_rfc822_parse_headers +imap_rfc822_write_address +imap_savebody +imap_scan +imap_scanmailbox +imap_search +imap_setacl +imap_setflag_full +imap_set_quota +imap_sort +imap_status +imap_subscribe +imap_thread +imap_timeout +imap_uid +imap_undelete +imap_unsubscribe +imap_utf7_decode +imap_utf7_encode +imap_utf8 +implements +implementsinterface +implode +import_request_variables +in_array +include +include_once +inclued_get_data +inet_ntop +inet_pton +infiniteiterator +ingres_autocommit +ingres_autocommit_state +ingres_charset +ingres_close +ingres_commit +ingres_connect +ingres_cursor +ingres_errno +ingres_error +ingres_errsqlstate +ingres_escape_string +ingres_execute +ingres_fetch_array +ingres_fetch_assoc +ingres_fetch_object +ingres_fetch_proc_return +ingres_fetch_row +ingres_field_length +ingres_field_name +ingres_field_nullable +ingres_field_precision +ingres_field_scale +ingres_field_type +ingres_free_result +ingres_next_error +ingres_num_fields +ingres_num_rows +ingres_pconnect +ingres_prepare +ingres_query +ingres_result_seek +ingres_rollback +ingres_set_environment +ingres_unbuffered_query +ini_alter +ini_get +ini_get_all +ini_restore +ini_set +innamespace +inotify_add_watch +inotify_init +inotify_queue_len +inotify_read +inotify_rm_watch +instanceof +interface +interface_exists +intldateformatter +intl_error_name +intl_get_error_code +intl_get_error_message +intl_is_failure +intval +invalidargumentexception +invoke +__invoke() +invokeargs +ip2long +iptcembed +iptcparse +is_a +isabstract +is_array +is_bool +is_callable +iscloneable +is_dir +isdisabled +is_double +is_executable +is_file +isfinal +is_finite +is_float +is_infinite +isinstance +isinstantiable +is_int +is_integer +isinterface +isinternal +isiterateable +is_link +is_long +is_nan +is_null +is_numeric +is_object +is_readable +is_real +is_resource +is_scalar +isset +__isset() +is_soap_fault +is_string +issubclassof +is_subclass_of +istrait +is_uploaded_file +isuserdefined +is_writable +is_writeable +iterator +iteratoraggregate +iterator_apply +iterator_count +iteratoriterator +iterator_to_array +java_last_exception_clear +java_last_exception_get +jddayofweek +jdmonthname +jdtofrench +jdtogregorian +jdtojewish +jdtojulian +jdtounix +jewishtojd +join +jpeg2wbmp +json_decode +json_encode +json_last_error +jsonserializable +judy +judy_type +judy_version +juliantojd +kadm5_chpass_principal +kadm5_create_principal +kadm5_delete_principal +kadm5_destroy +kadm5_flush +kadm5_get_policies +kadm5_get_principal +kadm5_get_principals +kadm5_init_with_password +kadm5_modify_principal +key +krsort +ksort +ktaglib_id3v2_attachedpictureframe +ktaglib_id3v2_frame +ktaglib_id3v2_tag +ktaglib_mpeg_audioproperties +ktaglib_mpeg_file +ktaglib_tag +lcfirst +lcg_value +lchgrp +lchown +ldap_8859_to_t61 +ldap_add +ldap_bind +ldap_close +ldap_compare +ldap_connect +ldap_count_entries +ldap_delete +ldap_dn2ufn +ldap_err2str +ldap_errno +ldap_error +ldap_explode_dn +ldap_first_attribute +ldap_first_entry +ldap_first_reference +ldap_free_result +ldap_get_attributes +ldap_get_dn +ldap_get_entries +ldap_get_option +ldap_get_values +ldap_get_values_len +ldap_list +ldap_mod_add +ldap_mod_del +ldap_modify +ldap_mod_replace +ldap_next_attribute +ldap_next_entry +ldap_next_reference +ldap_parse_reference +ldap_parse_result +ldap_read +ldap_rename +ldap_sasl_bind +ldap_search +ldap_set_option +ldap_set_rebind_proc +ldap_sort +ldap_start_tls +ldap_t61_to_8859 +ldap_unbind +lengthexception +levenshtein +libxml_clear_errors +libxml_disable_entity_loader +libxmlerror +libxml_get_errors +libxml_get_last_error +libxml_set_streams_context +libxml_use_internal_errors +limititerator +__LINE__ +link +linkinfo +list +locale +localeconv +localtime +log +log10 +log1p +logicexception +long2ip +lstat +ltrim +lua +luaclosure +lzf_compress +lzf_decompress +lzf_optimized_for +magic_quotes_runtime +mail +mailparse_determine_best_xfer_encoding +mailparse_msg_create +mailparse_msg_extract_part +mailparse_msg_extract_part_file +mailparse_msg_extract_whole_part_file +mailparse_msg_free +mailparse_msg_get_part +mailparse_msg_get_part_data +mailparse_msg_get_structure +mailparse_msg_parse +mailparse_msg_parse_file +mailparse_rfc822_parse_addresses +mailparse_stream_encode +mailparse_uudecode_all +main +max +maxdb_affected_rows +maxdb_autocommit +maxdb_bind_param +maxdb_bind_result +maxdb_change_user +maxdb_character_set_name +maxdb_client_encoding +maxdb_close +maxdb_close_long_data +maxdb_commit +maxdb_connect +maxdb_connect_errno +maxdb_connect_error +maxdb_data_seek +maxdb_debug +maxdb_disable_reads_from_master +maxdb_disable_rpl_parse +maxdb_dump_debug_info +maxdb_embedded_connect +maxdb_enable_reads_from_master +maxdb_enable_rpl_parse +maxdb_errno +maxdb_error +maxdb_escape_string +maxdb_execute +maxdb_fetch +maxdb_fetch_array +maxdb_fetch_assoc +maxdb_fetch_field +maxdb_fetch_field_direct +maxdb_fetch_fields +maxdb_fetch_lengths +maxdb_fetch_object +maxdb_fetch_row +maxdb_field_count +maxdb_field_seek +maxdb_field_tell +maxdb_free_result +maxdb_get_client_info +maxdb_get_client_version +maxdb_get_host_info +maxdb_get_metadata +maxdb_get_proto_info +maxdb_get_server_info +maxdb_get_server_version +maxdb_info +maxdb_init +maxdb_insert_id +maxdb_kill +maxdb_master_query +maxdb_more_results +maxdb_multi_query +maxdb_next_result +maxdb_num_fields +maxdb_num_rows +maxdb_options +maxdb_param_count +maxdb_ping +maxdb_prepare +maxdb_query +maxdb_real_connect +maxdb_real_escape_string +maxdb_real_query +maxdb_report +maxdb_rollback +maxdb_rpl_parse_enabled +maxdb_rpl_probe +maxdb_rpl_query_type +maxdb_select_db +maxdb_send_long_data +maxdb_send_query +maxdb_server_end +maxdb_server_init +maxdb_set_opt +maxdb_sqlstate +maxdb_ssl_set +maxdb_stat +maxdb_stmt_affected_rows +maxdb_stmt_bind_param +maxdb_stmt_bind_result +maxdb_stmt_close +maxdb_stmt_close_long_data +maxdb_stmt_data_seek +maxdb_stmt_errno +maxdb_stmt_error +maxdb_stmt_execute +maxdb_stmt_fetch +maxdb_stmt_free_result +maxdb_stmt_init +maxdb_stmt_num_rows +maxdb_stmt_param_count +maxdb_stmt_prepare +maxdb_stmt_reset +maxdb_stmt_result_metadata +maxdb_stmt_send_long_data +maxdb_stmt_sqlstate +maxdb_stmt_store_result +maxdb_store_result +maxdb_thread_id +maxdb_thread_safe +maxdb_use_result +maxdb_warning_count +mb_check_encoding +mb_convert_case +mb_convert_encoding +mb_convert_kana +mb_convert_variables +mb_decode_mimeheader +mb_decode_numericentity +mb_detect_encoding +mb_detect_order +mb_encode_mimeheader +mb_encode_numericentity +mb_encoding_aliases +mb_ereg +mb_eregi +mb_eregi_replace +mb_ereg_match +mb_ereg_replace +mb_ereg_search +mb_ereg_search_getpos +mb_ereg_search_getregs +mb_ereg_search_init +mb_ereg_search_pos +mb_ereg_search_regs +mb_ereg_search_setpos +mb_get_info +mb_http_input +mb_http_output +mb_internal_encoding +mb_language +mb_list_encodings +mb_output_handler +mb_parse_str +mb_preferred_mime_name +mb_regex_encoding +mb_regex_set_options +mb_send_mail +mb_split +mb_strcut +mb_strimwidth +mb_stripos +mb_stristr +mb_strlen +mb_strpos +mb_strrchr +mb_strrichr +mb_strripos +mb_strrpos +mb_strstr +mb_strtolower +mb_strtoupper +mb_strwidth +mb_substitute_character +mb_substr +mb_substr_count +m_checkstatus +m_completeauthorizations +m_connect +m_connectionerror +mcrypt_cbc +mcrypt_cfb +mcrypt_create_iv +mcrypt_decrypt +mcrypt_ecb +mcrypt_enc_get_algorithms_name +mcrypt_enc_get_block_size +mcrypt_enc_get_iv_size +mcrypt_enc_get_key_size +mcrypt_enc_get_modes_name +mcrypt_enc_get_supported_key_sizes +mcrypt_enc_is_block_algorithm +mcrypt_enc_is_block_algorithm_mode +mcrypt_enc_is_block_mode +mcrypt_encrypt +mcrypt_enc_self_test +mcrypt_generic +mcrypt_generic_deinit +mcrypt_generic_end +mcrypt_generic_init +mcrypt_get_block_size +mcrypt_get_cipher_name +mcrypt_get_iv_size +mcrypt_get_key_size +mcrypt_list_algorithms +mcrypt_list_modes +mcrypt_module_close +mcrypt_module_get_algo_block_size +mcrypt_module_get_algo_key_size +mcrypt_module_get_supported_key_sizes +mcrypt_module_is_block_algorithm +mcrypt_module_is_block_algorithm_mode +mcrypt_module_is_block_mode +mcrypt_module_open +mcrypt_module_self_test +mcrypt_ofb +md5 +md5_file +mdecrypt_generic +m_deletetrans +m_destroyconn +m_destroyengine +memcache +memcached +memcache_debug +memory_get_peak_usage +memory_get_usage +messageformatter +metaphone +__METHOD__ +method_exists +m_getcell +m_getcellbynum +m_getcommadelimited +m_getheader +mhash +mhash_count +mhash_get_block_size +mhash_get_hash_name +mhash_keygen_s2k +microtime +mime_content_type +min +ming_keypress +ming_setcubicthreshold +ming_setscale +ming_setswfcompression +ming_useconstants +ming_useswfversion +m_initconn +m_initengine +m_iscommadelimited +mkdir +mktime +m_maxconntimeout +m_monitor +m_numcolumns +m_numrows +money_format +mongo +mongobindata +mongocode +mongocollection +mongoconnectionexception +mongocursor +mongocursorexception +mongocursortimeoutexception +mongodate +mongodb +mongodbref +mongoexception +mongogridfs +mongogridfscursor +mongogridfsexception +mongogridfsfile +mongoid +mongoint32 +mongoint64 +mongolog +mongomaxkey +mongominkey +mongopool +mongoregex +mongotimestamp +move_uploaded_file +m_parsecommadelimited +mqseries_back +mqseries_begin +mqseries_close +mqseries_cmit +mqseries_conn +mqseries_connx +mqseries_disc +mqseries_get +mqseries_inq +mqseries_open +mqseries_put +mqseries_put1 +mqseries_set +mqseries_strerror +m_responsekeys +m_responseparam +m_returnstatus +msession_connect +msession_count +msession_create +msession_destroy +msession_disconnect +msession_find +msession_get +msession_get_array +msession_get_data +msession_inc +msession_list +msession_listvar +msession_lock +msession_plugin +msession_randstr +msession_set +msession_set_array +msession_set_data +msession_timeout +msession_uniq +msession_unlock +m_setblocking +m_setdropfile +m_setip +m_setssl +m_setssl_cafile +m_setssl_files +m_settimeout +msg_get_queue +msg_queue_exists +msg_receive +msg_remove_queue +msg_send +msg_set_queue +msg_stat_queue +msql +msql_affected_rows +msql_close +msql_connect +msql_createdb +msql_create_db +msql_data_seek +msql_dbname +msql_db_query +msql_drop_db +msql_error +msql_fetch_array +msql_fetch_field +msql_fetch_object +msql_fetch_row +msql_fieldflags +msql_field_flags +msql_fieldlen +msql_field_len +msql_fieldname +msql_field_name +msql_field_seek +msql_fieldtable +msql_field_table +msql_fieldtype +msql_field_type +msql_free_result +msql_list_dbs +msql_list_fields +msql_list_tables +msql_numfields +msql_num_fields +msql_numrows +msql_num_rows +msql_pconnect +msql_query +msql_regcase +msql_result +msql_select_db +msql_tablename +m_sslcert_gen_hash +mssql_bind +mssql_close +mssql_connect +mssql_data_seek +mssql_execute +mssql_fetch_array +mssql_fetch_assoc +mssql_fetch_batch +mssql_fetch_field +mssql_fetch_object +mssql_fetch_row +mssql_field_length +mssql_field_name +mssql_field_seek +mssql_field_type +mssql_free_result +mssql_free_statement +mssql_get_last_message +mssql_guid_string +mssql_init +mssql_min_error_severity +mssql_min_message_severity +mssql_next_result +mssql_num_fields +mssql_num_rows +mssql_pconnect +mssql_query +mssql_result +mssql_rows_affected +mssql_select_db +mt_getrandmax +mt_rand +m_transactionssent +m_transinqueue +m_transkeyval +m_transnew +m_transsend +mt_srand +multipleiterator +m_uwait +m_validateidentifier +m_verifyconnection +m_verifysslcert +mysql_affected_rows +mysql_client_encoding +mysql_close +mysql_connect +mysql_create_db +mysql_data_seek +mysql_db_name +mysql_db_query +mysql_drop_db +mysql_errno +mysql_error +mysql_escape_string +mysql_fetch_array +mysql_fetch_assoc +mysql_fetch_field +mysql_fetch_lengths +mysql_fetch_object +mysql_fetch_row +mysql_field_flags +mysql_field_len +mysql_field_name +mysql_field_seek +mysql_field_table +mysql_field_type +mysql_free_result +mysql_get_client_info +mysql_get_host_info +mysql_get_proto_info +mysql_get_server_info +mysqli +mysqli_bind_param +mysqli_bind_result +mysqli_client_encoding +mysqli_connect +mysqli_disable_reads_from_master +mysqli_disable_rpl_parse +mysqli_driver +mysqli_enable_reads_from_master +mysqli_enable_rpl_parse +mysqli_escape_string +mysqli_execute +mysqli_fetch +mysqli_get_metadata +mysqli_master_query +mysql_info +mysql_insert_id +mysqli_param_count +mysqli_report +mysqli_result +mysqli_rpl_parse_enabled +mysqli_rpl_probe +mysqli_rpl_query_type +mysqli_send_long_data +mysqli_send_query +mysqli_set_opt +mysqli_slave_query +mysqli_stmt +mysqli_warning +mysql_list_dbs +mysql_list_fields +mysql_list_processes +mysql_list_tables +mysqlnd_ms_get_stats +mysqlnd_ms_query_is_select +mysqlnd_ms_set_user_pick_server +mysqlnd_qc_change_handler +mysqlnd_qc_clear_cache +mysqlnd_qc_get_cache_info +mysqlnd_qc_get_core_stats +mysqlnd_qc_get_handler +mysqlnd_qc_get_query_trace_log +mysqlnd_qc_set_user_handlers +mysql_num_fields +mysql_num_rows +mysql_pconnect +mysql_ping +mysql_query +mysql_real_escape_string +mysql_result +mysql_select_db +mysql_set_charset +mysql_stat +mysql_tablename +mysql_thread_id +mysql_unbuffered_query +namespace +__NAMESPACE__ +natcasesort +natsort +ncurses_addch +ncurses_addchnstr +ncurses_addchstr +ncurses_addnstr +ncurses_addstr +ncurses_assume_default_colors +ncurses_attroff +ncurses_attron +ncurses_attrset +ncurses_baudrate +ncurses_beep +ncurses_bkgd +ncurses_bkgdset +ncurses_border +ncurses_bottom_panel +ncurses_can_change_color +ncurses_cbreak +ncurses_clear +ncurses_clrtobot +ncurses_clrtoeol +ncurses_color_content +ncurses_color_set +ncurses_curs_set +ncurses_define_key +ncurses_def_prog_mode +ncurses_def_shell_mode +ncurses_delay_output +ncurses_delch +ncurses_deleteln +ncurses_del_panel +ncurses_delwin +ncurses_doupdate +ncurses_echo +ncurses_echochar +ncurses_end +ncurses_erase +ncurses_erasechar +ncurses_filter +ncurses_flash +ncurses_flushinp +ncurses_getch +ncurses_getmaxyx +ncurses_getmouse +ncurses_getyx +ncurses_halfdelay +ncurses_has_colors +ncurses_has_ic +ncurses_has_il +ncurses_has_key +ncurses_hide_panel +ncurses_hline +ncurses_inch +ncurses_init +ncurses_init_color +ncurses_init_pair +ncurses_insch +ncurses_insdelln +ncurses_insertln +ncurses_insstr +ncurses_instr +ncurses_isendwin +ncurses_keyok +ncurses_keypad +ncurses_killchar +ncurses_longname +ncurses_meta +ncurses_mouseinterval +ncurses_mousemask +ncurses_mouse_trafo +ncurses_move +ncurses_move_panel +ncurses_mvaddch +ncurses_mvaddchnstr +ncurses_mvaddchstr +ncurses_mvaddnstr +ncurses_mvaddstr +ncurses_mvcur +ncurses_mvdelch +ncurses_mvgetch +ncurses_mvhline +ncurses_mvinch +ncurses_mvvline +ncurses_mvwaddstr +ncurses_napms +ncurses_newpad +ncurses_new_panel +ncurses_newwin +ncurses_nl +ncurses_nocbreak +ncurses_noecho +ncurses_nonl +ncurses_noqiflush +ncurses_noraw +ncurses_pair_content +ncurses_panel_above +ncurses_panel_below +ncurses_panel_window +ncurses_pnoutrefresh +ncurses_prefresh +ncurses_putp +ncurses_qiflush +ncurses_raw +ncurses_refresh +ncurses_replace_panel +ncurses_reset_prog_mode +ncurses_reset_shell_mode +ncurses_resetty +ncurses_savetty +ncurses_scr_dump +ncurses_scr_init +ncurses_scrl +ncurses_scr_restore +ncurses_scr_set +ncurses_show_panel +ncurses_slk_attr +ncurses_slk_attroff +ncurses_slk_attron +ncurses_slk_attrset +ncurses_slk_clear +ncurses_slk_color +ncurses_slk_init +ncurses_slk_noutrefresh +ncurses_slk_refresh +ncurses_slk_restore +ncurses_slk_set +ncurses_slk_touch +ncurses_standend +ncurses_standout +ncurses_start_color +ncurses_termattrs +ncurses_termname +ncurses_timeout +ncurses_top_panel +ncurses_typeahead +ncurses_ungetch +ncurses_ungetmouse +ncurses_update_panels +ncurses_use_default_colors +ncurses_use_env +ncurses_use_extended_names +ncurses_vidattr +ncurses_vline +ncurses_waddch +ncurses_waddstr +ncurses_wattroff +ncurses_wattron +ncurses_wattrset +ncurses_wborder +ncurses_wclear +ncurses_wcolor_set +ncurses_werase +ncurses_wgetch +ncurses_whline +ncurses_wmouse_trafo +ncurses_wmove +ncurses_wnoutrefresh +ncurses_wrefresh +ncurses_wstandend +ncurses_wstandout +ncurses_wvline +new +newinstance +newinstanceargs +newinstancewithoutconstructor +newt_bell +newt_button +newt_button_bar +newt_centered_window +newt_checkbox +newt_checkbox_get_value +newt_checkbox_set_flags +newt_checkbox_set_value +newt_checkbox_tree +newt_checkbox_tree_add_item +newt_checkbox_tree_find_item +newt_checkbox_tree_get_current +newt_checkbox_tree_get_entry_value +newt_checkbox_tree_get_multi_selection +newt_checkbox_tree_get_selection +newt_checkbox_tree_multi +newt_checkbox_tree_set_current +newt_checkbox_tree_set_entry +newt_checkbox_tree_set_entry_value +newt_checkbox_tree_set_width +newt_clear_key_buffer +newt_cls +newt_compact_button +newt_component_add_callback +newt_component_takes_focus +newt_create_grid +newt_cursor_off +newt_cursor_on +newt_delay +newt_draw_form +newt_draw_root_text +newt_entry +newt_entry_get_value +newt_entry_set +newt_entry_set_filter +newt_entry_set_flags +newt_finished +newt_form +newt_form_add_component +newt_form_add_components +newt_form_add_hot_key +newt_form_destroy +newt_form_get_current +newt_form_run +newt_form_set_background +newt_form_set_height +newt_form_set_size +newt_form_set_timer +newt_form_set_width +newt_form_watch_fd +newt_get_screen_size +newt_grid_add_components_to_form +newt_grid_basic_window +newt_grid_free +newt_grid_get_size +newt_grid_h_close_stacked +newt_grid_h_stacked +newt_grid_place +newt_grid_set_field +newt_grid_simple_window +newt_grid_v_close_stacked +newt_grid_v_stacked +newt_grid_wrapped_window +newt_grid_wrapped_window_at +newt_init +newt_label +newt_label_set_text +newt_listbox +newt_listbox_append_entry +newt_listbox_clear +newt_listbox_clear_selection +newt_listbox_delete_entry +newt_listbox_get_current +newt_listbox_get_selection +newt_listbox_insert_entry +newt_listbox_item_count +newt_listbox_select_item +newt_listbox_set_current +newt_listbox_set_current_by_key +newt_listbox_set_data +newt_listbox_set_entry +newt_listbox_set_width +newt_listitem +newt_listitem_get_data +newt_listitem_set +newt_open_window +newt_pop_help_line +newt_pop_window +newt_push_help_line +newt_radiobutton +newt_radio_get_current +newt_redraw_help_line +newt_reflow_text +newt_refresh +newt_resize_screen +newt_resume +newt_run_form +newt_scale +newt_scale_set +newt_scrollbar_set +newt_set_help_callback +newt_set_suspend_callback +newt_suspend +newt_textbox +newt_textbox_get_num_lines +newt_textbox_reflowed +newt_textbox_set_height +newt_textbox_set_text +newt_vertical_scrollbar +newt_wait_for_key +newt_win_choice +newt_win_entries +newt_win_menu +newt_win_message +newt_win_messagev +newt_win_ternary +next +ngettext +nl2br +nl_langinfo +norewinditerator +normalizer +notes_body +notes_copy_db +notes_create_db +notes_create_note +notes_drop_db +notes_find_note +notes_header_info +notes_list_msgs +notes_mark_read +notes_mark_unread +notes_nav_create +notes_search +notes_unread +notes_version +nsapi_request_headers +nsapi_response_headers +nsapi_virtual +nthmac +number_format +numberformatter +oauth +oauthexception +oauth_get_sbs +oauthprovider +oauth_urlencode +ob_clean +ob_deflatehandler +ob_end_clean +ob_end_flush +ob_etaghandler +ob_flush +ob_get_clean +ob_get_contents +ob_get_flush +ob_get_length +ob_get_level +ob_get_status +ob_gzhandler +ob_iconv_handler +ob_implicit_flush +ob_inflatehandler +ob_list_handlers +ob_start +ob_tidyhandler +oci_bind_array_by_name +ocibindbyname +oci_bind_by_name +ocicancel +oci_cancel +oci_client_version +oci_close +ocicloselob +ocicollappend +ocicollassign +ocicollassignelem +oci_collection_append +oci_collection_assign +oci_collection_element_assign +oci_collection_element_get +oci_collection_free +oci_collection_max +oci_collection_size +oci_collection_trim +ocicollgetelem +ocicollmax +ocicollsize +ocicolltrim +ocicolumnisnull +ocicolumnname +ocicolumnprecision +ocicolumnscale +ocicolumnsize +ocicolumntype +ocicolumntyperaw +ocicommit +oci_commit +oci_connect +ocidefinebyname +oci_define_by_name +ocierror +oci_error +ociexecute +oci_execute +ocifetch +oci_fetch +oci_fetch_all +oci_fetch_array +oci_fetch_assoc +ocifetchinto +oci_fetch_object +oci_fetch_row +ocifetchstatement +oci_field_is_null +oci_field_name +oci_field_precision +oci_field_scale +oci_field_size +oci_field_type +oci_field_type_raw +ocifreecollection +ocifreecursor +ocifreedesc +ocifreestatement +oci_free_statement +ociinternaldebug +oci_internal_debug +ociloadlob +oci_lob_append +oci_lob_close +oci_lob_copy +oci_lob_eof +oci_lob_erase +oci_lob_export +oci_lob_flush +oci_lob_free +oci_lob_getbuffering +oci_lob_import +oci_lob_is_equal +oci_lob_load +oci_lob_read +oci_lob_rewind +oci_lob_save +oci_lob_savefile +oci_lob_seek +oci_lob_setbuffering +oci_lob_size +oci_lob_tell +oci_lob_truncate +oci_lob_write +oci_lob_writetemporary +oci_lob_writetofile +ocilogoff +ocilogon +ocinewcollection +oci_new_collection +oci_new_connect +ocinewcursor +oci_new_cursor +ocinewdescriptor +oci_new_descriptor +ocinlogon +ocinumcols +oci_num_fields +oci_num_rows +ociparse +oci_parse +oci_password_change +oci_pconnect +ociplogon +ociresult +oci_result +ocirollback +oci_rollback +ocirowcount +ocisavelob +ocisavelobfile +ociserverversion +oci_server_version +oci_set_action +oci_set_client_identifier +oci_set_client_info +oci_set_edition +oci_set_module_name +ocisetprefetch +oci_set_prefetch +ocistatementtype +oci_statement_type +ociwritelobtofile +ociwritetemporarylob +octdec +odbc_autocommit +odbc_binmode +odbc_close +odbc_close_all +odbc_columnprivileges +odbc_columns +odbc_commit +odbc_connect +odbc_cursor +odbc_data_source +odbc_do +odbc_error +odbc_errormsg +odbc_exec +odbc_execute +odbc_fetch_array +odbc_fetch_into +odbc_fetch_object +odbc_fetch_row +odbc_field_len +odbc_field_name +odbc_field_num +odbc_field_precision +odbc_field_scale +odbc_field_type +odbc_foreignkeys +odbc_free_result +odbc_gettypeinfo +odbc_longreadlen +odbc_next_result +odbc_num_fields +odbc_num_rows +odbc_pconnect +odbc_prepare +odbc_primarykeys +odbc_procedurecolumns +odbc_procedures +odbc_result +odbc_result_all +odbc_rollback +odbc_setoption +odbc_specialcolumns +odbc_statistics +odbc_tableprivileges +odbc_tables +old_function +openal_buffer_create +openal_buffer_data +openal_buffer_destroy +openal_buffer_get +openal_buffer_loadwav +openal_context_create +openal_context_current +openal_context_destroy +openal_context_process +openal_context_suspend +openal_device_close +openal_device_open +openal_listener_get +openal_listener_set +openal_source_create +openal_source_destroy +openal_source_get +openal_source_pause +openal_source_play +openal_source_rewind +openal_source_set +openal_source_stop +openal_stream +opendir +openlog +openssl_cipher_iv_length +openssl_csr_export +openssl_csr_export_to_file +openssl_csr_get_public_key +openssl_csr_get_subject +openssl_csr_new +openssl_csr_sign +openssl_decrypt +openssl_dh_compute_key +openssl_digest +openssl_encrypt +openssl_error_string +openssl_free_key +openssl_get_cipher_methods +openssl_get_md_methods +openssl_get_privatekey +openssl_get_publickey +openssl_open +openssl_pkcs12_export +openssl_pkcs12_export_to_file +openssl_pkcs12_read +openssl_pkcs7_decrypt +openssl_pkcs7_encrypt +openssl_pkcs7_sign +openssl_pkcs7_verify +openssl_pkey_export +openssl_pkey_export_to_file +openssl_pkey_free +openssl_pkey_get_details +openssl_pkey_get_private +openssl_pkey_get_public +openssl_pkey_new +openssl_private_decrypt +openssl_private_encrypt +openssl_public_decrypt +openssl_public_encrypt +openssl_random_pseudo_bytes +openssl_seal +openssl_sign +openssl_verify +openssl_x509_check_private_key +openssl_x509_checkpurpose +openssl_x509_export +openssl_x509_export_to_file +openssl_x509_free +openssl_x509_parse +openssl_x509_read +or +ord +outeriterator +outofboundsexception +outofrangeexception +output_add_rewrite_var +output_reset_rewrite_vars +overflowexception +overload +override_function +ovrimos_close +ovrimos_commit +ovrimos_connect +ovrimos_cursor +ovrimos_exec +ovrimos_execute +ovrimos_fetch_into +ovrimos_fetch_row +ovrimos_field_len +ovrimos_field_name +ovrimos_field_num +ovrimos_field_type +ovrimos_free_result +ovrimos_longreadlen +ovrimos_num_fields +ovrimos_num_rows +ovrimos_prepare +ovrimos_result +ovrimos_result_all +ovrimos_rollback +pack +parentiterator +parse_ini_file +parse_ini_string +parsekit_compile_file +parsekit_compile_string +parsekit_func_arginfo +parse_str +parse_url +passthru +pathinfo +pclose +pcntl_alarm +pcntl_exec +pcntl_fork +pcntl_getpriority +pcntl_setpriority +pcntl_signal +pcntl_signal_dispatch +pcntl_sigprocmask +pcntl_sigtimedwait +pcntl_sigwaitinfo +pcntl_wait +pcntl_waitpid +pcntl_wexitstatus +pcntl_wifexited +pcntl_wifsignaled +pcntl_wifstopped +pcntl_wstopsig +pcntl_wtermsig +pdf_activate_item +pdf_add_annotation +pdf_add_bookmark +pdf_add_launchlink +pdf_add_locallink +pdf_add_nameddest +pdf_add_note +pdf_add_outline +pdf_add_pdflink +pdf_add_table_cell +pdf_add_textflow +pdf_add_thumbnail +pdf_add_weblink +pdf_arc +pdf_arcn +pdf_attach_file +pdf_begin_document +pdf_begin_font +pdf_begin_glyph +pdf_begin_item +pdf_begin_layer +pdf_begin_page +pdf_begin_page_ext +pdf_begin_pattern +pdf_begin_template +pdf_begin_template_ext +pdf_circle +pdf_clip +pdf_close +pdf_close_image +pdf_closepath +pdf_closepath_fill_stroke +pdf_closepath_stroke +pdf_close_pdi +pdf_close_pdi_page +pdf_concat +pdf_continue_text +pdf_create_3dview +pdf_create_action +pdf_create_annotation +pdf_create_bookmark +pdf_create_field +pdf_create_fieldgroup +pdf_create_gstate +pdf_create_pvf +pdf_create_textflow +pdf_curveto +pdf_define_layer +pdf_delete +pdf_delete_pvf +pdf_delete_table +pdf_delete_textflow +pdf_encoding_set_char +pdf_end_document +pdf_end_font +pdf_end_glyph +pdf_end_item +pdf_end_layer +pdf_end_page +pdf_end_page_ext +pdf_endpath +pdf_end_pattern +pdf_end_template +pdf_fill +pdf_fill_imageblock +pdf_fill_pdfblock +pdf_fill_stroke +pdf_fill_textblock +pdf_findfont +pdf_fit_image +pdf_fit_pdi_page +pdf_fit_table +pdf_fit_textflow +pdf_fit_textline +pdf_get_apiname +pdf_get_buffer +pdf_get_errmsg +pdf_get_errnum +pdf_get_font +pdf_get_fontname +pdf_get_fontsize +pdf_get_image_height +pdf_get_image_width +pdf_get_majorversion +pdf_get_minorversion +pdf_get_parameter +pdf_get_pdi_parameter +pdf_get_pdi_value +pdf_get_value +pdf_info_font +pdf_info_matchbox +pdf_info_table +pdf_info_textflow +pdf_info_textline +pdf_initgraphics +pdf_lineto +pdf_load_3ddata +pdf_load_font +pdf_load_iccprofile +pdf_load_image +pdf_makespotcolor +pdf_moveto +pdf_new +pdf_open_ccitt +pdf_open_file +pdf_open_gif +pdf_open_image +pdf_open_image_file +pdf_open_jpeg +pdf_open_memory_image +pdf_open_pdi +pdf_open_pdi_document +pdf_open_pdi_page +pdf_open_tiff +pdf_pcos_get_number +pdf_pcos_get_stream +pdf_pcos_get_string +pdf_place_image +pdf_place_pdi_page +pdf_process_pdi +pdf_rect +pdf_restore +pdf_resume_page +pdf_rotate +pdf_save +pdf_scale +pdf_set_border_color +pdf_set_border_dash +pdf_set_border_style +pdf_set_char_spacing +pdf_setcolor +pdf_setdash +pdf_setdashpattern +pdf_set_duration +pdf_setflat +pdf_setfont +pdf_setgray +pdf_setgray_fill +pdf_setgray_stroke +pdf_set_gstate +pdf_set_horiz_scaling +pdf_set_info +pdf_set_info_author +pdf_set_info_creator +pdf_set_info_keywords +pdf_set_info_subject +pdf_set_info_title +pdf_set_layer_dependency +pdf_set_leading +pdf_setlinecap +pdf_setlinejoin +pdf_setlinewidth +pdf_setmatrix +pdf_setmiterlimit +pdf_set_parameter +pdf_setpolydash +pdf_setrgbcolor +pdf_setrgbcolor_fill +pdf_setrgbcolor_stroke +pdf_set_text_matrix +pdf_set_text_pos +pdf_set_text_rendering +pdf_set_text_rise +pdf_set_value +pdf_set_word_spacing +pdf_shading +pdf_shading_pattern +pdf_shfill +pdf_show +pdf_show_boxed +pdf_show_xy +pdf_skew +pdf_stringwidth +pdf_stroke +pdf_suspend_page +pdf_translate +pdf_utf16_to_utf8 +pdf_utf32_to_utf16 +pdf_utf8_to_utf16 +pdo +pdo_cubrid_schema +pdoexception +pdo_pgsqllobcreate +pdo_pgsqllobopen +pdo_pgsqllobunlink +pdo_sqlitecreateaggregate +pdo_sqlitecreatefunction +pdostatement +pfsockopen +pg_affected_rows +pg_cancel_query +pg_client_encoding +pg_close +pg_connect +pg_connection_busy +pg_connection_reset +pg_connection_status +pg_convert +pg_copy_from +pg_copy_to +pg_dbname +pg_delete +pg_end_copy +pg_escape_bytea +pg_escape_string +pg_execute +pg_fetch_all +pg_fetch_all_columns +pg_fetch_array +pg_fetch_assoc +pg_fetch_object +pg_fetch_result +pg_fetch_row +pg_field_is_null +pg_field_name +pg_field_num +pg_field_prtlen +pg_field_size +pg_field_table +pg_field_type +pg_field_type_oid +pg_free_result +pg_get_notify +pg_get_pid +pg_get_result +pg_host +pg_insert +pg_last_error +pg_last_notice +pg_last_oid +pg_lo_close +pg_lo_create +pg_lo_export +pg_lo_import +pg_lo_open +pg_lo_read +pg_lo_read_all +pg_lo_seek +pg_lo_tell +pg_lo_unlink +pg_lo_write +pg_meta_data +pg_num_fields +pg_num_rows +pg_options +pg_parameter_status +pg_pconnect +pg_ping +pg_port +pg_prepare +pg_put_line +pg_query +pg_query_params +pg_result_error +pg_result_error_field +pg_result_seek +pg_result_status +pg_select +pg_send_execute +pg_send_prepare +pg_send_query +pg_send_query_params +pg_set_client_encoding +pg_set_error_verbosity +pg_trace +pg_transaction_status +pg_tty +pg_unescape_bytea +pg_untrace +pg_update +pg_version +Phar +PharData +PharException +PharFileInfo +php_check_syntax +phpcredits +phpinfo +php_ini_loaded_file +php_ini_scanned_files +php_logo_guid +php_sapi_name +php_strip_whitespace +php_uname +phpversion +pi +png2wbmp +popen +pos +posix_access +posix_ctermid +posix_errno +posix_getcwd +posix_getegid +posix_geteuid +posix_getgid +posix_getgrgid +posix_getgrnam +posix_getgroups +posix_get_last_error +posix_getlogin +posix_getpgid +posix_getpgrp +posix_getpid +posix_getppid +posix_getpwnam +posix_getpwuid +posix_getrlimit +posix_getsid +posix_getuid +posix_initgroups +posix_isatty +posix_kill +posix_mkfifo +posix_mknod +posix_setegid +posix_seteuid +posix_setgid +posix_setpgid +posix_setsid +posix_setuid +posix_strerror +posix_times +posix_ttyname +posix_uname +pow +preg_filter +preg_grep +preg_last_error +preg_match +preg_match_all +preg_quote +preg_replace +preg_replace_callback +preg_split +prev +print +printer_abort +printer_close +printer_create_brush +printer_create_dc +printer_create_font +printer_create_pen +printer_delete_brush +printer_delete_dc +printer_delete_font +printer_delete_pen +printer_draw_bmp +printer_draw_chord +printer_draw_elipse +printer_draw_line +printer_draw_pie +printer_draw_rectangle +printer_draw_roundrect +printer_draw_text +printer_end_doc +printer_end_page +printer_get_option +printer_list +printer_logical_fontheight +printer_open +printer_select_brush +printer_select_font +printer_select_pen +printer_set_option +printer_start_doc +printer_start_page +printer_write +printf +print_r +private +proc_close +proc_get_status +proc_nice +proc_open +proc_terminate +property_exists +protected +ps_add_bookmark +ps_add_launchlink +ps_add_locallink +ps_add_note +ps_add_pdflink +ps_add_weblink +ps_arc +ps_arcn +ps_begin_page +ps_begin_pattern +ps_begin_template +ps_circle +ps_clip +ps_close +ps_close_image +ps_closepath +ps_closepath_stroke +ps_continue_text +ps_curveto +ps_delete +ps_end_page +ps_end_pattern +ps_end_template +ps_fill +ps_fill_stroke +ps_findfont +ps_get_buffer +ps_get_parameter +ps_get_value +ps_hyphenate +ps_include_file +ps_lineto +ps_makespotcolor +ps_moveto +ps_new +ps_open_file +ps_open_image +ps_open_image_file +ps_open_memory_image +pspell_add_to_personal +pspell_add_to_session +pspell_check +pspell_clear_session +pspell_config_create +pspell_config_data_dir +pspell_config_dict_dir +pspell_config_ignore +pspell_config_mode +pspell_config_personal +pspell_config_repl +pspell_config_runtogether +pspell_config_save_repl +pspell_new +pspell_new_config +pspell_new_personal +pspell_save_wordlist +pspell_store_replacement +pspell_suggest +ps_place_image +ps_rect +ps_restore +ps_rotate +ps_save +ps_scale +ps_set_border_color +ps_set_border_dash +ps_set_border_style +ps_setcolor +ps_setdash +ps_setflat +ps_setfont +ps_setgray +ps_set_info +ps_setlinecap +ps_setlinejoin +ps_setlinewidth +ps_setmiterlimit +ps_setoverprintmode +ps_set_parameter +ps_setpolydash +ps_set_text_pos +ps_set_value +ps_shading +ps_shading_pattern +ps_shfill +ps_show +ps_show2 +ps_show_boxed +ps_show_xy +ps_show_xy2 +ps_string_geometry +ps_stringwidth +ps_stroke +ps_symbol +ps_symbol_name +ps_symbol_width +ps_translate +public +putenv +px_close +px_create_fp +px_date2string +px_delete +px_delete_record +px_get_field +px_get_info +px_get_parameter +px_get_record +px_get_schema +px_get_value +px_insert_record +px_new +px_numfields +px_numrecords +px_open_fp +px_put_record +px_retrieve_record +px_set_blob_file +px_set_parameter +px_set_tablename +px_set_targetencoding +px_set_value +px_timestamp2string +px_update_record +qdom_error +qdom_tree +quickhashinthash +quickhashintset +quickhashintstringhash +quickhashstringinthash +quoted_printable_decode +quoted_printable_encode +quotemeta +rad2deg +radius_acct_open +radius_add_server +radius_auth_open +radius_close +radius_config +radius_create_request +radius_cvt_addr +radius_cvt_int +radius_cvt_string +radius_demangle +radius_demangle_mppe_key +radius_get_attr +radius_get_vendor_attr +radius_put_addr +radius_put_attr +radius_put_int +radius_put_string +radius_put_vendor_addr +radius_put_vendor_attr +radius_put_vendor_int +radius_put_vendor_string +radius_request_authenticator +radius_send_request +radius_server_secret +radius_strerror +rand +range +rangeexception +rararchive +rarentry +rarexception +rar_wrapper_cache_stats +rawurldecode +rawurlencode +readdir +read_exif_data +readfile +readgzfile +readline +readline_add_history +readline_callback_handler_install +readline_callback_handler_remove +readline_callback_read_char +readline_clear_history +readline_completion_function +readline_info +readline_list_history +readline_on_new_line +readline_read_history +readline_redisplay +readline_write_history +readlink +realpath +realpath_cache_get +realpath_cache_size +recode +recode_file +recode_string +recursivearrayiterator +recursivecachingiterator +recursivecallbackfilteriterator +recursivedirectoryiterator +recursivefilteriterator +recursiveiterator +recursiveiteratoriterator +recursiveregexiterator +recursivetreeiterator +reflection +reflectionclass +reflectionexception +reflectionextension +reflectionfunction +reflectionfunctionabstract +reflectionmethod +reflectionobject +reflectionparameter +reflectionproperty +reflector +regexiterator +register_shutdown_function +register_tick_function +rename +rename_function +require +require_once +reset +resetValue +resourcebundle +restore_error_handler +restore_exception_handler +restore_include_path +return +rewind +rewinddir +rmdir +round +rpm_close +rpm_get_tag +rpm_is_valid +rpm_open +rpm_version +rrd_create +rrdcreator +rrd_error +rrd_fetch +rrd_first +rrdgraph +rrd_graph +rrd_info +rrd_last +rrd_lastupdate +rrd_restore +rrd_tune +rrd_update +rrdupdater +rrd_version +rrd_xport +rsort +rtrim +runkit_class_adopt +runkit_class_emancipate +runkit_constant_add +runkit_constant_redefine +runkit_constant_remove +runkit_function_add +runkit_function_copy +runkit_function_redefine +runkit_function_remove +runkit_function_rename +runkit_import +runkit_lint +runkit_lint_file +runkit_method_add +runkit_method_copy +runkit_method_redefine +runkit_method_remove +runkit_method_rename +runkit_return_value_used +runkit_sandbox_output_handler +runkit_superglobals +runtimeexception +samconnection_commit +samconnection_connect +samconnection_constructor +samconnection_disconnect +samconnection_errno +samconnection_error +samconnection_isconnected +samconnection_peek +samconnection_peekall +samconnection_receive +samconnection_remove +samconnection_rollback +samconnection_send +samconnection_setDebug +samconnection_subscribe +samconnection_unsubscribe +sammessage_body +sammessage_constructor +sammessage_header +sca_createdataobject +sca_getservice +sca_localproxy_createdataobject +scandir +sca_soapproxy_createdataobject +sdo_das_changesummary_beginlogging +sdo_das_changesummary_endlogging +sdo_das_changesummary_getchangeddataobjects +sdo_das_changesummary_getchangetype +sdo_das_changesummary_getoldcontainer +sdo_das_changesummary_getoldvalues +sdo_das_changesummary_islogging +sdo_das_datafactory_addpropertytotype +sdo_das_datafactory_addtype +sdo_das_datafactory_getdatafactory +sdo_das_dataobject_getchangesummary +sdo_das_relational_applychanges +sdo_das_relational_construct +sdo_das_relational_createrootdataobject +sdo_das_relational_executepreparedquery +sdo_das_relational_executequery +sdo_das_setting_getlistindex +sdo_das_setting_getpropertyindex +sdo_das_setting_getpropertyname +sdo_das_setting_getvalue +sdo_das_setting_isset +sdo_das_xml_addtypes +sdo_das_xml_create +sdo_das_xml_createdataobject +sdo_das_xml_createdocument +sdo_das_xml_document_getrootdataobject +sdo_das_xml_document_getrootelementname +sdo_das_xml_document_getrootelementuri +sdo_das_xml_document_setencoding +sdo_das_xml_document_setxmldeclaration +sdo_das_xml_document_setxmlversion +sdo_das_xml_loadfile +sdo_das_xml_loadstring +sdo_das_xml_savefile +sdo_das_xml_savestring +sdo_datafactory_create +sdo_dataobject_clear +sdo_dataobject_createdataobject +sdo_dataobject_getcontainer +sdo_dataobject_getsequence +sdo_dataobject_gettypename +sdo_dataobject_gettypenamespaceuri +sdo_exception_getcause +sdo_list_insert +sdo_model_property_getcontainingtype +sdo_model_property_getdefault +sdo_model_property_getname +sdo_model_property_gettype +sdo_model_property_iscontainment +sdo_model_property_ismany +sdo_model_reflectiondataobject_construct +sdo_model_reflectiondataobject_export +sdo_model_reflectiondataobject_getcontainmentproperty +sdo_model_reflectiondataobject_getinstanceproperties +sdo_model_reflectiondataobject_gettype +sdo_model_type_getbasetype +sdo_model_type_getname +sdo_model_type_getnamespaceuri +sdo_model_type_getproperties +sdo_model_type_getproperty +sdo_model_type_isabstracttype +sdo_model_type_isdatatype +sdo_model_type_isinstance +sdo_model_type_isopentype +sdo_model_type_issequencedtype +sdo_sequence_getproperty +sdo_sequence_insert +sdo_sequence_move +seekableiterator +sem_acquire +sem_get +sem_release +sem_remove +serializable +serialize +session_cache_expire +session_cache_limiter +session_commit +session_decode +session_destroy +session_encode +session_get_cookie_params +session_id +session_is_registered +session_module_name +session_name +session_pgsql_add_error +session_pgsql_get_error +session_pgsql_get_field +session_pgsql_reset +session_pgsql_set_field +session_pgsql_status +session_regenerate_id +session_register +session_save_path +session_set_cookie_params +session_set_save_handler +session_start +session_unregister +session_unset +session_write_close +__set() +setcookie +setCounterClass +set_error_handler +set_exception_handler +set_file_buffer +set_include_path +setlocale +set_magic_quotes_runtime +setproctitle +setrawcookie +set_socket_blocking +__set_state() +setstaticpropertyvalue +setthreadtitle +set_time_limit +settype +sha1 +sha1_file +shell_exec +shm_attach +shm_detach +shm_get_var +shm_has_var +shmop_close +shmop_delete +shmop_open +shmop_read +shmop_size +shmop_write +shm_put_var +shm_remove +shm_remove_var +show_source +shuffle +signeurlpaiement +similar_text +simplexmlelement +simplexml_import_dom +simplexmliterator +simplexml_load_file +simplexml_load_string +sin +sinh +sizeof +sleep +__sleep() +snmp +snmp2_get +snmp2_getnext +snmp2_real_walk +snmp2_set +snmp2_walk +snmp3_get +snmp3_getnext +snmp3_real_walk +snmp3_set +snmp3_walk +snmpexception +snmpget +snmpgetnext +snmp_get_quick_print +snmp_get_valueretrieval +snmp_read_mib +snmprealwalk +snmpset +snmp_set_enum_print +snmp_set_oid_numeric_print +snmp_set_oid_output_format +snmp_set_quick_print +snmp_set_valueretrieval +snmpwalk +snmpwalkoid +soapclient +soapfault +soapheader +soapparam +soapserver +soapvar +socket_accept +socket_bind +socket_clear_error +socket_close +socket_connect +socket_create +socket_create_listen +socket_create_pair +socket_get_option +socket_getpeername +socket_getsockname +socket_get_status +socket_last_error +socket_listen +socket_read +socket_recv +socket_recvfrom +socket_select +socket_send +socket_sendto +socket_set_block +socket_set_blocking +socket_set_nonblock +socket_set_option +socket_set_timeout +socket_shutdown +socket_strerror +socket_write +solrclient +solrclientexception +solrdocument +solrdocumentfield +solrexception +solrgenericresponse +solr_get_version +solrillegalargumentexception +solrillegaloperationexception +solrinputdocument +solrmodifiableparams +solrobject +solrparams +solrpingresponse +solrquery +solrqueryresponse +solrresponse +solrupdateresponse +solrutils +sort +soundex +sphinxclient +spl_autoload +spl_autoload_call +spl_autoload_extensions +spl_autoload_functions +spl_autoload_register +spl_autoload_unregister +splbool +spl_classes +spldoublylinkedlist +splenum +splfileinfo +splfileobject +splfixedarray +splfloat +splheap +splint +split +spliti +splmaxheap +splminheap +spl_object_hash +splobjectstorage +splobserver +splpriorityqueue +splqueue +splstack +splstring +splsubject +spltempfileobject +spltype +spoofchecker +sprintf +sqlite3 +sqlite3result +sqlite3stmt +sqlite_array_query +sqlite_busy_timeout +sqlite_changes +sqlite_close +sqlite_column +sqlite_create_aggregate +sqlite_create_function +sqlite_current +sqlite_error_string +sqlite_escape_string +sqlite_exec +sqlite_factory +sqlite_fetch_all +sqlite_fetch_array +sqlite_fetch_column_types +sqlite_fetch_object +sqlite_fetch_single +sqlite_fetch_string +sqlite_field_name +sqlite_has_more +sqlite_has_prev +sqlite_key +sqlite_last_error +sqlite_last_insert_rowid +sqlite_libencoding +sqlite_libversion +sqlite_next +sqlite_num_fields +sqlite_num_rows +sqlite_open +sqlite_popen +sqlite_prev +sqlite_query +sqlite_rewind +sqlite_seek +sqlite_single_query +sqlite_udf_decode_binary +sqlite_udf_encode_binary +sqlite_unbuffered_query +sqlite_valid +sql_regcase +sqlsrv_begin_transaction +sqlsrv_cancel +sqlsrv_client_info +sqlsrv_close +sqlsrv_commit +sqlsrv_configure +sqlsrv_connect +sqlsrv_errors +sqlsrv_execute +sqlsrv_fetch +sqlsrv_fetch_array +sqlsrv_fetch_object +sqlsrv_field_metadata +sqlsrv_free_stmt +sqlsrv_get_config +sqlsrv_get_field +sqlsrv_has_rows +sqlsrv_next_result +sqlsrv_num_fields +sqlsrv_num_rows +sqlsrv_prepare +sqlsrv_query +sqlsrv_rollback +sqlsrv_rows_affected +sqlsrv_send_stream_data +sqlsrv_server_info +sqrt +srand +sscanf +ssdeep_fuzzy_compare +ssdeep_fuzzy_hash +ssdeep_fuzzy_hash_filename +ssh2_auth_hostbased_file +ssh2_auth_none +ssh2_auth_password +ssh2_auth_pubkey_file +ssh2_connect +ssh2_exec +ssh2_fetch_stream +ssh2_fingerprint +ssh2_methods_negotiated +ssh2_publickey_add +ssh2_publickey_init +ssh2_publickey_list +ssh2_publickey_remove +ssh2_scp_recv +ssh2_scp_send +ssh2_sftp +ssh2_sftp_lstat +ssh2_sftp_mkdir +ssh2_sftp_readlink +ssh2_sftp_realpath +ssh2_sftp_rename +ssh2_sftp_rmdir +ssh2_sftp_stat +ssh2_sftp_symlink +ssh2_sftp_unlink +ssh2_shell +ssh2_tunnel +stat +static +stats_absolute_deviation +stats_cdf_beta +stats_cdf_binomial +stats_cdf_cauchy +stats_cdf_chisquare +stats_cdf_exponential +stats_cdf_f +stats_cdf_gamma +stats_cdf_laplace +stats_cdf_logistic +stats_cdf_negative_binomial +stats_cdf_noncentral_chisquare +stats_cdf_noncentral_f +stats_cdf_poisson +stats_cdf_t +stats_cdf_uniform +stats_cdf_weibull +stats_covariance +stats_dens_beta +stats_dens_cauchy +stats_dens_chisquare +stats_dens_exponential +stats_dens_f +stats_dens_gamma +stats_dens_laplace +stats_dens_logistic +stats_dens_negative_binomial +stats_dens_normal +stats_dens_pmf_binomial +stats_dens_pmf_hypergeometric +stats_dens_pmf_poisson +stats_dens_t +stats_dens_weibull +stats_den_uniform +stats_harmonic_mean +stats_kurtosis +stats_rand_gen_beta +stats_rand_gen_chisquare +stats_rand_gen_exponential +stats_rand_gen_f +stats_rand_gen_funiform +stats_rand_gen_gamma +stats_rand_gen_ibinomial +stats_rand_gen_ibinomial_negative +stats_rand_gen_int +stats_rand_gen_ipoisson +stats_rand_gen_iuniform +stats_rand_gen_noncenral_chisquare +stats_rand_gen_noncentral_f +stats_rand_gen_noncentral_t +stats_rand_gen_normal +stats_rand_gen_t +stats_rand_get_seeds +stats_rand_phrase_to_seeds +stats_rand_ranf +stats_rand_setall +stats_skew +stats_standard_deviation +stats_stat_binomial_coef +stats_stat_correlation +stats_stat_gennch +stats_stat_independent_t +stats_stat_innerproduct +stats_stat_noncentral_t +stats_stat_paired_t +stats_stat_percentile +stats_stat_powersum +stats_variance +stomp +stomp_connect_error +stompexception +stompframe +stomp_version +strcasecmp +strchr +strcmp +strcoll +strcspn +stream_bucket_append +stream_bucket_make_writeable +stream_bucket_new +stream_bucket_prepend +stream_context_create +stream_context_get_default +stream_context_get_options +stream_context_get_params +stream_context_set_default +stream_context_set_option +stream_context_set_params +stream_copy_to_stream +stream_encoding +stream_filter_append +stream_filter_prepend +stream_filter_register +stream_filter_remove +stream_get_contents +stream_get_filters +stream_get_line +stream_get_meta_data +stream_get_transports +stream_get_wrappers +stream_is_local +stream_notification_callback +stream_register_wrapper +stream_resolve_include_path +stream_select +stream_set_blocking +stream_set_read_buffer +stream_set_timeout +stream_set_write_buffer +stream_socket_accept +stream_socket_client +stream_socket_enable_crypto +stream_socket_get_name +stream_socket_pair +stream_socket_recvfrom +stream_socket_sendto +stream_socket_server +stream_socket_shutdown +stream_supports_lock +streamwrapper +stream_wrapper_register +stream_wrapper_restore +stream_wrapper_unregister +strftime +str_getcsv +stripcslashes +stripos +stripslashes +strip_tags +str_ireplace +stristr +strlen +strnatcasecmp +strnatcmp +strncasecmp +strncmp +str_pad +strpbrk +strpos +strptime +strrchr +str_repeat +str_replace +strrev +strripos +str_rot13 +strrpos +str_shuffle +str_split +strspn +strstr +strtok +strtolower +strtotime +strtoupper +strtr +strval +str_word_count +substr +substr_compare +substr_count +substr_replace +svm +svmmodel +svn_add +svn_auth_get_parameter +svn_auth_set_parameter +svn_blame +svn_cat +svn_checkout +svn_cleanup +svn_client_version +svn_commit +svn_delete +svn_diff +svn_export +svn_fs_abort_txn +svn_fs_apply_text +svn_fs_begin_txn2 +svn_fs_change_node_prop +svn_fs_check_path +svn_fs_contents_changed +svn_fs_copy +svn_fs_delete +svn_fs_dir_entries +svn_fs_file_contents +svn_fs_file_length +svn_fs_is_dir +svn_fs_is_file +svn_fs_make_dir +svn_fs_make_file +svn_fs_node_created_rev +svn_fs_node_prop +svn_fs_props_changed +svn_fs_revision_prop +svn_fs_revision_root +svn_fs_txn_root +svn_fs_youngest_rev +svn_import +svn_log +svn_ls +svn_mkdir +svn_repos_create +svn_repos_fs +svn_repos_fs_begin_txn_for_commit +svn_repos_fs_commit_txn +svn_repos_hotcopy +svn_repos_open +svn_repos_recover +svn_revert +svn_status +svn_update +swfaction +swfaction.construct +swf_actiongeturl +swf_actiongotoframe +swf_actiongotolabel +swf_actionnextframe +swf_actionplay +swf_actionprevframe +swf_actionsettarget +swf_actionstop +swf_actiontogglequality +swf_actionwaitforframe +swf_addbuttonrecord +swf_addcolor +swfbitmap +swfbitmap.construct +swfbitmap.getheight +swfbitmap.getwidth +swfbutton +swfbutton.addaction +swfbutton.addasound +swfbutton.addshape +swfbutton.construct +swfbutton.setaction +swfbutton.setdown +swfbutton.sethit +swfbutton.setmenu +swfbutton.setover +swfbutton.setup +swf_closefile +swf_definebitmap +swf_definefont +swf_defineline +swf_definepoly +swf_definerect +swf_definetext +swfdisplayitem +swfdisplayitem.addaction +swfdisplayitem.addcolor +swfdisplayitem.endmask +swfdisplayitem.getrot +swfdisplayitem.getx +swfdisplayitem.getxscale +swfdisplayitem.getxskew +swfdisplayitem.gety +swfdisplayitem.getyscale +swfdisplayitem.getyskew +swfdisplayitem.move +swfdisplayitem.moveto +swfdisplayitem.multcolor +swfdisplayitem.remove +swfdisplayitem.rotate +swfdisplayitem.rotateto +swfdisplayitem.scale +swfdisplayitem.scaleto +swfdisplayitem.setdepth +swfdisplayitem.setmasklevel +swfdisplayitem.setmatrix +swfdisplayitem.setname +swfdisplayitem.setratio +swfdisplayitem.skewx +swfdisplayitem.skewxto +swfdisplayitem.skewy +swfdisplayitem.skewyto +swf_endbutton +swf_enddoaction +swf_endshape +swf_endsymbol +swffill +swffill.moveto +swffill.rotateto +swffill.scaleto +swffill.skewxto +swffill.skewyto +swffont +swffontchar +swffontchar.addchars +swffontchar.addutf8chars +swffont.construct +swffont.getascent +swffont.getdescent +swffont.getleading +swffont.getshape +swffont.getutf8width +swffont.getwidth +swf_fontsize +swf_fontslant +swf_fonttracking +swf_getbitmapinfo +swf_getfontinfo +swf_getframe +swfgradient +swfgradient.addentry +swfgradient.construct +swf_labelframe +swf_lookat +swf_modifyobject +swfmorph +swfmorph.construct +swfmorph.getshape1 +swfmorph.getshape2 +swfmovie +swfmovie.add +swfmovie.addexport +swfmovie.addfont +swfmovie.construct +swfmovie.importchar +swfmovie.importfont +swfmovie.labelframe +swfmovie.nextframe +swfmovie.output +swfmovie.remove +swfmovie.save +swfmovie.savetofile +swfmovie.setbackground +swfmovie.setdimension +swfmovie.setframes +swfmovie.setrate +swfmovie.startsound +swfmovie.stopsound +swfmovie.streammp3 +swfmovie.writeexports +swf_mulcolor +swf_nextid +swf_oncondition +swf_openfile +swf_ortho +swf_ortho2 +swf_perspective +swf_placeobject +swf_polarview +swf_popmatrix +swf_posround +swfprebuiltclip +swfprebuiltclip.construct +swf_pushmatrix +swf_removeobject +swf_rotate +swf_scale +swf_setfont +swf_setframe +swfshape +swfshape.addfill +swf_shapearc +swfshape.construct +swf_shapecurveto +swf_shapecurveto3 +swfshape.drawarc +swfshape.drawcircle +swfshape.drawcubic +swfshape.drawcubicto +swfshape.drawcurve +swfshape.drawcurveto +swfshape.drawglyph +swfshape.drawline +swfshape.drawlineto +swf_shapefillbitmapclip +swf_shapefillbitmaptile +swf_shapefilloff +swf_shapefillsolid +swf_shapelinesolid +swf_shapelineto +swfshape.movepen +swfshape.movepento +swf_shapemoveto +swfshape.setleftfill +swfshape.setline +swfshape.setrightfill +swf_showframe +swfsound +swfsound.construct +swfsoundinstance +swfsoundinstance.loopcount +swfsoundinstance.loopinpoint +swfsoundinstance.loopoutpoint +swfsoundinstance.nomultiple +swfsprite +swfsprite.add +swfsprite.construct +swfsprite.labelframe +swfsprite.nextframe +swfsprite.remove +swfsprite.setframes +swfsprite.startsound +swfsprite.stopsound +swf_startbutton +swf_startdoaction +swf_startshape +swf_startsymbol +swftext +swftext.addstring +swftext.addutf8string +swftext.construct +swftextfield +swftextfield.addchars +swftextfield.addstring +swftextfield.align +swftextfield.construct +swftextfield.setbounds +swftextfield.setcolor +swftextfield.setfont +swftextfield.setheight +swftextfield.setindentation +swftextfield.setleftmargin +swftextfield.setlinespacing +swftextfield.setmargins +swftextfield.setname +swftextfield.setpadding +swftextfield.setrightmargin +swftext.getascent +swftext.getdescent +swftext.getleading +swftext.getutf8width +swftext.getwidth +swftext.moveto +swftext.setcolor +swftext.setfont +swftext.setheight +swftext.setspacing +swf_textwidth +swf_translate +swfvideostream +swfvideostream.construct +swfvideostream.getnumframes +swfvideostream.setdimension +swf_viewport +swish_construct +swish_getmetalist +swish_getpropertylist +swish_prepare +swish_query +swishresult_getmetalist +swishresults_getparsedwords +swishresults_getremovedstopwords +swishresults_nextresult +swishresults_seekresult +swishresult_stem +swishsearch_execute +swishsearch_resetlimit +swishsearch_setlimit +swishsearch_setphrasedelimiter +swishsearch_setsort +swishsearch_setstructure +switch +sybase_affected_rows +sybase_close +sybase_connect +sybase_data_seek +sybase_deadlock_retry_count +sybase_fetch_array +sybase_fetch_assoc +sybase_fetch_field +sybase_fetch_object +sybase_fetch_row +sybase_field_seek +sybase_free_result +sybase_get_last_message +sybase_min_client_severity +sybase_min_error_severity +sybase_min_message_severity +sybase_min_server_severity +sybase_num_fields +sybase_num_rows +sybase_pconnect +sybase_query +sybase_result +sybase_select_db +sybase_set_message_handler +sybase_unbuffered_query +symlink +sys_getloadavg +sys_get_temp_dir +syslog +system +tan +tanh +tcpwrap_check +tempnam +textdomain +throw +tidy +tidy_access_count +tidy_config_count +tidy_diagnose +tidy_error_count +tidy_get_error_buffer +tidy_get_output +tidy_load_config +tidynode +tidy_reset_config +tidy_save_config +tidy_set_encoding +tidy_setopt +tidy_warning_count +time +time_nanosleep +time_sleep_until +timezone_abbreviations_list +timezone_identifiers_list +timezone_location_get +timezone_name_from_abbr +timezone_name_get +timezone_offset_get +timezone_open +timezone_transitions_get +timezone_version_get +tmpfile +token_get_all +token_name +tokyotyrant +tokyotyrantquery +tokyotyranttable +tostring +__toString() +touch +transliterator +traversable +trigger_error +trim +try +uasort +ucfirst +ucwords +udm_add_search_limit +udm_alloc_agent +udm_alloc_agent_array +udm_api_version +udm_cat_list +udm_cat_path +udm_check_charset +udm_check_stored +udm_clear_search_limits +udm_close_stored +udm_crc32 +udm_errno +udm_error +udm_find +udm_free_agent +udm_free_ispell_data +udm_free_res +udm_get_doc_count +udm_get_res_field +udm_get_res_param +udm_hash32 +udm_load_ispell_data +udm_open_stored +udm_set_agent_param +uksort +umask +underflowexception +unexpectedvalueexception +uniqid +unixtojd +unlink +unpack +unregister_tick_function +unserialize +unset +__unset() +urldecode +urlencode +use +user_error +use_soap_error_handler +usleep +usort +utf8_decode +utf8_encode +v8js +v8jsexception +var +var_dump +var_export +variant +variant_abs +variant_add +variant_and +variant_cast +variant_cat +variant_cmp +variant_date_from_timestamp +variant_date_to_timestamp +variant_div +variant_eqv +variant_fix +variant_get_type +variant_idiv +variant_imp +variant_int +variant_mod +variant_mul +variant_neg +variant_not +variant_or +variant_pow +variant_round +variant_set +variant_set_type +variant_sub +variant_xor +version_compare +vfprintf +virtual +vpopmail_add_alias_domain +vpopmail_add_alias_domain_ex +vpopmail_add_domain +vpopmail_add_domain_ex +vpopmail_add_user +vpopmail_alias_add +vpopmail_alias_del +vpopmail_alias_del_domain +vpopmail_alias_get +vpopmail_alias_get_all +vpopmail_auth_user +vpopmail_del_domain +vpopmail_del_domain_ex +vpopmail_del_user +vpopmail_error +vpopmail_passwd +vpopmail_set_user_quota +vprintf +vsprintf +w32api_deftype +w32api_init_dtype +w32api_invoke_function +w32api_register_function +w32api_set_call_method +__wakeup() +wddx_add_vars +wddx_deserialize +wddx_packet_end +wddx_packet_start +wddx_serialize_value +wddx_serialize_vars +weakref +while +win32_continue_service +win32_create_service +win32_delete_service +win32_get_last_control_message +win32_pause_service +win32_ps_list_procs +win32_ps_stat_mem +win32_ps_stat_proc +win32_query_service_status +win32_set_service_status +win32_start_service +win32_start_service_ctrl_dispatcher +win32_stop_service +wincache_fcache_fileinfo +wincache_fcache_meminfo +wincache_lock +wincache_ocache_fileinfo +wincache_ocache_meminfo +wincache_refresh_if_changed +wincache_rplist_fileinfo +wincache_rplist_meminfo +wincache_scache_info +wincache_scache_meminfo +wincache_ucache_add +wincache_ucache_cas +wincache_ucache_clear +wincache_ucache_dec +wincache_ucache_delete +wincache_ucache_exists +wincache_ucache_get +wincache_ucache_inc +wincache_ucache_info +wincache_ucache_meminfo +wincache_ucache_set +wincache_unlock +wordwrap +xattr_get +xattr_list +xattr_remove +xattr_set +xattr_supported +xdiff_file_bdiff +xdiff_file_bdiff_size +xdiff_file_bpatch +xdiff_file_diff +xdiff_file_diff_binary +xdiff_file_merge3 +xdiff_file_patch +xdiff_file_patch_binary +xdiff_file_rabdiff +xdiff_string_bdiff +xdiff_string_bdiff_size +xdiff_string_bpatch +xdiff_string_diff +xdiff_string_diff_binary +xdiff_string_merge3 +xdiff_string_patch +xdiff_string_patch_binary +xdiff_string_rabdiff +xhprof_disable +xhprof_enable +xhprof_sample_disable +xhprof_sample_enable +xml_error_string +xml_get_current_byte_index +xml_get_current_column_number +xml_get_current_line_number +xml_get_error_code +xml_parse +xml_parse_into_struct +xml_parser_create +xml_parser_create_ns +xml_parser_free +xml_parser_get_option +xml_parser_set_option +xmlreader +xmlrpc_decode +xmlrpc_decode_request +xmlrpc_encode +xmlrpc_encode_request +xmlrpc_get_type +xmlrpc_is_fault +xmlrpc_parse_method_descriptions +xmlrpc_server_add_introspection_data +xmlrpc_server_call_method +xmlrpc_server_create +xmlrpc_server_destroy +xmlrpc_server_register_introspection_callback +xmlrpc_server_register_method +xmlrpc_set_type +xml_set_character_data_handler +xml_set_default_handler +xml_set_element_handler +xml_set_end_namespace_decl_handler +xml_set_external_entity_ref_handler +xml_set_notation_decl_handler +xml_set_object +xml_set_processing_instruction_handler +xml_set_start_namespace_decl_handler +xml_set_unparsed_entity_decl_handler +xmlwriter_end_attribute +xmlwriter_end_cdata +xmlwriter_end_comment +xmlwriter_end_document +xmlwriter_end_dtd +xmlwriter_end_dtd_attlist +xmlwriter_end_dtd_element +xmlwriter_end_dtd_entity +xmlwriter_end_element +xmlwriter_end_pi +xmlwriter_flush +xmlwriter_full_end_element +xmlwriter_open_memory +xmlwriter_open_uri +xmlwriter_output_memory +xmlwriter_set_indent +xmlwriter_set_indent_string +xmlwriter_start_attribute +xmlwriter_start_attribute_ns +xmlwriter_start_cdata +xmlwriter_start_comment +xmlwriter_start_document +xmlwriter_start_dtd +xmlwriter_start_dtd_attlist +xmlwriter_start_dtd_element +xmlwriter_start_dtd_entity +xmlwriter_start_element +xmlwriter_start_element_ns +xmlwriter_start_pi +xmlwriter_text +xmlwriter_write_attribute +xmlwriter_write_attribute_ns +xmlwriter_write_cdata +xmlwriter_write_comment +xmlwriter_write_dtd +xmlwriter_write_dtd_attlist +xmlwriter_write_dtd_element +xmlwriter_write_dtd_entity +xmlwriter_write_element +xmlwriter_write_element_ns +xmlwriter_write_pi +xmlwriter_write_raw +xor +xpath_eval +xpath_eval_expression +xpath_new_context +xpath_register_ns +xpath_register_ns_auto +xptr_eval +xptr_new_context +xslt_backend_info +xslt_backend_name +xslt_backend_version +xslt_create +xslt_errno +xslt_error +xslt_free +xslt_getopt +xslt_process +xsltprocessor +xslt_set_base +xslt_set_encoding +xslt_set_error_handler +xslt_set_log +xslt_set_object +xslt_setopt +xslt_set_sax_handler +xslt_set_sax_handlers +xslt_set_scheme_handler +xslt_set_scheme_handlers +yaml_emit +yaml_emit_file +yaml_parse +yaml_parse_file +yaml_parse_url +yaz_addinfo +yaz_ccl_conf +yaz_ccl_parse +yaz_close +yaz_connect +yaz_database +yaz_element +yaz_errno +yaz_error +yaz_es +yaz_es_result +yaz_get_option +yaz_hits +yaz_itemorder +yaz_present +yaz_range +yaz_record +yaz_scan +yaz_scan_result +yaz_schema +yaz_search +yaz_set_option +yaz_sort +yaz_syntax +yaz_wait +yp_all +yp_cat +yp_errno +yp_err_string +yp_first +yp_get_default_domain +yp_master +yp_match +yp_next +yp_order +zend_logo_guid +zend_thread_id +zend_version +ziparchive +ziparchive_addemptydir +ziparchive_addfile +ziparchive_addfromstring +ziparchive_close +ziparchive_deleteindex +ziparchive_deletename +ziparchive_extractto +ziparchive_getarchivecomment +ziparchive_getcommentindex +ziparchive_getcommentname +ziparchive_getfromindex +ziparchive_getfromname +ziparchive_getnameindex +ziparchive_getstatusstring +ziparchive_getstream +ziparchive_locatename +ziparchive_open +ziparchive_renameindex +ziparchive_renamename +ziparchive_setarchivecomment +ziparchive_setcommentindex +ziparchive_setCommentName +ziparchive_statindex +ziparchive_statname +ziparchive_unchangeall +ziparchive_unchangearchive +ziparchive_unchangeindex +ziparchive_unchangename +zip_close +zip_entry_close +zip_entry_compressedsize +zip_entry_compressionmethod +zip_entry_filesize +zip_entry_name +zip_entry_open +zip_entry_read +zip_open +zip_read +zlib_get_coding_type +amqpchannel +amqpenvelope +autoload +bumpvalue +class_uses +closure +cubrid_get_query_timeout +cubrid_pconnect +cubrid_pconnect_with_url +cubrid_set_query_timeout +directory +domcdatasection +eio_busy +eio_cancel +eio_chmod +eio_chown +eio_close +eio_custom +eio_dup2 +eio_event_loop +eio_fallocate +eio_fchmod +eio_fchown +eio_fdatasync +eio_fstat +eio_fstatvfs +eio_fsync +eio_ftruncate +eio_futime +eio_get_event_stream +eio_grp +eio_grp_add +eio_grp_cancel +eio_grp_limit +eio_link +eio_lstat +eio_mkdir +eio_mknod +eio_nop +eio_npending +eio_nready +eio_nreqs +eio_nthreads +eio_open +eio_poll +eio_read +eio_readahead +eio_readdir +eio_readlink +eio_realpath +eio_rename +eio_rmdir +eio_sendfile +eio_set_max_idle +eio_set_max_parallel +eio_set_max_poll_reqs +eio_set_max_poll_time +eio_set_min_parallel +eio_stat +eio_statvfs +eio_symlink +eio_sync +eio_sync_file_range +eio_syncfs +eio_truncate +eio_unlink +eio_utime +eio_write +get_declared_traits +getimagesizefromstring +getmeta +getnamed +getvalue +hwapi_attribute_new +hwapi_content_new +is_tainted +lapack +lapackexception +ldap_control_paged_result +ldap_control_paged_result_response +libxml_set_external_entity_loader +mysqli_get_cache_stats +mysqli_sql_exception +mysqlnd_ms_get_last_gtid +mysqlnd_ms_get_last_used_connection +mysqlnd_ms_match_wild +mysqlnd_ms_set_qos +mysqlnd_qc_get_available_handlers +mysqlnd_qc_get_normalized_query_trace_log +mysqlnd_qc_set_cache_condition +mysqlnd_qc_set_is_select +mysqlnd_qc_set_storage_handler +mysqlnd_uh_convert_to_mysqlnd +mysqlnd_uh_set_connection_proxy +mysqlnd_uh_set_statement_proxy +mysqlnduhconnection +mysqlnduhpreparedstatement +pg_escape_identifier +pg_escape_literal +phar +phardata +pharexception +pharfileinfo +php_user_filter +reflectionzendextension +resetvalue +session_register_shutdown +session_status +sessionhandler +sessionhandlerinterface +setcounterclass +socket_import_stream +stream_set_chunk_size +taint +tokyotyrantexception +tokyotyrantiterator +trait_exists +untaint +varnishadmin +varnishlog +varnishstat +yaf_action_abstract +yaf_application +yaf_bootstrap_abstract +yaf_config_abstract +yaf_config_ini +yaf_config_simple +yaf_controller_abstract +yaf_dispatcher +yaf_exception +yaf_exception_dispatchfailed +yaf_exception_loadfailed +yaf_exception_loadfailed_action +yaf_exception_loadfailed_controller +yaf_exception_loadfailed_module +yaf_exception_loadfailed_view +yaf_exception_routerfailed +yaf_exception_startuperror +yaf_exception_typeerror +yaf_loader +yaf_plugin_abstract +yaf_registry +yaf_request_abstract +yaf_request_http +yaf_request_simple +yaf_response_abstract +yaf_route_interface +yaf_route_map +yaf_route_regex +yaf_route_rewrite +yaf_route_simple +yaf_route_static +yaf_route_supervar +yaf_router +yaf_session +yaf_view_interface +yaf_view_simple +zlib_decode +zlib_encode +trait +insteadof diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/dict/python-mode b/.emacs.d/elpa/auto-complete-20201213.1255/dict/python-mode new file mode 100644 index 0000000..09e936c --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/dict/python-mode @@ -0,0 +1,379 @@ +ArithmeticError +AssertionError +AttributeError +BaseException +BufferError +BytesWarning +DeprecationWarning +EOFError +Ellipsis +EnvironmentError +Exception +False +FloatingPointError +FutureWarning +GeneratorExit +IOError +ImportError +ImportWarning +IndentationError +IndexError +KeyError +KeyboardInterrupt +LookupError +MemoryError +NameError +None +NotImplemented +NotImplementedError +OSError +OverflowError +PendingDeprecationWarning +ReferenceError +RuntimeError +RuntimeWarning +StandardError +StopIteration +SyntaxError +SyntaxWarning +SystemError +SystemExit +TabError +True +TypeError +UnboundLocalError +UnicodeDecodeError +UnicodeEncodeError +UnicodeError +UnicodeTranslateError +UnicodeWarning +UserWarning +ValueError +Warning +ZeroDivisionError +__builtins__ +__debug__ +__doc__ +__file__ +__future__ +__import__ +__init__ +__main__ +__name__ +__package__ +_dummy_thread +_thread +abc +abs +aifc +all +and +any +apply +argparse +array +as +assert +ast +asynchat +asyncio +asyncore +atexit +audioop +base64 +basestring +bdb +bin +binascii +binhex +bisect +bool +break +buffer +builtins +bytearray +bytes +bz2 +calendar +callable +cgi +cgitb +chr +chuck +class +classmethod +cmath +cmd +cmp +code +codecs +codeop +coerce +collections +colorsys +compile +compileall +complex +concurrent +configparser +contextlib +continue +copy +copyreg +copyright +credits +crypt +csv +ctypes +curses +datetime +dbm +decimal +def +del +delattr +dict +difflib +dir +dis +distutils +divmod +doctest +dummy_threading +elif +else +email +enumerate +ensurepip +enum +errno +eval +except +exec +execfile +exit +faulthandler +fcntl +file +filecmp +fileinput +filter +finally +float +fnmatch +for +format +formatter +fpectl +fractions +from +frozenset +ftplib +functools +gc +getattr +getopt +getpass +gettext +glob +global +globals +grp +gzip +hasattr +hash +hashlib +heapq +help +hex +hmac +html +http +id +if +imghdr +imp +impalib +import +importlib +in +input +inspect +int +intern +io +ipaddress +is +isinstance +issubclass +iter +itertools +json +keyword +lambda +len +license +linecache +list +locale +locals +logging +long +lzma +macpath +mailbox +mailcap +map +marshal +math +max +memoryview +mimetypes +min +mmap +modulefinder +msilib +msvcrt +multiprocessing +netrc +next +nis +nntplib +not +numbers +object +oct +open +operator +optparse +or +ord +os +ossaudiodev +parser +pass +pathlib +pdb +pickle +pickletools +pipes +pkgutil +platform +plistlib +poplib +posix +pow +pprint +print +profile +property +pty +pwd +py_compiler +pyclbr +pydoc +queue +quit +quopri +raise +random +range +raw_input +re +readline +reduce +reload +repr +reprlib +resource +return +reversed +rlcompleter +round +runpy +sched +select +selectors +self +set +setattr +shelve +shlex +shutil +signal +site +slice +smtpd +smtplib +sndhdr +socket +socketserver +sorted +spwd +sqlite3 +ssl +stat +staticmethod +statistics +str +string +stringprep +struct +subprocess +sum +sunau +super +symbol +symtable +sys +sysconfig +syslog +tabnanny +tarfile +telnetlib +tempfile +termios +test +textwrap +threading +time +timeit +tkinter +token +tokenize +trace +traceback +tracemalloc +try +tty +tuple +turtle +type +types +unichr +unicode +unicodedata +unittest +urllib +uu +uuid +vars +venv +warnings +wave +weakref +webbrowser +while +winsound +winreg +with +wsgiref +xdrlib +xml +xmlrpc +xrange +yield +zip +zipfile +zipimport +zlib diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/dict/qml-mode b/.emacs.d/elpa/auto-complete-20201213.1255/dict/qml-mode new file mode 100644 index 0000000..7d9976e --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/dict/qml-mode @@ -0,0 +1,183 @@ +AlignBottom +AlignCenter +AlignHCenter +AlignLeft +AlignRight +AlignTop +AlignVCenter +AnchorAnimation +AnchorChanges +Audio +Behavior +Binding +BorderImage +ColorAnimation +Column +Component +Connections +Easing +Flickable +Flipable +Flow +FocusScope +GestureArea +Grid +GridView +Horizontal +Image +InBack +InBounce +InCirc +InCubic +InElastic +InExpo +InOutBack +InOutBounce +InOutCirc +InOutCubic +InOutElastic +InOutExpo +InOutQuad +InOutQuart +InOutQuint +InQuad +InQuart +InQuint +InQuint +InSine +Item +LayoutItem +LeftButton +Linear +ListElement +ListModel +ListView +Loader +MidButton +MiddleButton +MouseArea +NoButton +NumberAnimation +OutBack +OutBounce +OutCirc +OutCubic +OutElastic +OutExpo +OutInBack +OutInBounce +OutInCirc +OutInCubic +OutInElastic +OutInExpo +OutInQuad +OutInQuart +OutInQuint +OutQuad +OutQuart +OutQuint +OutSine +Package +ParallelAnimation +ParentAnimation +ParentChange +ParticleMotionGravity +ParticleMotionLinear +ParticleMotionWander +Particles +Path +PathAttribute +PathCubic +PathLine +PathPercent +PathQuad +PathView +PauseAnimation +PropertyAction +PropertyAnimation +PropertyChanges +Qt +QtObject +Rectangle +Repeater +RightButton +Rotation +RotationAnimation +Row +Scale +ScriptAction +SequentialAnimation +SmoothedAnimation +SoundEffect +SpringFollow +State +StateChangeScript +StateGroup +SystemPalette +Text +TextEdit +TextInput +Timer +Transition +Translate +Vertical +Video +ViewsPositionersMediaEffects +VisualDataModel +VisualItemModel +WebView +WorkerScript +XmlListModel +XmlRole +alias +as +bool +break +case +catch +color +const +continue +date +debugger +default +delete +do +double +else +enum +false +false +finally +for +function +if +import +import +in +instanceof +int +let +new +null +on +parent +property +real +return +signal +string +switch +this +throw +true +try +typeof +undefined +url +var +variant +void +while +with +yield diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/dict/ruby-mode b/.emacs.d/elpa/auto-complete-20201213.1255/dict/ruby-mode new file mode 100644 index 0000000..1a85417 --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/dict/ruby-mode @@ -0,0 +1,181 @@ +$! +$" +$$ +$& +$' +$* +$+ +$, +$-0 +$-F +$-I +$-K +$-a +$-d +$-i +$-l +$-p +$-v +$-w +$. +$/ +$0 +$1 +$10 +$11 +$2 +$3 +$4 +$5 +$6 +$7 +$8 +$9 +$: +$; +$< +$= +$> +$? +$@ +$DEBUG +$FILENAME +$KCODE +$LOADED_FEATURES +$LOAD_PATH +$PROGRAM_NAME +$SAFE +$VERBOSE +$\ +$_ +$` +$deferr +$defout +$stderr +$stdin +$stdout +$~ +ARGF +ARGV +Array +BEGIN +DATA +END +ENV +FALSE +Float +Integer +NIL +PLATFORM +RELEASE_DATE +RUBY_COPYRIGHT +RUBY_DESCRIPTION +RUBY_PATCHLEVEL +RUBY_PLATFORM +RUBY_RELEASE_DATE +RUBY_VERSION +SCRIPT_LINES__ +STDERR +STDIN +STDOUT +String +TOPLEVEL_BINDING +TRUE +VERSION +__method__ +` +abort +alias +and +at_exit +autoload +autoload? +begin +binding +block_given +break +callcc +caller +case +catch +chomp +chomp! +chop +chop +class +def +defined? +do +else +elsif +end +ensure +eval +exec +exit +exit! +fail +false +for +fork +format +getc +gets +global_variables +gsub +gsub! +if +in +iterator? +lambda +load +local_variables +loop +module +next +nil +not +open +or +p +printf +proc +putc +puts +raise +rand +readline +readlines +redo +require +require_relative +rescue +retry +return +scan +select +self +set_trace_func +sleep +split +sprintf +srand +sub +sub! +super +syscall +system +test +then +throw +trace_var +trap +true +undef +unless +until +untrace_var +warn +when +while +yield diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/dict/scala-mode b/.emacs.d/elpa/auto-complete-20201213.1255/dict/scala-mode new file mode 100644 index 0000000..b1ed3a4 --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/dict/scala-mode @@ -0,0 +1,1347 @@ +_ +: += +=> +<<: +<% +>: +# +@ +abstract +case +catch +class +def +do +else +extends +false +final +finally +for +forSome +if +implicit +import +lazy +match +new +null +object +override +package +private +protected +requires +return +sealed +super +this +throw +trait +true +try +type +val +var +while +with +yield + +scala +scala.actors +scala.actors.remote +scala.annotation.unchecked +scala.collection +scala.collection.immutable +scala.collection.jcl +scala.collection.mutable +scala.compat +scala.concurrent +scala.io +scala.mobile +scala.ref +scala.reflect +scala.runtime +scala.swing +scala.swing.event +scala.swing.test +scala.testing +scala.text +scala.util +scala.util.automata +scala.util.grammar +scala.util.logging +scala.util.matching +scala.util.parsing +scala.util.parsing.ast +scala.util.parsing.combinator +scala.util.parsing.combinator.lexical +scala.util.parsing.combinator.syntactical +scala.util.parsing.combinator.testing +scala.util.parsing.combinatorold +scala.util.parsing.combinatorold.lexical +scala.util.parsing.combinatorold.syntactical +scala.util.parsing.combinatorold.testing +scala.util.parsing.input +scala.util.parsing.json +scala.util.parsing.syntax +scala.util.regexp +scala.xml +scala.xml.dtd +scala.xml.factory +scala.xml.include +scala.xml.include.sax +scala.xml.parsing +scala.xml.path +scala.xml.persistent +scala.xml.pull +scala.xml.transform + +! +:: +AbstractActor +AbstractButton +AbstractSyntax +AbstractSyntax.Element +AbstractSyntax.NameElement +Action +Action.Trigger +Action.Trigger.Wrapper +ActionEvent +Actor +AdjustingEvent +Annotation +Any +AnyRef +AnyVal +Applet +Applet.UI +Application +Apply0 +Array +Array.Array0 +Array.ArrayLike +Array.Projection +ArrayBuffer +ArrayList +ArrayStack +Atom +AttListDecl +AttrDecl +Attribute +BackgroundChanged +Base +Base.Alt +Base.Meta +Base.RegExp +Base.Sequ +Base.Star +BaseBerrySethi +BasicTransformer +BasicTransformer.NeedsCopy +BeanDescription +BeanDisplayName +BeanInfo +BeanInfoSkip +BeanProperty +Benchmark +BigDecimal +BigInt +Binder +Binders +Binders.BinderEnv +Binders.BindingSensitive +Binders.BoundElement +Binders.ReturnAndDo +Binders.Scope +Binders.UnboundElement +Binders.UnderBinder +BindingParsers +BitSet +Boolean +BorderPanel +BoxPanel +Buffer +Buffer.DefaultBufferIterator +Buffer.Projection +Buffer.Projection0 +Buffer.Projection0.MapProjection +Buffer.Range +Buffer.Range.RangeIterator +BufferIterator +BufferProxy +BufferWrapper +BufferWrapper.IteratorWrapper +BufferWrapper.Range +BufferedIterator +BufferedIterator.Advanced +BufferedIterator.Default +BufferedIterator.PutBack +BufferedSource +Button +ButtonClicked +ButtonGroup +ByNameFunction +Byte +BytePickle.Def +BytePickle.PU +BytePickle.PicklerEnv +BytePickle.PicklerState +BytePickle.Ref +BytePickle.RefDef +BytePickle.SPU +BytePickle.UnPicklerEnv +BytePickle.UnPicklerState +CachedFileStorage +CaretUpdate +Cell +Channel +Channel.LinkedList +Char +CharArrayPosition +CharArrayReader +CharInputStreamIterator +CharSequenceReader +CheckBox +CheckMenuItem +CircularIncludeException +ClassfileAnnotation +ClassfileAttribute +CloneableCollection +Code +Collection +Collection.Projection +CollectionProxy +CollectionWrapper +ComboBox +ComboBox.BuiltInEditor +ComboBox.BuiltInEditor.DelegatedEditor +ComboBox.Editor +Comment +Component +Component.SuperMixin +ComponentAdded +ComponentEvent +ComponentHidden +ComponentMoved +ComponentRemoved +ComponentResized +ComponentShown +ConsRHS +ConsoleLogger +ConstructingHandler +ConstructingParser +Container +Container.Wrapper +Container.Wrapper.Content +ContainerEvent +ContentModel +ContentModel.ElemName +CountedIterator +CustomObjectInputStream +DEFAULT +DFAContentModel +DTD +Debug +Decl +DefaultDecl +DefaultEntry +DefaultMapModel +DefaultMarkupHandler +DetWordAutom +DocCons +DocGroup +DocNest +DocText +DocType +Document +Double +DoubleLinkedList +DtdTypeSymbol +DynamicVariable +ELEMENTS +EditDone +Either +Either.LeftProjection +Either.RightProjection +Elem +ElemDecl +ElementValidator +EmptyMap +EmptySet +EntityDecl +EntityDef +EntityRef +Enumeration +Enumeration.Set32 +Enumeration.Set64 +Enumeration.SetXX +Enumeration.Val +Enumeration.Value +Equiv +EvComment +EvElemEnd +EvElemStart +EvEntityRef +EvProcInstr +EvText +Event +Exit +ExitFun +Expression.Attrib +Expression.Child +Expression.Cond +Expression.DescOrSelf +Expression.Equals +Expression.Exists +Expression.Expr +Expression.FExp +Expression.GenExp +Expression.NameTest +Expression.Test +ExtDef +ExternalID +ExternalSources +FJTaskScheduler2 +FactoryAdapter +FatalError +FileChooser +FlatHashTable +Float +FlowPanel +FocusEvent +FocusGained +FocusLost +FontChanged +ForegroundChanged +FormattedTextField +Frame +Function0 +Function1 +Function10 +Function11 +Function12 +Function13 +Function14 +Function15 +Function16 +Function17 +Function18 +Function19 +Function2 +Function20 +Function21 +Function22 +Function3 +Function4 +Function5 +Function6 +Function7 +Function8 +Function9 +Future +GBTree +GUIApplication +GridBagPanel +GridBagPanel.Constraints +GridPanel +Group +HasKeyValue +HashEntry +HashMap +HashSet +HashTable +Hashtable +HedgeRHS +History +IScheduler +Ident +IdentityHashMap +ImmutableIterator +ImmutableMapAdaptor +ImmutableSetAdaptor +ImplicitConversions +Include +Inclusion +Index +IndexedStorage +InputChannel +InputEvent +InsertTree +Int +IntDef +IntMap +Iterable +Iterable.Projection +IterableProxy +IterableWrapper +Iterator +Iterator.PredicatedIterator +Iterator.TakeWhileIterator +JavaMapAdaptor +JavaSerializer +JavaSetAdaptor +JavaTokenParsers +Label +LabelledRHS +LayoutContainer +Left +Lexer +Lexical +LinkToFun +LinkedHashMap +LinkedHashSet +LinkedList +LinkedListQueueCreator +List +ListBuffer +ListChange +ListChanged +ListElementsAdded +ListElementsRemoved +ListEvent +ListMap +ListMap.Node +ListQueueCreator +ListSelectionChanged +ListSelectionEvent +ListSet +ListSet.Node +ListView +ListView.AbstractRenderer +ListView.ModelWrapper +ListView.Renderer +ListView.Renderer.Wrapped +ListView.selection.Indices +LocalApply0 +Location +Locator +Lock +Logged +LoggedNodeFactory +Long +LongMap +MIXED +MailBox +MainFrame +MalformedAttributeException +Map +Map.Filter +Map.KeySet +Map.Lense +Map.MapTo +Map.MutableIterableProjection +Map.Projection +Map1 +Map2 +Map3 +Map4 +MapProxy +MapWrapper +MapWrapper.IteratorWrapper +MapWrapper.KeySet +MapWrapper.ValueSet +Mappable +Mappable.Mappable +Mappable.Mapper +MarkupDecl +MarkupHandler +MarkupParser +MatchError +Menu +MenuBar +MenuItem +Message +MessageQueue +MessageQueueElement +MetaData +MouseButtonEvent +MouseClicked +MouseDragged +MouseEntered +MouseEvent +MouseExited +MouseMotionEvent +MouseMoved +MousePressed +MouseReleased +MouseWheelMoved +MultiMap +MutableIterable +MutableIterable.Filter +MutableIterable.Map +MutableIterable.Projection +MutableIterator +MutableIterator.Map +MutableIterator.Wrapper +MutableList +MutableSeq +MutableSeq.DefaultSeqIterator +MutableSeq.Filter +MutableSeq.Filter.FilterIterator +MutableSeq.Map +MutableSeq.Projection +NamedSend +NamespaceBinding +NetKernel +NoBindingFactoryAdapter +Node +NodeBuffer +NodeFactory +NodeSeq +NodeTraverser +NonLocalReturnException +NondetWordAutom +NotDefinedError +NotNull +NotationDecl +Nothing +Null +Number +ObservableBuffer +ObservableMap +ObservableSet +OffsetPosition +OpenHashMap +Option +Ordered +Ordering +Orientable +Oriented +OutputChannel +PCData +PCDataMarkupParser +PEReference +PagedSeq +PagedSeqReader +Panel +ParameterEntityDecl +ParsedEntityDecl +Parser +Parsers +Parsers.Error +Parsers.Failure +Parsers.NoSuccess +Parsers.OnceParser +Parsers.ParseResult +Parsers.Parser +Parsers.Success +Parsers.UnitOnceParser +Parsers.UnitParser +Parsers.~ +PartialFunction +PartialOrdering +PartiallyOrdered +PasswordField +PhantomReference +PointedHedgeExp +PointedHedgeExp.Node +PointedHedgeExp.TopIter +Position +Positional +Predef.ArrowAssoc +Predef.Ensuring +PrefixedAttribute +PrettyPrinter +PrettyPrinter.Box +PrettyPrinter.BrokenException +PrettyPrinter.Item +PrettyPrinter.Para +PriorityQueue +PriorityQueueProxy +ProcInstr +Product +Product1 +Product10 +Product11 +Product12 +Product13 +Product14 +Product15 +Product16 +Product17 +Product18 +Product19 +Product2 +Product20 +Product21 +Product22 +Product3 +Product4 +Product5 +Product6 +Product7 +Product8 +Product9 +ProgressBar +Proxy +PublicID +Publisher +Queue +QueueModule +QueueProxy +RadioButton +RadioMenuItem +Random +RandomAccessSeq +RandomAccessSeq.Mutable +RandomAccessSeq.MutableProjection +RandomAccessSeq.Projection +RandomAccessSeq.Projection.MapProjection +RandomAccessSeqProxy +Range +Range.Inclusive +Ranged +Ranged.Comparator +Reaction +Reactions +Reactions.Impl +Reactions.StronglyReferenced +Reactions.Wrapper +Reactor +Reader +RedBlack +RedBlack.BlackTree +RedBlack.NonEmpty +RedBlack.RedTree +RedBlack.Tree +RefBuffer +Reference +ReferenceQueue +ReferenceQueue.Wrapper +ReferenceWrapper +Regex +Regex.Match +Regex.MatchData +Regex.MatchIterator +RegexParsers +RemoteApply0 +Remove +Reset +ResizableArray +Responder +RevertableHistory +RewriteRule +RichBoolean +RichByte +RichChar +RichDouble +RichException +RichFloat +RichInt +RichLong +RichShort +RichSorting +RichString +RichStringBuilder +Right +RollbackIterator +RootPanel +RuleTransformer +SUnit.Assert +SUnit.AssertFailed +SUnit.Test +SUnit.TestCase +SUnit.TestConsoleMain +SUnit.TestFailure +SUnit.TestResult +SUnit.TestSuite +ScalaBeanInfo +ScalaObject +Scanner +Scanners +Scanners.Scanner +SchedulerAdapter +Script +Scriptable +ScrollPane +Scrollable +SelectionChanged +SelectionEvent +SendTo +Separator +Seq +Seq.Projection +Seq.Projection.ComputeSize +Seq.Projection.MapProjection +Seq.singleton +SeqIterator +SeqIterator.Map +SeqProxy +SequentialContainer +SequentialContainer.Wrapper +SerialVersionUID +Serializer +Service +Set +Set.Filter +Set.Projection +Set1 +Set2 +Set3 +Set4 +SetProxy +SetStorage +SetWrapper +Short +Show +Show.SymApply +SimpleApplet +SimpleGUIApplication +SimpleTokenizer +SingleLinkedList +SingleThreadedScheduler +Slider +SoftReference +Some +Sorted +SortedMap +SortedMap.DefaultKeySet +SortedMap.Filter +SortedMap.KeySet +SortedMap.Lense +SortedMap.Projection +SortedMap.Range +SortedMap.Range.Filter +SortedMapWrapper +SortedMapWrapper.KeySet +SortedMapWrapper.Range +SortedSet +SortedSet.Filter +SortedSet.Projection +SortedSet.Range +SortedSetWrapper +SortedSetWrapper.Range +Source +SpecialNode +SplitPane +Stack +Stack.Node +StackProxy +StandardTokenParsers +StaticAnnotation +StaticAttribute +StdLexical +StdTokenParsers +StdTokens +StdTokens.Identifier +StdTokens.Keyword +StdTokens.NumericLit +StdTokens.StringLit +Str +Stream +Stream.Definite +StreamReader +StringBuilder +Subscriber +SubsetConstruction +Swing.Embossing +Symbol +SyncChannel +SyncVar +SynchronizedBuffer +SynchronizedMap +SynchronizedPriorityQueue +SynchronizedQueue +SynchronizedSet +SynchronizedStack +SyntaxError +SystemID +TabbedPane +TabbedPane.Page +Table +Table.AbstractRenderer +Table.LabelRenderer +Table.Renderer +Table.selection.SelectionSet +TableChange +TableChanged +TableColumnsSelected +TableEvent +TableResized +TableRowsAdded +TableRowsRemoved +TableRowsSelected +TableStructureChanged +TableUpdated +TcpService +TcpServiceWorker +Tester +Text +TextArea +TextBuffer +TextComponent +TextComponent.Caret +TextComponent.HasColumns +TextComponent.HasRows +TextField +TickedScheduler +ToggleButton +TokenParsers +TokenTests +Tokens +Tokens.ErrorToken +Tokens.Token +Tree +TreeHashMap +TreeMap +TreeRHS +TreeSet +Tuple1 +Tuple10 +Tuple11 +Tuple12 +Tuple13 +Tuple14 +Tuple15 +Tuple16 +Tuple17 +Tuple18 +Tuple19 +Tuple2 +Tuple20 +Tuple21 +Tuple22 +Tuple3 +Tuple4 +Tuple5 +Tuple6 +Tuple7 +Tuple8 +Tuple9 +TypeConstraint +TypeSymbol +UIElement +UIEvent +UnavailableResourceException +UnbalancedTreeMap +UnbalancedTreeMap.Node +Undoable +UninitializedError +UninitializedFieldError +Unit +UnlinkFromFun +Unparsed +UnparsedEntityDecl +UnprefixedAttribute +Update +ValidatingMarkupHandler +ValidationException +ValueChanged +WeakHashMap +WeakReference +WindowActivated +WindowClosed +WindowClosing +WindowDeactivated +WindowDeiconified +WindowEvent +WindowIconified +WindowOpened +WordBerrySethi +WordExp +WordExp.Label +WordExp.Letter +WordExp.Wildcard +WorkerThread +WorkerThreadScheduler +XIncludeException +XIncludeFilter +XIncluder +XMLEvent +XMLEventReader +XMLEventReader.Parser +XhtmlParser +cloneable +deprecated +inline +jolib.Asynchr +jolib.Join +jolib.Signal +jolib.Synchr +native +noinline +pilib.Chan +pilib.GP +pilib.Product +pilib.Spawn +pilib.Sum +pilib.UChan +pilib.UGP +remote +serializable +throws +transient +unchecked +uncheckedStable +uncheckedVariance +unsealed +volatile +~ + +! +:: +ANY +Action +Action.NoAction +Action.Trigger +ActionEvent +Actor +ActorGC +Alignment +AnyHedgeRHS +AnyTreeRHS +Apply0 +Array +AttListDecl +AttrDecl +BackgroundChanged +Base.Eps +BigDecimal +BigDecimal.RoundingMode +BigInt +Binders.EmptyBinderEnv +Binders.UnderBinder +BorderPanel +BorderPanel.Position +Buffer +BufferedIterator +BufferedSource +ButtonApp +ButtonClicked +BytePickle +CaretUpdate +Cell +CelsiusConverter +CelsiusConverter2 +CharArrayReader +CharSequenceReader +Collection +ComboBox +ComboBox.selection +ComboBoxes +Comment +Component +Component.Mouse +ComponentAdded +ComponentHidden +ComponentMoved +ComponentRemoved +ComponentResized +ComponentShown +ConsRHS +Console +ConstructingParser +Container +ContentModel +ContentModel.Translator +ContentModelParser +Conversions +CountButton +DEFAULT +Debug +Dialog +Dialog.Message +Dialog.Options +Dialog.Result +Dialogs +DocBreak +DocCons +DocGroup +DocNest +DocNil +DocText +DocType +Document +ELEMENTS +EMPTY +EditDone +Either +Elem +ElemDecl +EmptyHedgeRHS +EncodingHeuristics +End +EntityRef +EvComment +EvElemEnd +EvElemStart +EvEntityRef +EvProcInstr +EvText +Exit +Expression +Expression.Root +Expression.WildcardTest +ExtDef +FatalError +FileChooser +FileChooser.Result +FileChooser.SelectionMode +FlowPanel +FlowPanel.Alignment +FocusGained +FocusLost +FontChanged +ForegroundChanged +FormattedTextField +FormattedTextField.FocusLostBehavior +FreshNameCreator +Function +Futures +GridBagDemo +GridBagPanel +GridBagPanel.Anchor +GridBagPanel.Fill +GridPanel +Group +HashMap +HashSet +HelloWorld +IMPLIED +Ident +ImmutableIterator +ImmutableIterator.Empty +Include +Index +IntDef +IntMap +Iterable +Iterator +JSON +Key +LabelledRHS +Left +LinkedHashMap +LinkedHashSet +List +ListChanged +ListElementsAdded +ListElementsRemoved +ListMap +ListSelectionChanged +ListSet +ListView +ListView.GenericRenderer +ListView.IntervalMode +ListView.Renderer +ListView.selection +ListView.selection.indices +ListView.selection.items +LocalApply0 +Location +Locator +LongMap +MIXED +Main +MakeValidationException +MalformedAttributeException +Map +Marshal +Math +MetaData +MouseClicked +MouseDragged +MouseEntered +MouseExited +MouseMoved +MousePressed +MouseReleased +MouseWheelMoved +MutableIterable +MutableIterator +MutableSeq +NA +NamedSend +Nil +NoPosition +Node +NodeSeq +None +NotationDecl +Null +Number +OffsetPosition +OpenHashMap +Option +Orientation +PCDATA +PCData +PEReference +PagedSeq +PagedSeqReader +ParameterEntityDecl +ParsedEntityDecl +Parsing +Platform +PointedHedgeExp.Point +Position +Predef +Predef.Pair +Predef.Triple +PrettyPrinter.Break +ProcInstr +Product1 +Product10 +Product11 +Product12 +Product13 +Product14 +Product15 +Product16 +Product17 +Product18 +Product19 +Product2 +Product20 +Product21 +Product22 +Product3 +Product4 +Product5 +Product6 +Product7 +Product8 +Product9 +Properties +PublicID +QNode +Queue +REQUIRED +RandomAccessSeq +Range +Reactions +RedBlack.Empty +Regex +Regex.Match +RegexTest +RemoteActor +RemoteApply0 +Remove +Reset +Responder +RichString +Right +SUnit +Scheduler +SelectionChanged +SendTo +Seq +SequentialContainer +Set +SimpleApplet.ui +Some +SortedMap +SortedSet +Sorting +Source +Stack +Start +Str +Stream +Stream.cons +Stream.lazy_:: +StreamReader +StringBuilder +Swing +Swing.EmptyIcon +Swing.Lowered +Swing.Raised +SwingApp +Symbol +SystemID +TIMEOUT +TabbedPane +TabbedPane.Layout +TabbedPane.pages +TabbedPane.selection +Table +Table.AutoResizeMode +Table.ElementMode +Table.IntervalMode +Table.selection +Table.selection.columns +Table.selection.rows +TableChanged +TableColumnsSelected +TableResized +TableRowsAdded +TableRowsRemoved +TableRowsSelected +TableSelection +TableStructureChanged +TableUpdated +TcpService +Terminate +Text +TextBuffer +TextComponent +TextComponent.caret +Tokens.EOF +TopScope +TreeHashMap +TreeMap +TreeSet +Tuple1 +Tuple10 +Tuple11 +Tuple12 +Tuple13 +Tuple14 +Tuple15 +Tuple16 +Tuple17 +Tuple18 +Tuple19 +Tuple2 +Tuple20 +Tuple21 +Tuple22 +Tuple3 +Tuple4 +Tuple5 +Tuple6 +Tuple7 +Tuple8 +Tuple9 +UIDemo +UTF8Codec +UnbalancedTreeMap +UninitializedFieldError +Unparsed +UnparsedEntityDecl +Update +Utility +ValidationException +ValueChanged +WindowActivated +WindowClosed +WindowClosing +WindowDeactivated +WindowDeiconified +WindowIconified +WindowOpened +XML +Xhtml +XhtmlEntities +XhtmlParser +jolib +mkTilde +ops +pilib +~ + +ArrayIndexOutOfBoundsException +Character +Class +ClassCastException +Error +Exception +Function +IllegalArgumentException +IndexOutOfBoundsException +Integer +Map +NoSuchElementException +NullPointerException +NumberFormatException +Pair +Runnable +RuntimeException +Set +String +StringIndexOutOfBoundsException +Throwable +Triple +Tuple +UnsupportedOperationException +any2ArrowAssoc +any2Ensuring +any2stringadd +assert +assume +boolean +boolean2Boolean +booleanWrapper +byte +byte2Byte +byte2double +byte2float +byte2int +byte2long +byte2short +byteWrapper +char +char2Character +char2double +char2float +char2int +char2long +charWrapper +classOf +currentThread +double +double2Double +doubleWrapper +error +exceptionWrapper +exit +float +float2Float +float2double +floatWrapper +forceArrayProjection +forceRandomAccessCharSeq +format +identity +int +int2Integer +int2double +int2float +int2long +intWrapper +iterable2ordered +lazyStreamToConsable +long +long2Long +long2double +long2float +longWrapper +print +printf +println +readBoolean +readByte +readChar +readDouble +readFloat +readInt +readLine +readLong +readShort +readf +readf1 +readf2 +readf3 +require +seqToCharSequence +short +short2Short +short2double +short2float +short2int +short2long +shortWrapper +stringBuilderWrapper +stringWrapper +tuple22ordered +tuple32ordered +tuple42ordered +tuple52ordered +tuple62ordered +tuple72ordered +tuple82ordered +tuple92ordered +unit +unit2ordered diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/dict/scheme-mode b/.emacs.d/elpa/auto-complete-20201213.1255/dict/scheme-mode new file mode 100644 index 0000000..e5cca61 --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/dict/scheme-mode @@ -0,0 +1,216 @@ +case-lambda +call/cc +class +define-class +exit-handler +field +import +inherit +init-field +interface +let*-values +let-values +let/ec +mixin +opt-lambda +override +protect +provide +public +rename +require +require-for-syntax +syntax +syntax-case +syntax-error +unit/sig +unless +when +with-syntax +and +begin +call-with-current-continuation +call-with-input-file +call-with-output-file +case +cond +define +define-syntax +delay +do +dynamic-wind +else +for-each +if +lambda +let +let* +let-syntax +letrec +letrec-syntax +map +or +syntax-rules +abs +acos +angle +append +apply +asin +assoc +assq +assv +atan +boolean? +caar +cadr +call-with-input-file +call-with-output-file +call-with-values +car +cdddar +cddddr +cdr +ceiling +char->integer +char-alphabetic? +char-ci<=? +char-ci<? +char-ci=? +char-ci>=? +char-ci>? +char-downcase +char-lower-case? +char-numeric? +char-ready? +char-upcase +char-upper-case? +char-whitespace? +char<=? +char<? +char=? +char>=? +char>? +char? +close-input-port +close-output-port +complex? +cons +cos +current-input-port +current-output-port +denominator +display +eof-object? +eq? +equal? +eqv? +eval +even? +exact->inexact +exact? +exp +expt +#f +floor +force +gcd +imag-part +inexact->exact +inexact? +input-port? +integer->char +integer? +interaction-environment +lcm +length +list +list->string +list->vector +list-ref +list-tail +list? +load +log +magnitude +make-polar +make-rectangular +make-string +make-vector +max +member +memq +memv +min +modulo +negative? +newline +not +null-environment +null? +number->string +number? +numerator +odd? +open-input-file +open-output-file +output-port? +pair? +peek-char +port? +positive? +procedure? +quasiquote +quote +quotient +rational? +rationalize +read +read-char +real-part +real? +remainder +reverse +round +scheme-report-environment +set! +set-car! +set-cdr! +sin +sqrt +string +string->list +string->number +string->symbol +string-append +string-ci<=? +string-ci<? +string-ci=? +string-ci>=? +string-ci>? +string-copy +string-fill! +string-length +string-ref +string-set! +string<=? +string<? +string=? +string>=? +string>? +string? +substring +symbol->string +symbol? +#t +tan +transcript-off +transcript-on +truncate +values +vector +vector->list +vector-fill! +vector-length +vector-ref +vector-set! diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/dict/sclang-mode b/.emacs.d/elpa/auto-complete-20201213.1255/dict/sclang-mode new file mode 100644 index 0000000..2b92135 --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/dict/sclang-mode @@ -0,0 +1,1481 @@ +A2K +A2K +abs +absdif +AbstractFunction +AbstractIn +AbstractOut +AbstractServerAction +acos +addition +Adverbs +AllpassC +AllpassL +AllpassN +amclip +AmpComp +AmpComp +AmpCompA +AmpCompA +ampdb +Amplitude +Amplitude +APF +AppClock +Archive +Array +Array2D +ArrayedCollection +asin +Assignment +Association +asTarget +atan +atan2 +AudioControl +AudioIn +audio_rate_mapping +AutoClassHelper +Bag +Balance2 +Balance2 +Ball +Ball +BAllPass +BAllPass +BasicOpUGen +basic_live_coding_techniques +BBandPass +BBandPass +BBandStop +BBandStop +BeatTrack +BeatTrack +BeatTrack +BeatTrack2 +BeatTrack2 +BeatTrack2 +BEQSuite +BEQSuite +BHiPass +BHiPass +BHiPass4 +BHiShelf +BHiShelf +BinaryOpFunction +BinaryOpStream +BinaryOpUGen +BiPanB2 +BiPanB2 +Blip +Blip +BLowPass +BLowPass +BLowPass4 +BLowShelf +BLowShelf +Boolean +BPeakEQ +BPeakEQ +BPF +BPF +BPZ2 +BPZ2 +BRF +BRF +BrownNoise +BrownNoise +BRZ2 +BRZ2 +BufAllpassC +BufAllpassL +BufAllpassN +BufChannels +BufChannels +BufCombC +BufCombL +BufCombN +BufDelayC +BufDelayL +BufDelayN +BufDur +BufDur +Buffer +Buffers +BufFrames +BufFrames +BufRateScale +BufRateScale +BufRd +BufRd +BufSampleRate +BufSampleRate +BufSamples +BufSamples +BufWr +BufWr +bundledCommands +Bus +BusPlug +Busses +Button +CCResponder +ceil +Changed +Changed +ChaosGen +Char +CheckBadValues +Class +Classes +ClassHelpTemplate +ClearBuf +ClientVsServer +Clip +Clip +clip2 +ClipNoise +ClipNoise +Clock +CmdPeriod +cmds +CocoaMenuItem +CoinGate +CoinGate +Collection +Collections +Color +CombC +CombL +CombN +Comments +Compander +Compander +CompanderD +Complex +CompositeView +Condition +ContiguousBlockAllocator +Control +Control-Structures +ControlDur +ControlName +ControlRate +ControlSpec +convertRhythm +Convolution +Convolution2 +Convolution2L +Convolution3 +cos +COsc +COsc +cosh +cpsmidi +cpsoct +Crackle +Crackle +Creating-Standalone-Applications +Crossplatform +CSVFileReader +cubed +CuspL +CuspL +CuspN +CuspN +Date +dbamp +Dbrown +Dbrown +Dbufrd +Dbufrd +Dbufwr +Dbufwr +DC +DC +Debugging-tips +DebugNodeWatcher +Decay +Decay +Decay2 +Decay2 +DecodeB2 +DecodeB2 +default_group +DegreeToKey +DegreeToKey +Delay1 +Delay2 +DelayC +DelayL +DelayN +DelTapRd +DelTapRd +DelTapWr +DelTapWr +Demand +Demand +DemandEnvGen +DemandEnvGen +DemandEnvGen +DetectIndex +DetectIndex +DetectSilence +DetectSilence +DetectSilence +Dgeom +Dgeom +Dialog +Dibrown +Dictionary +difsqr +DiskIn +DiskIn +DiskIn +DiskOut +DiskOut +DiskOut +distort +division +Diwhite +Document +DocumentAutoCompletion +Donce +Done +Done +DoubleArray +Dpoll +Dpoll +DragBoth +DragSink +DragSource +Drand +Drand +Dreset +Dreset +Dseq +Dseq +Dser +Dser +Dseries +Dseries +Dshuf +Dshuf +Dstutter +Dstutter +Dswitch +Dswitch +Dswitch1 +Dswitch1 +DUGen +Dunique +Dust +Dust +Dust2 +Dust2 +Duty +Duty +Dwhite +Dwhite +Dwrand +Dwrand +Dxrand +DynKlang +DynKlang +DynKlank +DynKlank +DynKlank +EmacsEditor +EmacsGUI +Env +EnvelopeView +EnvGate +EnvGen +EnvGen +EnvirGui +Environment +EnvironmentRedirect +Error +Event +EventPatternProxy +EventPatternProxy +EventStream +EventStreamPlayer +Event_types +Exception +excess +exp +exponentiation +ExpRand +ExpRand +ExpRand +Expression-Sequence +EZGui +EZKnob +EZLists +EZListView +EZNumber +EZPopUpMenu +EZRanger +EZScroller +EZSlider +EZText +False +FBSineC +FBSineC +FBSineL +FBSineL +FBSineN +FBSineN +Fdef +FFT +FFTTrigger +File +FileReader +Filter +FilterPattern +FilterPattern +Float +FloatArray +floor +FlowLayout +FlowView +Fold +Fold +fold2 +Font +Formant +Formant +Formlet +Formlet +FOS +FOS +frac +Frame +Free +Free +FreeSelf +FreeSelf +FreeSelfWhenDone +FreeSelfWhenDone +FreeVerb +FreeVerb2 +FreqScope +FreqScopeView +FreqShift +FreqShift +FreqShift +FSinOsc +FSinOsc +FuncFilterPattern +Function +FunctionDef +FunctionList +Functions +Gate +GbmanL +GbmanL +GbmanN +GbmanN +Gendy1 +Gendy1 +Gendy2 +Gendy2 +Gendy3 +Gendy3 +GeneralHID +GeneralHIDDevice +GeneralHIDSlot +GeneralHIDSpec +Glossary +Gradient +GrainBuf +GrainBuf +GrainFM +GrainIn +GrainSin +GrayNoise +GrayNoise +greaterorequalthan +greaterthan +Group +Groups +GUI +gui +GUI-Classes +GUI-Overview +GVerb +Harmonics +Hasher +Hasher +Help +HelpDocsLicensing +Helper +HelpSearchResult +HenonC +HenonC +HenonL +HenonL +HenonN +HenonN +HIDDeviceService +Hilbert +HilbertFIR +HiliteGradient +History +HistoryGui +HLayoutView +How-to-Use-the-Interpreter +HPF +HPF +HPZ1 +HPZ1 +HPZ2 +HPZ2 +hypot +hypotApx +IdentityBag +IdentityDictionary +IdentitySet +IEnvGen +IEnvGen +if +IFFT +Impulse +Impulse +In +Index +Index +IndexInBetween +IndexInBetween +IndexL +IndexL +InFeedback +Infinitum +initClass +InRange +InRange +InRect +InRect +Int16Array +Int32Array +Int8Array +Integer +Integrator +Integrator +Integrator +Internal-Snooping +InterplEnv +InterplPairs +InterplXYC +Interpreter +Interval +InTrig +Intro-to-Objects +Introductory_tutorial +IRand +IRand +IRand +isKindOf +isNegative +isPositive +isStrictlyPositive +JITGui +JITLib +jitlib_asCompileString +jitlib_basic_concepts_01 +jitlib_basic_concepts_02 +jitlib_basic_concepts_03 +jitlib_basic_concepts_04 +jitlib_efficiency +jitlib_fading +jitlib_networking +J_concepts_in_SC +K2A +K2A +KeyState +KeyState +KeyTrack +KeyTrack +Klang +Klang +Klang +Klank +Klank +Klank +Knob +Lag +Lag +Lag2 +Lag2 +Lag2UD +Lag2UD +Lag3 +Lag3 +Lag3UD +Lag3UD +LagControl +LagIn +LagUD +LagUD +LastValue +Latch +Latch +LatoocarfianC +LatoocarfianC +LatoocarfianL +LatoocarfianL +LatoocarfianN +LatoocarfianN +LazyEnvir +LeakDC +LeakDC +LeastChange +LeastChange +lessorequalthan +lessthan +LFClipNoise +LFClipNoise +LFCub +LFCub +LFDClipNoise +LFDClipNoise +LFDNoise0 +LFDNoise0 +LFDNoise1 +LFDNoise1 +LFDNoise3 +LFDNoise3 +LFGauss +LFGauss +LFNoise0 +LFNoise0 +LFNoise1 +LFNoise1 +LFNoise2 +LFNoise2 +LFPar +LFPar +LFPulse +LFPulse +LFSaw +LFSaw +LFTri +LFTri +Library +LibraryBase +Licensing +LID +Limiter +Limiter +LinCongC +LinCongC +LinCongL +LinCongL +LinCongN +LinCongN +Line +Line +Linen +Linen +LinExp +LinExp +LinkedList +LinkedListNode +LinLin +LinLin +LinPan2 +LinPan2 +LinRand +LinRand +LinRand +LinSelectX +Linux_udev_setup +LinXFade2 +LinXFade2 +List +ListComprehensions +ListDUGen +ListPattern +ListPattern +ListView +Literals +LocalBuf +LocalBuf +LocalIn +LocalOut +log +log10 +log2 +Logistic +Logistic +loop +LorenzL +LorenzL +Loudness +Loudness +LPF +LPF +LPZ1 +LPZ1 +LPZ2 +LPZ2 +Magnitude +Main +MantissaMask +MantissaMask +matchItem +max +MaxLocalBufs +MaxLocalBufs +Maybe +Median +Median +Method +Method-Calls +MFCC +MFCC +MidEQ +MidEQ +MIDI +midicps +MIDIIn +MIDIOut +MIDIResponder +min +Mix +modifiers +Modifying_Standalones +modulo +Monitor +MonitorGui +MoogFF +MoogFF +More-On-Getting-Help +MostChange +MostChange +MouseButton +MouseButton +MouseX +MouseX +MouseY +MouseY +MovieView +MulAdd +MultiChannel +MultiLevelIdentityDictionary +MultiOutUGen +multiplication +MultiSliderView +MultiTap +NamedControl +NAryOpFunction +NAryOpStream +Ndef +NdefGui +NdefMixer +NdefMixerOld +NdefParamGui +neg +NetAddr +Nil +Node +NodeControl +NodeEvent +NodeMap +NodeMessaging +NodeProxy +NodeProxyEditor +NodeProxy_roles +NodeWatcher +Non-Realtime-Synthesis +Normalizer +Normalizer +NoteOnResponder +Notes-on-the-HTML-Help-System +NotificationCenter +NRand +NRand +NRand +NumAudioBuses +Number +NumberBox +NumBuffers +NumControlBuses +NumInputBuses +NumOutputBuses +NumRunningSynths +Object +ObjectGui +ObjectTable +octcps +OffsetOut +OnePole +OnePole +OneZero +OneZero +Onsets +Onsets +Operators +Order +Order-of-execution +OrderedIdentitySet +Osc +Osc +OSCBundle +OscN +OscN +OSCpathResponder +OSCresponder +OSCresponderNode +OSC_communication +Out +OutputProxy +PAbstractGroup +PackFFT +Padd +Padd +Paddp +Paddp +Paddpre +Paddpre +Pair +Pan2 +Pan2 +Pan4 +Pan4 +PanAz +PanAz +PanB +PanB +PanB2 +PanB2 +Panner +PartConv +Partial-Application +PathName +Pattern +PatternConductor +PatternProxy +PatternProxy +PatternsDocumentedAndNot +Pause +Pause +PauseSelf +PauseSelf +PauseSelfWhenDone +Pavaroh +Pavaroh +Pbeta +Pbeta +Pbind +Pbind +Pbindef +Pbindef +Pbindf +Pbindf +PbindProxy +PbindProxy +Pbinop +Pbinop +Pbrown +Pbrown +Pbus +Pbus +Pcauchy +Pcauchy +Pchain +Pchain +Pclump +Pclutch +Pclutch +Pcollect +Pcollect +Pconst +Pconst +Pdef +Pdef +PdefAllGui +PdefEditor +PdefGui +Pdefn +Pdefn +PdegreeToKey +PdegreeToKey +Pdfsm +Pdfsm +Pdict +Pdict +Pdiff +Pdrop +PdurStutter +PdurStutter +Peak +Peak +PeakFollower +PeakFollower +Pen +Penvir +Penvir +Pevent +Peventmod +Pexprand +Pexprand +PfadeIn +PfadeOut +Pfin +Pfin +Pfindur +Pfindur +PfinQuant +Pfinval +Pfinval +Pflatten +Pflow +Pflow +Pfpar +Pfset +Pfset +Pfsm +Pfsm +Pfunc +Pfunc +Pfuncn +Pfuncn +Pfx +Pfx +Pfxb +Pfxb +Pgate +Pgate +Pgauss +Pgauss +Pgbrown +Pgbrown +Pgeom +Pgeom +Pget +Pgpar +Pgpar +Pgroup +Pgroup +Pgtpar +PG_01_Introduction +PG_02_Basic_Vocabulary +PG_03_What_Is_Pbind +PG_04_Words_to_Phrases +PG_05_Math_on_Patterns +PG_060_Filter_Patterns +PG_06a_Repetition_Contraint_Patterns +PG_06b_Time_Based_Patterns +PG_06c_Composition_of_Patterns +PG_06d_Parallel_Patterns +PG_06e_Language_Control +PG_06f_Server_Control +PG_06g_Data_Sharing +PG_07_Value_Conversions +PG_08_Event_Types_and_Parameters +PG_Cookbook01_Basic_Sequencing +PG_Cookbook02_Manipulating_Patterns +PG_Cookbook03_External_Control +PG_Cookbook04_Sending_MIDI +PG_Cookbook05_Using_Samples +PG_Cookbook06_Phrase_Network +PG_Cookbook07_Rhythmic_Variations +PG_Ref01_Pattern_Internals +Phasor +Phasor +Phid +Phid +PhidKey +PhidKey +PhidSlot +PhidSlot +Phprand +Phprand +Pif +Pif +Pindex +Pindex +PingPong +PinkerNoise +PinkNoise +PinkNoise +Pipe +Pitch +Pitch +Pitch +PitchShift +PitchShift +Pkey +Pkey +Place +Place +Plag +Plambda +Plambda +Platform +play +PlayBuf +PlayBuf +playN +Plazy +Plazy +PlazyEnvir +PlazyEnvir +PlazyEnvirN +PlazyEnvirN +Plet +plot +Plotter +Plprand +Plprand +Pluck +Pluck +Pmeanrand +Pmeanrand +Pmono +Pmono +PmonoArtic +PmonoArtic +PMOsc +PMOsc +Pmul +Pmul +Pmulp +Pmulp +Pmulpre +Pmulpre +Pn +Pn +Pnaryop +Pnaryop +Pnsym +Pnsym +Pnsym1 +Point +Polar +Poll +Poll +Polymorphism +PopUpMenu +Post +pow +Ppar +Ppar +PparGroup +Ppatlace +Ppatlace +Ppatmod +Ppatmod +Pplayer +Ppoisson +Ppoisson +Pprob +Pprob +Pprotect +Pprotect +Pproto +Pproto +Prand +Prand +Preject +Preject +Prewrite +Prewrite +PriorityQueue +Process +Prorate +Prorate +Prout +Prout +Proutine +Proutine +ProxyMixer +ProxyMixerOld +ProxyMonitorGui +ProxySpace +proxyspace_examples +ProxySynthDef +Pseed +Pseed +Pseg +Pseg +Pselect +Pselect +Pseq +Pseq +Pser +Pser +Pseries +Pseries +Pset +Pset +Psetp +Psetp +Psetpre +Psetpre +Pshuf +Pshuf +PSinGrain +Pslide +Pslide +Pspawn +Pspawn +Pspawner +Pspawner +Pstep +Pstep +Pstep2add +Pstep3add +PstepNadd +PstepNadd +PstepNfunc +PstepNfunc +Pstretch +Pstretchp +Pstutter +Pstutter +Pswitch +Pswitch +Pswitch1 +Pswitch1 +Psym +Psym +Psym1 +Psync +Psync +Ptime +Ptime +Ptpar +Ptpar +Ptrace +Ptsym +Ptuple +Ptuple +publishing_code +Pulse +Pulse +PulseCount +PulseDivider +Punop +Punop +pvcalc +pvcalc2 +pvcollect +PV_Add +PV_BinScramble +PV_BinShift +PV_BinWipe +PV_BrickWall +PV_ChainUGen +PV_ChainUGen +PV_ConformalMap +PV_Conj +PV_Copy +PV_CopyPhase +PV_Diffuser +PV_Div +PV_HainsworthFoote +PV_JensenAndersen +PV_LocalMax +PV_MagAbove +PV_MagBelow +PV_MagClip +PV_MagDiv +PV_MagFreeze +PV_MagMul +PV_MagNoise +PV_MagShift +PV_MagSmear +PV_MagSquared +PV_Max +PV_Min +PV_Mul +PV_PhaseShift +PV_PhaseShift270 +PV_PhaseShift90 +PV_RandComb +PV_RandWipe +PV_RectComb +PV_RectComb2 +Pwalk +Pwalk +Pwhile +Pwhile +Pwhite +Pwhite +Pwrand +Pwrand +Pwrap +Pwrap +Pxrand +Pxrand +QuadC +QuadC +QuadL +QuadL +QuadN +QuadN +Quant +Quark +Quarks +RadiansPerSample +Ramp +Ramp +Rand +Rand +Rand +RandID +RandID +Randomness +randomSeed +RandSeed +RandSeed +RangeSlider +RawArray +RawPointer +reciprocal +RecNodeProxy +RecordBuf +RecordBuf +Rect +recursive_phrasing +Ref +RefCopy +Regenerate-GUI-Help +ReplaceOut +resize +Resonz +Resonz +RHPF +RHPF +ring1 +ring2 +ring3 +ring4 +Ringz +Ringz +RLPF +RLPF +RootNode +Rossler +Rotate2 +Rotate2 +round +Routine +runMe +runMe2 +RunningMax +RunningMax +RunningMin +RunningMin +RunningSum +RunningSum +SampleDur +SampleRate +Saw +Saw +SC2DSlider +SC2DTabletSlider +Scale +scaleneg +SCButton +SCCompositeView +SCContainerView +SCControlView +SCDragBoth +SCDragSink +SCDragSource +SCDragView +SCEnvelopeEdit +SCEnvelopeView +SCFont +SCFreqScope +SCFreqScopeWindow +Scheduler +SCHLayoutView +Schmidt +Schmidt +SCImage +SCImageFilter +SCImageKernel +SCKnob +SCLayoutView +SCLevelIndicator +SCListView +SCMenuGroup +SCMenuItem +SCMenuSeparator +SCModalSheet +SCModalWindow +SCMovieView +SCMultiSliderView +SCNumberBox +Scope +ScopeOut +ScopeOut2 +ScopeView +Score +SCPen +SCPopUpMenu +SCQuartzComposerView +SCRangeSlider +ScrollView +SCScope +SCScrollTopView +SCScrollView +SCSlider +SCSliderBase +SCSoundFileView +SCStaticText +SCStaticTextBase +SCStethoscope +SCTabletView +SCTextField +SCTextView +SCTopView +SCUserView +SCUserView-Subclassing +SCView +SCVLayoutView +SCWindow +Select +Select +SelectX +SelectX +SelectXFocus +SelectXFocus +Semaphore +SendPeakRMS +SendReply +SendTrig +SequenceableCollection +SerialPort +Server +Server-Architecture +Server-Command-Reference +ServerBoot +ServerOptions +ServerQuit +ServerTiming +ServerTree +Set +SetBuf +SetResetFF +Shaper +Shaper +SharedIn +SharedOut +Shortcuts +sign +Signal +Silent +Silent +SimpleController +SimpleNumber +sin +sinh +SinOsc +SinOsc +SinOscFB +SkipJack +Slew +Slew +Slider +Slider2D +Slope +Slope +Slope +softclip +softPut +softSet +softVol_ +somepage +SortedList +SOS +SOS +SoundFile +SoundFileView +SoundFileViewProgressWindow +SoundIn +SparseArray +Spawner +Spec +SpecCentroid +SpecCentroid +SpecFlatness +SpecFlatness +SpecPcile +SpecPcile +Splay +SplayAz +SplayZ +Spring +Spring +sqrdif +sqrsum +sqrt +squared +StandardL +StandardL +StandardN +StandardN +StartUp +StaticText +Stepper +StereoConvolution2L +Stethoscope +Stream +StreamClutch +Streams +Streams-Patterns-Events1 +Streams-Patterns-Events2 +Streams-Patterns-Events3 +Streams-Patterns-Events4 +Streams-Patterns-Events5 +Streams-Patterns-Events6 +Streams-Patterns-Events7 +String +StubTemplate +SubsampleOffset +subtraction +sumsqr +Sweep +switch +Symbol +SymbolArray +SymbolicNotations +SyncSaw +SyncSaw +Syntax-Shortcuts +Synth +Synth-Controlling-UGens +Synth-Definition-File-Format +SynthDef +SynthDesc +SynthDescLib +SystemClock +T2A +T2A +T2K +T2K +TabFileReader +TabletSlider2D +TabletView +tan +tanh +Tap +Tap +Task +TaskProxy +TaskProxy +TaskProxyGui +TBall +TBall +TChoose +Tdef +Tdef +TdefAllGui +TdefEditor +TdefGui +TDelay +TDelay +TDuty +TDuty +TempoBusClock +TempoClock +TExpRand +TExpRand +TextField +TextView +TGrains +TGrains +TGrains +the_lazy_proxy +Thread +thresh +Thunk +Timer +TIRand +TIRand +ToggleFF +TopicHelpTemplate +Tour_of_UGens +TRand +TRand +Trig +Trig1 +TrigControl +True +trunc +Tuning +Tutorial +TWChoose +TWChoose +TWindex +TWindex +TwoPole +TwoPole +TwoWayIdentityDictionary +TwoZero +TwoZero +UGen +UGen-doneActions +UGenHelpTemplate +UGens +UGens-and-Synths +UnaryOpFunction +UnaryOpStream +UnaryOpUGen +Understanding-Errors +Undocumented-Classes +UniqueID +UnixFILE +Unpack1FFT +UnpackFFT +UserView +Using-Extensions +Using-the-Startup-File +UsingMIDI +VarLag +VarSaw +VarSaw +VDiskIn +VDiskIn +VDiskIn +Vibrato +View +ViewRedirect +VLayoutView +Volume +VOsc +VOsc +VOsc3 +VOsc3 +Warp +Warp1 +Warp1 +Warp1 +Wavetable +WhiteNoise +WhiteNoise +WidthFirstUGen +WiiMote +WikiUsage +Window +Wrap +Wrap +wrap2 +WrapIndex +WrapIndex +Writing-Classes +Writing_Unit_Generators +XFade +XFade2 +XFade2 +XLine +XLine +XOut +ZeroCrossing +ZeroCrossing diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/dict/sh-mode b/.emacs.d/elpa/auto-complete-20201213.1255/dict/sh-mode new file mode 100644 index 0000000..df66ae3 --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/dict/sh-mode @@ -0,0 +1,182 @@ +# Bash Family Shell Dictionary +# http://www.gnu.org/software/bash/manual/bash.html + +. +: +[ +alias +bg +bind +break +builtin +caller +cd +command +compgen +complete +compopt +continue +declare +dirs +disown +echo +enable +eval +exec +exit +export +fc +fg +getopts +hash +help +history +jobs +kill +let +local +logout +mapfile +popd +printf +pushd +pwd +read +readarray +readonly +return +set +shift +shopt +source +suspend +test +times +trap +type +typeset +ulimit +umask +unalias +unset +wait +! +[[ +]] +case +do +done +elif +else +esac +fi +for +function +if +in +select +then +time +until +while +{ +} +! +# +$ +* +- +0 +? +@ +_ +BASH +BASH_ALIASES +BASH_ARGC +BASH_ARGV +BASH_CMDS +BASH_COMMAND +BASH_ENV +BASH_EXECUTION_STRING +BASH_LINENO +BASH_REMATCH +BASH_SOURCE +BASH_SUBSHELL +BASH_VERSINFO +BASH_VERSION +BASH_XTRACEFD +BASHOPTS +BASHPID +CDPATH +COLUMNS +COMP_CWORD +COMP_KEY +COMP_LINE +COMP_POINT +COMP_TYPE +COMP_WORDBREAKS +COMP_WORDS +COMPREPLY +DIRSTACK +EMACS +EUID +FCEDIT +FIGNORE +FUNCNAME +GLOBIGNORE +GROUPS +HISTCMD +HISTCONTROL +HISTFILE +HISTFILESIZE +HISTIGNORE +HISTSIZE +HISTTIMEFORMAT +HOME +HOSTFILE +HOSTNAME +HOSTTYPE +IFS +IGNOREEOF +INPUTRC +LANG +LC_ALL +LC_COLLATE +LC_CTYPE +LC_MESSAGES +LC_MESSAGES +LC_NUMERIC +LINENO +LINES +MACHTYPE +MAIL +MAILCHECK +MAILPATH +OLDPWD +OPTARG +OPTERR +OPTIND +OSTYPE +PATH +PIPESTATUS +POSIXLY_CORRECT +PPID +PROMPT_COMMAND +PROMPT_DIRTRIM +PS1 +PS2 +PS3 +PS4 +PWD +RANDOM +REPLY +SECONDS +SHELL +SHELLOPTS +SHLVL +TEXTDOMAIN +TEXTDOMAINDIR +TIMEFORMAT +TMOUT +TMPDIR +UID diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/dict/swift-mode b/.emacs.d/elpa/auto-complete-20201213.1255/dict/swift-mode new file mode 100644 index 0000000..ab121e0 --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/dict/swift-mode @@ -0,0 +1,87 @@ +associatedtype +class +deinit +enum +extension +func +import +init +inout +let +operator +precedencegroup +protocol +struct +subscript +typealias +var +fileprivate +internal +private +public +static +undef +sil +sil_stage +sil_vtable +sil_global +sil_witness_table +sil_default_witness_table +sil_coverage_map +sil_scope +defer +if +guard +do +repeat +else +for +in +while +return +break +continue +fallthrough +switch +case +default +where +catch +as +Any +false +is +nil +rethrows +super +self +Self +throw +true +try +throws +__FILE__ +__LINE__ +__COLUMN__ +__FUNCTION__ +__DSO_HANDLE__ +_ +#if +#else +#elseif +#endif +#keyPath +#line +#sourceLocation +#selector +#available +#fileLiteral +#imageLiteral +#colorLiteral +#FileReference +#Image +#Color +#file +#column +#function +#dsohandle diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/dict/tcl-mode b/.emacs.d/elpa/auto-complete-20201213.1255/dict/tcl-mode new file mode 100644 index 0000000..07a1281 --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/dict/tcl-mode @@ -0,0 +1,172 @@ +after +append +apply +array +auto_execok +auto_import +auto_load +auto_load_index +auto_mkindex +auto_mkindex_old +auto_qualify +auto_reset +bell +binary +bind +bindtags +break +button +canvas +case +catch +cd +chan +checkbutton +clipboard +clock +close +concat +continue +destroy +dict +encoding +entry +eof +error +eval +event +exec +exit +expr +fblocked +fconfigure +fcopy +file +fileevent +flush +focus +font +for +foreach +format +frame +gets +glob +global +grab +grid +if +image +incr +info +interp +join +label +labelframe +lappend +lassign +lindex +linsert +list +listbox +llength +load +lower +lrange +lrepeat +lreplace +lreverse +lsearch +lset +lsort +menu +menubutton +message +namespace +open +option +pack +package +panedwindow +pid +pkg_mkIndex +place +proc +puts +pwd +radiobutton +raise +read +regexp +registry +regsub +rename +return +scale +scan +scrollbar +seek +selection +set +socket +source +spinbox +split +string +subst +switch +tclLog +tclPkgSetup +tclPkgUnknown +tcl_findLibrary +tell +text +time +tk +tk_chooseColor +tk_chooseDirectory +tk_getOpenFile +tk_getSaveFile +tk_menuSetFocus +tk_messageBox +tk_popup +tk_textCopy +tk_textCut +tk_textPaste +tkwait +toplevel +ttk::button +ttk::checkbutton +ttk::combobox +ttk::entry +ttk::focusFirst +ttk::frame +ttk::label +ttk::labelframe +ttk::menubutton +ttk::notebook +ttk::paned +ttk::panedwindow +ttk::progressbar +ttk::radiobutton +ttk::scale +ttk::scrollbar +ttk::separator +ttk::setTheme +ttk::sizegrip +ttk::style +ttk::takefocus +ttk::themes +ttk::treeview +trace +unknown +unload +unset +update +uplevel +upvar +variable +vwait +while +winfo +wm diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/dict/ts-mode b/.emacs.d/elpa/auto-complete-20201213.1255/dict/ts-mode new file mode 100644 index 0000000..ffe377f --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/dict/ts-mode @@ -0,0 +1,797 @@ +absRefPrefix +accessibility +accessibilityWrap +accessKey +ACT +ACTIFSUB +ACTIVSUBRO +ACTRO +addAttributes +addExtUrlsAndShortCuts +additionalHeaders +additionalParams +addParams +addQueryString +addQueryString +adjustItemsH +adjustSubItemsH +adminPanelStyles +after +age +align +align.field +all +allowedAttribs +allowedGroups +allowEdit +allowNew +allowTags +allStdWrap +allWrap +alternativeSortingField +alternativeTempPath +altImgResource +altTarget +altText +alwaysActivePIDlist +alwaysLink +andWhere +angle +antiAlias +append +applyTotalH +applyTotalW +arrayReturnMode +arrowACT +arrowImgParams +arrowNO +ATagBeforeWrap +ATagParams +ATagTitle +atLeast +atMost +authcodeFields +autoInsertPID +autostart +backColor +badMess +base64 +baseURL +beforeImg +beforeImgLink +beforeImgTagParams +beforeROImg +beforeWrap +begin +begin +beginAtLevel +beLoginLinkIPList +beLoginLinkIPList_login +beLoginLinkIPList_logout +beUserLogin +bgImg +blankStrEqFalse +blur +bm +bodyTag +bodyTag +bodyTagAdd +bodyTagCObject +bodyTagMargins +border +border +borderCol +bordersWithin +borderThick +bottomContent +bottomHeight +br +breakSpace +breakWidth +brTag +bytes +c +cache_clearAtMidnight +cached +cache_period +caption +captionAlign +captionSplit +case +case +CASE +casesensitiveComp +cellpadding +cellspacing +char +charcoal +clearCacheOfPages +cMargins +COA +COA_INT +cObject +cObjNum +code +collapse +color +color1 +color2 +color3 +color.default +color.field +colRelations +cols +cols +colSpace +COLUMNS +COMMENT +commentWrap +compensateFieldWidth +compX +compY +concatenateJsAndCss +conf +config +config +CONFIG +constants +CONTENT +content_fallback +content_from_pid_allowOutsideDomain +controllerActionName +controllerExtensionName +controllerName +crop +cropHTML +csConv +cssInline +CSS_inlineStyle +CTABLE +CUR +CURIFSUB +CURIFSUBRO +current +CURRO +cWidth +data +dataArray +dataWrap +date +debug +debugData +debugFunc +debugItemConf +debugRenumberedObject +decimals +dec_point +default +defaultAlign +defaultCmd +defaultCode +defaultGetVars +delete +denyTags +depth +dimensions +directImageLink +directionLeft +directionUp +directReturn +disableAllHeaderCode +disableAltText +disableCharsetHeader +disableImgBorderAttr +disablePageExternalUrl +disablePrefixComment +disablePreviewNotification +displayActiveOnLoad +displayActiveOnLoad +displayrecord +distributeX +distributeY +doctype +doctypeSwitch +doNotLinkIt +doNotShowLink +doNotStripHTML +dontCheckPid +dontFollowMouse +dontHideOnMouseUp +dontLinkIfSubmenu +dontMd5FieldNames +dontWrapInTable +doubleBrTag +doublePostCheck +dWorkArea +edge +edit +editIcons +editIcons +editPanel +EDITPANEL +EDITPANEL +effects +email +emailMess +emboss +emptyTitleHandling +emptyTitleHandling +emptyTitleHandling +enable +enableContentLengthHeader +encapsLines +encapsLinesStdWrap +encapsTagList +entryLevel +equalH +equals +evalErrors +evalFunc +excludeDoktypes +excludeNoSearchPages +excludeUidList +expAll +explode +ext +extbase +externalBlocks +extOnReady +extTarget +face.default +face.field +FEData +fe_userEditSelf +fe_userOwnSelf +field +fieldPrefix +fieldRequired +fieldWrap +file +FILE +filelink +fileList +fileTarget +firstLabel +firstLabelGeneral +flip +flop +foldSpeed +foldTimer +fontFile +fontSize +fontSizeMultiplicator +fontTag +footerData +forceAbsoluteUrl +forceTypeValue +FORM +format +formName +formurl +frame +frameReloadIfNotInFrameset +frameSet +freezeMouseover +ftu +gamma +gapBgCol +gapLineCol +gapLineThickness +gapWidth +gif +GIFBUILDER +globalNesting +GMENU +goodMess +gray +gr_list +groupBy +headerComment +headerData +headTag +height +hiddenFields +hide +hideButCreateMap +hideMenuTimer +hideMenuWhenNotOver +hideNonTranslated +highColor +HMENU +hover +hoverStyle +HRULER +HTML +html5 +htmlmail +HTMLparser +htmlSpecialChars +htmlTag_dir +htmlTag_langKey +htmlTag_setParams +http +icon +iconCObject +icon_image_ext_list +icon_link +icon_thumbSize +if +ifBlank +ifEmpty +IFSUB +IFSUBRO +ignore +IMAGE +image_compression +image_effects +image_frames +imgList +imgMap +imgMapExtras +imgMax +imgNameNotRandom +imgNamePrefix +imgObjNum +imgParams +imgPath +imgStart +IMGTEXT +import +inBranch +includeCSS +includeJS +includeJSFooter +includeJSFooterlibs +includeJSlibs +includeLibrary +includeLibs +includeNotInMenu +incT3Lib_htmlmail +index_descrLgd +index_enable +index_externals +index_metatags +infomail +inlineJS +inlineLanguageLabel +inlineSettings +inlineStyle2TempFile +innerStdWrap_all +innerWrap +innerWrap2 +inputLevels +insertClassesFromRTE +insertData +intensity +intTarget +intval +invert +IProcFunc +isFalse +isGreaterThan +isInList +isLessThan +isPositive +isTrue +itemArrayProcFunc +items +iterations +javascriptLibs +join +jpg +jsFooterInline +jsInline +JSMENU +JSwindow +JSwindow.altUrl +JSwindow.altUrl_noDefaultParams +JSwindow.expand +JSwindow.newWindow +JSwindow_params +jumpurl +jumpurl_enable +jumpurl_mailto_disable +keep +keepNonMatchedTags +keywords +keywordsField +labelStdWrap +labelWrap +lang +language +language_alt +languageField +layer_menu_id +layerStyle +layout +layoutRootPath +leftjoin +leftOffset +levels +limit +lineColor +lineThickness +linkAccessRestrictedPages +linkParams +linkVars +linkWrap +list +listNum +lm +LOAD_REGISTER +locale_all +localNesting +locationData +lockFilePath +lockPosition +lockPosition_addSelf +lockPosition_adjust +loginUser +longdescURL +loop +lowColor +lower +mailto +main +mainScript +makelinks +markers +markerWrap +mask +max +maxAge +maxH +maxHeight +maxItems +maxW +maxWidth +maxWInText +m.bgImg +m.bottomImg +m.bottomImg_mask +md5 +meaningfulTempFilePrefix +menuBackColor +menuHeight +menuOffset +menuWidth +message_page_is_being_generated +message_preview +message_preview_workspace +meta +metaCharset +method +minH +minifyCSS +minifyJS +minItems +minItems +minW +m.mask +moveJsFromHeaderToFooter +MP_defaults +MP_disableTypolinkClosestMPvalue +MP_mapRootPoints +MULTIMEDIA +name +namespaces +negate +newRecordFromTable +newRecordInPid +next +niceText +NO +noAttrib +noBlur +no_cache +noCols +noLink +noLinkUnderline +nonCachedSubst +none +nonTypoTagStdWrap +nonTypoTagUserFunc +nonWrappedTag +noOrderBy +noPageTitle +noResultObj +normalWhenNoLanguage +noRows +noScale +noScaleUp +noscript +noStretchAndMarginCells +notification_email_charset +notification_email_encoding +notification_email_urlmode +noTrimWrap +noValueInsert +noWrapAttr +numberFormat +numRows +obj +offset +offset +_offset +offsetWrap +onlyCurrentPid +opacity +options +orderBy +OTABLE +outerWrap +outline +output +outputLevels +override +overrideAttribs +overrideEdit +overrideId +PAGE +pageGenScript +pageRendererTemplateFile +pageTitleFirst +parameter +params +parseFunc +parseFunc +parseValues +partialRootPath +path +pidInList +pixelSpaceFontSizeRef +plainTextStdWrap +pluginNames +png +postCObject +postUserFunc +postUserFunkInt +preCObject +prefixComment +prefixLocalAnchors +prefixLocalAnchors +prefixRelPathWith +preIfEmptyListNum +prepend +preUserFunc +prev +previewBorder +printBeforeContent +prioriCalc +processScript +properties +protect +protectLvar +quality +quality +radioInputWrap +radioWrap +range +range +rawUrlEncode +recipient +RECORDS +recursive +redirect +reduceColors +relativeToParentLayer +relativeToTriggerItem +relPathPrefix +remap +remapTag +removeBadHTML +removeDefaultJS +removeIfEquals +removeIfFalse +removeObjectsOfDummy +removePrependedNumbers +removeTags +removeWrapping +renderCharset +renderObj +renderWrap +REQ +required +required +resources +resultObj +returnKey +returnLast +reverseOrder +rightjoin +rm +rmTagIfNoAttrib +RO_chBgColor +rootline +rotate +rows +rowSpace +sample +sample +section +sectionIndex +select +sendCacheHeaders +sendCacheHeaders_onlyWhenLoginDeniedInBranch +separator +setContentToCurrent +setCurrent +setfixed +setFixedHeight +setFixedWidth +setJS_mouseOver +setJS_openPic +setKeywords +shadow +sharpen +shear +short +shortcutIcon +showAccessRestrictedPages +showActive +showFirst +simulateStaticDocuments +simulateStaticDocuments_addTitle +simulateStaticDocuments_dontRedirectPathInfoError +simulateStaticDocuments_noTypeIfNoTitle +simulateStaticDocuments_pEnc +simulateStaticDocuments_pEnc_onlyP +simulateStaticDocuments_replacementChar +sitetitle +size +size.default +size.field +slide +smallFormFields +solarize +source +space +spaceAfter +spaceBefore +spaceBelowAbove +spaceLeft +spaceRight +spacing +spamProtectEmailAddresses +spamProtectEmailAddresses_atSubst +spamProtectEmailAddresses_lastDotSubst +SPC +special +split +splitRendering +src +stat +stat_apache +stat_apache_logfile +stat_apache_niceTitle +stat_apache_noHost +stat_apache_noRoot +stat_apache_notExtended +stat_apache_pagenames +stat_excludeBEuserHits +stat_excludeIPList +stat_mysql +stat_pageLen +stat_titleLen +stat_typeNumList +stayFolded +stdWrap +stdWrap2 +strftime +stripHtml +stripProfile +stylesheet +submenuObjSuffixes +subMenuOffset +subparts +subst_elementUid +subst_elementUid +substMarksSeparately +substring +swirl +sword +sword_noMixedCase +sword_standAlone +sys_language_mode +sys_language_overlay +sys_language_softExclude +sys_language_softMergeIfNotBlank +sys_language_uid +sys_page +table +tableParams +tables +tableStdWrap +tableStyle +tags +target +TCAselectItem +TDparams +template +TEMPLATE +templateFile +text +TEXT +textMargin +textMargin_outOfText +textMaxLength +textObjNum +textPos +textStyle +thickness +thousands_sep +title +titleTagFunction +titleText +titleText +tm +TMENU +token +topOffset +totalWidth +transparentBackground +transparentColor +trim +twice +typeNum +types +typolink +typolinkCheckRootline +typolinkEnableLinksAcrossDomains +typolinkLinkAccessRestrictedPages +typolinkLinkAccessRestrictedPages_addParams +uid +uidInList +uniqueGlobal +uniqueLinkVars +uniqueLocal +unset +unsetEmpty +upper +url +useCacheHash +useLargestItemX +useLargestItemY +USER +USERDEF1 +USERDEF1RO +USERDEF2RO +USERFEF2 +userFunc +userFunc_updateArray +userIdColumn +USER_INT +USERNAME_substToken +USERUID_substToken +USR +USRRO +value +variables +wave +where +width +wordSpacing +workArea +workOnSubpart +wrap +wrap2 +wrap3 +wrapAlign +wrapFieldName +wrapItemAndSub +wrapNoWrappedLines +wraps +xhtml_11 +xhtml_2 +xhtml_basic +xhtml_cleaning +xhtmlDoctype +xhtml_frames +xhtml+rdfa_10 +xhtml_strict +xhtml_trans +xml_10 +xml_11 +xmlprologue +xPosOffset +yPosOffset diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/dict/tuareg-mode b/.emacs.d/elpa/auto-complete-20201213.1255/dict/tuareg-mode new file mode 100644 index 0000000..e709f9f --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/dict/tuareg-mode @@ -0,0 +1,231 @@ +# OCaml 3.12.1 + +# Keywords +and +as +assert +begin +class +constraint +do +done +downto +else +end +exception +external +false +for +fun +function +functor +if +in +include +inherit +initializer +lazy +let +match +method +module +mutable +new +object +of +open +or +private +rec +sig +struct +then +to +true +try +type +val +virtual +when +while +with + +# Pervasives +! +!= +& +&& +* +** +*. ++ ++. +- +-. +/ +/. +:= +< +<= +<> += +== +> +>= +@ +FP_infinite +FP_nan +FP_normal +FP_subnormal +FP_zero +LargeFile +Open_append +Open_binary +Open_creat +Open_nonblock +Open_rdonly +Open_text +Open_trunc +Open_wronly +Oupen_excl +^ +^^ +abs +abs_float +acos +asin +asr +at_exit +atan +atan2 +bool_of_string +ceil +char_of_int +classify_float +close_in +close_in_noerr +close_out +close_out_noerr +compare +cos +cosh +decr +do_at_exit +epsilon_float +exit +exp +expm1 +failwith +float +float_of_int +float_of_string +floor +flush +flush_all +format +format4 +format_of_string +fpclass +frexp +fst +ignore +in_channel +in_channel_length +incr +infinity +input +input_binary_int +input_byte +input_char +input_line +input_value +int_of_char +int_of_float +int_of_string +invalid_arg +land +ldexp +lnot +log +log10 +log1p +lor +lsl +lsr +lxor +max +max_float +max_int +min +min_float +min_int +mod +mod_float +modf +nan +neg_infinity +not +open_flag +open_in +open_in_bin +open_in_gen +open_out +open_out_bin +open_out_gen +or +out_channel +out_channel_length +output +output_binary_int +output_byte +output_char +output_string +output_value +pos_in +pos_out +pred +prerr_char +prerr_endline +prerr_float +prerr_int +prerr_newline +prerr_string +print_char +print_endline +print_float +print_int +print_newline +print_string +raise +read_float +read_int +read_line +really_input +ref +seek_in +seek_out +set_binary_mode_in +set_binary_mode_out +sin +sinh +snd +sqrt +stderr +stdin +stdout +string_of_bool +string_of_float +string_of_format +string_of_int +succ +tan +tanh +truncate +unsafe_really_input +valid_float_lexem +|| +~ +~+ +~+. +~- +~-. diff --git a/.emacs.d/elpa/auto-complete-20201213.1255/dict/verilog-mode b/.emacs.d/elpa/auto-complete-20201213.1255/dict/verilog-mode new file mode 100644 index 0000000..acc2f32 --- /dev/null +++ b/.emacs.d/elpa/auto-complete-20201213.1255/dict/verilog-mode @@ -0,0 +1,313 @@ +`define +`else +`endif +`ifdef +`ifndef +`macromodule +`module +`primitive +`timescale +above +abs +absdelay +ac_stim +acos +acosh +alias +aliasparam +always +always_comb +always_ff +always_latch +analog +analysis +and +asin +asinh +assert +assign +assume +atan +atan2 +atanh +automatic +before +begin +bind +bins +binsof +bit +branch +break +buf +bufif0 +bufif1 +byte +case +casex +casez +cell +chandle +class +clocking +cmos +config +connectmodule +connectrules +const +constraint +context +continue +cos +cosh +cover +covergroup +coverpoint +cross +ddt +ddx +deassign +default +define +defparam +design +disable +discipline +dist +do +driver_update +edge +else +end +endcase +endclass +endclocking +endconfig +endconnectrules +enddiscipline +endfunction +endgenerate +endgroup +endif +endinterface +endmodule +endnature +endpackage +endparamset +endprimitive +endprogram +endproperty +endsequence +endspecify +endtable +endtask +enum +event +exclude +exp +expect +export +extends +extern +final +final_step +first_match +flicker_noise +floor +flow +for +force +foreach +forever +fork +forkjoin +from +function +generate +genvar +ground +highz0 +highz1 +hypot +idt +idtmod +if +ifdef +iff +ifndef +ifnone +ignore_bins +illegal_bins +import +incdir +include +inf +initial +initial_step +inout +input +inside +instance +int +integer +interface +intersect +join +join_any +join_none +laplace_nd +laplace_np +laplace_zd +laplace_zp +large +last_crossing +liblist +library +limexp +ln +local +localparam +log +logic +longint +macromodule +mailbox +matches +max +medium +min +modport +module +nand +nand +nature +negedge +net_resolution +new +nmos +nmos +noise_table +nor +noshowcancelled +not +notif0 +notif1 +null +or +output +package +packed +parameter +paramset +pmos +pmos +posedge +potential +pow +primitive +priority +program +property +protected +pull0 +pull1 +pullup +pulsestyle_ondetect +pulsestyle_onevent +pure +rand +randc +randcase +randcase +randsequence +rcmos +real +realtime +ref +reg +release +repeat +return +rnmos +rpmos +rtran +rtranif0 +rtranif1 +scalared +semaphore +sequence +shortint +shortreal +showcancelled +signed +sin +sinh +slew +small +solve +specify +specparam +sqrt +static +string +strong0 +strong1 +struct +super +supply +supply0 +supply1 +table +tagged +tan +tanh +task +then +this +throughout +time +timeprecision +timer +timescale +timeunit +tran +tran +tranif0 +tranif1 +transition +tri +tri +tri0 +tri1 +triand +trior +trireg +type +typedef +union +unique +unsigned +use +uwire +var +vectored +virtual +void +wait +wait_order +wand +weak0 +weak1 +while +white_noise +wildcard +wire +with +within +wor +wreal +xnor +xor +zi_nd +zi_np +zi_zd diff --git a/.emacs.d/elpa/dash-20210609.1330/dash-autoloads.el b/.emacs.d/elpa/dash-20210609.1330/dash-autoloads.el new file mode 100644 index 0000000..3a96693 --- /dev/null +++ b/.emacs.d/elpa/dash-20210609.1330/dash-autoloads.el @@ -0,0 +1,74 @@ +;;; dash-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "dash" "dash.el" (0 0 0 0)) +;;; Generated autoloads from dash.el + +(autoload 'dash-fontify-mode "dash" "\ +Toggle fontification of Dash special variables. + +If called interactively, enable Dash-Fontify mode if ARG is +positive, and disable it if ARG is zero or negative. If called +from Lisp, also enable the mode if ARG is omitted or nil, and +toggle it if ARG is `toggle'; disable the mode otherwise. + +Dash-Fontify mode is a buffer-local minor mode intended for Emacs +Lisp buffers. Enabling it causes the special variables bound in +anaphoric Dash macros to be fontified. These anaphoras include +`it', `it-index', `acc', and `other'. In older Emacs versions +which do not dynamically detect macros, Dash-Fontify mode +additionally fontifies Dash macro calls. + +See also `dash-fontify-mode-lighter' and +`global-dash-fontify-mode'. + +\(fn &optional ARG)" t nil) + +(put 'global-dash-fontify-mode 'globalized-minor-mode t) + +(defvar global-dash-fontify-mode nil "\ +Non-nil if Global Dash-Fontify mode is enabled. +See the `global-dash-fontify-mode' command +for a description of this minor mode. +Setting this variable directly does not take effect; +either customize it (see the info node `Easy Customization') +or call the function `global-dash-fontify-mode'.") + +(custom-autoload 'global-dash-fontify-mode "dash" nil) + +(autoload 'global-dash-fontify-mode "dash" "\ +Toggle Dash-Fontify mode in all buffers. +With prefix ARG, enable Global Dash-Fontify mode if ARG is positive; +otherwise, disable it. If called from Lisp, enable the mode if +ARG is omitted or nil. + +Dash-Fontify mode is enabled in all buffers where +`dash--turn-on-fontify-mode' would do it. +See `dash-fontify-mode' for more information on Dash-Fontify mode. + +\(fn &optional ARG)" t nil) + +(autoload 'dash-register-info-lookup "dash" "\ +Register the Dash Info manual with `info-lookup-symbol'. +This allows Dash symbols to be looked up with \\[info-lookup-symbol]." t nil) + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "dash" '("!cdr" "!cons" "--" "->" "-a" "-butlast" "-c" "-d" "-e" "-f" "-gr" "-i" "-juxt" "-keep" "-l" "-m" "-no" "-o" "-p" "-r" "-s" "-t" "-u" "-value-to-list" "-when-let" "-zip" "dash-"))) + +;;;*** + +;;;### (autoloads nil nil ("dash-pkg.el") (0 0 0 0)) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; dash-autoloads.el ends here diff --git a/.emacs.d/elpa/dash-20210609.1330/dash-pkg.el b/.emacs.d/elpa/dash-20210609.1330/dash-pkg.el new file mode 100644 index 0000000..befa385 --- /dev/null +++ b/.emacs.d/elpa/dash-20210609.1330/dash-pkg.el @@ -0,0 +1,12 @@ +(define-package "dash" "20210609.1330" "A modern list library for Emacs" + '((emacs "24")) + :commit "88d799595e8f1b4154637ce8a3f81b97b0520c1a" :authors + '(("Magnar Sveen" . "magnars@gmail.com")) + :maintainer + '("Magnar Sveen" . "magnars@gmail.com") + :keywords + '("extensions" "lisp") + :url "https://github.com/magnars/dash.el") +;; Local Variables: +;; no-byte-compile: t +;; End: diff --git a/.emacs.d/elpa/dash-20210609.1330/dash.el b/.emacs.d/elpa/dash-20210609.1330/dash.el new file mode 100644 index 0000000..be50166 --- /dev/null +++ b/.emacs.d/elpa/dash-20210609.1330/dash.el @@ -0,0 +1,3417 @@ +;;; dash.el --- A modern list library for Emacs -*- lexical-binding: t -*- + +;; Copyright (C) 2012-2021 Free Software Foundation, Inc. + +;; Author: Magnar Sveen <magnars@gmail.com> +;; Version: 2.18.1 +;; Package-Requires: ((emacs "24")) +;; Keywords: extensions, lisp +;; Homepage: https://github.com/magnars/dash.el + +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see <https://www.gnu.org/licenses/>. + +;;; Commentary: + +;; A modern list API for Emacs. +;; +;; See its overview at https://github.com/magnars/dash.el#functions. + +;;; Code: + +;; TODO: `gv' was introduced in Emacs 24.3, so remove this and all +;; calls to `defsetf' when support for earlier versions is dropped. +(eval-when-compile + (unless (fboundp 'gv-define-setter) + (require 'cl))) + +(defgroup dash () + "Customize group for Dash, a modern list library." + :group 'extensions + :group 'lisp + :prefix "dash-") + +(defmacro !cons (car cdr) + "Destructive: Set CDR to the cons of CAR and CDR." + (declare (debug (form symbolp))) + `(setq ,cdr (cons ,car ,cdr))) + +(defmacro !cdr (list) + "Destructive: Set LIST to the cdr of LIST." + (declare (debug (symbolp))) + `(setq ,list (cdr ,list))) + +(defmacro --each (list &rest body) + "Evaluate BODY for each element of LIST and return nil. +Each element of LIST in turn is bound to `it' and its index +within LIST to `it-index' before evaluating BODY. +This is the anaphoric counterpart to `-each'." + (declare (debug (form body)) (indent 1)) + (let ((l (make-symbol "list")) + (i (make-symbol "i"))) + `(let ((,l ,list) + (,i 0) + it it-index) + (ignore it it-index) + (while ,l + (setq it (pop ,l) it-index ,i ,i (1+ ,i)) + ,@body)))) + +(defun -each (list fn) + "Call FN on each element of LIST. +Return nil; this function is intended for side effects. + +Its anaphoric counterpart is `--each'. + +For access to the current element's index in LIST, see +`-each-indexed'." + (declare (indent 1)) + (ignore (mapc fn list))) + +(defalias '--each-indexed '--each) + +(defun -each-indexed (list fn) + "Call FN on each index and element of LIST. +For each ITEM at INDEX in LIST, call (funcall FN INDEX ITEM). +Return nil; this function is intended for side effects. + +See also: `-map-indexed'." + (declare (indent 1)) + (--each list (funcall fn it-index it))) + +(defmacro --each-while (list pred &rest body) + "Evaluate BODY for each item in LIST, while PRED evaluates to non-nil. +Each element of LIST in turn is bound to `it' and its index +within LIST to `it-index' before evaluating PRED or BODY. Once +an element is reached for which PRED evaluates to nil, no further +BODY is evaluated. The return value is always nil. +This is the anaphoric counterpart to `-each-while'." + (declare (debug (form form body)) (indent 2)) + (let ((l (make-symbol "list")) + (i (make-symbol "i")) + (elt (make-symbol "elt"))) + `(let ((,l ,list) + (,i 0) + ,elt it it-index) + (ignore it it-index) + (while (and ,l (setq ,elt (pop ,l) it ,elt it-index ,i) ,pred) + (setq it ,elt it-index ,i ,i (1+ ,i)) + ,@body)))) + +(defun -each-while (list pred fn) + "Call FN on each ITEM in LIST, while (PRED ITEM) is non-nil. +Once an ITEM is reached for which PRED returns nil, FN is no +longer called. Return nil; this function is intended for side +effects. + +Its anaphoric counterpart is `--each-while'." + (declare (indent 2)) + (--each-while list (funcall pred it) (funcall fn it))) + +(defmacro --each-r (list &rest body) + "Evaluate BODY for each element of LIST in reversed order. +Each element of LIST in turn, starting at its end, is bound to +`it' and its index within LIST to `it-index' before evaluating +BODY. The return value is always nil. +This is the anaphoric counterpart to `-each-r'." + (declare (debug (form body)) (indent 1)) + (let ((v (make-symbol "vector")) + (i (make-symbol "i"))) + ;; Implementation note: building a vector is considerably faster + ;; than building a reversed list (vector takes less memory, so + ;; there is less GC), plus `length' comes naturally. In-place + ;; `nreverse' would be faster still, but BODY would be able to see + ;; that, even if the modification was undone before we return. + `(let* ((,v (vconcat ,list)) + (,i (length ,v)) + it it-index) + (ignore it it-index) + (while (> ,i 0) + (setq ,i (1- ,i) it-index ,i it (aref ,v ,i)) + ,@body)))) + +(defun -each-r (list fn) + "Call FN on each element of LIST in reversed order. +Return nil; this function is intended for side effects. + +Its anaphoric counterpart is `--each-r'." + (--each-r list (funcall fn it))) + +(defmacro --each-r-while (list pred &rest body) + "Eval BODY for each item in reversed LIST, while PRED evals to non-nil. +Each element of LIST in turn, starting at its end, is bound to +`it' and its index within LIST to `it-index' before evaluating +PRED or BODY. Once an element is reached for which PRED +evaluates to nil, no further BODY is evaluated. The return value +is always nil. +This is the anaphoric counterpart to `-each-r-while'." + (declare (debug (form form body)) (indent 2)) + (let ((v (make-symbol "vector")) + (i (make-symbol "i")) + (elt (make-symbol "elt"))) + `(let* ((,v (vconcat ,list)) + (,i (length ,v)) + ,elt it it-index) + (ignore it it-index) + (while (when (> ,i 0) + (setq ,i (1- ,i) it-index ,i) + (setq ,elt (aref ,v ,i) it ,elt) + ,pred) + (setq it-index ,i it ,elt) + ,@body)))) + +(defun -each-r-while (list pred fn) + "Call FN on each ITEM in reversed LIST, while (PRED ITEM) is non-nil. +Once an ITEM is reached for which PRED returns nil, FN is no +longer called. Return nil; this function is intended for side +effects. + +Its anaphoric counterpart is `--each-r-while'." + (--each-r-while list (funcall pred it) (funcall fn it))) + +(defmacro --dotimes (num &rest body) + "Evaluate BODY NUM times, presumably for side effects. +BODY is evaluated with the local variable `it' temporarily bound +to successive integers running from 0, inclusive, to NUM, +exclusive. BODY is not evaluated if NUM is less than 1. +This is the anaphoric counterpart to `-dotimes'." + (declare (debug (form body)) (indent 1)) + (let ((n (make-symbol "num")) + (i (make-symbol "i"))) + `(let ((,n ,num) + (,i 0) + it) + (ignore it) + (while (< ,i ,n) + (setq it ,i ,i (1+ ,i)) + ,@body)))) + +(defun -dotimes (num fn) + "Call FN NUM times, presumably for side effects. +FN is called with a single argument on successive integers +running from 0, inclusive, to NUM, exclusive. FN is not called +if NUM is less than 1. + +This function's anaphoric counterpart is `--dotimes'." + (declare (indent 1)) + (--dotimes num (funcall fn it))) + +(defun -map (fn list) + "Apply FN to each item in LIST and return the list of results. + +This function's anaphoric counterpart is `--map'." + (mapcar fn list)) + +(defmacro --map (form list) + "Eval FORM for each item in LIST and return the list of results. +Each element of LIST in turn is bound to `it' before evaluating +FORM. +This is the anaphoric counterpart to `-map'." + (declare (debug (def-form form))) + `(mapcar (lambda (it) (ignore it) ,form) ,list)) + +(defmacro --reduce-from (form init list) + "Accumulate a value by evaluating FORM across LIST. +This macro is like `--each' (which see), but it additionally +provides an accumulator variable `acc' which it successively +binds to the result of evaluating FORM for the current LIST +element before processing the next element. For the first +element, `acc' is initialized with the result of evaluating INIT. +The return value is the resulting value of `acc'. If LIST is +empty, FORM is not evaluated, and the return value is the result +of INIT. +This is the anaphoric counterpart to `-reduce-from'." + (declare (debug (form form form))) + `(let ((acc ,init)) + (--each ,list (setq acc ,form)) + acc)) + +(defun -reduce-from (fn init list) + "Reduce the function FN across LIST, starting with INIT. +Return the result of applying FN to INIT and the first element of +LIST, then applying FN to that result and the second element, +etc. If LIST is empty, return INIT without calling FN. + +This function's anaphoric counterpart is `--reduce-from'. + +For other folds, see also `-reduce' and `-reduce-r'." + (--reduce-from (funcall fn acc it) init list)) + +(defmacro --reduce (form list) + "Accumulate a value by evaluating FORM across LIST. +This macro is like `--reduce-from' (which see), except the first +element of LIST is taken as INIT. Thus if LIST contains a single +item, it is returned without evaluating FORM. If LIST is empty, +FORM is evaluated with `it' and `acc' bound to nil. +This is the anaphoric counterpart to `-reduce'." + (declare (debug (form form))) + (let ((lv (make-symbol "list-value"))) + `(let ((,lv ,list)) + (if ,lv + (--reduce-from ,form (car ,lv) (cdr ,lv)) + ;; Explicit nil binding pacifies lexical "variable left uninitialized" + ;; warning. See issue #377 and upstream https://bugs.gnu.org/47080. + (let ((acc nil) (it nil)) + (ignore acc it) + ,form))))) + +(defun -reduce (fn list) + "Reduce the function FN across LIST. +Return the result of applying FN to the first two elements of +LIST, then applying FN to that result and the third element, etc. +If LIST contains a single element, return it without calling FN. +If LIST is empty, return the result of calling FN with no +arguments. + +This function's anaphoric counterpart is `--reduce'. + +For other folds, see also `-reduce-from' and `-reduce-r'." + (if list + (-reduce-from fn (car list) (cdr list)) + (funcall fn))) + +(defmacro --reduce-r-from (form init list) + "Accumulate a value by evaluating FORM across LIST in reverse. +This macro is like `--reduce-from', except it starts from the end +of LIST. +This is the anaphoric counterpart to `-reduce-r-from'." + (declare (debug (form form form))) + `(let ((acc ,init)) + (--each-r ,list (setq acc ,form)) + acc)) + +(defun -reduce-r-from (fn init list) + "Reduce the function FN across LIST in reverse, starting with INIT. +Return the result of applying FN to the last element of LIST and +INIT, then applying FN to the second-to-last element and the +previous result of FN, etc. That is, the first argument of FN is +the current element, and its second argument the accumulated +value. If LIST is empty, return INIT without calling FN. + +This function is like `-reduce-from' but the operation associates +from the right rather than left. In other words, it starts from +the end of LIST and flips the arguments to FN. Conceptually, it +is like replacing the conses in LIST with applications of FN, and +its last link with INIT, and evaluating the resulting expression. + +This function's anaphoric counterpart is `--reduce-r-from'. + +For other folds, see also `-reduce-r' and `-reduce'." + (--reduce-r-from (funcall fn it acc) init list)) + +(defmacro --reduce-r (form list) + "Accumulate a value by evaluating FORM across LIST in reverse order. +This macro is like `--reduce', except it starts from the end of +LIST. +This is the anaphoric counterpart to `-reduce-r'." + (declare (debug (form form))) + `(--reduce ,form (reverse ,list))) + +(defun -reduce-r (fn list) + "Reduce the function FN across LIST in reverse. +Return the result of applying FN to the last two elements of +LIST, then applying FN to the third-to-last element and the +previous result of FN, etc. That is, the first argument of FN is +the current element, and its second argument the accumulated +value. If LIST contains a single element, return it without +calling FN. If LIST is empty, return the result of calling FN +with no arguments. + +This function is like `-reduce' but the operation associates from +the right rather than left. In other words, it starts from the +end of LIST and flips the arguments to FN. Conceptually, it is +like replacing the conses in LIST with applications of FN, +ignoring its last link, and evaluating the resulting expression. + +This function's anaphoric counterpart is `--reduce-r'. + +For other folds, see also `-reduce-r-from' and `-reduce'." + (if list + (--reduce-r (funcall fn it acc) list) + (funcall fn))) + +(defmacro --reductions-from (form init list) + "Return a list of FORM's intermediate reductions across LIST. +That is, a list of the intermediate values of the accumulator +when `--reduce-from' (which see) is called with the same +arguments. +This is the anaphoric counterpart to `-reductions-from'." + (declare (debug (form form form))) + `(nreverse + (--reduce-from (cons (let ((acc (car acc))) (ignore acc) ,form) acc) + (list ,init) + ,list))) + +(defun -reductions-from (fn init list) + "Return a list of FN's intermediate reductions across LIST. +That is, a list of the intermediate values of the accumulator +when `-reduce-from' (which see) is called with the same +arguments. + +This function's anaphoric counterpart is `--reductions-from'. + +For other folds, see also `-reductions' and `-reductions-r'." + (--reductions-from (funcall fn acc it) init list)) + +(defmacro --reductions (form list) + "Return a list of FORM's intermediate reductions across LIST. +That is, a list of the intermediate values of the accumulator +when `--reduce' (which see) is called with the same arguments. +This is the anaphoric counterpart to `-reductions'." + (declare (debug (form form))) + (let ((lv (make-symbol "list-value"))) + `(let ((,lv ,list)) + (if ,lv + (--reductions-from ,form (car ,lv) (cdr ,lv)) + (let (acc it) + (ignore acc it) + (list ,form)))))) + +(defun -reductions (fn list) + "Return a list of FN's intermediate reductions across LIST. +That is, a list of the intermediate values of the accumulator +when `-reduce' (which see) is called with the same arguments. + +This function's anaphoric counterpart is `--reductions'. + +For other folds, see also `-reductions' and `-reductions-r'." + (if list + (--reductions-from (funcall fn acc it) (car list) (cdr list)) + (list (funcall fn)))) + +(defmacro --reductions-r-from (form init list) + "Return a list of FORM's intermediate reductions across reversed LIST. +That is, a list of the intermediate values of the accumulator +when `--reduce-r-from' (which see) is called with the same +arguments. +This is the anaphoric counterpart to `-reductions-r-from'." + (declare (debug (form form form))) + `(--reduce-r-from (cons (let ((acc (car acc))) (ignore acc) ,form) acc) + (list ,init) + ,list)) + +(defun -reductions-r-from (fn init list) + "Return a list of FN's intermediate reductions across reversed LIST. +That is, a list of the intermediate values of the accumulator +when `-reduce-r-from' (which see) is called with the same +arguments. + +This function's anaphoric counterpart is `--reductions-r-from'. + +For other folds, see also `-reductions' and `-reductions-r'." + (--reductions-r-from (funcall fn it acc) init list)) + +(defmacro --reductions-r (form list) + "Return a list of FORM's intermediate reductions across reversed LIST. +That is, a list of the intermediate values of the accumulator +when `--reduce-re' (which see) is called with the same arguments. +This is the anaphoric counterpart to `-reductions-r'." + (declare (debug (form list))) + (let ((lv (make-symbol "list-value"))) + `(let ((,lv (reverse ,list))) + (if ,lv + (--reduce-from (cons (let ((acc (car acc))) (ignore acc) ,form) acc) + (list (car ,lv)) + (cdr ,lv)) + ;; Explicit nil binding pacifies lexical "variable left uninitialized" + ;; warning. See issue #377 and upstream https://bugs.gnu.org/47080. + (let ((acc nil) (it nil)) + (ignore acc it) + (list ,form)))))) + +(defun -reductions-r (fn list) + "Return a list of FN's intermediate reductions across reversed LIST. +That is, a list of the intermediate values of the accumulator +when `-reduce-r' (which see) is called with the same arguments. + +This function's anaphoric counterpart is `--reductions-r'. + +For other folds, see also `-reductions-r-from' and +`-reductions'." + (if list + (--reductions-r (funcall fn it acc) list) + (list (funcall fn)))) + +(defmacro --filter (form list) + "Return a new list of the items in LIST for which FORM evals to non-nil. +Each element of LIST in turn is bound to `it' and its index +within LIST to `it-index' before evaluating FORM. +This is the anaphoric counterpart to `-filter'. +For the opposite operation, see also `--remove'." + (declare (debug (form form))) + (let ((r (make-symbol "result"))) + `(let (,r) + (--each ,list (when ,form (push it ,r))) + (nreverse ,r)))) + +(defun -filter (pred list) + "Return a new list of the items in LIST for which PRED returns non-nil. + +Alias: `-select'. + +This function's anaphoric counterpart is `--filter'. + +For similar operations, see also `-keep' and `-remove'." + (--filter (funcall pred it) list)) + +(defalias '-select '-filter) +(defalias '--select '--filter) + +(defmacro --remove (form list) + "Return a new list of the items in LIST for which FORM evals to nil. +Each element of LIST in turn is bound to `it' and its index +within LIST to `it-index' before evaluating FORM. +This is the anaphoric counterpart to `-remove'. +For the opposite operation, see also `--filter'." + (declare (debug (form form))) + `(--filter (not ,form) ,list)) + +(defun -remove (pred list) + "Return a new list of the items in LIST for which PRED returns nil. + +Alias: `-reject'. + +This function's anaphoric counterpart is `--remove'. + +For similar operations, see also `-keep' and `-filter'." + (--remove (funcall pred it) list)) + +(defalias '-reject '-remove) +(defalias '--reject '--remove) + +(defmacro --remove-first (form list) + "Remove the first item from LIST for which FORM evals to non-nil. +Each element of LIST in turn is bound to `it' and its index +within LIST to `it-index' before evaluating FORM. This is a +non-destructive operation, but only the front of LIST leading up +to the removed item is a copy; the rest is LIST's original tail. +If no item is removed, then the result is a complete copy. +This is the anaphoric counterpart to `-remove-first'." + (declare (debug (form form))) + (let ((front (make-symbol "front")) + (tail (make-symbol "tail"))) + `(let ((,tail ,list) ,front) + (--each-while ,tail (not ,form) + (push (pop ,tail) ,front)) + (if ,tail + (nconc (nreverse ,front) (cdr ,tail)) + (nreverse ,front))))) + +(defun -remove-first (pred list) + "Remove the first item from LIST for which PRED returns non-nil. +This is a non-destructive operation, but only the front of LIST +leading up to the removed item is a copy; the rest is LIST's +original tail. If no item is removed, then the result is a +complete copy. + +Alias: `-reject-first'. + +This function's anaphoric counterpart is `--remove-first'. + +See also `-map-first', `-remove-item', and `-remove-last'." + (--remove-first (funcall pred it) list)) + +(defalias '-reject-first '-remove-first) +(defalias '--reject-first '--remove-first) + +(defmacro --remove-last (form list) + "Remove the last item from LIST for which FORM evals to non-nil. +Each element of LIST in turn is bound to `it' before evaluating +FORM. The result is a copy of LIST regardless of whether an +element is removed. +This is the anaphoric counterpart to `-remove-last'." + (declare (debug (form form))) + `(nreverse (--remove-first ,form (reverse ,list)))) + +(defun -remove-last (pred list) + "Remove the last item from LIST for which PRED returns non-nil. +The result is a copy of LIST regardless of whether an element is +removed. + +Alias: `-reject-last'. + +This function's anaphoric counterpart is `--remove-last'. + +See also `-map-last', `-remove-item', and `-remove-first'." + (--remove-last (funcall pred it) list)) + +(defalias '-reject-last '-remove-last) +(defalias '--reject-last '--remove-last) + +(defalias '-remove-item #'remove + "Return a copy of LIST with all occurrences of ITEM removed. +The comparison is done with `equal'. +\n(fn ITEM LIST)") + +(defmacro --keep (form list) + "Eval FORM for each item in LIST and return the non-nil results. +Like `--filter', but returns the non-nil results of FORM instead +of the corresponding elements of LIST. Each element of LIST in +turn is bound to `it' and its index within LIST to `it-index' +before evaluating FORM. +This is the anaphoric counterpart to `-keep'." + (declare (debug (form form))) + (let ((r (make-symbol "result")) + (m (make-symbol "mapped"))) + `(let (,r) + (--each ,list (let ((,m ,form)) (when ,m (push ,m ,r)))) + (nreverse ,r)))) + +(defun -keep (fn list) + "Return a new list of the non-nil results of applying FN to each item in LIST. +Like `-filter', but returns the non-nil results of FN instead of +the corresponding elements of LIST. + +Its anaphoric counterpart is `--keep'." + (--keep (funcall fn it) list)) + +(defun -non-nil (list) + "Return a copy of LIST with all nil items removed." + (declare (pure t) (side-effect-free t)) + (--filter it list)) + +(defmacro --map-indexed (form list) + "Eval FORM for each item in LIST and return the list of results. +Each element of LIST in turn is bound to `it' and its index +within LIST to `it-index' before evaluating FORM. This is like +`--map', but additionally makes `it-index' available to FORM. + +This is the anaphoric counterpart to `-map-indexed'." + (declare (debug (form form))) + (let ((r (make-symbol "result"))) + `(let (,r) + (--each ,list + (push ,form ,r)) + (nreverse ,r)))) + +(defun -map-indexed (fn list) + "Apply FN to each index and item in LIST and return the list of results. +This is like `-map', but FN takes two arguments: the index of the +current element within LIST, and the element itself. + +This function's anaphoric counterpart is `--map-indexed'. + +For a side-effecting variant, see also `-each-indexed'." + (--map-indexed (funcall fn it-index it) list)) + +(defmacro --map-when (pred rep list) + "Anaphoric form of `-map-when'." + (declare (debug (form form form))) + (let ((r (make-symbol "result"))) + `(let (,r) + (--each ,list (!cons (if ,pred ,rep it) ,r)) + (nreverse ,r)))) + +(defun -map-when (pred rep list) + "Return a new list where the elements in LIST that do not match the PRED function +are unchanged, and where the elements in LIST that do match the PRED function are mapped +through the REP function. + +Alias: `-replace-where' + +See also: `-update-at'" + (--map-when (funcall pred it) (funcall rep it) list)) + +(defalias '-replace-where '-map-when) +(defalias '--replace-where '--map-when) + +(defun -map-first (pred rep list) + "Replace first item in LIST satisfying PRED with result of REP called on this item. + +See also: `-map-when', `-replace-first'" + (let (front) + (while (and list (not (funcall pred (car list)))) + (push (car list) front) + (!cdr list)) + (if list + (-concat (nreverse front) (cons (funcall rep (car list)) (cdr list))) + (nreverse front)))) + +(defmacro --map-first (pred rep list) + "Anaphoric form of `-map-first'." + (declare (debug (def-form def-form form))) + `(-map-first (lambda (it) ,pred) (lambda (it) (ignore it) ,rep) ,list)) + +(defun -map-last (pred rep list) + "Replace last item in LIST satisfying PRED with result of REP called on this item. + +See also: `-map-when', `-replace-last'" + (nreverse (-map-first pred rep (reverse list)))) + +(defmacro --map-last (pred rep list) + "Anaphoric form of `-map-last'." + (declare (debug (def-form def-form form))) + `(-map-last (lambda (it) ,pred) (lambda (it) (ignore it) ,rep) ,list)) + +(defun -replace (old new list) + "Replace all OLD items in LIST with NEW. + +Elements are compared using `equal'. + +See also: `-replace-at'" + (declare (pure t) (side-effect-free t)) + (--map-when (equal it old) new list)) + +(defun -replace-first (old new list) + "Replace the first occurrence of OLD with NEW in LIST. + +Elements are compared using `equal'. + +See also: `-map-first'" + (declare (pure t) (side-effect-free t)) + (--map-first (equal old it) new list)) + +(defun -replace-last (old new list) + "Replace the last occurrence of OLD with NEW in LIST. + +Elements are compared using `equal'. + +See also: `-map-last'" + (declare (pure t) (side-effect-free t)) + (--map-last (equal old it) new list)) + +(defmacro --mapcat (form list) + "Anaphoric form of `-mapcat'." + (declare (debug (form form))) + `(apply 'append (--map ,form ,list))) + +(defun -mapcat (fn list) + "Return the concatenation of the result of mapping FN over LIST. +Thus function FN should return a list." + (--mapcat (funcall fn it) list)) + +(defmacro --iterate (form init n) + "Anaphoric version of `-iterate'." + (declare (debug (form form form))) + (let ((res (make-symbol "result")) + (len (make-symbol "n"))) + `(let ((,len ,n)) + (when (> ,len 0) + (let* ((it ,init) + (,res (list it))) + (dotimes (_ (1- ,len)) + (push (setq it ,form) ,res)) + (nreverse ,res)))))) + +(defun -iterate (fun init n) + "Return a list of iterated applications of FUN to INIT. + +This means a list of the form: + + (INIT (FUN INIT) (FUN (FUN INIT)) ...) + +N is the length of the returned list." + (--iterate (funcall fun it) init n)) + +(defun -flatten (l) + "Take a nested list L and return its contents as a single, flat list. + +Note that because `nil' represents a list of zero elements (an +empty list), any mention of nil in L will disappear after +flattening. If you need to preserve nils, consider `-flatten-n' +or map them to some unique symbol and then map them back. + +Conses of two atoms are considered \"terminals\", that is, they +aren't flattened further. + +See also: `-flatten-n'" + (declare (pure t) (side-effect-free t)) + (if (and (listp l) (listp (cdr l))) + (-mapcat '-flatten l) + (list l))) + +(defun -flatten-n (num list) + "Flatten NUM levels of a nested LIST. + +See also: `-flatten'" + (declare (pure t) (side-effect-free t)) + (dotimes (_ num) + (setq list (apply #'append (mapcar #'-list list)))) + list) + +(defun -concat (&rest lists) + "Return a new list with the concatenation of the elements in the supplied LISTS." + (declare (pure t) (side-effect-free t)) + (apply 'append lists)) + +(defalias '-copy 'copy-sequence + "Create a shallow copy of LIST. + +\(fn LIST)") + +(defun -splice (pred fun list) + "Splice lists generated by FUN in place of elements matching PRED in LIST. + +FUN takes the element matching PRED as input. + +This function can be used as replacement for `,@' in case you +need to splice several lists at marked positions (for example +with keywords). + +See also: `-splice-list', `-insert-at'" + (let (r) + (--each list + (if (funcall pred it) + (let ((new (funcall fun it))) + (--each new (!cons it r))) + (!cons it r))) + (nreverse r))) + +(defmacro --splice (pred form list) + "Anaphoric form of `-splice'." + (declare (debug (def-form def-form form))) + `(-splice (lambda (it) ,pred) (lambda (it) ,form) ,list)) + +(defun -splice-list (pred new-list list) + "Splice NEW-LIST in place of elements matching PRED in LIST. + +See also: `-splice', `-insert-at'" + (-splice pred (lambda (_) new-list) list)) + +(defmacro --splice-list (pred new-list list) + "Anaphoric form of `-splice-list'." + (declare (debug (def-form form form))) + `(-splice-list (lambda (it) ,pred) ,new-list ,list)) + +(defun -cons* (&rest args) + "Make a new list from the elements of ARGS. +The last 2 elements of ARGS are used as the final cons of the +result, so if the final element of ARGS is not a list, the result +is a dotted list. With no ARGS, return nil." + (declare (pure t) (side-effect-free t)) + (let* ((len (length args)) + (tail (nthcdr (- len 2) args)) + (last (cdr tail))) + (if (null last) + (car args) + (setcdr tail (car last)) + args))) + +(defun -snoc (list elem &rest elements) + "Append ELEM to the end of the list. + +This is like `cons', but operates on the end of list. + +If ELEMENTS is non nil, append these to the list as well." + (-concat list (list elem) elements)) + +(defmacro --first (form list) + "Return the first item in LIST for which FORM evals to non-nil. +Return nil if no such element is found. +Each element of LIST in turn is bound to `it' and its index +within LIST to `it-index' before evaluating FORM. +This is the anaphoric counterpart to `-first'." + (declare (debug (form form))) + (let ((n (make-symbol "needle"))) + `(let (,n) + (--each-while ,list (or (not ,form) + (ignore (setq ,n it)))) + ,n))) + +(defun -first (pred list) + "Return the first item in LIST for which PRED returns non-nil. +Return nil if no such element is found. +To get the first item in the list no questions asked, use `car'. + +Alias: `-find'. + +This function's anaphoric counterpart is `--first'." + (--first (funcall pred it) list)) + +(defalias '-find '-first) +(defalias '--find '--first) + +(defmacro --some (form list) + "Return non-nil if FORM evals to non-nil for at least one item in LIST. +If so, return the first such result of FORM. +Each element of LIST in turn is bound to `it' and its index +within LIST to `it-index' before evaluating FORM. +This is the anaphoric counterpart to `-some'." + (declare (debug (form form))) + (let ((n (make-symbol "needle"))) + `(let (,n) + (--each-while ,list (not (setq ,n ,form))) + ,n))) + +(defun -some (pred list) + "Return (PRED x) for the first LIST item where (PRED x) is non-nil, else nil. + +Alias: `-any'. + +This function's anaphoric counterpart is `--some'." + (--some (funcall pred it) list)) + +(defalias '-any '-some) +(defalias '--any '--some) + +(defmacro --last (form list) + "Anaphoric form of `-last'." + (declare (debug (form form))) + (let ((n (make-symbol "needle"))) + `(let (,n) + (--each ,list + (when ,form (setq ,n it))) + ,n))) + +(defun -last (pred list) + "Return the last x in LIST where (PRED x) is non-nil, else nil." + (--last (funcall pred it) list)) + +(defalias '-first-item 'car + "Return the first item of LIST, or nil on an empty list. + +See also: `-second-item', `-last-item'. + +\(fn LIST)") + +;; Ensure that calls to `-first-item' are compiled to a single opcode, +;; just like `car'. +(put '-first-item 'byte-opcode 'byte-car) +(put '-first-item 'byte-compile 'byte-compile-one-arg) + +(defalias '-second-item 'cadr + "Return the second item of LIST, or nil if LIST is too short. + +See also: `-third-item'. + +\(fn LIST)") + +(defalias '-third-item + (if (fboundp 'caddr) + #'caddr + (lambda (list) (car (cddr list)))) + "Return the third item of LIST, or nil if LIST is too short. + +See also: `-fourth-item'. + +\(fn LIST)") + +(defun -fourth-item (list) + "Return the fourth item of LIST, or nil if LIST is too short. + +See also: `-fifth-item'." + (declare (pure t) (side-effect-free t)) + (car (cdr (cdr (cdr list))))) + +(defun -fifth-item (list) + "Return the fifth item of LIST, or nil if LIST is too short. + +See also: `-last-item'." + (declare (pure t) (side-effect-free t)) + (car (cdr (cdr (cdr (cdr list)))))) + +(defun -last-item (list) + "Return the last item of LIST, or nil on an empty list." + (declare (pure t) (side-effect-free t)) + (car (last list))) + +;; Use `with-no-warnings' to suppress unbound `-last-item' or +;; undefined `gv--defsetter' warnings arising from both +;; `gv-define-setter' and `defsetf' in certain Emacs versions. +(with-no-warnings + (if (fboundp 'gv-define-setter) + (gv-define-setter -last-item (val x) `(setcar (last ,x) ,val)) + (defsetf -last-item (x) (val) `(setcar (last ,x) ,val)))) + +(defun -butlast (list) + "Return a list of all items in list except for the last." + ;; no alias as we don't want magic optional argument + (declare (pure t) (side-effect-free t)) + (butlast list)) + +(defmacro --count (pred list) + "Anaphoric form of `-count'." + (declare (debug (form form))) + (let ((r (make-symbol "result"))) + `(let ((,r 0)) + (--each ,list (when ,pred (setq ,r (1+ ,r)))) + ,r))) + +(defun -count (pred list) + "Counts the number of items in LIST where (PRED item) is non-nil." + (--count (funcall pred it) list)) + +(defun ---truthy? (obj) + "Return OBJ as a boolean value (t or nil)." + (declare (pure t) (side-effect-free t)) + (and obj t)) + +(defmacro --any? (form list) + "Anaphoric form of `-any?'." + (declare (debug (form form))) + `(---truthy? (--some ,form ,list))) + +(defun -any? (pred list) + "Return t if (PRED x) is non-nil for any x in LIST, else nil. + +Alias: `-any-p', `-some?', `-some-p'" + (--any? (funcall pred it) list)) + +(defalias '-some? '-any?) +(defalias '--some? '--any?) +(defalias '-any-p '-any?) +(defalias '--any-p '--any?) +(defalias '-some-p '-any?) +(defalias '--some-p '--any?) + +(defmacro --all? (form list) + "Anaphoric form of `-all?'." + (declare (debug (form form))) + (let ((a (make-symbol "all"))) + `(let ((,a t)) + (--each-while ,list ,a (setq ,a ,form)) + (---truthy? ,a)))) + +(defun -all? (pred list) + "Return t if (PRED x) is non-nil for all x in LIST, else nil. + +Alias: `-all-p', `-every?', `-every-p'" + (--all? (funcall pred it) list)) + +(defalias '-every? '-all?) +(defalias '--every? '--all?) +(defalias '-all-p '-all?) +(defalias '--all-p '--all?) +(defalias '-every-p '-all?) +(defalias '--every-p '--all?) + +(defmacro --none? (form list) + "Anaphoric form of `-none?'." + (declare (debug (form form))) + `(--all? (not ,form) ,list)) + +(defun -none? (pred list) + "Return t if (PRED x) is nil for all x in LIST, else nil. + +Alias: `-none-p'" + (--none? (funcall pred it) list)) + +(defalias '-none-p '-none?) +(defalias '--none-p '--none?) + +(defmacro --only-some? (form list) + "Anaphoric form of `-only-some?'." + (declare (debug (form form))) + (let ((y (make-symbol "yes")) + (n (make-symbol "no"))) + `(let (,y ,n) + (--each-while ,list (not (and ,y ,n)) + (if ,form (setq ,y t) (setq ,n t))) + (---truthy? (and ,y ,n))))) + +(defun -only-some? (pred list) + "Return `t` if at least one item of LIST matches PRED and at least one item of LIST does not match PRED. +Return `nil` both if all items match the predicate or if none of the items match the predicate. + +Alias: `-only-some-p'" + (--only-some? (funcall pred it) list)) + +(defalias '-only-some-p '-only-some?) +(defalias '--only-some-p '--only-some?) + +(defun -slice (list from &optional to step) + "Return copy of LIST, starting from index FROM to index TO. + +FROM or TO may be negative. These values are then interpreted +modulo the length of the list. + +If STEP is a number, only each STEPth item in the resulting +section is returned. Defaults to 1." + (declare (pure t) (side-effect-free t)) + (let ((length (length list)) + (new-list nil)) + ;; to defaults to the end of the list + (setq to (or to length)) + (setq step (or step 1)) + ;; handle negative indices + (when (< from 0) + (setq from (mod from length))) + (when (< to 0) + (setq to (mod to length))) + + ;; iterate through the list, keeping the elements we want + (--each-while list (< it-index to) + (when (and (>= it-index from) + (= (mod (- from it-index) step) 0)) + (push it new-list))) + (nreverse new-list))) + +(defmacro --take-while (form list) + "Take successive items from LIST for which FORM evals to non-nil. +Each element of LIST in turn is bound to `it' and its index +within LIST to `it-index' before evaluating FORM. Return a new +list of the successive elements from the start of LIST for which +FORM evaluates to non-nil. +This is the anaphoric counterpart to `-take-while'." + (declare (debug (form form))) + (let ((r (make-symbol "result"))) + `(let (,r) + (--each-while ,list ,form (push it ,r)) + (nreverse ,r)))) + +(defun -take-while (pred list) + "Take successive items from LIST for which PRED returns non-nil. +PRED is a function of one argument. Return a new list of the +successive elements from the start of LIST for which PRED returns +non-nil. + +This function's anaphoric counterpart is `--take-while'. + +For another variant, see also `-drop-while'." + (--take-while (funcall pred it) list)) + +(defmacro --drop-while (form list) + "Drop successive items from LIST for which FORM evals to non-nil. +Each element of LIST in turn is bound to `it' and its index +within LIST to `it-index' before evaluating FORM. Return the +tail (not a copy) of LIST starting from its first element for +which FORM evaluates to nil. +This is the anaphoric counterpart to `-drop-while'." + (declare (debug (form form))) + (let ((l (make-symbol "list"))) + `(let ((,l ,list)) + (--each-while ,l ,form (pop ,l)) + ,l))) + +(defun -drop-while (pred list) + "Drop successive items from LIST for which PRED returns non-nil. +PRED is a function of one argument. Return the tail (not a copy) +of LIST starting from its first element for which PRED returns +nil. + +This function's anaphoric counterpart is `--drop-while'. + +For another variant, see also `-take-while'." + (--drop-while (funcall pred it) list)) + +(defun -take (n list) + "Return a copy of the first N items in LIST. +Return a copy of LIST if it contains N items or fewer. +Return nil if N is zero or less. + +See also: `-take-last'." + (declare (pure t) (side-effect-free t)) + (--take-while (< it-index n) list)) + +(defun -take-last (n list) + "Return a copy of the last N items of LIST in order. +Return a copy of LIST if it contains N items or fewer. +Return nil if N is zero or less. + +See also: `-take'." + (declare (pure t) (side-effect-free t)) + (copy-sequence (last list n))) + +(defalias '-drop #'nthcdr + "Return the tail (not a copy) of LIST without the first N items. +Return nil if LIST contains N items or fewer. +Return LIST if N is zero or less. + +For another variant, see also `-drop-last'. +\n(fn N LIST)") + +(defun -drop-last (n list) + "Return a copy of LIST without its last N items. +Return a copy of LIST if N is zero or less. +Return nil if LIST contains N items or fewer. + +See also: `-drop'." + (declare (pure t) (side-effect-free t)) + (nbutlast (copy-sequence list) n)) + +(defun -split-at (n list) + "Split LIST into two sublists after the Nth element. +The result is a list of two elements (TAKE DROP) where TAKE is a +new list of the first N elements of LIST, and DROP is the +remaining elements of LIST (not a copy). TAKE and DROP are like +the results of `-take' and `-drop', respectively, but the split +is done in a single list traversal." + (declare (pure t) (side-effect-free t)) + (let (result) + (--each-while list (< it-index n) + (push (pop list) result)) + (list (nreverse result) list))) + +(defun -rotate (n list) + "Rotate LIST N places to the right. With N negative, rotate to the left. +The time complexity is O(n)." + (declare (pure t) (side-effect-free t)) + (when list + (let* ((len (length list)) + (n-mod-len (mod n len)) + (new-tail-len (- len n-mod-len))) + (append (nthcdr new-tail-len list) (-take new-tail-len list))))) + +(defun -insert-at (n x list) + "Return a list with X inserted into LIST at position N. + +See also: `-splice', `-splice-list'" + (declare (pure t) (side-effect-free t)) + (let ((split-list (-split-at n list))) + (nconc (car split-list) (cons x (cadr split-list))))) + +(defun -replace-at (n x list) + "Return a list with element at Nth position in LIST replaced with X. + +See also: `-replace'" + (declare (pure t) (side-effect-free t)) + (let ((split-list (-split-at n list))) + (nconc (car split-list) (cons x (cdr (cadr split-list)))))) + +(defun -update-at (n func list) + "Return a list with element at Nth position in LIST replaced with `(func (nth n list))`. + +See also: `-map-when'" + (let ((split-list (-split-at n list))) + (nconc (car split-list) (cons (funcall func (car (cadr split-list))) (cdr (cadr split-list)))))) + +(defmacro --update-at (n form list) + "Anaphoric version of `-update-at'." + (declare (debug (form def-form form))) + `(-update-at ,n (lambda (it) ,form) ,list)) + +(defun -remove-at (n list) + "Return a list with element at Nth position in LIST removed. + +See also: `-remove-at-indices', `-remove'" + (declare (pure t) (side-effect-free t)) + (-remove-at-indices (list n) list)) + +(defun -remove-at-indices (indices list) + "Return a list whose elements are elements from LIST without +elements selected as `(nth i list)` for all i +from INDICES. + +See also: `-remove-at', `-remove'" + (declare (pure t) (side-effect-free t)) + (let* ((indices (-sort '< indices)) + (diffs (cons (car indices) (-map '1- (-zip-with '- (cdr indices) indices)))) + r) + (--each diffs + (let ((split (-split-at it list))) + (!cons (car split) r) + (setq list (cdr (cadr split))))) + (!cons list r) + (apply '-concat (nreverse r)))) + +(defmacro --split-with (pred list) + "Anaphoric form of `-split-with'." + (declare (debug (form form))) + (let ((l (make-symbol "list")) + (r (make-symbol "result")) + (c (make-symbol "continue"))) + `(let ((,l ,list) + (,r nil) + (,c t)) + (while (and ,l ,c) + (let ((it (car ,l))) + (if (not ,pred) + (setq ,c nil) + (!cons it ,r) + (!cdr ,l)))) + (list (nreverse ,r) ,l)))) + +(defun -split-with (pred list) + "Return a list of ((-take-while PRED LIST) (-drop-while PRED LIST)), in no more than one pass through the list." + (--split-with (funcall pred it) list)) + +(defmacro -split-on (item list) + "Split the LIST each time ITEM is found. + +Unlike `-partition-by', the ITEM is discarded from the results. +Empty lists are also removed from the result. + +Comparison is done by `equal'. + +See also `-split-when'" + (declare (debug (def-form form))) + `(-split-when (lambda (it) (equal it ,item)) ,list)) + +(defmacro --split-when (form list) + "Anaphoric version of `-split-when'." + (declare (debug (def-form form))) + `(-split-when (lambda (it) ,form) ,list)) + +(defun -split-when (fn list) + "Split the LIST on each element where FN returns non-nil. + +Unlike `-partition-by', the \"matched\" element is discarded from +the results. Empty lists are also removed from the result. + +This function can be thought of as a generalization of +`split-string'." + (let (r s) + (while list + (if (not (funcall fn (car list))) + (push (car list) s) + (when s (push (nreverse s) r)) + (setq s nil)) + (!cdr list)) + (when s (push (nreverse s) r)) + (nreverse r))) + +(defmacro --separate (form list) + "Anaphoric form of `-separate'." + (declare (debug (form form))) + (let ((y (make-symbol "yes")) + (n (make-symbol "no"))) + `(let (,y ,n) + (--each ,list (if ,form (!cons it ,y) (!cons it ,n))) + (list (nreverse ,y) (nreverse ,n))))) + +(defun -separate (pred list) + "Return a list of ((-filter PRED LIST) (-remove PRED LIST)), in one pass through the list." + (--separate (funcall pred it) list)) + +(defun dash--partition-all-in-steps-reversed (n step list) + "Used by `-partition-all-in-steps' and `-partition-in-steps'." + (when (< step 1) + (signal 'wrong-type-argument + `("Step size < 1 results in juicy infinite loops" ,step))) + (let (result) + (while list + (push (-take n list) result) + (setq list (nthcdr step list))) + result)) + +(defun -partition-all-in-steps (n step list) + "Return a new list with the items in LIST grouped into N-sized sublists at offsets STEP apart. +The last groups may contain less than N items." + (declare (pure t) (side-effect-free t)) + (nreverse (dash--partition-all-in-steps-reversed n step list))) + +(defun -partition-in-steps (n step list) + "Return a new list with the items in LIST grouped into N-sized sublists at offsets STEP apart. +If there are not enough items to make the last group N-sized, +those items are discarded." + (declare (pure t) (side-effect-free t)) + (let ((result (dash--partition-all-in-steps-reversed n step list))) + (while (and result (< (length (car result)) n)) + (!cdr result)) + (nreverse result))) + +(defun -partition-all (n list) + "Return a new list with the items in LIST grouped into N-sized sublists. +The last group may contain less than N items." + (declare (pure t) (side-effect-free t)) + (-partition-all-in-steps n n list)) + +(defun -partition (n list) + "Return a new list with the items in LIST grouped into N-sized sublists. +If there are not enough items to make the last group N-sized, +those items are discarded." + (declare (pure t) (side-effect-free t)) + (-partition-in-steps n n list)) + +(defmacro --partition-by (form list) + "Anaphoric form of `-partition-by'." + (declare (debug (form form))) + (let ((r (make-symbol "result")) + (s (make-symbol "sublist")) + (v (make-symbol "value")) + (n (make-symbol "new-value")) + (l (make-symbol "list"))) + `(let ((,l ,list)) + (when ,l + (let* ((,r nil) + (it (car ,l)) + (,s (list it)) + (,v ,form) + (,l (cdr ,l))) + (while ,l + (let* ((it (car ,l)) + (,n ,form)) + (unless (equal ,v ,n) + (!cons (nreverse ,s) ,r) + (setq ,s nil) + (setq ,v ,n)) + (!cons it ,s) + (!cdr ,l))) + (!cons (nreverse ,s) ,r) + (nreverse ,r)))))) + +(defun -partition-by (fn list) + "Apply FN to each item in LIST, splitting it each time FN returns a new value." + (--partition-by (funcall fn it) list)) + +(defmacro --partition-by-header (form list) + "Anaphoric form of `-partition-by-header'." + (declare (debug (form form))) + (let ((r (make-symbol "result")) + (s (make-symbol "sublist")) + (h (make-symbol "header-value")) + (b (make-symbol "seen-body?")) + (n (make-symbol "new-value")) + (l (make-symbol "list"))) + `(let ((,l ,list)) + (when ,l + (let* ((,r nil) + (it (car ,l)) + (,s (list it)) + (,h ,form) + (,b nil) + (,l (cdr ,l))) + (while ,l + (let* ((it (car ,l)) + (,n ,form)) + (if (equal ,h ,n) + (when ,b + (!cons (nreverse ,s) ,r) + (setq ,s nil) + (setq ,b nil)) + (setq ,b t)) + (!cons it ,s) + (!cdr ,l))) + (!cons (nreverse ,s) ,r) + (nreverse ,r)))))) + +(defun -partition-by-header (fn list) + "Apply FN to the first item in LIST. That is the header +value. Apply FN to each item in LIST, splitting it each time FN +returns the header value, but only after seeing at least one +other value (the body)." + (--partition-by-header (funcall fn it) list)) + +(defmacro --partition-after-pred (form list) + "Partition LIST after each element for which FORM evaluates to non-nil. +Each element of LIST in turn is bound to `it' before evaluating +FORM. + +This is the anaphoric counterpart to `-partition-after-pred'." + (let ((l (make-symbol "list")) + (r (make-symbol "result")) + (s (make-symbol "sublist"))) + `(let ((,l ,list) ,r ,s) + (when ,l + (--each ,l + (push it ,s) + (when ,form + (push (nreverse ,s) ,r) + (setq ,s ()))) + (when ,s + (push (nreverse ,s) ,r)) + (nreverse ,r))))) + +(defun -partition-after-pred (pred list) + "Partition LIST after each element for which PRED returns non-nil. + +This function's anaphoric counterpart is `--partition-after-pred'." + (--partition-after-pred (funcall pred it) list)) + +(defun -partition-before-pred (pred list) + "Partition directly before each time PRED is true on an element of LIST." + (nreverse (-map #'reverse + (-partition-after-pred pred (reverse list))))) + +(defun -partition-after-item (item list) + "Partition directly after each time ITEM appears in LIST." + (-partition-after-pred (lambda (ele) (equal ele item)) + list)) + +(defun -partition-before-item (item list) + "Partition directly before each time ITEM appears in LIST." + (-partition-before-pred (lambda (ele) (equal ele item)) + list)) + +(defmacro --group-by (form list) + "Anaphoric form of `-group-by'." + (declare (debug t)) + (let ((n (make-symbol "n")) + (k (make-symbol "k")) + (grp (make-symbol "grp"))) + `(nreverse + (-map + (lambda (,n) + (cons (car ,n) + (nreverse (cdr ,n)))) + (--reduce-from + (let* ((,k (,@form)) + (,grp (assoc ,k acc))) + (if ,grp + (setcdr ,grp (cons it (cdr ,grp))) + (push + (list ,k it) + acc)) + acc) + nil ,list))))) + +(defun -group-by (fn list) + "Separate LIST into an alist whose keys are FN applied to the +elements of LIST. Keys are compared by `equal'." + (--group-by (funcall fn it) list)) + +(defun -interpose (sep list) + "Return a new list of all elements in LIST separated by SEP." + (declare (pure t) (side-effect-free t)) + (let (result) + (when list + (!cons (car list) result) + (!cdr list)) + (while list + (setq result (cons (car list) (cons sep result))) + (!cdr list)) + (nreverse result))) + +(defun -interleave (&rest lists) + "Return a new list of the first item in each list, then the second etc." + (declare (pure t) (side-effect-free t)) + (when lists + (let (result) + (while (-none? 'null lists) + (--each lists (!cons (car it) result)) + (setq lists (-map 'cdr lists))) + (nreverse result)))) + +(defmacro --zip-with (form list1 list2) + "Anaphoric form of `-zip-with'. + +The elements in list1 are bound as symbol `it', the elements in list2 as symbol `other'." + (declare (debug (form form form))) + (let ((r (make-symbol "result")) + (l1 (make-symbol "list1")) + (l2 (make-symbol "list2"))) + `(let ((,r nil) + (,l1 ,list1) + (,l2 ,list2)) + (while (and ,l1 ,l2) + (let ((it (car ,l1)) + (other (car ,l2))) + (!cons ,form ,r) + (!cdr ,l1) + (!cdr ,l2))) + (nreverse ,r)))) + +(defun -zip-with (fn list1 list2) + "Zip the two lists LIST1 and LIST2 using a function FN. This +function is applied pairwise taking as first argument element of +LIST1 and as second argument element of LIST2 at corresponding +position. + +The anaphoric form `--zip-with' binds the elements from LIST1 as symbol `it', +and the elements from LIST2 as symbol `other'." + (--zip-with (funcall fn it other) list1 list2)) + +(defun -zip-lists (&rest lists) + "Zip LISTS together. Group the head of each list, followed by the +second elements of each list, and so on. The lengths of the returned +groupings are equal to the length of the shortest input list. + +The return value is always list of lists, which is a difference +from `-zip-pair' which returns a cons-cell in case two input +lists are provided. + +See also: `-zip'" + (declare (pure t) (side-effect-free t)) + (when lists + (let (results) + (while (-none? 'null lists) + (setq results (cons (mapcar 'car lists) results)) + (setq lists (mapcar 'cdr lists))) + (nreverse results)))) + +(defun -zip (&rest lists) + "Zip LISTS together. Group the head of each list, followed by the +second elements of each list, and so on. The lengths of the returned +groupings are equal to the length of the shortest input list. + +If two lists are provided as arguments, return the groupings as a list +of cons cells. Otherwise, return the groupings as a list of lists. + +Use `-zip-lists' if you need the return value to always be a list +of lists. + +Alias: `-zip-pair' + +See also: `-zip-lists'" + (declare (pure t) (side-effect-free t)) + (when lists + (let (results) + (while (-none? 'null lists) + (setq results (cons (mapcar 'car lists) results)) + (setq lists (mapcar 'cdr lists))) + (setq results (nreverse results)) + (if (= (length lists) 2) + ;; to support backward compatibility, return + ;; a cons cell if two lists were provided + (--map (cons (car it) (cadr it)) results) + results)))) + +(defalias '-zip-pair '-zip) + +(defun -zip-fill (fill-value &rest lists) + "Zip LISTS, with FILL-VALUE padded onto the shorter lists. The +lengths of the returned groupings are equal to the length of the +longest input list." + (declare (pure t) (side-effect-free t)) + (apply '-zip (apply '-pad (cons fill-value lists)))) + +(defun -unzip (lists) + "Unzip LISTS. + +This works just like `-zip' but takes a list of lists instead of +a variable number of arguments, such that + + (-unzip (-zip L1 L2 L3 ...)) + +is identity (given that the lists are the same length). + +Note in particular that calling this on a list of two lists will +return a list of cons-cells such that the above identity works. + +See also: `-zip'" + (apply '-zip lists)) + +(defun -cycle (list) + "Return an infinite circular copy of LIST. +The returned list cycles through the elements of LIST and repeats +from the beginning." + (declare (pure t) (side-effect-free t)) + ;; Also works with sequences that aren't lists. + (let ((newlist (append list ()))) + (nconc newlist newlist))) + +(defun -pad (fill-value &rest lists) + "Appends FILL-VALUE to the end of each list in LISTS such that they +will all have the same length." + (let* ((annotations (-annotate 'length lists)) + (n (-max (-map 'car annotations)))) + (--map (append (cdr it) (-repeat (- n (car it)) fill-value)) annotations))) + +(defun -annotate (fn list) + "Return a list of cons cells where each cell is FN applied to each +element of LIST paired with the unmodified element of LIST." + (-zip (-map fn list) list)) + +(defmacro --annotate (form list) + "Anaphoric version of `-annotate'." + (declare (debug (def-form form))) + `(-annotate (lambda (it) ,form) ,list)) + +(defun dash--table-carry (lists restore-lists &optional re) + "Helper for `-table' and `-table-flat'. + +If a list overflows, carry to the right and reset the list." + (while (not (or (car lists) + (equal lists '(nil)))) + (setcar lists (car restore-lists)) + (pop (cadr lists)) + (!cdr lists) + (!cdr restore-lists) + (when re + (push (nreverse (car re)) (cadr re)) + (setcar re nil) + (!cdr re)))) + +(defun -table (fn &rest lists) + "Compute outer product of LISTS using function FN. + +The function FN should have the same arity as the number of +supplied lists. + +The outer product is computed by applying fn to all possible +combinations created by taking one element from each list in +order. The dimension of the result is (length lists). + +See also: `-table-flat'" + (let ((restore-lists (copy-sequence lists)) + (last-list (last lists)) + (re (make-list (length lists) nil))) + (while (car last-list) + (let ((item (apply fn (-map 'car lists)))) + (push item (car re)) + (setcar lists (cdar lists)) ;; silence byte compiler + (dash--table-carry lists restore-lists re))) + (nreverse (car (last re))))) + +(defun -table-flat (fn &rest lists) + "Compute flat outer product of LISTS using function FN. + +The function FN should have the same arity as the number of +supplied lists. + +The outer product is computed by applying fn to all possible +combinations created by taking one element from each list in +order. The results are flattened, ignoring the tensor structure +of the result. This is equivalent to calling: + + (-flatten-n (1- (length lists)) (apply \\='-table fn lists)) + +but the implementation here is much more efficient. + +See also: `-flatten-n', `-table'" + (let ((restore-lists (copy-sequence lists)) + (last-list (last lists)) + re) + (while (car last-list) + (let ((item (apply fn (-map 'car lists)))) + (push item re) + (setcar lists (cdar lists)) ;; silence byte compiler + (dash--table-carry lists restore-lists))) + (nreverse re))) + +(defun -elem-index (elem list) + "Return the index of the first element in the given LIST which +is equal to the query element ELEM, or nil if there is no +such element." + (declare (pure t) (side-effect-free t)) + (car (-elem-indices elem list))) + +(defun -elem-indices (elem list) + "Return the indices of all elements in LIST equal to the query +element ELEM, in ascending order." + (declare (pure t) (side-effect-free t)) + (-find-indices (-partial 'equal elem) list)) + +(defun -find-indices (pred list) + "Return the indices of all elements in LIST satisfying the +predicate PRED, in ascending order." + (apply 'append (--map-indexed (when (funcall pred it) (list it-index)) list))) + +(defmacro --find-indices (form list) + "Anaphoric version of `-find-indices'." + (declare (debug (def-form form))) + `(-find-indices (lambda (it) ,form) ,list)) + +(defun -find-index (pred list) + "Take a predicate PRED and a LIST and return the index of the +first element in the list satisfying the predicate, or nil if +there is no such element. + +See also `-first'." + (car (-find-indices pred list))) + +(defmacro --find-index (form list) + "Anaphoric version of `-find-index'." + (declare (debug (def-form form))) + `(-find-index (lambda (it) ,form) ,list)) + +(defun -find-last-index (pred list) + "Take a predicate PRED and a LIST and return the index of the +last element in the list satisfying the predicate, or nil if +there is no such element. + +See also `-last'." + (-last-item (-find-indices pred list))) + +(defmacro --find-last-index (form list) + "Anaphoric version of `-find-last-index'." + (declare (debug (def-form form))) + `(-find-last-index (lambda (it) ,form) ,list)) + +(defun -select-by-indices (indices list) + "Return a list whose elements are elements from LIST selected +as `(nth i list)` for all i from INDICES." + (declare (pure t) (side-effect-free t)) + (let (r) + (--each indices + (!cons (nth it list) r)) + (nreverse r))) + +(defun -select-columns (columns table) + "Select COLUMNS from TABLE. + +TABLE is a list of lists where each element represents one row. +It is assumed each row has the same length. + +Each row is transformed such that only the specified COLUMNS are +selected. + +See also: `-select-column', `-select-by-indices'" + (declare (pure t) (side-effect-free t)) + (--map (-select-by-indices columns it) table)) + +(defun -select-column (column table) + "Select COLUMN from TABLE. + +TABLE is a list of lists where each element represents one row. +It is assumed each row has the same length. + +The single selected column is returned as a list. + +See also: `-select-columns', `-select-by-indices'" + (declare (pure t) (side-effect-free t)) + (--mapcat (-select-by-indices (list column) it) table)) + +(defmacro -> (x &optional form &rest more) + "Thread the expr through the forms. Insert X as the second item +in the first form, making a list of it if it is not a list +already. If there are more forms, insert the first form as the +second item in second form, etc." + (declare (debug (form &rest [&or symbolp (sexp &rest form)])) + (indent 1)) + (cond + ((null form) x) + ((null more) (if (listp form) + `(,(car form) ,x ,@(cdr form)) + (list form x))) + (:else `(-> (-> ,x ,form) ,@more)))) + +(defmacro ->> (x &optional form &rest more) + "Thread the expr through the forms. Insert X as the last item +in the first form, making a list of it if it is not a list +already. If there are more forms, insert the first form as the +last item in second form, etc." + (declare (debug ->) + (indent 1)) + (cond + ((null form) x) + ((null more) (if (listp form) + `(,@form ,x) + (list form x))) + (:else `(->> (->> ,x ,form) ,@more)))) + +(defmacro --> (x &rest forms) + "Starting with the value of X, thread each expression through FORMS. + +Insert X at the position signified by the symbol `it' in the first +form. If there are more forms, insert the first form at the position +signified by `it' in in second form, etc." + (declare (debug (form body)) (indent 1)) + `(-as-> ,x it ,@forms)) + +(defmacro -as-> (value variable &rest forms) + "Starting with VALUE, thread VARIABLE through FORMS. + +In the first form, bind VARIABLE to VALUE. In the second form, bind +VARIABLE to the result of the first form, and so forth." + (declare (debug (form symbolp body))) + (if (null forms) + `,value + `(let ((,variable ,value)) + (-as-> ,(if (symbolp (car forms)) + (list (car forms) variable) + (car forms)) + ,variable + ,@(cdr forms))))) + +(defmacro -some-> (x &optional form &rest more) + "When expr is non-nil, thread it through the first form (via `->'), +and when that result is non-nil, through the next form, etc." + (declare (debug ->) + (indent 1)) + (if (null form) x + (let ((result (make-symbol "result"))) + `(-some-> (-when-let (,result ,x) + (-> ,result ,form)) + ,@more)))) + +(defmacro -some->> (x &optional form &rest more) + "When expr is non-nil, thread it through the first form (via `->>'), +and when that result is non-nil, through the next form, etc." + (declare (debug ->) + (indent 1)) + (if (null form) x + (let ((result (make-symbol "result"))) + `(-some->> (-when-let (,result ,x) + (->> ,result ,form)) + ,@more)))) + +(defmacro -some--> (expr &rest forms) + "Thread EXPR through FORMS via `-->', while the result is non-nil. +When EXPR evaluates to non-nil, thread the result through the +first of FORMS, and when that result is non-nil, thread it +through the next form, etc." + (declare (debug (form &rest &or symbolp consp)) (indent 1)) + (if (null forms) expr + (let ((result (make-symbol "result"))) + `(-some--> (-when-let (,result ,expr) + (--> ,result ,(car forms))) + ,@(cdr forms))))) + +(defmacro -doto (init &rest forms) + "Evaluate INIT and pass it as argument to FORMS with `->'. +The RESULT of evaluating INIT is threaded through each of FORMS +individually using `->', which see. The return value is RESULT, +which FORMS may have modified by side effect." + (declare (debug (form &rest &or symbolp consp)) (indent 1)) + (let ((retval (make-symbol "result"))) + `(let ((,retval ,init)) + ,@(mapcar (lambda (form) `(-> ,retval ,form)) forms) + ,retval))) + +(defmacro --doto (init &rest forms) + "Anaphoric form of `-doto'. +This just evaluates INIT, binds the result to `it', evaluates +FORMS, and returns the final value of `it'. +Note: `it' need not be used in each form." + (declare (debug (form body)) (indent 1)) + `(let ((it ,init)) + ,@forms + it)) + +(defun -grade-up (comparator list) + "Grade elements of LIST using COMPARATOR relation. +This yields a permutation vector such that applying this +permutation to LIST sorts it in ascending order." + (->> (--map-indexed (cons it it-index) list) + (-sort (lambda (it other) (funcall comparator (car it) (car other)))) + (mapcar #'cdr))) + +(defun -grade-down (comparator list) + "Grade elements of LIST using COMPARATOR relation. +This yields a permutation vector such that applying this +permutation to LIST sorts it in descending order." + (->> (--map-indexed (cons it it-index) list) + (-sort (lambda (it other) (funcall comparator (car other) (car it)))) + (mapcar #'cdr))) + +(defvar dash--source-counter 0 + "Monotonic counter for generated symbols.") + +(defun dash--match-make-source-symbol () + "Generate a new dash-source symbol. + +All returned symbols are guaranteed to be unique." + (prog1 (make-symbol (format "--dash-source-%d--" dash--source-counter)) + (setq dash--source-counter (1+ dash--source-counter)))) + +(defun dash--match-ignore-place-p (symbol) + "Return non-nil if SYMBOL is a symbol and starts with _." + (and (symbolp symbol) + (eq (aref (symbol-name symbol) 0) ?_))) + +(defun dash--match-cons-skip-cdr (skip-cdr source) + "Helper function generating idiomatic shifting code." + (cond + ((= skip-cdr 0) + `(pop ,source)) + (t + `(prog1 ,(dash--match-cons-get-car skip-cdr source) + (setq ,source ,(dash--match-cons-get-cdr (1+ skip-cdr) source)))))) + +(defun dash--match-cons-get-car (skip-cdr source) + "Helper function generating idiomatic code to get nth car." + (cond + ((= skip-cdr 0) + `(car ,source)) + ((= skip-cdr 1) + `(cadr ,source)) + (t + `(nth ,skip-cdr ,source)))) + +(defun dash--match-cons-get-cdr (skip-cdr source) + "Helper function generating idiomatic code to get nth cdr." + (cond + ((= skip-cdr 0) + source) + ((= skip-cdr 1) + `(cdr ,source)) + (t + `(nthcdr ,skip-cdr ,source)))) + +(defun dash--match-cons (match-form source) + "Setup a cons matching environment and call the real matcher." + (let ((s (dash--match-make-source-symbol)) + (n 0) + (m match-form)) + (while (and (consp m) + (dash--match-ignore-place-p (car m))) + (setq n (1+ n)) (!cdr m)) + (cond + ;; when we only have one pattern in the list, we don't have to + ;; create a temporary binding (--dash-source--) for the source + ;; and just use the input directly + ((and (consp m) + (not (cdr m))) + (dash--match (car m) (dash--match-cons-get-car n source))) + ;; handle other special types + ((> n 0) + (dash--match m (dash--match-cons-get-cdr n source))) + ;; this is the only entry-point for dash--match-cons-1, that's + ;; why we can't simply use the above branch, it would produce + ;; infinite recursion + (t + (cons (list s source) (dash--match-cons-1 match-form s)))))) + +(defun dash--get-expand-function (type) + "Get expand function name for TYPE." + (intern-soft (format "dash-expand:%s" type))) + +(defun dash--match-cons-1 (match-form source &optional props) + "Match MATCH-FORM against SOURCE. + +MATCH-FORM is a proper or improper list. Each element of +MATCH-FORM is either a symbol, which gets bound to the respective +value in source or another match form which gets destructured +recursively. + +If the cdr of last cons cell in the list is `nil', matching stops +there. + +SOURCE is a proper or improper list." + (let ((skip-cdr (or (plist-get props :skip-cdr) 0))) + (cond + ((consp match-form) + (cond + ((cdr match-form) + (cond + ((and (symbolp (car match-form)) + (functionp (dash--get-expand-function (car match-form)))) + (dash--match-kv (dash--match-kv-normalize-match-form match-form) (dash--match-cons-get-cdr skip-cdr source))) + ((dash--match-ignore-place-p (car match-form)) + (dash--match-cons-1 (cdr match-form) source + (plist-put props :skip-cdr (1+ skip-cdr)))) + (t + (-concat (dash--match (car match-form) (dash--match-cons-skip-cdr skip-cdr source)) + (dash--match-cons-1 (cdr match-form) source))))) + (t ;; Last matching place, no need for shift + (dash--match (car match-form) (dash--match-cons-get-car skip-cdr source))))) + ((eq match-form nil) + nil) + (t ;; Handle improper lists. Last matching place, no need for shift + (dash--match match-form (dash--match-cons-get-cdr skip-cdr source)))))) + +(defun dash--match-vector (match-form source) + "Setup a vector matching environment and call the real matcher." + (let ((s (dash--match-make-source-symbol))) + (cond + ;; don't bind `s' if we only have one sub-pattern + ((= (length match-form) 1) + (dash--match (aref match-form 0) `(aref ,source 0))) + ;; if the source is a symbol, we don't need to re-bind it + ((symbolp source) + (dash--match-vector-1 match-form source)) + ;; don't bind `s' if we only have one sub-pattern which is not ignored + ((let* ((ignored-places (mapcar 'dash--match-ignore-place-p match-form)) + (ignored-places-n (length (-remove 'null ignored-places)))) + (when (= ignored-places-n (1- (length match-form))) + (let ((n (-find-index 'null ignored-places))) + (dash--match (aref match-form n) `(aref ,source ,n)))))) + (t + (cons (list s source) (dash--match-vector-1 match-form s)))))) + +(defun dash--match-vector-1 (match-form source) + "Match MATCH-FORM against SOURCE. + +MATCH-FORM is a vector. Each element of MATCH-FORM is either a +symbol, which gets bound to the respective value in source or +another match form which gets destructured recursively. + +If second-from-last place in MATCH-FORM is the symbol &rest, the +next element of the MATCH-FORM is matched against the tail of +SOURCE, starting at index of the &rest symbol. This is +conceptually the same as the (head . tail) match for improper +lists, where dot plays the role of &rest. + +SOURCE is a vector. + +If the MATCH-FORM vector is shorter than SOURCE vector, only +the (length MATCH-FORM) places are bound, the rest of the SOURCE +is discarded." + (let ((i 0) + (l (length match-form)) + (re)) + (while (< i l) + (let ((m (aref match-form i))) + (push (cond + ((and (symbolp m) + (eq m '&rest)) + (prog1 (dash--match + (aref match-form (1+ i)) + `(substring ,source ,i)) + (setq i l))) + ((and (symbolp m) + ;; do not match symbols starting with _ + (not (eq (aref (symbol-name m) 0) ?_))) + (list (list m `(aref ,source ,i)))) + ((not (symbolp m)) + (dash--match m `(aref ,source ,i)))) + re) + (setq i (1+ i)))) + (-flatten-n 1 (nreverse re)))) + +(defun dash--match-kv-normalize-match-form (pattern) + "Normalize kv PATTERN. + +This method normalizes PATTERN to the format expected by +`dash--match-kv'. See `-let' for the specification." + (let ((normalized (list (car pattern))) + (skip nil) + (fill-placeholder (make-symbol "--dash-fill-placeholder--"))) + (-each (apply '-zip (-pad fill-placeholder (cdr pattern) (cddr pattern))) + (lambda (pair) + (let ((current (car pair)) + (next (cdr pair))) + (if skip + (setq skip nil) + (if (or (eq fill-placeholder next) + (not (or (and (symbolp next) + (not (keywordp next)) + (not (eq next t)) + (not (eq next nil))) + (and (consp next) + (not (eq (car next) 'quote))) + (vectorp next)))) + (progn + (cond + ((keywordp current) + (push current normalized) + (push (intern (substring (symbol-name current) 1)) normalized)) + ((stringp current) + (push current normalized) + (push (intern current) normalized)) + ((and (consp current) + (eq (car current) 'quote)) + (push current normalized) + (push (cadr current) normalized)) + (t (error "-let: found key `%s' in kv destructuring but its pattern `%s' is invalid and can not be derived from the key" current next))) + (setq skip nil)) + (push current normalized) + (push next normalized) + (setq skip t)))))) + (nreverse normalized))) + +(defun dash--match-kv (match-form source) + "Setup a kv matching environment and call the real matcher. + +kv can be any key-value store, such as plist, alist or hash-table." + (let ((s (dash--match-make-source-symbol))) + (cond + ;; don't bind `s' if we only have one sub-pattern (&type key val) + ((= (length match-form) 3) + (dash--match-kv-1 (cdr match-form) source (car match-form))) + ;; if the source is a symbol, we don't need to re-bind it + ((symbolp source) + (dash--match-kv-1 (cdr match-form) source (car match-form))) + (t + (cons (list s source) (dash--match-kv-1 (cdr match-form) s (car match-form))))))) + +(defun dash-expand:&hash (key source) + "Generate extracting KEY from SOURCE for &hash destructuring." + `(gethash ,key ,source)) + +(defun dash-expand:&plist (key source) + "Generate extracting KEY from SOURCE for &plist destructuring." + `(plist-get ,source ,key)) + +(defun dash-expand:&alist (key source) + "Generate extracting KEY from SOURCE for &alist destructuring." + `(cdr (assoc ,key ,source))) + +(defun dash-expand:&hash? (key source) + "Generate extracting KEY from SOURCE for &hash? destructuring. +Similar to &hash but check whether the map is not nil." + (let ((src (make-symbol "src"))) + `(let ((,src ,source)) + (when ,src (gethash ,key ,src))))) + +(defalias 'dash-expand:&keys 'dash-expand:&plist) + +(defun dash--match-kv-1 (match-form source type) + "Match MATCH-FORM against SOURCE of type TYPE. + +MATCH-FORM is a proper list of the form (key1 place1 ... keyN +placeN). Each placeK is either a symbol, which gets bound to the +value of keyK retrieved from the key-value store, or another +match form which gets destructured recursively. + +SOURCE is a key-value store of type TYPE, which can be a plist, +an alist or a hash table. + +TYPE is a token specifying the type of the key-value store. +Valid values are &plist, &alist and &hash." + (-flatten-n 1 (-map + (lambda (kv) + (let* ((k (car kv)) + (v (cadr kv)) + (getter + (funcall (dash--get-expand-function type) k source))) + (cond + ((symbolp v) + (list (list v getter))) + (t (dash--match v getter))))) + (-partition 2 match-form)))) + +(defun dash--match-symbol (match-form source) + "Bind a symbol. + +This works just like `let', there is no destructuring." + (list (list match-form source))) + +(defun dash--match (match-form source) + "Match MATCH-FORM against SOURCE. + +This function tests the MATCH-FORM and dispatches to specific +matchers based on the type of the expression. + +Key-value stores are disambiguated by placing a token &plist, +&alist or &hash as a first item in the MATCH-FORM." + (cond + ((symbolp match-form) + (dash--match-symbol match-form source)) + ((consp match-form) + (cond + ;; Handle the "x &as" bindings first. + ((and (consp (cdr match-form)) + (symbolp (car match-form)) + (eq '&as (cadr match-form))) + (let ((s (car match-form))) + (cons (list s source) + (dash--match (cddr match-form) s)))) + ((functionp (dash--get-expand-function (car match-form))) + (dash--match-kv (dash--match-kv-normalize-match-form match-form) source)) + (t (dash--match-cons match-form source)))) + ((vectorp match-form) + ;; We support the &as binding in vectors too + (cond + ((and (> (length match-form) 2) + (symbolp (aref match-form 0)) + (eq '&as (aref match-form 1))) + (let ((s (aref match-form 0))) + (cons (list s source) + (dash--match (substring match-form 2) s)))) + (t (dash--match-vector match-form source)))))) + +(defun dash--normalize-let-varlist (varlist) + "Normalize VARLIST so that every binding is a list. + +`let' allows specifying a binding which is not a list but simply +the place which is then automatically bound to nil, such that all +three of the following are identical and evaluate to nil. + + (let (a) a) + (let ((a)) a) + (let ((a nil)) a) + +This function normalizes all of these to the last form." + (--map (if (consp it) it (list it nil)) varlist)) + +(defmacro -let* (varlist &rest body) + "Bind variables according to VARLIST then eval BODY. + +VARLIST is a list of lists of the form (PATTERN SOURCE). Each +PATTERN is matched against the SOURCE structurally. SOURCE is +only evaluated once for each PATTERN. + +Each SOURCE can refer to the symbols already bound by this +VARLIST. This is useful if you want to destructure SOURCE +recursively but also want to name the intermediate structures. + +See `-let' for the list of all possible patterns." + (declare (debug ((&rest [&or (sexp form) sexp]) body)) + (indent 1)) + (let* ((varlist (dash--normalize-let-varlist varlist)) + (bindings (--mapcat (dash--match (car it) (cadr it)) varlist))) + `(let* ,bindings + ,@body))) + +(defmacro -let (varlist &rest body) + "Bind variables according to VARLIST then eval BODY. + +VARLIST is a list of lists of the form (PATTERN SOURCE). Each +PATTERN is matched against the SOURCE \"structurally\". SOURCE +is only evaluated once for each PATTERN. Each PATTERN is matched +recursively, and can therefore contain sub-patterns which are +matched against corresponding sub-expressions of SOURCE. + +All the SOURCEs are evalled before any symbols are +bound (i.e. \"in parallel\"). + +If VARLIST only contains one (PATTERN SOURCE) element, you can +optionally specify it using a vector and discarding the +outer-most parens. Thus + + (-let ((PATTERN SOURCE)) ...) + +becomes + + (-let [PATTERN SOURCE] ...). + +`-let' uses a convention of not binding places (symbols) starting +with _ whenever it's possible. You can use this to skip over +entries you don't care about. However, this is not *always* +possible (as a result of implementation) and these symbols might +get bound to undefined values. + +Following is the overview of supported patterns. Remember that +patterns can be matched recursively, so every a, b, aK in the +following can be a matching construct and not necessarily a +symbol/variable. + +Symbol: + + a - bind the SOURCE to A. This is just like regular `let'. + +Conses and lists: + + (a) - bind `car' of cons/list to A + + (a . b) - bind car of cons to A and `cdr' to B + + (a b) - bind car of list to A and `cadr' to B + + (a1 a2 a3 ...) - bind 0th car of list to A1, 1st to A2, 2nd to A3... + + (a1 a2 a3 ... aN . rest) - as above, but bind the Nth cdr to REST. + +Vectors: + + [a] - bind 0th element of a non-list sequence to A (works with + vectors, strings, bit arrays...) + + [a1 a2 a3 ...] - bind 0th element of non-list sequence to A0, 1st to + A1, 2nd to A2, ... + If the PATTERN is shorter than SOURCE, the values at + places not in PATTERN are ignored. + If the PATTERN is longer than SOURCE, an `error' is + thrown. + + [a1 a2 a3 ... &rest rest] - as above, but bind the rest of + the sequence to REST. This is + conceptually the same as improper list + matching (a1 a2 ... aN . rest) + +Key/value stores: + + (&plist key0 a0 ... keyN aN) - bind value mapped by keyK in the + SOURCE plist to aK. If the + value is not found, aK is nil. + Uses `plist-get' to fetch values. + + (&alist key0 a0 ... keyN aN) - bind value mapped by keyK in the + SOURCE alist to aK. If the + value is not found, aK is nil. + Uses `assoc' to fetch values. + + (&hash key0 a0 ... keyN aN) - bind value mapped by keyK in the + SOURCE hash table to aK. If the + value is not found, aK is nil. + Uses `gethash' to fetch values. + +Further, special keyword &keys supports \"inline\" matching of +plist-like key-value pairs, similarly to &keys keyword of +`cl-defun'. + + (a1 a2 ... aN &keys key1 b1 ... keyN bK) + +This binds N values from the list to a1 ... aN, then interprets +the cdr as a plist (see key/value matching above). + +A shorthand notation for kv-destructuring exists which allows the +patterns be optionally left out and derived from the key name in +the following fashion: + +- a key :foo is converted into `foo' pattern, +- a key 'bar is converted into `bar' pattern, +- a key \"baz\" is converted into `baz' pattern. + +That is, the entire value under the key is bound to the derived +variable without any further destructuring. + +This is possible only when the form following the key is not a +valid pattern (i.e. not a symbol, a cons cell or a vector). +Otherwise the matching proceeds as usual and in case of an +invalid spec fails with an error. + +Thus the patterns are normalized as follows: + + ;; derive all the missing patterns + (&plist :foo 'bar \"baz\") => (&plist :foo foo 'bar bar \"baz\" baz) + + ;; we can specify some but not others + (&plist :foo 'bar explicit-bar) => (&plist :foo foo 'bar explicit-bar) + + ;; nothing happens, we store :foo in x + (&plist :foo x) => (&plist :foo x) + + ;; nothing happens, we match recursively + (&plist :foo (a b c)) => (&plist :foo (a b c)) + +You can name the source using the syntax SYMBOL &as PATTERN. +This syntax works with lists (proper or improper), vectors and +all types of maps. + + (list &as a b c) (list 1 2 3) + +binds A to 1, B to 2, C to 3 and LIST to (1 2 3). + +Similarly: + + (bounds &as beg . end) (cons 1 2) + +binds BEG to 1, END to 2 and BOUNDS to (1 . 2). + + (items &as first . rest) (list 1 2 3) + +binds FIRST to 1, REST to (2 3) and ITEMS to (1 2 3) + + [vect &as _ b c] [1 2 3] + +binds B to 2, C to 3 and VECT to [1 2 3] (_ avoids binding as usual). + + (plist &as &plist :b b) (list :a 1 :b 2 :c 3) + +binds B to 2 and PLIST to (:a 1 :b 2 :c 3). Same for &alist and &hash. + +This is especially useful when we want to capture the result of a +computation and destructure at the same time. Consider the +form (function-returning-complex-structure) returning a list of +two vectors with two items each. We want to capture this entire +result and pass it to another computation, but at the same time +we want to get the second item from each vector. We can achieve +it with pattern + + (result &as [_ a] [_ b]) (function-returning-complex-structure) + +Note: Clojure programmers may know this feature as the \":as +binding\". The difference is that we put the &as at the front +because we need to support improper list binding." + (declare (debug ([&or (&rest [&or (sexp form) sexp]) + (vector [&rest [sexp form]])] + body)) + (indent 1)) + (if (vectorp varlist) + `(let* ,(dash--match (aref varlist 0) (aref varlist 1)) + ,@body) + (let* ((varlist (dash--normalize-let-varlist varlist)) + (inputs (--map-indexed (list (make-symbol (format "input%d" it-index)) (cadr it)) varlist)) + (new-varlist (--map (list (caar it) (cadr it)) (-zip varlist inputs)))) + `(let ,inputs + (-let* ,new-varlist ,@body))))) + +(defmacro -lambda (match-form &rest body) + "Return a lambda which destructures its input as MATCH-FORM and executes BODY. + +Note that you have to enclose the MATCH-FORM in a pair of parens, +such that: + + (-lambda (x) body) + (-lambda (x y ...) body) + +has the usual semantics of `lambda'. Furthermore, these get +translated into normal `lambda', so there is no performance +penalty. + +See `-let' for a description of the destructuring mechanism." + (declare (doc-string 2) (indent defun) + (debug (&define sexp + [&optional stringp] + [&optional ("interactive" interactive)] + def-body))) + (cond + ((nlistp match-form) + (signal 'wrong-type-argument (list #'listp match-form))) + ;; No destructuring, so just return regular `lambda' for speed. + ((-all? #'symbolp match-form) + `(lambda ,match-form ,@body)) + ((let ((inputs (--map-indexed + (list it (make-symbol (format "input%d" it-index))) + match-form))) + ;; TODO: because inputs to the `lambda' are evaluated only once, + ;; `-let*' need not create the extra bindings to ensure that. + ;; We should find a way to optimize that. Not critical however. + `(lambda ,(mapcar #'cadr inputs) + (-let* ,inputs ,@body)))))) + +(defmacro -setq (&rest forms) + "Bind each MATCH-FORM to the value of its VAL. + +MATCH-FORM destructuring is done according to the rules of `-let'. + +This macro allows you to bind multiple variables by destructuring +the value, so for example: + + (-setq (a b) x + (&plist :c c) plist) + +expands roughly speaking to the following code + + (setq a (car x) + b (cadr x) + c (plist-get plist :c)) + +Care is taken to only evaluate each VAL once so that in case of +multiple assignments it does not cause unexpected side effects. + +\(fn [MATCH-FORM VAL]...)" + (declare (debug (&rest sexp form)) + (indent 1)) + (when (= (mod (length forms) 2) 1) + (signal 'wrong-number-of-arguments (list '-setq (1+ (length forms))))) + (let* ((forms-and-sources + ;; First get all the necessary mappings with all the + ;; intermediate bindings. + (-map (lambda (x) (dash--match (car x) (cadr x))) + (-partition 2 forms))) + ;; To preserve the logic of dynamic scoping we must ensure + ;; that we `setq' the variables outside of the `let*' form + ;; which holds the destructured intermediate values. For + ;; this we generate for each variable a placeholder which is + ;; bound to (lexically) the result of the destructuring. + ;; Then outside of the helper `let*' form we bind all the + ;; original variables to their respective placeholders. + ;; TODO: There is a lot of room for possible optimization, + ;; for start playing with `special-variable-p' to eliminate + ;; unnecessary re-binding. + (variables-to-placeholders + (-mapcat + (lambda (bindings) + (-map + (lambda (binding) + (let ((var (car binding))) + (list var (make-symbol (concat "--dash-binding-" (symbol-name var) "--"))))) + (--filter (not (string-prefix-p "--" (symbol-name (car it)))) bindings))) + forms-and-sources))) + `(let ,(-map 'cadr variables-to-placeholders) + (let* ,(-flatten-n 1 forms-and-sources) + (setq ,@(-flatten (-map 'reverse variables-to-placeholders)))) + (setq ,@(-flatten variables-to-placeholders))))) + +(defmacro -if-let* (vars-vals then &rest else) + "If all VALS evaluate to true, bind them to their corresponding +VARS and do THEN, otherwise do ELSE. VARS-VALS should be a list +of (VAR VAL) pairs. + +Note: binding is done according to `-let*'. VALS are evaluated +sequentially, and evaluation stops after the first nil VAL is +encountered." + (declare (debug ((&rest (sexp form)) form body)) + (indent 2)) + (->> vars-vals + (--mapcat (dash--match (car it) (cadr it))) + (--reduce-r-from + (let ((var (car it)) + (val (cadr it))) + `(let ((,var ,val)) + (if ,var ,acc ,@else))) + then))) + +(defmacro -if-let (var-val then &rest else) + "If VAL evaluates to non-nil, bind it to VAR and do THEN, +otherwise do ELSE. + +Note: binding is done according to `-let'. + +\(fn (VAR VAL) THEN &rest ELSE)" + (declare (debug ((sexp form) form body)) + (indent 2)) + `(-if-let* (,var-val) ,then ,@else)) + +(defmacro --if-let (val then &rest else) + "If VAL evaluates to non-nil, bind it to symbol `it' and do THEN, +otherwise do ELSE." + (declare (debug (form form body)) + (indent 2)) + `(-if-let (it ,val) ,then ,@else)) + +(defmacro -when-let* (vars-vals &rest body) + "If all VALS evaluate to true, bind them to their corresponding +VARS and execute body. VARS-VALS should be a list of (VAR VAL) +pairs. + +Note: binding is done according to `-let*'. VALS are evaluated +sequentially, and evaluation stops after the first nil VAL is +encountered." + (declare (debug ((&rest (sexp form)) body)) + (indent 1)) + `(-if-let* ,vars-vals (progn ,@body))) + +(defmacro -when-let (var-val &rest body) + "If VAL evaluates to non-nil, bind it to VAR and execute body. + +Note: binding is done according to `-let'. + +\(fn (VAR VAL) &rest BODY)" + (declare (debug ((sexp form) body)) + (indent 1)) + `(-if-let ,var-val (progn ,@body))) + +(defmacro --when-let (val &rest body) + "If VAL evaluates to non-nil, bind it to symbol `it' and +execute body." + (declare (debug (form body)) + (indent 1)) + `(--if-let ,val (progn ,@body))) + +(defvar -compare-fn nil + "Tests for equality use this function or `equal' if this is nil. +It should only be set using dynamic scope with a let, like: + + (let ((-compare-fn #\\='=)) (-union numbers1 numbers2 numbers3)") + +(defun -distinct (list) + "Return a new list with all duplicates removed. +The test for equality is done with `equal', +or with `-compare-fn' if that's non-nil. + +Alias: `-uniq'" + ;; Implementation note: The speedup gained from hash table lookup + ;; starts to outweigh its overhead for lists of length greater than + ;; 32. See discussion in PR #305. + (let* ((len (length list)) + (lut (and (> len 32) + ;; Check that `-compare-fn' is a valid hash-table + ;; lookup function or `nil'. + (memq -compare-fn '(nil equal eq eql)) + (make-hash-table :test (or -compare-fn #'equal) + :size len)))) + (if lut + (--filter (unless (gethash it lut) + (puthash it t lut)) + list) + (--each list (unless (-contains? lut it) (!cons it lut))) + (nreverse lut)))) + +(defalias '-uniq '-distinct) + +(defun -union (list list2) + "Return a new list containing the elements of LIST and elements of LIST2 that are not in LIST. +The test for equality is done with `equal', +or with `-compare-fn' if that's non-nil." + ;; We fall back to iteration implementation if the comparison + ;; function isn't one of `eq', `eql' or `equal'. + (let* ((result (reverse list)) + ;; TODO: get rid of this dynamic variable, pass it as an + ;; argument instead. + (-compare-fn (if (bound-and-true-p -compare-fn) + -compare-fn + 'equal))) + (if (memq -compare-fn '(eq eql equal)) + (let ((ht (make-hash-table :test -compare-fn))) + (--each list (puthash it t ht)) + (--each list2 (unless (gethash it ht) (!cons it result)))) + (--each list2 (unless (-contains? result it) (!cons it result)))) + (nreverse result))) + +(defun -intersection (list list2) + "Return a new list containing only the elements that are members of both LIST and LIST2. +The test for equality is done with `equal', +or with `-compare-fn' if that's non-nil." + (--filter (-contains? list2 it) list)) + +(defun -difference (list list2) + "Return a new list with only the members of LIST that are not in LIST2. +The test for equality is done with `equal', +or with `-compare-fn' if that's non-nil." + (--filter (not (-contains? list2 it)) list)) + +(defun -powerset (list) + "Return the power set of LIST." + (if (null list) '(()) + (let ((last (-powerset (cdr list)))) + (append (mapcar (lambda (x) (cons (car list) x)) last) + last)))) + +(defun -permutations (list) + "Return the permutations of LIST." + (if (null list) '(()) + (apply #'append + (mapcar (lambda (x) + (mapcar (lambda (perm) (cons x perm)) + (-permutations (remove x list)))) + list)))) + +(defun -inits (list) + "Return all prefixes of LIST." + (let ((res (list list))) + (setq list (reverse list)) + (while list + (push (reverse (!cdr list)) res)) + res)) + +(defun -tails (list) + "Return all suffixes of LIST" + (-reductions-r-from 'cons nil list)) + +(defun -common-prefix (&rest lists) + "Return the longest common prefix of LISTS." + (declare (pure t) (side-effect-free t)) + (--reduce (--take-while (and acc (equal (pop acc) it)) it) + lists)) + +(defun -common-suffix (&rest lists) + "Return the longest common suffix of LISTS." + (nreverse (apply #'-common-prefix (mapcar #'reverse lists)))) + +(defun -contains? (list element) + "Return non-nil if LIST contains ELEMENT. + +The test for equality is done with `equal', or with `-compare-fn' +if that's non-nil. + +Alias: `-contains-p'" + (not + (null + (cond + ((null -compare-fn) (member element list)) + ((eq -compare-fn 'eq) (memq element list)) + ((eq -compare-fn 'eql) (memql element list)) + (t + (let ((lst list)) + (while (and lst + (not (funcall -compare-fn element (car lst)))) + (setq lst (cdr lst))) + lst)))))) + +(defalias '-contains-p '-contains?) + +(defun -same-items? (list list2) + "Return true if LIST and LIST2 has the same items. + +The order of the elements in the lists does not matter. + +Alias: `-same-items-p'" + (let ((length-a (length list)) + (length-b (length list2))) + (and + (= length-a length-b) + (= length-a (length (-intersection list list2)))))) + +(defalias '-same-items-p '-same-items?) + +(defun -is-prefix? (prefix list) + "Return non-nil if PREFIX is a prefix of LIST. + +Alias: `-is-prefix-p'." + (declare (pure t) (side-effect-free t)) + (--each-while list (and (equal (car prefix) it) + (!cdr prefix))) + (null prefix)) + +(defun -is-suffix? (suffix list) + "Return non-nil if SUFFIX is a suffix of LIST. + +Alias: `-is-suffix-p'." + (declare (pure t) (side-effect-free t)) + (cond ((null suffix)) + ((setq list (member (car suffix) list)) + (equal (cdr suffix) (cdr list))))) + +(defun -is-infix? (infix list) + "Return non-nil if INFIX is infix of LIST. + +This operation runs in O(n^2) time + +Alias: `-is-infix-p'" + (declare (pure t) (side-effect-free t)) + (let (done) + (while (and (not done) list) + (setq done (-is-prefix? infix list)) + (!cdr list)) + done)) + +(defalias '-is-prefix-p '-is-prefix?) +(defalias '-is-suffix-p '-is-suffix?) +(defalias '-is-infix-p '-is-infix?) + +(defun -sort (comparator list) + "Sort LIST, stably, comparing elements using COMPARATOR. +Return the sorted list. LIST is NOT modified by side effects. +COMPARATOR is called with two elements of LIST, and should return non-nil +if the first element should sort before the second." + (sort (copy-sequence list) comparator)) + +(defmacro --sort (form list) + "Anaphoric form of `-sort'." + (declare (debug (def-form form))) + `(-sort (lambda (it other) ,form) ,list)) + +(defun -list (&optional arg &rest args) + "Ensure ARG is a list. +If ARG is already a list, return it as is (not a copy). +Otherwise, return a new list with ARG as its only element. + +Another supported calling convention is (-list &rest ARGS). +In this case, if ARG is not a list, a new list with all of +ARGS as elements is returned. This use is supported for +backward compatibility and is otherwise deprecated." + (declare (advertised-calling-convention (arg) "2.18.0") + (pure t) (side-effect-free t)) + (if (listp arg) arg (cons arg args))) + +(defun -repeat (n x) + "Return a new list of length N with each element being X. +Return nil if N is less than 1." + (declare (pure t) (side-effect-free t)) + (and (natnump n) (make-list n x))) + +(defun -sum (list) + "Return the sum of LIST." + (declare (pure t) (side-effect-free t)) + (apply '+ list)) + +(defun -running-sum (list) + "Return a list with running sums of items in LIST. +LIST must be non-empty." + (declare (pure t) (side-effect-free t)) + (or list (signal 'wrong-type-argument (list #'consp list))) + (-reductions #'+ list)) + +(defun -product (list) + "Return the product of LIST." + (declare (pure t) (side-effect-free t)) + (apply '* list)) + +(defun -running-product (list) + "Return a list with running products of items in LIST. +LIST must be non-empty." + (declare (pure t) (side-effect-free t)) + (or list (signal 'wrong-type-argument (list #'consp list))) + (-reductions #'* list)) + +(defun -max (list) + "Return the largest value from LIST of numbers or markers." + (declare (pure t) (side-effect-free t)) + (apply 'max list)) + +(defun -min (list) + "Return the smallest value from LIST of numbers or markers." + (declare (pure t) (side-effect-free t)) + (apply 'min list)) + +(defun -max-by (comparator list) + "Take a comparison function COMPARATOR and a LIST and return +the greatest element of the list by the comparison function. + +See also combinator `-on' which can transform the values before +comparing them." + (--reduce (if (funcall comparator it acc) it acc) list)) + +(defun -min-by (comparator list) + "Take a comparison function COMPARATOR and a LIST and return +the least element of the list by the comparison function. + +See also combinator `-on' which can transform the values before +comparing them." + (--reduce (if (funcall comparator it acc) acc it) list)) + +(defmacro --max-by (form list) + "Anaphoric version of `-max-by'. + +The items for the comparator form are exposed as \"it\" and \"other\"." + (declare (debug (def-form form))) + `(-max-by (lambda (it other) ,form) ,list)) + +(defmacro --min-by (form list) + "Anaphoric version of `-min-by'. + +The items for the comparator form are exposed as \"it\" and \"other\"." + (declare (debug (def-form form))) + `(-min-by (lambda (it other) ,form) ,list)) + +(defun -iota (count &optional start step) + "Return a list containing COUNT numbers. +Starts from START and adds STEP each time. The default START is +zero, the default STEP is 1. +This function takes its name from the corresponding primitive in +the APL language." + (declare (pure t) (side-effect-free t)) + (unless (natnump count) + (signal 'wrong-type-argument (list #'natnump count))) + (or start (setq start 0)) + (or step (setq step 1)) + (if (zerop step) + (make-list count start) + (--iterate (+ it step) start count))) + +(defun -fix (fn list) + "Compute the (least) fixpoint of FN with initial input LIST. + +FN is called at least once, results are compared with `equal'." + (let ((re (funcall fn list))) + (while (not (equal list re)) + (setq list re) + (setq re (funcall fn re))) + re)) + +(defmacro --fix (form list) + "Anaphoric form of `-fix'." + (declare (debug (def-form form))) + `(-fix (lambda (it) ,form) ,list)) + +(defun -unfold (fun seed) + "Build a list from SEED using FUN. + +This is \"dual\" operation to `-reduce-r': while -reduce-r +consumes a list to produce a single value, `-unfold' takes a +seed value and builds a (potentially infinite!) list. + +FUN should return `nil' to stop the generating process, or a +cons (A . B), where A will be prepended to the result and B is +the new seed." + (let ((last (funcall fun seed)) r) + (while last + (push (car last) r) + (setq last (funcall fun (cdr last)))) + (nreverse r))) + +(defmacro --unfold (form seed) + "Anaphoric version of `-unfold'." + (declare (debug (def-form form))) + `(-unfold (lambda (it) ,form) ,seed)) + +(defun -cons-pair? (obj) + "Return non-nil if OBJ is a true cons pair. +That is, a cons (A . B) where B is not a list. + +Alias: `-cons-pair-p'." + (declare (pure t) (side-effect-free t)) + (nlistp (cdr-safe obj))) + +(defalias '-cons-pair-p '-cons-pair?) + +(defun -cons-to-list (con) + "Convert a cons pair to a list with `car' and `cdr' of the pair respectively." + (declare (pure t) (side-effect-free t)) + (list (car con) (cdr con))) + +(defun -value-to-list (val) + "Convert a value to a list. + +If the value is a cons pair, make a list with two elements, `car' +and `cdr' of the pair respectively. + +If the value is anything else, wrap it in a list." + (declare (pure t) (side-effect-free t)) + (cond + ((-cons-pair? val) (-cons-to-list val)) + (t (list val)))) + +(defun -tree-mapreduce-from (fn folder init-value tree) + "Apply FN to each element of TREE, and make a list of the results. +If elements of TREE are lists themselves, apply FN recursively to +elements of these nested lists. + +Then reduce the resulting lists using FOLDER and initial value +INIT-VALUE. See `-reduce-r-from'. + +This is the same as calling `-tree-reduce-from' after `-tree-map' +but is twice as fast as it only traverse the structure once." + (cond + ((not tree) nil) + ((-cons-pair? tree) (funcall fn tree)) + ((listp tree) + (-reduce-r-from folder init-value (mapcar (lambda (x) (-tree-mapreduce-from fn folder init-value x)) tree))) + (t (funcall fn tree)))) + +(defmacro --tree-mapreduce-from (form folder init-value tree) + "Anaphoric form of `-tree-mapreduce-from'." + (declare (debug (def-form def-form form form))) + `(-tree-mapreduce-from (lambda (it) ,form) (lambda (it acc) ,folder) ,init-value ,tree)) + +(defun -tree-mapreduce (fn folder tree) + "Apply FN to each element of TREE, and make a list of the results. +If elements of TREE are lists themselves, apply FN recursively to +elements of these nested lists. + +Then reduce the resulting lists using FOLDER and initial value +INIT-VALUE. See `-reduce-r-from'. + +This is the same as calling `-tree-reduce' after `-tree-map' +but is twice as fast as it only traverse the structure once." + (cond + ((not tree) nil) + ((-cons-pair? tree) (funcall fn tree)) + ((listp tree) + (-reduce-r folder (mapcar (lambda (x) (-tree-mapreduce fn folder x)) tree))) + (t (funcall fn tree)))) + +(defmacro --tree-mapreduce (form folder tree) + "Anaphoric form of `-tree-mapreduce'." + (declare (debug (def-form def-form form))) + `(-tree-mapreduce (lambda (it) ,form) (lambda (it acc) ,folder) ,tree)) + +(defun -tree-map (fn tree) + "Apply FN to each element of TREE while preserving the tree structure." + (cond + ((not tree) nil) + ((-cons-pair? tree) (funcall fn tree)) + ((listp tree) + (mapcar (lambda (x) (-tree-map fn x)) tree)) + (t (funcall fn tree)))) + +(defmacro --tree-map (form tree) + "Anaphoric form of `-tree-map'." + (declare (debug (def-form form))) + `(-tree-map (lambda (it) ,form) ,tree)) + +(defun -tree-reduce-from (fn init-value tree) + "Use FN to reduce elements of list TREE. +If elements of TREE are lists themselves, apply the reduction recursively. + +FN is first applied to INIT-VALUE and first element of the list, +then on this result and second element from the list etc. + +The initial value is ignored on cons pairs as they always contain +two elements." + (cond + ((not tree) nil) + ((-cons-pair? tree) tree) + ((listp tree) + (-reduce-r-from fn init-value (mapcar (lambda (x) (-tree-reduce-from fn init-value x)) tree))) + (t tree))) + +(defmacro --tree-reduce-from (form init-value tree) + "Anaphoric form of `-tree-reduce-from'." + (declare (debug (def-form form form))) + `(-tree-reduce-from (lambda (it acc) ,form) ,init-value ,tree)) + +(defun -tree-reduce (fn tree) + "Use FN to reduce elements of list TREE. +If elements of TREE are lists themselves, apply the reduction recursively. + +FN is first applied to first element of the list and second +element, then on this result and third element from the list etc. + +See `-reduce-r' for how exactly are lists of zero or one element handled." + (cond + ((not tree) nil) + ((-cons-pair? tree) tree) + ((listp tree) + (-reduce-r fn (mapcar (lambda (x) (-tree-reduce fn x)) tree))) + (t tree))) + +(defmacro --tree-reduce (form tree) + "Anaphoric form of `-tree-reduce'." + (declare (debug (def-form form))) + `(-tree-reduce (lambda (it acc) ,form) ,tree)) + +(defun -tree-map-nodes (pred fun tree) + "Call FUN on each node of TREE that satisfies PRED. + +If PRED returns nil, continue descending down this node. If PRED +returns non-nil, apply FUN to this node and do not descend +further." + (if (funcall pred tree) + (funcall fun tree) + (if (and (listp tree) + (not (-cons-pair? tree))) + (-map (lambda (x) (-tree-map-nodes pred fun x)) tree) + tree))) + +(defmacro --tree-map-nodes (pred form tree) + "Anaphoric form of `-tree-map-nodes'." + (declare (debug (def-form def-form form))) + `(-tree-map-nodes (lambda (it) ,pred) (lambda (it) ,form) ,tree)) + +(defun -tree-seq (branch children tree) + "Return a sequence of the nodes in TREE, in depth-first search order. + +BRANCH is a predicate of one argument that returns non-nil if the +passed argument is a branch, that is, a node that can have children. + +CHILDREN is a function of one argument that returns the children +of the passed branch node. + +Non-branch nodes are simply copied." + (cons tree + (when (funcall branch tree) + (-mapcat (lambda (x) (-tree-seq branch children x)) + (funcall children tree))))) + +(defmacro --tree-seq (branch children tree) + "Anaphoric form of `-tree-seq'." + (declare (debug (def-form def-form form))) + `(-tree-seq (lambda (it) ,branch) (lambda (it) ,children) ,tree)) + +(defun -clone (list) + "Create a deep copy of LIST. +The new list has the same elements and structure but all cons are +replaced with new ones. This is useful when you need to clone a +structure such as plist or alist." + (declare (pure t) (side-effect-free t)) + (-tree-map 'identity list)) + +;;; Combinators + +(defalias '-partial #'apply-partially) + +(defun -rpartial (fn &rest args) + "Return a function that is a partial application of FN to ARGS. +ARGS is a list of the last N arguments to pass to FN. The result +is a new function which does the same as FN, except that the last +N arguments are fixed at the values with which this function was +called. This is like `-partial', except the arguments are fixed +starting from the right rather than the left." + (declare (pure t) (side-effect-free t)) + (lambda (&rest args-before) (apply fn (append args-before args)))) + +(defun -juxt (&rest fns) + "Return a function that is the juxtaposition of FNS. +The returned function takes a variable number of ARGS, applies +each of FNS in turn to ARGS, and returns the list of results." + (declare (pure t) (side-effect-free t)) + (lambda (&rest args) (mapcar (lambda (x) (apply x args)) fns))) + +(defun -compose (&rest fns) + "Compose FNS into a single composite function. +Return a function that takes a variable number of ARGS, applies +the last function in FNS to ARGS, and returns the result of +calling each remaining function on the result of the previous +function, right-to-left. If no FNS are given, return a variadic +`identity' function." + (declare (pure t) (side-effect-free t)) + (let* ((fns (nreverse fns)) + (head (car fns)) + (tail (cdr fns))) + (cond (tail + (lambda (&rest args) + (--reduce-from (funcall it acc) (apply head args) tail))) + (fns head) + ((lambda (&optional arg &rest _) arg))))) + +(defun -applify (fn) + "Return a function that applies FN to a single list of args. +This changes the arity of FN from taking N distinct arguments to +taking 1 argument which is a list of N arguments." + (declare (pure t) (side-effect-free t)) + (lambda (args) (apply fn args))) + +(defun -on (operator transformer) + "Return a function of two arguments that first applies +TRANSFORMER to each of them and then applies OPERATOR on the +results (in the same order). + +In types: (b -> b -> c) -> (a -> b) -> a -> a -> c" + (lambda (x y) (funcall operator (funcall transformer x) (funcall transformer y)))) + +(defun -flip (func) + "Swap the order of arguments for binary function FUNC. + +In types: (a -> b -> c) -> b -> a -> c" + (lambda (x y) (funcall func y x))) + +(defun -const (c) + "Return a function that returns C ignoring any additional arguments. + +In types: a -> b -> a" + (lambda (&rest _) c)) + +(defmacro -cut (&rest params) + "Take n-ary function and n arguments and specialize some of them. +Arguments denoted by <> will be left unspecialized. + +See SRFI-26 for detailed description." + (declare (debug (&optional sexp &rest &or "<>" form))) + (let* ((i 0) + (args (--keep (when (eq it '<>) + (setq i (1+ i)) + (make-symbol (format "D%d" i))) + params))) + `(lambda ,args + ,(let ((body (--map (if (eq it '<>) (pop args) it) params))) + (if (eq (car params) '<>) + (cons 'funcall body) + body))))) + +(defun -not (pred) + "Take a unary predicate PRED and return a unary predicate +that returns t if PRED returns nil and nil if PRED returns +non-nil." + (lambda (x) (not (funcall pred x)))) + +(defun -orfn (&rest preds) + "Take list of unary predicates PREDS and return a unary +predicate with argument x that returns non-nil if at least one of +the PREDS returns non-nil on x. + +In types: [a -> Bool] -> a -> Bool" + (lambda (x) (-any? (-cut funcall <> x) preds))) + +(defun -andfn (&rest preds) + "Take list of unary predicates PREDS and return a unary +predicate with argument x that returns non-nil if all of the +PREDS returns non-nil on x. + +In types: [a -> Bool] -> a -> Bool" + (lambda (x) (-all? (-cut funcall <> x) preds))) + +(defun -iteratefn (fn n) + "Return a function FN composed N times with itself. + +FN is a unary function. If you need to use a function of higher +arity, use `-applify' first to turn it into a unary function. + +With n = 0, this acts as identity function. + +In types: (a -> a) -> Int -> a -> a. + +This function satisfies the following law: + + (funcall (-iteratefn fn n) init) = (-last-item (-iterate fn init (1+ n)))." + (lambda (x) (--dotimes n (setq x (funcall fn x))) x)) + +(defun -counter (&optional beg end inc) + "Return a closure that counts from BEG to END, with increment INC. + +The closure will return the next value in the counting sequence +each time it is called, and nil after END is reached. BEG +defaults to 0, INC defaults to 1, and if END is nil, the counter +will increment indefinitely. + +The closure accepts any number of arguments, which are discarded." + (let ((inc (or inc 1)) + (n (or beg 0))) + (lambda (&rest _) + (when (or (not end) (< n end)) + (prog1 n + (setq n (+ n inc))))))) + +(defvar -fixfn-max-iterations 1000 + "The default maximum number of iterations performed by `-fixfn' + unless otherwise specified.") + +(defun -fixfn (fn &optional equal-test halt-test) + "Return a function that computes the (least) fixpoint of FN. + +FN must be a unary function. The returned lambda takes a single +argument, X, the initial value for the fixpoint iteration. The +iteration halts when either of the following conditions is satisfied: + + 1. Iteration converges to the fixpoint, with equality being + tested using EQUAL-TEST. If EQUAL-TEST is not specified, + `equal' is used. For functions over the floating point + numbers, it may be necessary to provide an appropriate + approximate comparison test. + + 2. HALT-TEST returns a non-nil value. HALT-TEST defaults to a + simple counter that returns t after `-fixfn-max-iterations', + to guard against infinite iteration. Otherwise, HALT-TEST + must be a function that accepts a single argument, the + current value of X, and returns non-nil as long as iteration + should continue. In this way, a more sophisticated + convergence test may be supplied by the caller. + +The return value of the lambda is either the fixpoint or, if +iteration halted before converging, a cons with car `halted' and +cdr the final output from HALT-TEST. + +In types: (a -> a) -> a -> a." + (let ((eqfn (or equal-test 'equal)) + (haltfn (or halt-test + (-not + (-counter 0 -fixfn-max-iterations))))) + (lambda (x) + (let ((re (funcall fn x)) + (halt? (funcall haltfn x))) + (while (and (not halt?) (not (funcall eqfn x re))) + (setq x re + re (funcall fn re) + halt? (funcall haltfn re))) + (if halt? (cons 'halted halt?) + re))))) + +(defun -prodfn (&rest fns) + "Take a list of n functions and return a function that takes a +list of length n, applying i-th function to i-th element of the +input list. Returns a list of length n. + +In types (for n=2): ((a -> b), (c -> d)) -> (a, c) -> (b, d) + +This function satisfies the following laws: + + (-compose (-prodfn f g ...) (-prodfn f\\=' g\\=' ...)) = (-prodfn (-compose f f\\=') (-compose g g\\=') ...) + (-prodfn f g ...) = (-juxt (-compose f (-partial \\='nth 0)) (-compose g (-partial \\='nth 1)) ...) + (-compose (-prodfn f g ...) (-juxt f\\=' g\\=' ...)) = (-juxt (-compose f f\\=') (-compose g g\\=') ...) + (-compose (-partial \\='nth n) (-prod f1 f2 ...)) = (-compose fn (-partial \\='nth n))" + (lambda (x) (-zip-with 'funcall fns x))) + +;;; Font lock + +(defvar dash--keywords + `(;; TODO: Do not fontify the following automatic variables + ;; globally; detect and limit to their local anaphoric scope. + (,(rx symbol-start (| "acc" "it" "it-index" "other") symbol-end) + 0 font-lock-variable-name-face) + ;; Macros in dev/examples.el. Based on `lisp-mode-symbol-regexp'. + (,(rx ?\( (group (| "defexamples" "def-example-group")) symbol-end + (+ (in "\t ")) + (group (* (| (syntax word) (syntax symbol) (: ?\\ nonl))))) + (1 font-lock-keyword-face) + (2 font-lock-function-name-face)) + ;; Symbols in dev/examples.el. + ,(rx symbol-start (| "=>" "~>" "!!>") symbol-end) + ;; Elisp macro fontification was static prior to Emacs 25. + ,@(when (< emacs-major-version 25) + (let ((macs '("!cdr" + "!cons" + "-->" + "--all?" + "--annotate" + "--any?" + "--count" + "--dotimes" + "--doto" + "--drop-while" + "--each" + "--each-r" + "--each-r-while" + "--each-while" + "--filter" + "--find-index" + "--find-indices" + "--find-last-index" + "--first" + "--fix" + "--group-by" + "--if-let" + "--iterate" + "--keep" + "--last" + "--map" + "--map-first" + "--map-indexed" + "--map-last" + "--map-when" + "--mapcat" + "--max-by" + "--min-by" + "--none?" + "--only-some?" + "--partition-by" + "--partition-by-header" + "--reduce" + "--reduce-from" + "--reduce-r" + "--reduce-r-from" + "--reductions" + "--reductions-from" + "--reductions-r" + "--reductions-r-from" + "--remove" + "--remove-first" + "--remove-last" + "--separate" + "--some" + "--sort" + "--splice" + "--splice-list" + "--split-when" + "--split-with" + "--take-while" + "--tree-map" + "--tree-map-nodes" + "--tree-mapreduce" + "--tree-mapreduce-from" + "--tree-reduce" + "--tree-reduce-from" + "--tree-seq" + "--unfold" + "--update-at" + "--when-let" + "--zip-with" + "->" + "->>" + "-as->" + "-doto" + "-if-let" + "-if-let*" + "-lambda" + "-let" + "-let*" + "-setq" + "-some-->" + "-some->" + "-some->>" + "-split-on" + "-when-let" + "-when-let*"))) + `((,(concat "(" (regexp-opt macs 'symbols)) . 1))))) + "Font lock keywords for `dash-fontify-mode'.") + +(defcustom dash-fontify-mode-lighter nil + "Mode line lighter for `dash-fontify-mode'. +Either a string to display in the mode line when +`dash-fontify-mode' is on, or nil to display +nothing (the default)." + :package-version '(dash . "2.18.0") + :group 'dash + :type '(choice (string :tag "Lighter" :value " Dash") + (const :tag "Nothing" nil))) + +;;;###autoload +(define-minor-mode dash-fontify-mode + "Toggle fontification of Dash special variables. + +Dash-Fontify mode is a buffer-local minor mode intended for Emacs +Lisp buffers. Enabling it causes the special variables bound in +anaphoric Dash macros to be fontified. These anaphoras include +`it', `it-index', `acc', and `other'. In older Emacs versions +which do not dynamically detect macros, Dash-Fontify mode +additionally fontifies Dash macro calls. + +See also `dash-fontify-mode-lighter' and +`global-dash-fontify-mode'." + :group 'dash :lighter dash-fontify-mode-lighter + (if dash-fontify-mode + (font-lock-add-keywords nil dash--keywords t) + (font-lock-remove-keywords nil dash--keywords)) + (cond ((fboundp 'font-lock-flush) ;; Added in Emacs 25. + (font-lock-flush)) + ;; `font-lock-fontify-buffer' unconditionally enables + ;; `font-lock-mode' and is marked `interactive-only' in later + ;; Emacs versions which have `font-lock-flush', so we guard + ;; and pacify as needed, respectively. + (font-lock-mode + (with-no-warnings + (font-lock-fontify-buffer))))) + +(defun dash--turn-on-fontify-mode () + "Enable `dash-fontify-mode' if in an Emacs Lisp buffer." + (when (derived-mode-p #'emacs-lisp-mode) + (dash-fontify-mode))) + +;;;###autoload +(define-globalized-minor-mode global-dash-fontify-mode + dash-fontify-mode dash--turn-on-fontify-mode + :group 'dash) + +(defcustom dash-enable-fontlock nil + "If non-nil, fontify Dash macro calls and special variables." + :group 'dash + :set (lambda (sym val) + (set-default sym val) + (global-dash-fontify-mode (if val 1 0))) + :type 'boolean) + +(make-obsolete-variable + 'dash-enable-fontlock #'global-dash-fontify-mode "2.18.0") + +(define-obsolete-function-alias + 'dash-enable-font-lock #'global-dash-fontify-mode "2.18.0") + +;;; Info + +(defvar dash--info-doc-spec '("(dash) Index" nil "^ -+ .*: " "\\( \\|$\\)") + "The Dash :doc-spec entry for `info-lookup-alist'. +It is based on that for `emacs-lisp-mode'.") + +(defun dash--info-elisp-docs () + "Return the `emacs-lisp-mode' symbol docs from `info-lookup-alist'. +Specifically, return the cons containing their +`info-lookup->doc-spec' so that we can modify it." + (defvar info-lookup-alist) + (nthcdr 3 (assq #'emacs-lisp-mode (cdr (assq 'symbol info-lookup-alist))))) + +;;;###autoload +(defun dash-register-info-lookup () + "Register the Dash Info manual with `info-lookup-symbol'. +This allows Dash symbols to be looked up with \\[info-lookup-symbol]." + (interactive) + (require 'info-look) + (let ((docs (dash--info-elisp-docs))) + (setcar docs (append (car docs) (list dash--info-doc-spec))) + (info-lookup-reset))) + +(defun dash-unload-function () + "Remove Dash from `info-lookup-alist'. +Used by `unload-feature', which see." + (let ((docs (and (featurep 'info-look) + (dash--info-elisp-docs)))) + (when (member dash--info-doc-spec (car docs)) + (setcar docs (remove dash--info-doc-spec (car docs))) + (info-lookup-reset))) + nil) + +(provide 'dash) +;;; dash.el ends here diff --git a/.emacs.d/elpa/dash-20210609.1330/dash.elc b/.emacs.d/elpa/dash-20210609.1330/dash.elc new file mode 100644 index 0000000..5da93d5 Binary files /dev/null and b/.emacs.d/elpa/dash-20210609.1330/dash.elc differ diff --git a/.emacs.d/elpa/dash-20210609.1330/dash.info b/.emacs.d/elpa/dash-20210609.1330/dash.info new file mode 100644 index 0000000..7a03f7c --- /dev/null +++ b/.emacs.d/elpa/dash-20210609.1330/dash.info @@ -0,0 +1,4668 @@ +This is dash.info, produced by makeinfo version 6.7 from dash.texi. + +This manual is for Dash version 2.18.1. + + Copyright © 2012–2021 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU Free Documentation License, + Version 1.3 or any later version published by the Free Software + Foundation; with the Invariant Sections being “GNU General Public + License,” and no Front-Cover Texts or Back-Cover Texts. A copy of + the license is included in the section entitled “GNU Free + Documentation License”. +INFO-DIR-SECTION Emacs +START-INFO-DIR-ENTRY +* Dash: (dash.info). A modern list library for GNU Emacs. +END-INFO-DIR-ENTRY + + +File: dash.info, Node: Top, Next: Installation, Up: (dir) + +Dash +**** + +This manual is for Dash version 2.18.1. + + Copyright © 2012–2021 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU Free Documentation License, + Version 1.3 or any later version published by the Free Software + Foundation; with the Invariant Sections being “GNU General Public + License,” and no Front-Cover Texts or Back-Cover Texts. A copy of + the license is included in the section entitled “GNU Free + Documentation License”. + +* Menu: + +* Installation:: Installing and configuring Dash. +* Functions:: Dash API reference. +* Development:: Contributing to Dash development. + +Appendices + +* FDL:: The license for this documentation. +* GPL:: Conditions for copying and changing Dash. +* Index:: Index including functions and macros. + + — The Detailed Node Listing — + +Installation + +* Using in a package:: Listing Dash as a package dependency. +* Fontification of special variables:: Font Lock of anaphoric macro variables. +* Info symbol lookup:: Looking up Dash symbols in this manual. + +Functions + +* Maps:: +* Sublist selection:: +* List to list:: +* Reductions:: +* Unfolding:: +* Predicates:: +* Partitioning:: +* Indexing:: +* Set operations:: +* Other list operations:: +* Tree operations:: +* Threading macros:: +* Binding:: +* Side effects:: +* Destructive operations:: +* Function combinators:: + +Development + +* Contribute:: How to contribute. +* Contributors:: List of contributors. + + +File: dash.info, Node: Installation, Next: Functions, Prev: Top, Up: Top + +1 Installation +************** + +Dash is available on GNU ELPA (https://elpa.gnu.org/), GNU-devel ELPA +(https://elpa.gnu.org/devel/), and MELPA (https://melpa.org/), and can +be installed with the standard command ‘package-install’ (*note +(emacs)Package Installation::). + +‘M-x package-install <RET> dash <RET>’ + Install the Dash library. + + Alternatively, you can just dump ‘dash.el’ in your ‘load-path’ +somewhere (*note (emacs)Lisp Libraries::). + +* Menu: + +* Using in a package:: Listing Dash as a package dependency. +* Fontification of special variables:: Font Lock of anaphoric macro variables. +* Info symbol lookup:: Looking up Dash symbols in this manual. + + +File: dash.info, Node: Using in a package, Next: Fontification of special variables, Up: Installation + +1.1 Using in a package +====================== + +If you use Dash in your own package, be sure to list it as a dependency +in the library’s headers as follows (*note (elisp)Library Headers::). + + ;; Package-Requires: ((dash "2.18.1")) + + +File: dash.info, Node: Fontification of special variables, Next: Info symbol lookup, Prev: Using in a package, Up: Installation + +1.2 Fontification of special variables +====================================== + +The autoloaded minor mode ‘dash-fontify-mode’ is provided for optional +fontification of anaphoric Dash variables (‘it’, ‘acc’, etc.) in Emacs +Lisp buffers using search-based Font Lock (*note (emacs)Font Lock::). +In older Emacs versions which do not dynamically detect macros, the +minor mode also fontifies calls to Dash macros. + + To automatically enable the minor mode in all Emacs Lisp buffers, +just call its autoloaded global counterpart ‘global-dash-fontify-mode’, +either interactively or from your ‘user-init-file’: + + (global-dash-fontify-mode) + + +File: dash.info, Node: Info symbol lookup, Prev: Fontification of special variables, Up: Installation + +1.3 Info symbol lookup +====================== + +While editing Elisp files, you can use ‘C-h S’ (‘info-lookup-symbol’) to +look up Elisp symbols in the relevant Info manuals (*note (emacs)Info +Lookup::). To enable the same for Dash symbols, use the command +‘dash-register-info-lookup’. It can be called directly when needed, or +automatically from your ‘user-init-file’. For example: + + (with-eval-after-load 'info-look + (dash-register-info-lookup)) + + +File: dash.info, Node: Functions, Next: Development, Prev: Installation, Up: Top + +2 Functions +*********** + +This chapter contains reference documentation for the Dash API +(Application Programming Interface). The names of all public functions +defined in the library are prefixed with a dash character (‘-’). + + The library also provides anaphoric macro versions of functions where +that makes sense. The names of these macros are prefixed with two +dashes (‘--’) instead of one. + + For instance, while the function ‘-map’ applies a function to each +element of a list, its anaphoric counterpart ‘--map’ evaluates a form +with the local variable ‘it’ temporarily bound to the current list +element instead. + + ;; Normal version. + (-map (lambda (n) (* n n)) '(1 2 3 4)) + ⇒ (1 4 9 16) + + ;; Anaphoric version. + (--map (* it it) '(1 2 3 4)) + ⇒ (1 4 9 16) + + The normal version can, of course, also be written as in the +following example, which demonstrates the utility of both versions. + + (defun my-square (n) + "Return N multiplied by itself." + (* n n)) + + (-map #'my-square '(1 2 3 4)) + ⇒ (1 4 9 16) + +* Menu: + +* Maps:: +* Sublist selection:: +* List to list:: +* Reductions:: +* Unfolding:: +* Predicates:: +* Partitioning:: +* Indexing:: +* Set operations:: +* Other list operations:: +* Tree operations:: +* Threading macros:: +* Binding:: +* Side effects:: +* Destructive operations:: +* Function combinators:: + + +File: dash.info, Node: Maps, Next: Sublist selection, Up: Functions + +2.1 Maps +======== + +Functions in this category take a transforming function, which is then +applied sequentially to each or selected elements of the input list. +The results are collected in order and returned as a new list. + + -- Function: -map (fn list) + Apply FN to each item in LIST and return the list of results. + + This function’s anaphoric counterpart is ‘--map’. + + (-map (lambda (num) (* num num)) '(1 2 3 4)) + ⇒ (1 4 9 16) + (-map #'1+ '(1 2 3 4)) + ⇒ (2 3 4 5) + (--map (* it it) '(1 2 3 4)) + ⇒ (1 4 9 16) + + -- Function: -map-when (pred rep list) + Return a new list where the elements in LIST that do not match the + PRED function are unchanged, and where the elements in LIST that do + match the PRED function are mapped through the REP function. + + Alias: ‘-replace-where’ + + See also: ‘-update-at’ (*note -update-at::) + + (-map-when 'even? 'square '(1 2 3 4)) + ⇒ (1 4 3 16) + (--map-when (> it 2) (* it it) '(1 2 3 4)) + ⇒ (1 2 9 16) + (--map-when (= it 2) 17 '(1 2 3 4)) + ⇒ (1 17 3 4) + + -- Function: -map-first (pred rep list) + Replace first item in LIST satisfying PRED with result of REP + called on this item. + + See also: ‘-map-when’ (*note -map-when::), ‘-replace-first’ (*note + -replace-first::) + + (-map-first 'even? 'square '(1 2 3 4)) + ⇒ (1 4 3 4) + (--map-first (> it 2) (* it it) '(1 2 3 4)) + ⇒ (1 2 9 4) + (--map-first (= it 2) 17 '(1 2 3 2)) + ⇒ (1 17 3 2) + + -- Function: -map-last (pred rep list) + Replace last item in LIST satisfying PRED with result of REP called + on this item. + + See also: ‘-map-when’ (*note -map-when::), ‘-replace-last’ (*note + -replace-last::) + + (-map-last 'even? 'square '(1 2 3 4)) + ⇒ (1 2 3 16) + (--map-last (> it 2) (* it it) '(1 2 3 4)) + ⇒ (1 2 3 16) + (--map-last (= it 2) 17 '(1 2 3 2)) + ⇒ (1 2 3 17) + + -- Function: -map-indexed (fn list) + Apply FN to each index and item in LIST and return the list of + results. This is like ‘-map’ (*note -map::), but FN takes two + arguments: the index of the current element within LIST, and the + element itself. + + This function’s anaphoric counterpart is ‘--map-indexed’. + + For a side-effecting variant, see also ‘-each-indexed’ (*note + -each-indexed::). + + (-map-indexed (lambda (index item) (- item index)) '(1 2 3 4)) + ⇒ (1 1 1 1) + (--map-indexed (- it it-index) '(1 2 3 4)) + ⇒ (1 1 1 1) + (-map-indexed #'* '(1 2 3 4)) + ⇒ (0 2 6 12) + + -- Function: -annotate (fn list) + Return a list of cons cells where each cell is FN applied to each + element of LIST paired with the unmodified element of LIST. + + (-annotate '1+ '(1 2 3)) + ⇒ ((2 . 1) (3 . 2) (4 . 3)) + (-annotate 'length '(("h" "e" "l" "l" "o") ("hello" "world"))) + ⇒ ((5 "h" "e" "l" "l" "o") (2 "hello" "world")) + (--annotate (< 1 it) '(0 1 2 3)) + ⇒ ((nil . 0) (nil . 1) (t . 2) (t . 3)) + + -- Function: -splice (pred fun list) + Splice lists generated by FUN in place of elements matching PRED in + LIST. + + FUN takes the element matching PRED as input. + + This function can be used as replacement for ‘,@’ in case you need + to splice several lists at marked positions (for example with + keywords). + + See also: ‘-splice-list’ (*note -splice-list::), ‘-insert-at’ + (*note -insert-at::) + + (-splice 'even? (lambda (x) (list x x)) '(1 2 3 4)) + ⇒ (1 2 2 3 4 4) + (--splice 't (list it it) '(1 2 3 4)) + ⇒ (1 1 2 2 3 3 4 4) + (--splice (equal it :magic) '((list of) (magical) (code)) '((foo) (bar) :magic (baz))) + ⇒ ((foo) (bar) (list of) (magical) (code) (baz)) + + -- Function: -splice-list (pred new-list list) + Splice NEW-LIST in place of elements matching PRED in LIST. + + See also: ‘-splice’ (*note -splice::), ‘-insert-at’ (*note + -insert-at::) + + (-splice-list 'keywordp '(a b c) '(1 :foo 2)) + ⇒ (1 a b c 2) + (-splice-list 'keywordp nil '(1 :foo 2)) + ⇒ (1 2) + (--splice-list (keywordp it) '(a b c) '(1 :foo 2)) + ⇒ (1 a b c 2) + + -- Function: -mapcat (fn list) + Return the concatenation of the result of mapping FN over LIST. + Thus function FN should return a list. + + (-mapcat 'list '(1 2 3)) + ⇒ (1 2 3) + (-mapcat (lambda (item) (list 0 item)) '(1 2 3)) + ⇒ (0 1 0 2 0 3) + (--mapcat (list 0 it) '(1 2 3)) + ⇒ (0 1 0 2 0 3) + + -- Function: -copy (list) + Create a shallow copy of LIST. + + (-copy '(1 2 3)) + ⇒ (1 2 3) + (let ((a '(1 2 3))) (eq a (-copy a))) + ⇒ nil + + +File: dash.info, Node: Sublist selection, Next: List to list, Prev: Maps, Up: Functions + +2.2 Sublist selection +===================== + +Functions returning a sublist of the original list. + + -- Function: -filter (pred list) + Return a new list of the items in LIST for which PRED returns + non-nil. + + Alias: ‘-select’. + + This function’s anaphoric counterpart is ‘--filter’. + + For similar operations, see also ‘-keep’ (*note -keep::) and + ‘-remove’ (*note -remove::). + + (-filter (lambda (num) (= 0 (% num 2))) '(1 2 3 4)) + ⇒ (2 4) + (-filter #'natnump '(-2 -1 0 1 2)) + ⇒ (0 1 2) + (--filter (= 0 (% it 2)) '(1 2 3 4)) + ⇒ (2 4) + + -- Function: -remove (pred list) + Return a new list of the items in LIST for which PRED returns nil. + + Alias: ‘-reject’. + + This function’s anaphoric counterpart is ‘--remove’. + + For similar operations, see also ‘-keep’ (*note -keep::) and + ‘-filter’ (*note -filter::). + + (-remove (lambda (num) (= 0 (% num 2))) '(1 2 3 4)) + ⇒ (1 3) + (-remove #'natnump '(-2 -1 0 1 2)) + ⇒ (-2 -1) + (--remove (= 0 (% it 2)) '(1 2 3 4)) + ⇒ (1 3) + + -- Function: -remove-first (pred list) + Remove the first item from LIST for which PRED returns non-nil. + This is a non-destructive operation, but only the front of LIST + leading up to the removed item is a copy; the rest is LIST’s + original tail. If no item is removed, then the result is a + complete copy. + + Alias: ‘-reject-first’. + + This function’s anaphoric counterpart is ‘--remove-first’. + + See also ‘-map-first’ (*note -map-first::), ‘-remove-item’ (*note + -remove-item::), and ‘-remove-last’ (*note -remove-last::). + + (-remove-first #'natnump '(-2 -1 0 1 2)) + ⇒ (-2 -1 1 2) + (-remove-first #'stringp '(1 2 "first" "second")) + ⇒ (1 2 "second") + (--remove-first (> it 3) '(1 2 3 4 5 6)) + ⇒ (1 2 3 5 6) + + -- Function: -remove-last (pred list) + Remove the last item from LIST for which PRED returns non-nil. The + result is a copy of LIST regardless of whether an element is + removed. + + Alias: ‘-reject-last’. + + This function’s anaphoric counterpart is ‘--remove-last’. + + See also ‘-map-last’ (*note -map-last::), ‘-remove-item’ (*note + -remove-item::), and ‘-remove-first’ (*note -remove-first::). + + (-remove-last #'natnump '(1 3 5 4 7 8 10 -11)) + ⇒ (1 3 5 4 7 8 -11) + (-remove-last #'stringp '(1 2 "last" "second")) + ⇒ (1 2 "last") + (--remove-last (> it 3) '(1 2 3 4 5 6 7 8 9 10)) + ⇒ (1 2 3 4 5 6 7 8 9) + + -- Function: -remove-item (item list) + Return a copy of LIST with all occurrences of ITEM removed. The + comparison is done with ‘equal’. + + (-remove-item 3 '(1 2 3 2 3 4 5 3)) + ⇒ (1 2 2 4 5) + (-remove-item 'foo '(foo bar baz foo)) + ⇒ (bar baz) + (-remove-item "bob" '("alice" "bob" "eve" "bob")) + ⇒ ("alice" "eve") + + -- Function: -non-nil (list) + Return a copy of LIST with all nil items removed. + + (-non-nil '(nil 1 nil 2 nil nil 3 4 nil 5 nil)) + ⇒ (1 2 3 4 5) + (-non-nil '((nil))) + ⇒ ((nil)) + (-non-nil ()) + ⇒ () + + -- Function: -slice (list from &optional to step) + Return copy of LIST, starting from index FROM to index TO. + + FROM or TO may be negative. These values are then interpreted + modulo the length of the list. + + If STEP is a number, only each STEPth item in the resulting section + is returned. Defaults to 1. + + (-slice '(1 2 3 4 5) 1) + ⇒ (2 3 4 5) + (-slice '(1 2 3 4 5) 0 3) + ⇒ (1 2 3) + (-slice '(1 2 3 4 5 6 7 8 9) 1 -1 2) + ⇒ (2 4 6 8) + + -- Function: -take (n list) + Return a copy of the first N items in LIST. Return a copy of LIST + if it contains N items or fewer. Return nil if N is zero or less. + + See also: ‘-take-last’ (*note -take-last::). + + (-take 3 '(1 2 3 4 5)) + ⇒ (1 2 3) + (-take 17 '(1 2 3 4 5)) + ⇒ (1 2 3 4 5) + (-take 0 '(1 2 3 4 5)) + ⇒ () + + -- Function: -take-last (n list) + Return a copy of the last N items of LIST in order. Return a copy + of LIST if it contains N items or fewer. Return nil if N is zero + or less. + + See also: ‘-take’ (*note -take::). + + (-take-last 3 '(1 2 3 4 5)) + ⇒ (3 4 5) + (-take-last 17 '(1 2 3 4 5)) + ⇒ (1 2 3 4 5) + (-take-last 1 '(1 2 3 4 5)) + ⇒ (5) + + -- Function: -drop (n list) + Return the tail (not a copy) of LIST without the first N items. + Return nil if LIST contains N items or fewer. Return LIST if N is + zero or less. + + For another variant, see also ‘-drop-last’ (*note -drop-last::). + + (-drop 3 '(1 2 3 4 5)) + ⇒ (4 5) + (-drop 17 '(1 2 3 4 5)) + ⇒ () + (-drop 0 '(1 2 3 4 5)) + ⇒ (1 2 3 4 5) + + -- Function: -drop-last (n list) + Return a copy of LIST without its last N items. Return a copy of + LIST if N is zero or less. Return nil if LIST contains N items or + fewer. + + See also: ‘-drop’ (*note -drop::). + + (-drop-last 3 '(1 2 3 4 5)) + ⇒ (1 2) + (-drop-last 17 '(1 2 3 4 5)) + ⇒ () + (-drop-last 0 '(1 2 3 4 5)) + ⇒ (1 2 3 4 5) + + -- Function: -take-while (pred list) + Take successive items from LIST for which PRED returns non-nil. + PRED is a function of one argument. Return a new list of the + successive elements from the start of LIST for which PRED returns + non-nil. + + This function’s anaphoric counterpart is ‘--take-while’. + + For another variant, see also ‘-drop-while’ (*note -drop-while::). + + (-take-while #'even? '(1 2 3 4)) + ⇒ () + (-take-while #'even? '(2 4 5 6)) + ⇒ (2 4) + (--take-while (< it 4) '(1 2 3 4 3 2 1)) + ⇒ (1 2 3) + + -- Function: -drop-while (pred list) + Drop successive items from LIST for which PRED returns non-nil. + PRED is a function of one argument. Return the tail (not a copy) + of LIST starting from its first element for which PRED returns nil. + + This function’s anaphoric counterpart is ‘--drop-while’. + + For another variant, see also ‘-take-while’ (*note -take-while::). + + (-drop-while #'even? '(1 2 3 4)) + ⇒ (1 2 3 4) + (-drop-while #'even? '(2 4 5 6)) + ⇒ (5 6) + (--drop-while (< it 4) '(1 2 3 4 3 2 1)) + ⇒ (4 3 2 1) + + -- Function: -select-by-indices (indices list) + Return a list whose elements are elements from LIST selected as + ‘(nth i list)‘ for all i from INDICES. + + (-select-by-indices '(4 10 2 3 6) '("v" "e" "l" "o" "c" "i" "r" "a" "p" "t" "o" "r")) + ⇒ ("c" "o" "l" "o" "r") + (-select-by-indices '(2 1 0) '("a" "b" "c")) + ⇒ ("c" "b" "a") + (-select-by-indices '(0 1 2 0 1 3 3 1) '("f" "a" "r" "l")) + ⇒ ("f" "a" "r" "f" "a" "l" "l" "a") + + -- Function: -select-columns (columns table) + Select COLUMNS from TABLE. + + TABLE is a list of lists where each element represents one row. It + is assumed each row has the same length. + + Each row is transformed such that only the specified COLUMNS are + selected. + + See also: ‘-select-column’ (*note -select-column::), + ‘-select-by-indices’ (*note -select-by-indices::) + + (-select-columns '(0 2) '((1 2 3) (a b c) (:a :b :c))) + ⇒ ((1 3) (a c) (:a :c)) + (-select-columns '(1) '((1 2 3) (a b c) (:a :b :c))) + ⇒ ((2) (b) (:b)) + (-select-columns nil '((1 2 3) (a b c) (:a :b :c))) + ⇒ (nil nil nil) + + -- Function: -select-column (column table) + Select COLUMN from TABLE. + + TABLE is a list of lists where each element represents one row. It + is assumed each row has the same length. + + The single selected column is returned as a list. + + See also: ‘-select-columns’ (*note -select-columns::), + ‘-select-by-indices’ (*note -select-by-indices::) + + (-select-column 1 '((1 2 3) (a b c) (:a :b :c))) + ⇒ (2 b :b) + + +File: dash.info, Node: List to list, Next: Reductions, Prev: Sublist selection, Up: Functions + +2.3 List to list +================ + +Functions returning a modified copy of the input list. + + -- Function: -keep (fn list) + Return a new list of the non-nil results of applying FN to each + item in LIST. Like ‘-filter’ (*note -filter::), but returns the + non-nil results of FN instead of the corresponding elements of + LIST. + + Its anaphoric counterpart is ‘--keep’. + + (-keep #'cdr '((1 2 3) (4 5) (6))) + ⇒ ((2 3) (5)) + (-keep (lambda (n) (and (> n 3) (* 10 n))) '(1 2 3 4 5 6)) + ⇒ (40 50 60) + (--keep (and (> it 3) (* 10 it)) '(1 2 3 4 5 6)) + ⇒ (40 50 60) + + -- Function: -concat (&rest lists) + Return a new list with the concatenation of the elements in the + supplied LISTS. + + (-concat '(1)) + ⇒ (1) + (-concat '(1) '(2)) + ⇒ (1 2) + (-concat '(1) '(2 3) '(4)) + ⇒ (1 2 3 4) + + -- Function: -flatten (l) + Take a nested list L and return its contents as a single, flat + list. + + Note that because ‘nil’ represents a list of zero elements (an + empty list), any mention of nil in L will disappear after + flattening. If you need to preserve nils, consider ‘-flatten-n’ + (*note -flatten-n::) or map them to some unique symbol and then map + them back. + + Conses of two atoms are considered "terminals", that is, they + aren’t flattened further. + + See also: ‘-flatten-n’ (*note -flatten-n::) + + (-flatten '((1))) + ⇒ (1) + (-flatten '((1 (2 3) (((4 (5))))))) + ⇒ (1 2 3 4 5) + (-flatten '(1 2 (3 . 4))) + ⇒ (1 2 (3 . 4)) + + -- Function: -flatten-n (num list) + Flatten NUM levels of a nested LIST. + + See also: ‘-flatten’ (*note -flatten::) + + (-flatten-n 1 '((1 2) ((3 4) ((5 6))))) + ⇒ (1 2 (3 4) ((5 6))) + (-flatten-n 2 '((1 2) ((3 4) ((5 6))))) + ⇒ (1 2 3 4 (5 6)) + (-flatten-n 3 '((1 2) ((3 4) ((5 6))))) + ⇒ (1 2 3 4 5 6) + + -- Function: -replace (old new list) + Replace all OLD items in LIST with NEW. + + Elements are compared using ‘equal’. + + See also: ‘-replace-at’ (*note -replace-at::) + + (-replace 1 "1" '(1 2 3 4 3 2 1)) + ⇒ ("1" 2 3 4 3 2 "1") + (-replace "foo" "bar" '("a" "nice" "foo" "sentence" "about" "foo")) + ⇒ ("a" "nice" "bar" "sentence" "about" "bar") + (-replace 1 2 nil) + ⇒ nil + + -- Function: -replace-first (old new list) + Replace the first occurrence of OLD with NEW in LIST. + + Elements are compared using ‘equal’. + + See also: ‘-map-first’ (*note -map-first::) + + (-replace-first 1 "1" '(1 2 3 4 3 2 1)) + ⇒ ("1" 2 3 4 3 2 1) + (-replace-first "foo" "bar" '("a" "nice" "foo" "sentence" "about" "foo")) + ⇒ ("a" "nice" "bar" "sentence" "about" "foo") + (-replace-first 1 2 nil) + ⇒ nil + + -- Function: -replace-last (old new list) + Replace the last occurrence of OLD with NEW in LIST. + + Elements are compared using ‘equal’. + + See also: ‘-map-last’ (*note -map-last::) + + (-replace-last 1 "1" '(1 2 3 4 3 2 1)) + ⇒ (1 2 3 4 3 2 "1") + (-replace-last "foo" "bar" '("a" "nice" "foo" "sentence" "about" "foo")) + ⇒ ("a" "nice" "foo" "sentence" "about" "bar") + (-replace-last 1 2 nil) + ⇒ nil + + -- Function: -insert-at (n x list) + Return a list with X inserted into LIST at position N. + + See also: ‘-splice’ (*note -splice::), ‘-splice-list’ (*note + -splice-list::) + + (-insert-at 1 'x '(a b c)) + ⇒ (a x b c) + (-insert-at 12 'x '(a b c)) + ⇒ (a b c x) + + -- Function: -replace-at (n x list) + Return a list with element at Nth position in LIST replaced with X. + + See also: ‘-replace’ (*note -replace::) + + (-replace-at 0 9 '(0 1 2 3 4 5)) + ⇒ (9 1 2 3 4 5) + (-replace-at 1 9 '(0 1 2 3 4 5)) + ⇒ (0 9 2 3 4 5) + (-replace-at 4 9 '(0 1 2 3 4 5)) + ⇒ (0 1 2 3 9 5) + + -- Function: -update-at (n func list) + Return a list with element at Nth position in LIST replaced with + ‘(func (nth n list))‘. + + See also: ‘-map-when’ (*note -map-when::) + + (-update-at 0 (lambda (x) (+ x 9)) '(0 1 2 3 4 5)) + ⇒ (9 1 2 3 4 5) + (-update-at 1 (lambda (x) (+ x 8)) '(0 1 2 3 4 5)) + ⇒ (0 9 2 3 4 5) + (--update-at 2 (length it) '("foo" "bar" "baz" "quux")) + ⇒ ("foo" "bar" 3 "quux") + + -- Function: -remove-at (n list) + Return a list with element at Nth position in LIST removed. + + See also: ‘-remove-at-indices’ (*note -remove-at-indices::), + ‘-remove’ (*note -remove::) + + (-remove-at 0 '("0" "1" "2" "3" "4" "5")) + ⇒ ("1" "2" "3" "4" "5") + (-remove-at 1 '("0" "1" "2" "3" "4" "5")) + ⇒ ("0" "2" "3" "4" "5") + (-remove-at 2 '("0" "1" "2" "3" "4" "5")) + ⇒ ("0" "1" "3" "4" "5") + + -- Function: -remove-at-indices (indices list) + Return a list whose elements are elements from LIST without + elements selected as ‘(nth i list)‘ for all i from INDICES. + + See also: ‘-remove-at’ (*note -remove-at::), ‘-remove’ (*note + -remove::) + + (-remove-at-indices '(0) '("0" "1" "2" "3" "4" "5")) + ⇒ ("1" "2" "3" "4" "5") + (-remove-at-indices '(0 2 4) '("0" "1" "2" "3" "4" "5")) + ⇒ ("1" "3" "5") + (-remove-at-indices '(0 5) '("0" "1" "2" "3" "4" "5")) + ⇒ ("1" "2" "3" "4") + + +File: dash.info, Node: Reductions, Next: Unfolding, Prev: List to list, Up: Functions + +2.4 Reductions +============== + +Functions reducing lists to a single value (which may also be a list). + + -- Function: -reduce-from (fn init list) + Reduce the function FN across LIST, starting with INIT. Return the + result of applying FN to INIT and the first element of LIST, then + applying FN to that result and the second element, etc. If LIST is + empty, return INIT without calling FN. + + This function’s anaphoric counterpart is ‘--reduce-from’. + + For other folds, see also ‘-reduce’ (*note -reduce::) and + ‘-reduce-r’ (*note -reduce-r::). + + (-reduce-from #'- 10 '(1 2 3)) + ⇒ 4 + (-reduce-from #'list 10 '(1 2 3)) + ⇒ (((10 1) 2) 3) + (--reduce-from (concat acc " " it) "START" '("a" "b" "c")) + ⇒ "START a b c" + + -- Function: -reduce-r-from (fn init list) + Reduce the function FN across LIST in reverse, starting with INIT. + Return the result of applying FN to the last element of LIST and + INIT, then applying FN to the second-to-last element and the + previous result of FN, etc. That is, the first argument of FN is + the current element, and its second argument the accumulated value. + If LIST is empty, return INIT without calling FN. + + This function is like ‘-reduce-from’ (*note -reduce-from::) but the + operation associates from the right rather than left. In other + words, it starts from the end of LIST and flips the arguments to + FN. Conceptually, it is like replacing the conses in LIST with + applications of FN, and its last link with INIT, and evaluating the + resulting expression. + + This function’s anaphoric counterpart is ‘--reduce-r-from’. + + For other folds, see also ‘-reduce-r’ (*note -reduce-r::) and + ‘-reduce’ (*note -reduce::). + + (-reduce-r-from #'- 10 '(1 2 3)) + ⇒ -8 + (-reduce-r-from #'list 10 '(1 2 3)) + ⇒ (1 (2 (3 10))) + (--reduce-r-from (concat it " " acc) "END" '("a" "b" "c")) + ⇒ "a b c END" + + -- Function: -reduce (fn list) + Reduce the function FN across LIST. Return the result of applying + FN to the first two elements of LIST, then applying FN to that + result and the third element, etc. If LIST contains a single + element, return it without calling FN. If LIST is empty, return + the result of calling FN with no arguments. + + This function’s anaphoric counterpart is ‘--reduce’. + + For other folds, see also ‘-reduce-from’ (*note -reduce-from::) and + ‘-reduce-r’ (*note -reduce-r::). + + (-reduce #'- '(1 2 3 4)) + ⇒ -8 + (-reduce #'list '(1 2 3 4)) + ⇒ (((1 2) 3) 4) + (--reduce (format "%s-%d" acc it) '(1 2 3)) + ⇒ "1-2-3" + + -- Function: -reduce-r (fn list) + Reduce the function FN across LIST in reverse. Return the result + of applying FN to the last two elements of LIST, then applying FN + to the third-to-last element and the previous result of FN, etc. + That is, the first argument of FN is the current element, and its + second argument the accumulated value. If LIST contains a single + element, return it without calling FN. If LIST is empty, return + the result of calling FN with no arguments. + + This function is like ‘-reduce’ (*note -reduce::) but the operation + associates from the right rather than left. In other words, it + starts from the end of LIST and flips the arguments to FN. + Conceptually, it is like replacing the conses in LIST with + applications of FN, ignoring its last link, and evaluating the + resulting expression. + + This function’s anaphoric counterpart is ‘--reduce-r’. + + For other folds, see also ‘-reduce-r-from’ (*note -reduce-r-from::) + and ‘-reduce’ (*note -reduce::). + + (-reduce-r #'- '(1 2 3 4)) + ⇒ -2 + (-reduce-r #'list '(1 2 3 4)) + ⇒ (1 (2 (3 4))) + (--reduce-r (format "%s-%d" acc it) '(1 2 3)) + ⇒ "3-2-1" + + -- Function: -reductions-from (fn init list) + Return a list of FN’s intermediate reductions across LIST. That + is, a list of the intermediate values of the accumulator when + ‘-reduce-from’ (*note -reduce-from::) (which see) is called with + the same arguments. + + This function’s anaphoric counterpart is ‘--reductions-from’. + + For other folds, see also ‘-reductions’ (*note -reductions::) and + ‘-reductions-r’ (*note -reductions-r::). + + (-reductions-from #'max 0 '(2 1 4 3)) + ⇒ (0 2 2 4 4) + (-reductions-from #'* 1 '(1 2 3 4)) + ⇒ (1 1 2 6 24) + (--reductions-from (format "(FN %s %d)" acc it) "INIT" '(1 2 3)) + ⇒ ("INIT" "(FN INIT 1)" "(FN (FN INIT 1) 2)" "(FN (FN (FN INIT 1) 2) 3)") + + -- Function: -reductions-r-from (fn init list) + Return a list of FN’s intermediate reductions across reversed LIST. + That is, a list of the intermediate values of the accumulator when + ‘-reduce-r-from’ (*note -reduce-r-from::) (which see) is called + with the same arguments. + + This function’s anaphoric counterpart is ‘--reductions-r-from’. + + For other folds, see also ‘-reductions’ (*note -reductions::) and + ‘-reductions-r’ (*note -reductions-r::). + + (-reductions-r-from #'max 0 '(2 1 4 3)) + ⇒ (4 4 4 3 0) + (-reductions-r-from #'* 1 '(1 2 3 4)) + ⇒ (24 24 12 4 1) + (--reductions-r-from (format "(FN %d %s)" it acc) "INIT" '(1 2 3)) + ⇒ ("(FN 1 (FN 2 (FN 3 INIT)))" "(FN 2 (FN 3 INIT))" "(FN 3 INIT)" "INIT") + + -- Function: -reductions (fn list) + Return a list of FN’s intermediate reductions across LIST. That + is, a list of the intermediate values of the accumulator when + ‘-reduce’ (*note -reduce::) (which see) is called with the same + arguments. + + This function’s anaphoric counterpart is ‘--reductions’. + + For other folds, see also ‘-reductions’ (*note -reductions::) and + ‘-reductions-r’ (*note -reductions-r::). + + (-reductions #'+ '(1 2 3 4)) + ⇒ (1 3 6 10) + (-reductions #'* '(1 2 3 4)) + ⇒ (1 2 6 24) + (--reductions (format "(FN %s %d)" acc it) '(1 2 3)) + ⇒ (1 "(FN 1 2)" "(FN (FN 1 2) 3)") + + -- Function: -reductions-r (fn list) + Return a list of FN’s intermediate reductions across reversed LIST. + That is, a list of the intermediate values of the accumulator when + ‘-reduce-r’ (*note -reduce-r::) (which see) is called with the same + arguments. + + This function’s anaphoric counterpart is ‘--reductions-r’. + + For other folds, see also ‘-reductions-r-from’ (*note + -reductions-r-from::) and ‘-reductions’ (*note -reductions::). + + (-reductions-r #'+ '(1 2 3 4)) + ⇒ (10 9 7 4) + (-reductions-r #'* '(1 2 3 4)) + ⇒ (24 24 12 4) + (--reductions-r (format "(FN %d %s)" it acc) '(1 2 3)) + ⇒ ("(FN 1 (FN 2 3))" "(FN 2 3)" 3) + + -- Function: -count (pred list) + Counts the number of items in LIST where (PRED item) is non-nil. + + (-count 'even? '(1 2 3 4 5)) + ⇒ 2 + (--count (< it 4) '(1 2 3 4)) + ⇒ 3 + + -- Function: -sum (list) + Return the sum of LIST. + + (-sum ()) + ⇒ 0 + (-sum '(1)) + ⇒ 1 + (-sum '(1 2 3 4)) + ⇒ 10 + + -- Function: -running-sum (list) + Return a list with running sums of items in LIST. LIST must be + non-empty. + + (-running-sum '(1 2 3 4)) + ⇒ (1 3 6 10) + (-running-sum '(1)) + ⇒ (1) + (-running-sum ()) + error→ Wrong type argument: consp, nil + + -- Function: -product (list) + Return the product of LIST. + + (-product ()) + ⇒ 1 + (-product '(1)) + ⇒ 1 + (-product '(1 2 3 4)) + ⇒ 24 + + -- Function: -running-product (list) + Return a list with running products of items in LIST. LIST must be + non-empty. + + (-running-product '(1 2 3 4)) + ⇒ (1 2 6 24) + (-running-product '(1)) + ⇒ (1) + (-running-product ()) + error→ Wrong type argument: consp, nil + + -- Function: -inits (list) + Return all prefixes of LIST. + + (-inits '(1 2 3 4)) + ⇒ (nil (1) (1 2) (1 2 3) (1 2 3 4)) + (-inits nil) + ⇒ (nil) + (-inits '(1)) + ⇒ (nil (1)) + + -- Function: -tails (list) + Return all suffixes of LIST + + (-tails '(1 2 3 4)) + ⇒ ((1 2 3 4) (2 3 4) (3 4) (4) nil) + (-tails nil) + ⇒ (nil) + (-tails '(1)) + ⇒ ((1) nil) + + -- Function: -common-prefix (&rest lists) + Return the longest common prefix of LISTS. + + (-common-prefix '(1)) + ⇒ (1) + (-common-prefix '(1 2) '(3 4) '(1 2)) + ⇒ () + (-common-prefix '(1 2) '(1 2 3) '(1 2 3 4)) + ⇒ (1 2) + + -- Function: -common-suffix (&rest lists) + Return the longest common suffix of LISTS. + + (-common-suffix '(1)) + ⇒ (1) + (-common-suffix '(1 2) '(3 4) '(1 2)) + ⇒ () + (-common-suffix '(1 2 3 4) '(2 3 4) '(3 4)) + ⇒ (3 4) + + -- Function: -min (list) + Return the smallest value from LIST of numbers or markers. + + (-min '(0)) + ⇒ 0 + (-min '(3 2 1)) + ⇒ 1 + (-min '(1 2 3)) + ⇒ 1 + + -- Function: -min-by (comparator list) + Take a comparison function COMPARATOR and a LIST and return the + least element of the list by the comparison function. + + See also combinator ‘-on’ (*note -on::) which can transform the + values before comparing them. + + (-min-by '> '(4 3 6 1)) + ⇒ 1 + (--min-by (> (car it) (car other)) '((1 2 3) (2) (3 2))) + ⇒ (1 2 3) + (--min-by (> (length it) (length other)) '((1 2 3) (2) (3 2))) + ⇒ (2) + + -- Function: -max (list) + Return the largest value from LIST of numbers or markers. + + (-max '(0)) + ⇒ 0 + (-max '(3 2 1)) + ⇒ 3 + (-max '(1 2 3)) + ⇒ 3 + + -- Function: -max-by (comparator list) + Take a comparison function COMPARATOR and a LIST and return the + greatest element of the list by the comparison function. + + See also combinator ‘-on’ (*note -on::) which can transform the + values before comparing them. + + (-max-by '> '(4 3 6 1)) + ⇒ 6 + (--max-by (> (car it) (car other)) '((1 2 3) (2) (3 2))) + ⇒ (3 2) + (--max-by (> (length it) (length other)) '((1 2 3) (2) (3 2))) + ⇒ (1 2 3) + + +File: dash.info, Node: Unfolding, Next: Predicates, Prev: Reductions, Up: Functions + +2.5 Unfolding +============= + +Operations dual to reductions, building lists from a seed value rather +than consuming a list to produce a single value. + + -- Function: -iterate (fun init n) + Return a list of iterated applications of FUN to INIT. + + This means a list of the form: + + (INIT (FUN INIT) (FUN (FUN INIT)) ...) + + N is the length of the returned list. + + (-iterate #'1+ 1 10) + ⇒ (1 2 3 4 5 6 7 8 9 10) + (-iterate (lambda (x) (+ x x)) 2 5) + ⇒ (2 4 8 16 32) + (--iterate (* it it) 2 5) + ⇒ (2 4 16 256 65536) + + -- Function: -unfold (fun seed) + Build a list from SEED using FUN. + + This is "dual" operation to ‘-reduce-r’ (*note -reduce-r::): while + -reduce-r consumes a list to produce a single value, ‘-unfold’ + (*note -unfold::) takes a seed value and builds a (potentially + infinite!) list. + + FUN should return ‘nil’ to stop the generating process, or a cons + (A . B), where A will be prepended to the result and B is the new + seed. + + (-unfold (lambda (x) (unless (= x 0) (cons x (1- x)))) 10) + ⇒ (10 9 8 7 6 5 4 3 2 1) + (--unfold (when it (cons it (cdr it))) '(1 2 3 4)) + ⇒ ((1 2 3 4) (2 3 4) (3 4) (4)) + (--unfold (when it (cons it (butlast it))) '(1 2 3 4)) + ⇒ ((1 2 3 4) (1 2 3) (1 2) (1)) + + +File: dash.info, Node: Predicates, Next: Partitioning, Prev: Unfolding, Up: Functions + +2.6 Predicates +============== + +Reductions of one or more lists to a boolean value. + + -- Function: -any? (pred list) + Return t if (PRED x) is non-nil for any x in LIST, else nil. + + Alias: ‘-any-p’, ‘-some?’, ‘-some-p’ + + (-any? 'even? '(1 2 3)) + ⇒ t + (-any? 'even? '(1 3 5)) + ⇒ nil + (-any? 'null '(1 3 5)) + ⇒ nil + + -- Function: -all? (pred list) + Return t if (PRED x) is non-nil for all x in LIST, else nil. + + Alias: ‘-all-p’, ‘-every?’, ‘-every-p’ + + (-all? 'even? '(1 2 3)) + ⇒ nil + (-all? 'even? '(2 4 6)) + ⇒ t + (--all? (= 0 (% it 2)) '(2 4 6)) + ⇒ t + + -- Function: -none? (pred list) + Return t if (PRED x) is nil for all x in LIST, else nil. + + Alias: ‘-none-p’ + + (-none? 'even? '(1 2 3)) + ⇒ nil + (-none? 'even? '(1 3 5)) + ⇒ t + (--none? (= 0 (% it 2)) '(1 2 3)) + ⇒ nil + + -- Function: -only-some? (pred list) + Return ‘t‘ if at least one item of LIST matches PRED and at least + one item of LIST does not match PRED. Return ‘nil‘ both if all + items match the predicate or if none of the items match the + predicate. + + Alias: ‘-only-some-p’ + + (-only-some? 'even? '(1 2 3)) + ⇒ t + (-only-some? 'even? '(1 3 5)) + ⇒ nil + (-only-some? 'even? '(2 4 6)) + ⇒ nil + + -- Function: -contains? (list element) + Return non-nil if LIST contains ELEMENT. + + The test for equality is done with ‘equal’, or with ‘-compare-fn’ + if that’s non-nil. + + Alias: ‘-contains-p’ + + (-contains? '(1 2 3) 1) + ⇒ t + (-contains? '(1 2 3) 2) + ⇒ t + (-contains? '(1 2 3) 4) + ⇒ nil + + -- Function: -same-items? (list list2) + Return true if LIST and LIST2 has the same items. + + The order of the elements in the lists does not matter. + + Alias: ‘-same-items-p’ + + (-same-items? '(1 2 3) '(1 2 3)) + ⇒ t + (-same-items? '(1 2 3) '(3 2 1)) + ⇒ t + (-same-items? '(1 2 3) '(1 2 3 4)) + ⇒ nil + + -- Function: -is-prefix? (prefix list) + Return non-nil if PREFIX is a prefix of LIST. + + Alias: ‘-is-prefix-p’. + + (-is-prefix? '(1 2 3) '(1 2 3 4 5)) + ⇒ t + (-is-prefix? '(1 2 3 4 5) '(1 2 3)) + ⇒ nil + (-is-prefix? '(1 3) '(1 2 3 4 5)) + ⇒ nil + + -- Function: -is-suffix? (suffix list) + Return non-nil if SUFFIX is a suffix of LIST. + + Alias: ‘-is-suffix-p’. + + (-is-suffix? '(3 4 5) '(1 2 3 4 5)) + ⇒ t + (-is-suffix? '(1 2 3 4 5) '(3 4 5)) + ⇒ nil + (-is-suffix? '(3 5) '(1 2 3 4 5)) + ⇒ nil + + -- Function: -is-infix? (infix list) + Return non-nil if INFIX is infix of LIST. + + This operation runs in O(n^2) time + + Alias: ‘-is-infix-p’ + + (-is-infix? '(1 2 3) '(1 2 3 4 5)) + ⇒ t + (-is-infix? '(2 3 4) '(1 2 3 4 5)) + ⇒ t + (-is-infix? '(3 4 5) '(1 2 3 4 5)) + ⇒ t + + -- Function: -cons-pair? (obj) + Return non-nil if OBJ is a true cons pair. That is, a cons (A . + B) where B is not a list. + + Alias: ‘-cons-pair-p’. + + (-cons-pair? '(1 . 2)) + ⇒ t + (-cons-pair? '(1 2)) + ⇒ nil + (-cons-pair? '(1)) + ⇒ nil + + +File: dash.info, Node: Partitioning, Next: Indexing, Prev: Predicates, Up: Functions + +2.7 Partitioning +================ + +Functions partitioning the input list into a list of lists. + + -- Function: -split-at (n list) + Split LIST into two sublists after the Nth element. The result is + a list of two elements (TAKE DROP) where TAKE is a new list of the + first N elements of LIST, and DROP is the remaining elements of + LIST (not a copy). TAKE and DROP are like the results of ‘-take’ + (*note -take::) and ‘-drop’ (*note -drop::), respectively, but the + split is done in a single list traversal. + + (-split-at 3 '(1 2 3 4 5)) + ⇒ ((1 2 3) (4 5)) + (-split-at 17 '(1 2 3 4 5)) + ⇒ ((1 2 3 4 5) nil) + (-split-at 0 '(1 2 3 4 5)) + ⇒ (nil (1 2 3 4 5)) + + -- Function: -split-with (pred list) + Return a list of ((-take-while PRED LIST) (-drop-while PRED LIST)), + in no more than one pass through the list. + + (-split-with 'even? '(1 2 3 4)) + ⇒ (nil (1 2 3 4)) + (-split-with 'even? '(2 4 5 6)) + ⇒ ((2 4) (5 6)) + (--split-with (< it 4) '(1 2 3 4 3 2 1)) + ⇒ ((1 2 3) (4 3 2 1)) + + -- Macro: -split-on (item list) + Split the LIST each time ITEM is found. + + Unlike ‘-partition-by’ (*note -partition-by::), the ITEM is + discarded from the results. Empty lists are also removed from the + result. + + Comparison is done by ‘equal’. + + See also ‘-split-when’ (*note -split-when::) + + (-split-on '| '(Nil | Leaf a | Node [Tree a])) + ⇒ ((Nil) (Leaf a) (Node [Tree a])) + (-split-on ':endgroup '("a" "b" :endgroup "c" :endgroup "d" "e")) + ⇒ (("a" "b") ("c") ("d" "e")) + (-split-on ':endgroup '("a" "b" :endgroup :endgroup "d" "e")) + ⇒ (("a" "b") ("d" "e")) + + -- Function: -split-when (fn list) + Split the LIST on each element where FN returns non-nil. + + Unlike ‘-partition-by’ (*note -partition-by::), the "matched" + element is discarded from the results. Empty lists are also + removed from the result. + + This function can be thought of as a generalization of + ‘split-string’. + + (-split-when 'even? '(1 2 3 4 5 6)) + ⇒ ((1) (3) (5)) + (-split-when 'even? '(1 2 3 4 6 8 9)) + ⇒ ((1) (3) (9)) + (--split-when (memq it '(&optional &rest)) '(a b &optional c d &rest args)) + ⇒ ((a b) (c d) (args)) + + -- Function: -separate (pred list) + Return a list of ((-filter PRED LIST) (-remove PRED LIST)), in one + pass through the list. + + (-separate (lambda (num) (= 0 (% num 2))) '(1 2 3 4 5 6 7)) + ⇒ ((2 4 6) (1 3 5 7)) + (--separate (< it 5) '(3 7 5 9 3 2 1 4 6)) + ⇒ ((3 3 2 1 4) (7 5 9 6)) + (-separate 'cdr '((1 2) (1) (1 2 3) (4))) + ⇒ (((1 2) (1 2 3)) ((1) (4))) + + -- Function: -partition (n list) + Return a new list with the items in LIST grouped into N-sized + sublists. If there are not enough items to make the last group + N-sized, those items are discarded. + + (-partition 2 '(1 2 3 4 5 6)) + ⇒ ((1 2) (3 4) (5 6)) + (-partition 2 '(1 2 3 4 5 6 7)) + ⇒ ((1 2) (3 4) (5 6)) + (-partition 3 '(1 2 3 4 5 6 7)) + ⇒ ((1 2 3) (4 5 6)) + + -- Function: -partition-all (n list) + Return a new list with the items in LIST grouped into N-sized + sublists. The last group may contain less than N items. + + (-partition-all 2 '(1 2 3 4 5 6)) + ⇒ ((1 2) (3 4) (5 6)) + (-partition-all 2 '(1 2 3 4 5 6 7)) + ⇒ ((1 2) (3 4) (5 6) (7)) + (-partition-all 3 '(1 2 3 4 5 6 7)) + ⇒ ((1 2 3) (4 5 6) (7)) + + -- Function: -partition-in-steps (n step list) + Return a new list with the items in LIST grouped into N-sized + sublists at offsets STEP apart. If there are not enough items to + make the last group N-sized, those items are discarded. + + (-partition-in-steps 2 1 '(1 2 3 4)) + ⇒ ((1 2) (2 3) (3 4)) + (-partition-in-steps 3 2 '(1 2 3 4)) + ⇒ ((1 2 3)) + (-partition-in-steps 3 2 '(1 2 3 4 5)) + ⇒ ((1 2 3) (3 4 5)) + + -- Function: -partition-all-in-steps (n step list) + Return a new list with the items in LIST grouped into N-sized + sublists at offsets STEP apart. The last groups may contain less + than N items. + + (-partition-all-in-steps 2 1 '(1 2 3 4)) + ⇒ ((1 2) (2 3) (3 4) (4)) + (-partition-all-in-steps 3 2 '(1 2 3 4)) + ⇒ ((1 2 3) (3 4)) + (-partition-all-in-steps 3 2 '(1 2 3 4 5)) + ⇒ ((1 2 3) (3 4 5) (5)) + + -- Function: -partition-by (fn list) + Apply FN to each item in LIST, splitting it each time FN returns a + new value. + + (-partition-by 'even? ()) + ⇒ () + (-partition-by 'even? '(1 1 2 2 2 3 4 6 8)) + ⇒ ((1 1) (2 2 2) (3) (4 6 8)) + (--partition-by (< it 3) '(1 2 3 4 3 2 1)) + ⇒ ((1 2) (3 4 3) (2 1)) + + -- Function: -partition-by-header (fn list) + Apply FN to the first item in LIST. That is the header value. + Apply FN to each item in LIST, splitting it each time FN returns + the header value, but only after seeing at least one other value + (the body). + + (--partition-by-header (= it 1) '(1 2 3 1 2 1 2 3 4)) + ⇒ ((1 2 3) (1 2) (1 2 3 4)) + (--partition-by-header (> it 0) '(1 2 0 1 0 1 2 3 0)) + ⇒ ((1 2 0) (1 0) (1 2 3 0)) + (-partition-by-header 'even? '(2 1 1 1 4 1 3 5 6 6 1)) + ⇒ ((2 1 1 1) (4 1 3 5) (6 6 1)) + + -- Function: -partition-after-pred (pred list) + Partition LIST after each element for which PRED returns non-nil. + + This function’s anaphoric counterpart is ‘--partition-after-pred’. + + (-partition-after-pred #'booleanp ()) + ⇒ () + (-partition-after-pred #'booleanp '(t t)) + ⇒ ((t) (t)) + (-partition-after-pred #'booleanp '(0 0 t t 0 t)) + ⇒ ((0 0 t) (t) (0 t)) + + -- Function: -partition-before-pred (pred list) + Partition directly before each time PRED is true on an element of + LIST. + + (-partition-before-pred #'booleanp ()) + ⇒ () + (-partition-before-pred #'booleanp '(0 t)) + ⇒ ((0) (t)) + (-partition-before-pred #'booleanp '(0 0 t 0 t t)) + ⇒ ((0 0) (t 0) (t) (t)) + + -- Function: -partition-before-item (item list) + Partition directly before each time ITEM appears in LIST. + + (-partition-before-item 3 ()) + ⇒ () + (-partition-before-item 3 '(1)) + ⇒ ((1)) + (-partition-before-item 3 '(3)) + ⇒ ((3)) + + -- Function: -partition-after-item (item list) + Partition directly after each time ITEM appears in LIST. + + (-partition-after-item 3 ()) + ⇒ () + (-partition-after-item 3 '(1)) + ⇒ ((1)) + (-partition-after-item 3 '(3)) + ⇒ ((3)) + + -- Function: -group-by (fn list) + Separate LIST into an alist whose keys are FN applied to the + elements of LIST. Keys are compared by ‘equal’. + + (-group-by 'even? ()) + ⇒ () + (-group-by 'even? '(1 1 2 2 2 3 4 6 8)) + ⇒ ((nil 1 1 3) (t 2 2 2 4 6 8)) + (--group-by (car (split-string it "/")) '("a/b" "c/d" "a/e")) + ⇒ (("a" "a/b" "a/e") ("c" "c/d")) + + +File: dash.info, Node: Indexing, Next: Set operations, Prev: Partitioning, Up: Functions + +2.8 Indexing +============ + +Functions retrieving or sorting based on list indices and related +predicates. + + -- Function: -elem-index (elem list) + Return the index of the first element in the given LIST which is + equal to the query element ELEM, or nil if there is no such + element. + + (-elem-index 2 '(6 7 8 2 3 4)) + ⇒ 3 + (-elem-index "bar" '("foo" "bar" "baz")) + ⇒ 1 + (-elem-index '(1 2) '((3) (5 6) (1 2) nil)) + ⇒ 2 + + -- Function: -elem-indices (elem list) + Return the indices of all elements in LIST equal to the query + element ELEM, in ascending order. + + (-elem-indices 2 '(6 7 8 2 3 4 2 1)) + ⇒ (3 6) + (-elem-indices "bar" '("foo" "bar" "baz")) + ⇒ (1) + (-elem-indices '(1 2) '((3) (1 2) (5 6) (1 2) nil)) + ⇒ (1 3) + + -- Function: -find-index (pred list) + Take a predicate PRED and a LIST and return the index of the first + element in the list satisfying the predicate, or nil if there is no + such element. + + See also ‘-first’ (*note -first::). + + (-find-index 'even? '(2 4 1 6 3 3 5 8)) + ⇒ 0 + (--find-index (< 5 it) '(2 4 1 6 3 3 5 8)) + ⇒ 3 + (-find-index (-partial 'string-lessp "baz") '("bar" "foo" "baz")) + ⇒ 1 + + -- Function: -find-last-index (pred list) + Take a predicate PRED and a LIST and return the index of the last + element in the list satisfying the predicate, or nil if there is no + such element. + + See also ‘-last’ (*note -last::). + + (-find-last-index 'even? '(2 4 1 6 3 3 5 8)) + ⇒ 7 + (--find-last-index (< 5 it) '(2 7 1 6 3 8 5 2)) + ⇒ 5 + (-find-last-index (-partial 'string-lessp "baz") '("q" "foo" "baz")) + ⇒ 1 + + -- Function: -find-indices (pred list) + Return the indices of all elements in LIST satisfying the predicate + PRED, in ascending order. + + (-find-indices 'even? '(2 4 1 6 3 3 5 8)) + ⇒ (0 1 3 7) + (--find-indices (< 5 it) '(2 4 1 6 3 3 5 8)) + ⇒ (3 7) + (-find-indices (-partial 'string-lessp "baz") '("bar" "foo" "baz")) + ⇒ (1) + + -- Function: -grade-up (comparator list) + Grade elements of LIST using COMPARATOR relation. This yields a + permutation vector such that applying this permutation to LIST + sorts it in ascending order. + + (-grade-up #'< '(3 1 4 2 1 3 3)) + ⇒ (1 4 3 0 5 6 2) + (let ((l '(3 1 4 2 1 3 3))) (-select-by-indices (-grade-up #'< l) l)) + ⇒ (1 1 2 3 3 3 4) + + -- Function: -grade-down (comparator list) + Grade elements of LIST using COMPARATOR relation. This yields a + permutation vector such that applying this permutation to LIST + sorts it in descending order. + + (-grade-down #'< '(3 1 4 2 1 3 3)) + ⇒ (2 0 5 6 3 1 4) + (let ((l '(3 1 4 2 1 3 3))) (-select-by-indices (-grade-down #'< l) l)) + ⇒ (4 3 3 3 2 1 1) + + +File: dash.info, Node: Set operations, Next: Other list operations, Prev: Indexing, Up: Functions + +2.9 Set operations +================== + +Operations pretending lists are sets. + + -- Function: -union (list list2) + Return a new list containing the elements of LIST and elements of + LIST2 that are not in LIST. The test for equality is done with + ‘equal’, or with ‘-compare-fn’ if that’s non-nil. + + (-union '(1 2 3) '(3 4 5)) + ⇒ (1 2 3 4 5) + (-union '(1 2 3 4) ()) + ⇒ (1 2 3 4) + (-union '(1 1 2 2) '(3 2 1)) + ⇒ (1 1 2 2 3) + + -- Function: -difference (list list2) + Return a new list with only the members of LIST that are not in + LIST2. The test for equality is done with ‘equal’, or with + ‘-compare-fn’ if that’s non-nil. + + (-difference () ()) + ⇒ () + (-difference '(1 2 3) '(4 5 6)) + ⇒ (1 2 3) + (-difference '(1 2 3 4) '(3 4 5 6)) + ⇒ (1 2) + + -- Function: -intersection (list list2) + Return a new list containing only the elements that are members of + both LIST and LIST2. The test for equality is done with ‘equal’, + or with ‘-compare-fn’ if that’s non-nil. + + (-intersection () ()) + ⇒ () + (-intersection '(1 2 3) '(4 5 6)) + ⇒ () + (-intersection '(1 2 3 4) '(3 4 5 6)) + ⇒ (3 4) + + -- Function: -powerset (list) + Return the power set of LIST. + + (-powerset ()) + ⇒ (nil) + (-powerset '(x y z)) + ⇒ ((x y z) (x y) (x z) (x) (y z) (y) (z) nil) + + -- Function: -permutations (list) + Return the permutations of LIST. + + (-permutations ()) + ⇒ (nil) + (-permutations '(1 2)) + ⇒ ((1 2) (2 1)) + (-permutations '(a b c)) + ⇒ ((a b c) (a c b) (b a c) (b c a) (c a b) (c b a)) + + -- Function: -distinct (list) + Return a new list with all duplicates removed. The test for + equality is done with ‘equal’, or with ‘-compare-fn’ if that’s + non-nil. + + Alias: ‘-uniq’ + + (-distinct ()) + ⇒ () + (-distinct '(1 2 2 4)) + ⇒ (1 2 4) + (-distinct '(t t t)) + ⇒ (t) + + +File: dash.info, Node: Other list operations, Next: Tree operations, Prev: Set operations, Up: Functions + +2.10 Other list operations +========================== + +Other list functions not fit to be classified elsewhere. + + -- Function: -rotate (n list) + Rotate LIST N places to the right. With N negative, rotate to the + left. The time complexity is O(n). + + (-rotate 3 '(1 2 3 4 5 6 7)) + ⇒ (5 6 7 1 2 3 4) + (-rotate -3 '(1 2 3 4 5 6 7)) + ⇒ (4 5 6 7 1 2 3) + (-rotate 16 '(1 2 3 4 5 6 7)) + ⇒ (6 7 1 2 3 4 5) + + -- Function: -repeat (n x) + Return a new list of length N with each element being X. Return + nil if N is less than 1. + + (-repeat 3 :a) + ⇒ (:a :a :a) + (-repeat 1 :a) + ⇒ (:a) + (-repeat 0 :a) + ⇒ nil + + -- Function: -cons* (&rest args) + Make a new list from the elements of ARGS. The last 2 elements of + ARGS are used as the final cons of the result, so if the final + element of ARGS is not a list, the result is a dotted list. With + no ARGS, return nil. + + (-cons* 1 2) + ⇒ (1 . 2) + (-cons* 1 2 3) + ⇒ (1 2 . 3) + (-cons* 1) + ⇒ 1 + + -- Function: -snoc (list elem &rest elements) + Append ELEM to the end of the list. + + This is like ‘cons’, but operates on the end of list. + + If ELEMENTS is non nil, append these to the list as well. + + (-snoc '(1 2 3) 4) + ⇒ (1 2 3 4) + (-snoc '(1 2 3) 4 5 6) + ⇒ (1 2 3 4 5 6) + (-snoc '(1 2 3) '(4 5 6)) + ⇒ (1 2 3 (4 5 6)) + + -- Function: -interpose (sep list) + Return a new list of all elements in LIST separated by SEP. + + (-interpose "-" ()) + ⇒ () + (-interpose "-" '("a")) + ⇒ ("a") + (-interpose "-" '("a" "b" "c")) + ⇒ ("a" "-" "b" "-" "c") + + -- Function: -interleave (&rest lists) + Return a new list of the first item in each list, then the second + etc. + + (-interleave '(1 2) '("a" "b")) + ⇒ (1 "a" 2 "b") + (-interleave '(1 2) '("a" "b") '("A" "B")) + ⇒ (1 "a" "A" 2 "b" "B") + (-interleave '(1 2 3) '("a" "b")) + ⇒ (1 "a" 2 "b") + + -- Function: -iota (count &optional start step) + Return a list containing COUNT numbers. Starts from START and adds + STEP each time. The default START is zero, the default STEP is 1. + This function takes its name from the corresponding primitive in + the APL language. + + (-iota 6) + ⇒ (0 1 2 3 4 5) + (-iota 4 2.5 -2) + ⇒ (2.5 0.5 -1.5 -3.5) + (-iota -1) + error→ Wrong type argument: natnump, -1 + + -- Function: -zip-with (fn list1 list2) + Zip the two lists LIST1 and LIST2 using a function FN. This + function is applied pairwise taking as first argument element of + LIST1 and as second argument element of LIST2 at corresponding + position. + + The anaphoric form ‘--zip-with’ binds the elements from LIST1 as + symbol ‘it’, and the elements from LIST2 as symbol ‘other’. + + (-zip-with '+ '(1 2 3) '(4 5 6)) + ⇒ (5 7 9) + (-zip-with 'cons '(1 2 3) '(4 5 6)) + ⇒ ((1 . 4) (2 . 5) (3 . 6)) + (--zip-with (concat it " and " other) '("Batman" "Jekyll") '("Robin" "Hyde")) + ⇒ ("Batman and Robin" "Jekyll and Hyde") + + -- Function: -zip (&rest lists) + Zip LISTS together. Group the head of each list, followed by the + second elements of each list, and so on. The lengths of the + returned groupings are equal to the length of the shortest input + list. + + If two lists are provided as arguments, return the groupings as a + list of cons cells. Otherwise, return the groupings as a list of + lists. + + Use ‘-zip-lists’ (*note -zip-lists::) if you need the return value + to always be a list of lists. + + Alias: ‘-zip-pair’ + + See also: ‘-zip-lists’ (*note -zip-lists::) + + (-zip '(1 2 3) '(4 5 6)) + ⇒ ((1 . 4) (2 . 5) (3 . 6)) + (-zip '(1 2 3) '(4 5 6 7)) + ⇒ ((1 . 4) (2 . 5) (3 . 6)) + (-zip '(1 2) '(3 4 5) '(6)) + ⇒ ((1 3 6)) + + -- Function: -zip-lists (&rest lists) + Zip LISTS together. Group the head of each list, followed by the + second elements of each list, and so on. The lengths of the + returned groupings are equal to the length of the shortest input + list. + + The return value is always list of lists, which is a difference + from ‘-zip-pair’ which returns a cons-cell in case two input lists + are provided. + + See also: ‘-zip’ (*note -zip::) + + (-zip-lists '(1 2 3) '(4 5 6)) + ⇒ ((1 4) (2 5) (3 6)) + (-zip-lists '(1 2 3) '(4 5 6 7)) + ⇒ ((1 4) (2 5) (3 6)) + (-zip-lists '(1 2) '(3 4 5) '(6)) + ⇒ ((1 3 6)) + + -- Function: -zip-fill (fill-value &rest lists) + Zip LISTS, with FILL-VALUE padded onto the shorter lists. The + lengths of the returned groupings are equal to the length of the + longest input list. + + (-zip-fill 0 '(1 2 3 4 5) '(6 7 8 9)) + ⇒ ((1 . 6) (2 . 7) (3 . 8) (4 . 9) (5 . 0)) + + -- Function: -unzip (lists) + Unzip LISTS. + + This works just like ‘-zip’ (*note -zip::) but takes a list of + lists instead of a variable number of arguments, such that + + (-unzip (-zip L1 L2 L3 ...)) + + is identity (given that the lists are the same length). + + Note in particular that calling this on a list of two lists will + return a list of cons-cells such that the above identity works. + + See also: ‘-zip’ (*note -zip::) + + (-unzip (-zip '(1 2 3) '(a b c) '("e" "f" "g"))) + ⇒ ((1 2 3) (a b c) ("e" "f" "g")) + (-unzip '((1 2) (3 4) (5 6) (7 8) (9 10))) + ⇒ ((1 3 5 7 9) (2 4 6 8 10)) + (-unzip '((1 2) (3 4))) + ⇒ ((1 . 3) (2 . 4)) + + -- Function: -cycle (list) + Return an infinite circular copy of LIST. The returned list cycles + through the elements of LIST and repeats from the beginning. + + (-take 5 (-cycle '(1 2 3))) + ⇒ (1 2 3 1 2) + (-take 7 (-cycle '(1 "and" 3))) + ⇒ (1 "and" 3 1 "and" 3 1) + (-zip (-cycle '(1 2 3)) '(1 2)) + ⇒ ((1 . 1) (2 . 2)) + + -- Function: -pad (fill-value &rest lists) + Appends FILL-VALUE to the end of each list in LISTS such that they + will all have the same length. + + (-pad 0 ()) + ⇒ (nil) + (-pad 0 '(1)) + ⇒ ((1)) + (-pad 0 '(1 2 3) '(4 5)) + ⇒ ((1 2 3) (4 5 0)) + + -- Function: -table (fn &rest lists) + Compute outer product of LISTS using function FN. + + The function FN should have the same arity as the number of + supplied lists. + + The outer product is computed by applying fn to all possible + combinations created by taking one element from each list in order. + The dimension of the result is (length lists). + + See also: ‘-table-flat’ (*note -table-flat::) + + (-table '* '(1 2 3) '(1 2 3)) + ⇒ ((1 2 3) (2 4 6) (3 6 9)) + (-table (lambda (a b) (-sum (-zip-with '* a b))) '((1 2) (3 4)) '((1 3) (2 4))) + ⇒ ((7 15) (10 22)) + (apply '-table 'list (-repeat 3 '(1 2))) + ⇒ ((((1 1 1) (2 1 1)) ((1 2 1) (2 2 1))) (((1 1 2) (2 1 2)) ((1 2 2) (2 2 2)))) + + -- Function: -table-flat (fn &rest lists) + Compute flat outer product of LISTS using function FN. + + The function FN should have the same arity as the number of + supplied lists. + + The outer product is computed by applying fn to all possible + combinations created by taking one element from each list in order. + The results are flattened, ignoring the tensor structure of the + result. This is equivalent to calling: + + (-flatten-n (1- (length lists)) (apply ’-table fn lists)) + + but the implementation here is much more efficient. + + See also: ‘-flatten-n’ (*note -flatten-n::), ‘-table’ (*note + -table::) + + (-table-flat 'list '(1 2 3) '(a b c)) + ⇒ ((1 a) (2 a) (3 a) (1 b) (2 b) (3 b) (1 c) (2 c) (3 c)) + (-table-flat '* '(1 2 3) '(1 2 3)) + ⇒ (1 2 3 2 4 6 3 6 9) + (apply '-table-flat 'list (-repeat 3 '(1 2))) + ⇒ ((1 1 1) (2 1 1) (1 2 1) (2 2 1) (1 1 2) (2 1 2) (1 2 2) (2 2 2)) + + -- Function: -first (pred list) + Return the first item in LIST for which PRED returns non-nil. + Return nil if no such element is found. To get the first item in + the list no questions asked, use ‘car’. + + Alias: ‘-find’. + + This function’s anaphoric counterpart is ‘--first’. + + (-first #'natnump '(-1 0 1)) + ⇒ 0 + (-first #'null '(1 2 3)) + ⇒ nil + (--first (> it 2) '(1 2 3)) + ⇒ 3 + + -- Function: -some (pred list) + Return (PRED x) for the first LIST item where (PRED x) is non-nil, + else nil. + + Alias: ‘-any’. + + This function’s anaphoric counterpart is ‘--some’. + + (-some (lambda (s) (string-match-p "x" s)) '("foo" "axe" "xor")) + ⇒ 1 + (-some (lambda (s) (string-match-p "x" s)) '("foo" "bar" "baz")) + ⇒ nil + (--some (member 'foo it) '((foo bar) (baz))) + ⇒ (foo bar) + + -- Function: -last (pred list) + Return the last x in LIST where (PRED x) is non-nil, else nil. + + (-last 'even? '(1 2 3 4 5 6 3 3 3)) + ⇒ 6 + (-last 'even? '(1 3 7 5 9)) + ⇒ nil + (--last (> (length it) 3) '("a" "looong" "word" "and" "short" "one")) + ⇒ "short" + + -- Function: -first-item (list) + Return the first item of LIST, or nil on an empty list. + + See also: ‘-second-item’ (*note -second-item::), ‘-last-item’ + (*note -last-item::). + + (-first-item '(1 2 3)) + ⇒ 1 + (-first-item nil) + ⇒ nil + (let ((list (list 1 2 3))) (setf (-first-item list) 5) list) + ⇒ (5 2 3) + + -- Function: -second-item (list) + Return the second item of LIST, or nil if LIST is too short. + + See also: ‘-third-item’ (*note -third-item::). + + (-second-item '(1 2 3)) + ⇒ 2 + (-second-item nil) + ⇒ nil + + -- Function: -third-item (list) + Return the third item of LIST, or nil if LIST is too short. + + See also: ‘-fourth-item’ (*note -fourth-item::). + + (-third-item '(1 2 3)) + ⇒ 3 + (-third-item nil) + ⇒ nil + + -- Function: -fourth-item (list) + Return the fourth item of LIST, or nil if LIST is too short. + + See also: ‘-fifth-item’ (*note -fifth-item::). + + (-fourth-item '(1 2 3 4)) + ⇒ 4 + (-fourth-item nil) + ⇒ nil + + -- Function: -fifth-item (list) + Return the fifth item of LIST, or nil if LIST is too short. + + See also: ‘-last-item’ (*note -last-item::). + + (-fifth-item '(1 2 3 4 5)) + ⇒ 5 + (-fifth-item nil) + ⇒ nil + + -- Function: -last-item (list) + Return the last item of LIST, or nil on an empty list. + + (-last-item '(1 2 3)) + ⇒ 3 + (-last-item nil) + ⇒ nil + (let ((list (list 1 2 3))) (setf (-last-item list) 5) list) + ⇒ (1 2 5) + + -- Function: -butlast (list) + Return a list of all items in list except for the last. + + (-butlast '(1 2 3)) + ⇒ (1 2) + (-butlast '(1 2)) + ⇒ (1) + (-butlast '(1)) + ⇒ nil + + -- Function: -sort (comparator list) + Sort LIST, stably, comparing elements using COMPARATOR. Return the + sorted list. LIST is NOT modified by side effects. COMPARATOR is + called with two elements of LIST, and should return non-nil if the + first element should sort before the second. + + (-sort '< '(3 1 2)) + ⇒ (1 2 3) + (-sort '> '(3 1 2)) + ⇒ (3 2 1) + (--sort (< it other) '(3 1 2)) + ⇒ (1 2 3) + + -- Function: -list (arg) + Ensure ARG is a list. If ARG is already a list, return it as is + (not a copy). Otherwise, return a new list with ARG as its only + element. + + Another supported calling convention is (-list &rest ARGS). In + this case, if ARG is not a list, a new list with all of ARGS as + elements is returned. This use is supported for backward + compatibility and is otherwise deprecated. + + (-list 1) + ⇒ (1) + (-list ()) + ⇒ () + (-list '(1 2 3)) + ⇒ (1 2 3) + + -- Function: -fix (fn list) + Compute the (least) fixpoint of FN with initial input LIST. + + FN is called at least once, results are compared with ‘equal’. + + (-fix (lambda (l) (-non-nil (--mapcat (-split-at (/ (length it) 2) it) l))) '((1 2 3))) + ⇒ ((1) (2) (3)) + (let ((l '((starwars scifi) (jedi starwars warrior)))) (--fix (-uniq (--mapcat (cons it (cdr (assq it l))) it)) '(jedi book))) + ⇒ (jedi starwars warrior scifi book) + + +File: dash.info, Node: Tree operations, Next: Threading macros, Prev: Other list operations, Up: Functions + +2.11 Tree operations +==================== + +Functions pretending lists are trees. + + -- Function: -tree-seq (branch children tree) + Return a sequence of the nodes in TREE, in depth-first search + order. + + BRANCH is a predicate of one argument that returns non-nil if the + passed argument is a branch, that is, a node that can have + children. + + CHILDREN is a function of one argument that returns the children of + the passed branch node. + + Non-branch nodes are simply copied. + + (-tree-seq 'listp 'identity '(1 (2 3) 4 (5 (6 7)))) + ⇒ ((1 (2 3) 4 (5 (6 7))) 1 (2 3) 2 3 4 (5 (6 7)) 5 (6 7) 6 7) + (-tree-seq 'listp 'reverse '(1 (2 3) 4 (5 (6 7)))) + ⇒ ((1 (2 3) 4 (5 (6 7))) (5 (6 7)) (6 7) 7 6 5 4 (2 3) 3 2 1) + (--tree-seq (vectorp it) (append it nil) [1 [2 3] 4 [5 [6 7]]]) + ⇒ ([1 [2 3] 4 [5 [6 7]]] 1 [2 3] 2 3 4 [5 [6 7]] 5 [6 7] 6 7) + + -- Function: -tree-map (fn tree) + Apply FN to each element of TREE while preserving the tree + structure. + + (-tree-map '1+ '(1 (2 3) (4 (5 6) 7))) + ⇒ (2 (3 4) (5 (6 7) 8)) + (-tree-map '(lambda (x) (cons x (expt 2 x))) '(1 (2 3) 4)) + ⇒ ((1 . 2) ((2 . 4) (3 . 8)) (4 . 16)) + (--tree-map (length it) '("<body>" ("<p>" "text" "</p>") "</body>")) + ⇒ (6 (3 4 4) 7) + + -- Function: -tree-map-nodes (pred fun tree) + Call FUN on each node of TREE that satisfies PRED. + + If PRED returns nil, continue descending down this node. If PRED + returns non-nil, apply FUN to this node and do not descend further. + + (-tree-map-nodes 'vectorp (lambda (x) (-sum (append x nil))) '(1 [2 3] 4 (5 [6 7] 8))) + ⇒ (1 5 4 (5 13 8)) + (-tree-map-nodes 'keywordp (lambda (x) (symbol-name x)) '(1 :foo 4 ((5 6 :bar) :baz 8))) + ⇒ (1 ":foo" 4 ((5 6 ":bar") ":baz" 8)) + (--tree-map-nodes (eq (car-safe it) 'add-mode) (-concat it (list :mode 'emacs-lisp-mode)) '(with-mode emacs-lisp-mode (foo bar) (add-mode a b) (baz (add-mode c d)))) + ⇒ (with-mode emacs-lisp-mode (foo bar) (add-mode a b :mode emacs-lisp-mode) (baz (add-mode c d :mode emacs-lisp-mode))) + + -- Function: -tree-reduce (fn tree) + Use FN to reduce elements of list TREE. If elements of TREE are + lists themselves, apply the reduction recursively. + + FN is first applied to first element of the list and second + element, then on this result and third element from the list etc. + + See ‘-reduce-r’ (*note -reduce-r::) for how exactly are lists of + zero or one element handled. + + (-tree-reduce '+ '(1 (2 3) (4 5))) + ⇒ 15 + (-tree-reduce 'concat '("strings" (" on" " various") ((" levels")))) + ⇒ "strings on various levels" + (--tree-reduce (cond ((stringp it) (concat it " " acc)) (t (let ((sn (symbol-name it))) (concat "<" sn ">" acc "</" sn ">")))) '(body (p "some words") (div "more" (b "bold") "words"))) + ⇒ "<body><p>some words</p> <div>more <b>bold</b> words</div></body>" + + -- Function: -tree-reduce-from (fn init-value tree) + Use FN to reduce elements of list TREE. If elements of TREE are + lists themselves, apply the reduction recursively. + + FN is first applied to INIT-VALUE and first element of the list, + then on this result and second element from the list etc. + + The initial value is ignored on cons pairs as they always contain + two elements. + + (-tree-reduce-from '+ 1 '(1 (1 1) ((1)))) + ⇒ 8 + (--tree-reduce-from (-concat acc (list it)) nil '(1 (2 3 (4 5)) (6 7))) + ⇒ ((7 6) ((5 4) 3 2) 1) + + -- Function: -tree-mapreduce (fn folder tree) + Apply FN to each element of TREE, and make a list of the results. + If elements of TREE are lists themselves, apply FN recursively to + elements of these nested lists. + + Then reduce the resulting lists using FOLDER and initial value + INIT-VALUE. See ‘-reduce-r-from’ (*note -reduce-r-from::). + + This is the same as calling ‘-tree-reduce’ (*note -tree-reduce::) + after ‘-tree-map’ (*note -tree-map::) but is twice as fast as it + only traverse the structure once. + + (-tree-mapreduce 'list 'append '(1 (2 (3 4) (5 6)) (7 (8 9)))) + ⇒ (1 2 3 4 5 6 7 8 9) + (--tree-mapreduce 1 (+ it acc) '(1 (2 (4 9) (2 1)) (7 (4 3)))) + ⇒ 9 + (--tree-mapreduce 0 (max acc (1+ it)) '(1 (2 (4 9) (2 1)) (7 (4 3)))) + ⇒ 3 + + -- Function: -tree-mapreduce-from (fn folder init-value tree) + Apply FN to each element of TREE, and make a list of the results. + If elements of TREE are lists themselves, apply FN recursively to + elements of these nested lists. + + Then reduce the resulting lists using FOLDER and initial value + INIT-VALUE. See ‘-reduce-r-from’ (*note -reduce-r-from::). + + This is the same as calling ‘-tree-reduce-from’ (*note + -tree-reduce-from::) after ‘-tree-map’ (*note -tree-map::) but is + twice as fast as it only traverse the structure once. + + (-tree-mapreduce-from 'identity '* 1 '(1 (2 (3 4) (5 6)) (7 (8 9)))) + ⇒ 362880 + (--tree-mapreduce-from (+ it it) (cons it acc) nil '(1 (2 (4 9) (2 1)) (7 (4 3)))) + ⇒ (2 (4 (8 18) (4 2)) (14 (8 6))) + (concat "{" (--tree-mapreduce-from (cond ((-cons-pair? it) (concat (symbol-name (car it)) " -> " (symbol-name (cdr it)))) (t (concat (symbol-name it) " : {"))) (concat it (unless (or (equal acc "}") (equal (substring it (1- (length it))) "{")) ", ") acc) "}" '((elisp-mode (foo (bar . booze)) (baz . qux)) (c-mode (foo . bla) (bum . bam))))) + ⇒ "{elisp-mode : {foo : {bar -> booze}, baz -> qux}, c-mode : {foo -> bla, bum -> bam}}" + + -- Function: -clone (list) + Create a deep copy of LIST. The new list has the same elements and + structure but all cons are replaced with new ones. This is useful + when you need to clone a structure such as plist or alist. + + (let* ((a '(1 2 3)) (b (-clone a))) (nreverse a) b) + ⇒ (1 2 3) + + +File: dash.info, Node: Threading macros, Next: Binding, Prev: Tree operations, Up: Functions + +2.12 Threading macros +===================== + +Macros that conditionally combine sequential forms for brevity or +readability. + + -- Macro: -> (x &optional form &rest more) + Thread the expr through the forms. Insert X as the second item in + the first form, making a list of it if it is not a list already. + If there are more forms, insert the first form as the second item + in second form, etc. + + (-> '(2 3 5)) + ⇒ (2 3 5) + (-> '(2 3 5) (append '(8 13))) + ⇒ (2 3 5 8 13) + (-> '(2 3 5) (append '(8 13)) (-slice 1 -1)) + ⇒ (3 5 8) + + -- Macro: ->> (x &optional form &rest more) + Thread the expr through the forms. Insert X as the last item in + the first form, making a list of it if it is not a list already. + If there are more forms, insert the first form as the last item in + second form, etc. + + (->> '(1 2 3) (-map 'square)) + ⇒ (1 4 9) + (->> '(1 2 3) (-map 'square) (-remove 'even?)) + ⇒ (1 9) + (->> '(1 2 3) (-map 'square) (-reduce '+)) + ⇒ 14 + + -- Macro: --> (x &rest forms) + Starting with the value of X, thread each expression through FORMS. + + Insert X at the position signified by the symbol ‘it’ in the first + form. If there are more forms, insert the first form at the + position signified by ‘it’ in in second form, etc. + + (--> "def" (concat "abc" it "ghi")) + ⇒ "abcdefghi" + (--> "def" (concat "abc" it "ghi") (upcase it)) + ⇒ "ABCDEFGHI" + (--> "def" (concat "abc" it "ghi") upcase) + ⇒ "ABCDEFGHI" + + -- Macro: -as-> (value variable &rest forms) + Starting with VALUE, thread VARIABLE through FORMS. + + In the first form, bind VARIABLE to VALUE. In the second form, + bind VARIABLE to the result of the first form, and so forth. + + (-as-> 3 my-var (1+ my-var) (list my-var) (mapcar (lambda (ele) (* 2 ele)) my-var)) + ⇒ (8) + (-as-> 3 my-var 1+) + ⇒ 4 + (-as-> 3 my-var) + ⇒ 3 + + -- Macro: -some-> (x &optional form &rest more) + When expr is non-nil, thread it through the first form (via ‘->’ + (*note ->::)), and when that result is non-nil, through the next + form, etc. + + (-some-> '(2 3 5)) + ⇒ (2 3 5) + (-some-> 5 square) + ⇒ 25 + (-some-> 5 even? square) + ⇒ nil + + -- Macro: -some->> (x &optional form &rest more) + When expr is non-nil, thread it through the first form (via ‘->>’ + (*note ->>::)), and when that result is non-nil, through the next + form, etc. + + (-some->> '(1 2 3) (-map 'square)) + ⇒ (1 4 9) + (-some->> '(1 3 5) (-last 'even?) (+ 100)) + ⇒ nil + (-some->> '(2 4 6) (-last 'even?) (+ 100)) + ⇒ 106 + + -- Macro: -some--> (expr &rest forms) + Thread EXPR through FORMS via ‘-->’ (*note -->::), while the result + is non-nil. When EXPR evaluates to non-nil, thread the result + through the first of FORMS, and when that result is non-nil, thread + it through the next form, etc. + + (-some--> "def" (concat "abc" it "ghi")) + ⇒ "abcdefghi" + (-some--> nil (concat "abc" it "ghi")) + ⇒ nil + (-some--> '(0 1) (-remove #'natnump it) (append it it) (-map #'1+ it)) + ⇒ () + + -- Macro: -doto (init &rest forms) + Evaluate INIT and pass it as argument to FORMS with ‘->’ (*note + ->::). The RESULT of evaluating INIT is threaded through each of + FORMS individually using ‘->’ (*note ->::), which see. The return + value is RESULT, which FORMS may have modified by side effect. + + (-doto (list 1 2 3) pop pop) + ⇒ (3) + (-doto (cons 1 2) (setcar 3) (setcdr 4)) + ⇒ (3 . 4) + (gethash 'k (--doto (make-hash-table) (puthash 'k 'v it))) + ⇒ v + + +File: dash.info, Node: Binding, Next: Side effects, Prev: Threading macros, Up: Functions + +2.13 Binding +============ + +Macros that combine ‘let’ and ‘let*’ with destructuring and flow +control. + + -- Macro: -when-let ((var val) &rest body) + If VAL evaluates to non-nil, bind it to VAR and execute body. + + Note: binding is done according to ‘-let’ (*note -let::). + + (-when-let (match-index (string-match "d" "abcd")) (+ match-index 2)) + ⇒ 5 + (-when-let ((&plist :foo foo) (list :foo "foo")) foo) + ⇒ "foo" + (-when-let ((&plist :foo foo) (list :bar "bar")) foo) + ⇒ nil + + -- Macro: -when-let* (vars-vals &rest body) + If all VALS evaluate to true, bind them to their corresponding VARS + and execute body. VARS-VALS should be a list of (VAR VAL) pairs. + + Note: binding is done according to ‘-let*’ (*note -let*::). VALS + are evaluated sequentially, and evaluation stops after the first + nil VAL is encountered. + + (-when-let* ((x 5) (y 3) (z (+ y 4))) (+ x y z)) + ⇒ 15 + (-when-let* ((x 5) (y nil) (z 7)) (+ x y z)) + ⇒ nil + + -- Macro: -if-let ((var val) then &rest else) + If VAL evaluates to non-nil, bind it to VAR and do THEN, otherwise + do ELSE. + + Note: binding is done according to ‘-let’ (*note -let::). + + (-if-let (match-index (string-match "d" "abc")) (+ match-index 3) 7) + ⇒ 7 + (--if-let (even? 4) it nil) + ⇒ t + + -- Macro: -if-let* (vars-vals then &rest else) + If all VALS evaluate to true, bind them to their corresponding VARS + and do THEN, otherwise do ELSE. VARS-VALS should be a list of (VAR + VAL) pairs. + + Note: binding is done according to ‘-let*’ (*note -let*::). VALS + are evaluated sequentially, and evaluation stops after the first + nil VAL is encountered. + + (-if-let* ((x 5) (y 3) (z 7)) (+ x y z) "foo") + ⇒ 15 + (-if-let* ((x 5) (y nil) (z 7)) (+ x y z) "foo") + ⇒ "foo" + (-if-let* (((_ _ x) '(nil nil 7))) x) + ⇒ 7 + + -- Macro: -let (varlist &rest body) + Bind variables according to VARLIST then eval BODY. + + VARLIST is a list of lists of the form (PATTERN SOURCE). Each + PATTERN is matched against the SOURCE "structurally". SOURCE is + only evaluated once for each PATTERN. Each PATTERN is matched + recursively, and can therefore contain sub-patterns which are + matched against corresponding sub-expressions of SOURCE. + + All the SOURCEs are evalled before any symbols are bound (i.e. "in + parallel"). + + If VARLIST only contains one (PATTERN SOURCE) element, you can + optionally specify it using a vector and discarding the outer-most + parens. Thus + + (-let ((PATTERN SOURCE)) ...) + + becomes + + (-let [PATTERN SOURCE] ...). + + ‘-let’ (*note -let::) uses a convention of not binding places + (symbols) starting with _ whenever it’s possible. You can use this + to skip over entries you don’t care about. However, this is not + *always* possible (as a result of implementation) and these symbols + might get bound to undefined values. + + Following is the overview of supported patterns. Remember that + patterns can be matched recursively, so every a, b, aK in the + following can be a matching construct and not necessarily a + symbol/variable. + + Symbol: + + a - bind the SOURCE to A. This is just like regular ‘let’. + + Conses and lists: + + (a) - bind ‘car’ of cons/list to A + + (a . b) - bind car of cons to A and ‘cdr’ to B + + (a b) - bind car of list to A and ‘cadr’ to B + + (a1 a2 a3 ...) - bind 0th car of list to A1, 1st to A2, 2nd to + A3... + + (a1 a2 a3 ... aN . rest) - as above, but bind the Nth cdr to REST. + + Vectors: + + [a] - bind 0th element of a non-list sequence to A (works with + vectors, strings, bit arrays...) + + [a1 a2 a3 ...] - bind 0th element of non-list sequence to A0, 1st + to A1, 2nd to A2, ... If the PATTERN is shorter than SOURCE, the + values at places not in PATTERN are ignored. If the PATTERN is + longer than SOURCE, an ‘error’ is thrown. + + [a1 a2 a3 ... &rest rest] - as above, but bind the rest of the + sequence to REST. This is conceptually the same as improper list + matching (a1 a2 ... aN . rest) + + Key/value stores: + + (&plist key0 a0 ... keyN aN) - bind value mapped by keyK in the + SOURCE plist to aK. If the value is not found, aK is nil. Uses + ‘plist-get’ to fetch values. + + (&alist key0 a0 ... keyN aN) - bind value mapped by keyK in the + SOURCE alist to aK. If the value is not found, aK is nil. Uses + ‘assoc’ to fetch values. + + (&hash key0 a0 ... keyN aN) - bind value mapped by keyK in the + SOURCE hash table to aK. If the value is not found, aK is nil. + Uses ‘gethash’ to fetch values. + + Further, special keyword &keys supports "inline" matching of + plist-like key-value pairs, similarly to &keys keyword of + ‘cl-defun’. + + (a1 a2 ... aN &keys key1 b1 ... keyN bK) + + This binds N values from the list to a1 ... aN, then interprets the + cdr as a plist (see key/value matching above). + + A shorthand notation for kv-destructuring exists which allows the + patterns be optionally left out and derived from the key name in + the following fashion: + + - a key :foo is converted into ‘foo’ pattern, - a key ’bar is + converted into ‘bar’ pattern, - a key "baz" is converted into ‘baz’ + pattern. + + That is, the entire value under the key is bound to the derived + variable without any further destructuring. + + This is possible only when the form following the key is not a + valid pattern (i.e. not a symbol, a cons cell or a vector). + Otherwise the matching proceeds as usual and in case of an invalid + spec fails with an error. + + Thus the patterns are normalized as follows: + + ;; derive all the missing patterns (&plist :foo ’bar "baz") => + (&plist :foo foo ’bar bar "baz" baz) + + ;; we can specify some but not others (&plist :foo ’bar + explicit-bar) => (&plist :foo foo ’bar explicit-bar) + + ;; nothing happens, we store :foo in x (&plist :foo x) => (&plist + :foo x) + + ;; nothing happens, we match recursively (&plist :foo (a b c)) => + (&plist :foo (a b c)) + + You can name the source using the syntax SYMBOL &as PATTERN. This + syntax works with lists (proper or improper), vectors and all types + of maps. + + (list &as a b c) (list 1 2 3) + + binds A to 1, B to 2, C to 3 and LIST to (1 2 3). + + Similarly: + + (bounds &as beg . end) (cons 1 2) + + binds BEG to 1, END to 2 and BOUNDS to (1 . 2). + + (items &as first . rest) (list 1 2 3) + + binds FIRST to 1, REST to (2 3) and ITEMS to (1 2 3) + + [vect &as _ b c] [1 2 3] + + binds B to 2, C to 3 and VECT to [1 2 3] (_ avoids binding as + usual). + + (plist &as &plist :b b) (list :a 1 :b 2 :c 3) + + binds B to 2 and PLIST to (:a 1 :b 2 :c 3). Same for &alist and + &hash. + + This is especially useful when we want to capture the result of a + computation and destructure at the same time. Consider the form + (function-returning-complex-structure) returning a list of two + vectors with two items each. We want to capture this entire result + and pass it to another computation, but at the same time we want to + get the second item from each vector. We can achieve it with + pattern + + (result &as [_ a] [_ b]) (function-returning-complex-structure) + + Note: Clojure programmers may know this feature as the ":as + binding". The difference is that we put the &as at the front + because we need to support improper list binding. + + (-let (([a (b c) d] [1 (2 3) 4])) (list a b c d)) + ⇒ (1 2 3 4) + (-let [(a b c . d) (list 1 2 3 4 5 6)] (list a b c d)) + ⇒ (1 2 3 (4 5 6)) + (-let [(&plist :foo foo :bar bar) (list :baz 3 :foo 1 :qux 4 :bar 2)] (list foo bar)) + ⇒ (1 2) + + -- Macro: -let* (varlist &rest body) + Bind variables according to VARLIST then eval BODY. + + VARLIST is a list of lists of the form (PATTERN SOURCE). Each + PATTERN is matched against the SOURCE structurally. SOURCE is only + evaluated once for each PATTERN. + + Each SOURCE can refer to the symbols already bound by this VARLIST. + This is useful if you want to destructure SOURCE recursively but + also want to name the intermediate structures. + + See ‘-let’ (*note -let::) for the list of all possible patterns. + + (-let* (((a . b) (cons 1 2)) ((c . d) (cons 3 4))) (list a b c d)) + ⇒ (1 2 3 4) + (-let* (((a . b) (cons 1 (cons 2 3))) ((c . d) b)) (list a b c d)) + ⇒ (1 (2 . 3) 2 3) + (-let* (((&alist "foo" foo "bar" bar) (list (cons "foo" 1) (cons "bar" (list 'a 'b 'c)))) ((a b c) bar)) (list foo a b c bar)) + ⇒ (1 a b c (a b c)) + + -- Macro: -lambda (match-form &rest body) + Return a lambda which destructures its input as MATCH-FORM and + executes BODY. + + Note that you have to enclose the MATCH-FORM in a pair of parens, + such that: + + (-lambda (x) body) (-lambda (x y ...) body) + + has the usual semantics of ‘lambda’. Furthermore, these get + translated into normal ‘lambda’, so there is no performance + penalty. + + See ‘-let’ (*note -let::) for a description of the destructuring + mechanism. + + (-map (-lambda ((x y)) (+ x y)) '((1 2) (3 4) (5 6))) + ⇒ (3 7 11) + (-map (-lambda ([x y]) (+ x y)) '([1 2] [3 4] [5 6])) + ⇒ (3 7 11) + (funcall (-lambda ((_ . a) (_ . b)) (-concat a b)) '(1 2 3) '(4 5 6)) + ⇒ (2 3 5 6) + + -- Macro: -setq ([match-form val] ...) + Bind each MATCH-FORM to the value of its VAL. + + MATCH-FORM destructuring is done according to the rules of ‘-let’ + (*note -let::). + + This macro allows you to bind multiple variables by destructuring + the value, so for example: + + (-setq (a b) x (&plist :c c) plist) + + expands roughly speaking to the following code + + (setq a (car x) b (cadr x) c (plist-get plist :c)) + + Care is taken to only evaluate each VAL once so that in case of + multiple assignments it does not cause unexpected side effects. + + (let (a) (-setq a 1) a) + ⇒ 1 + (let (a b) (-setq (a b) (list 1 2)) (list a b)) + ⇒ (1 2) + (let (c) (-setq (&plist :c c) (list :c "c")) c) + ⇒ "c" + + +File: dash.info, Node: Side effects, Next: Destructive operations, Prev: Binding, Up: Functions + +2.14 Side effects +================= + +Functions iterating over lists for side effect only. + + -- Function: -each (list fn) + Call FN on each element of LIST. Return nil; this function is + intended for side effects. + + Its anaphoric counterpart is ‘--each’. + + For access to the current element’s index in LIST, see + ‘-each-indexed’ (*note -each-indexed::). + + (let (l) (-each '(1 2 3) (lambda (x) (push x l))) l) + ⇒ (3 2 1) + (let (l) (--each '(1 2 3) (push it l)) l) + ⇒ (3 2 1) + (-each '(1 2 3) #'identity) + ⇒ nil + + -- Function: -each-while (list pred fn) + Call FN on each ITEM in LIST, while (PRED ITEM) is non-nil. Once + an ITEM is reached for which PRED returns nil, FN is no longer + called. Return nil; this function is intended for side effects. + + Its anaphoric counterpart is ‘--each-while’. + + (let (l) (-each-while '(2 4 5 6) #'even? (lambda (x) (push x l))) l) + ⇒ (4 2) + (let (l) (--each-while '(1 2 3 4) (< it 3) (push it l)) l) + ⇒ (2 1) + (let ((s 0)) (--each-while '(1 3 4 5) (< it 5) (setq s (+ s it))) s) + ⇒ 8 + + -- Function: -each-indexed (list fn) + Call FN on each index and element of LIST. For each ITEM at INDEX + in LIST, call (funcall FN INDEX ITEM). Return nil; this function + is intended for side effects. + + See also: ‘-map-indexed’ (*note -map-indexed::). + + (let (l) (-each-indexed '(a b c) (lambda (i x) (push (list x i) l))) l) + ⇒ ((c 2) (b 1) (a 0)) + (let (l) (--each-indexed '(a b c) (push (list it it-index) l)) l) + ⇒ ((c 2) (b 1) (a 0)) + (let (l) (--each-indexed () (push it l)) l) + ⇒ () + + -- Function: -each-r (list fn) + Call FN on each element of LIST in reversed order. Return nil; + this function is intended for side effects. + + Its anaphoric counterpart is ‘--each-r’. + + (let (l) (-each-r '(1 2 3) (lambda (x) (push x l))) l) + ⇒ (1 2 3) + (let (l) (--each-r '(1 2 3) (push it l)) l) + ⇒ (1 2 3) + (-each-r '(1 2 3) #'identity) + ⇒ nil + + -- Function: -each-r-while (list pred fn) + Call FN on each ITEM in reversed LIST, while (PRED ITEM) is + non-nil. Once an ITEM is reached for which PRED returns nil, FN is + no longer called. Return nil; this function is intended for side + effects. + + Its anaphoric counterpart is ‘--each-r-while’. + + (let (l) (-each-r-while '(2 4 5 6) #'even? (lambda (x) (push x l))) l) + ⇒ (6) + (let (l) (--each-r-while '(1 2 3 4) (>= it 3) (push it l)) l) + ⇒ (3 4) + (let ((s 0)) (--each-r-while '(1 2 3 5) (> it 1) (setq s (+ s it))) s) + ⇒ 10 + + -- Function: -dotimes (num fn) + Call FN NUM times, presumably for side effects. FN is called with + a single argument on successive integers running from 0, inclusive, + to NUM, exclusive. FN is not called if NUM is less than 1. + + This function’s anaphoric counterpart is ‘--dotimes’. + + (let (s) (-dotimes 3 (lambda (n) (push n s))) s) + ⇒ (2 1 0) + (let (s) (-dotimes 0 (lambda (n) (push n s))) s) + ⇒ () + (let (s) (--dotimes 5 (push it s)) s) + ⇒ (4 3 2 1 0) + + +File: dash.info, Node: Destructive operations, Next: Function combinators, Prev: Side effects, Up: Functions + +2.15 Destructive operations +=========================== + +Macros that modify variables holding lists. + + -- Macro: !cons (car cdr) + Destructive: Set CDR to the cons of CAR and CDR. + + (let (l) (!cons 5 l) l) + ⇒ (5) + (let ((l '(3))) (!cons 5 l) l) + ⇒ (5 3) + + -- Macro: !cdr (list) + Destructive: Set LIST to the cdr of LIST. + + (let ((l '(3))) (!cdr l) l) + ⇒ () + (let ((l '(3 5))) (!cdr l) l) + ⇒ (5) + + +File: dash.info, Node: Function combinators, Prev: Destructive operations, Up: Functions + +2.16 Function combinators +========================= + +Functions that manipulate and compose other functions. + + -- Function: -partial (fun &rest args) + Return a function that is a partial application of FUN to ARGS. + ARGS is a list of the first N arguments to pass to FUN. The result + is a new function which does the same as FUN, except that the first + N arguments are fixed at the values with which this function was + called. + + (funcall (-partial #'+ 5)) + ⇒ 5 + (funcall (-partial #'- 5) 3) + ⇒ 2 + (funcall (-partial #'+ 5 2) 3) + ⇒ 10 + + -- Function: -rpartial (fn &rest args) + Return a function that is a partial application of FN to ARGS. + ARGS is a list of the last N arguments to pass to FN. The result + is a new function which does the same as FN, except that the last N + arguments are fixed at the values with which this function was + called. This is like ‘-partial’ (*note -partial::), except the + arguments are fixed starting from the right rather than the left. + + (funcall (-rpartial #'- 5)) + ⇒ -5 + (funcall (-rpartial #'- 5) 8) + ⇒ 3 + (funcall (-rpartial #'- 5 2) 10) + ⇒ 3 + + -- Function: -juxt (&rest fns) + Return a function that is the juxtaposition of FNS. The returned + function takes a variable number of ARGS, applies each of FNS in + turn to ARGS, and returns the list of results. + + (funcall (-juxt) 1 2) + ⇒ () + (funcall (-juxt #'+ #'- #'* #'/) 7 5) + ⇒ (12 2 35 1) + (mapcar (-juxt #'number-to-string #'1+) '(1 2)) + ⇒ (("1" 2) ("2" 3)) + + -- Function: -compose (&rest fns) + Compose FNS into a single composite function. Return a function + that takes a variable number of ARGS, applies the last function in + FNS to ARGS, and returns the result of calling each remaining + function on the result of the previous function, right-to-left. If + no FNS are given, return a variadic ‘identity’ function. + + (funcall (-compose #'- #'1+ #'+) 1 2 3) + ⇒ -7 + (funcall (-compose #'identity #'1+) 3) + ⇒ 4 + (mapcar (-compose #'not #'stringp) '(nil "")) + ⇒ (t nil) + + -- Function: -applify (fn) + Return a function that applies FN to a single list of args. This + changes the arity of FN from taking N distinct arguments to taking + 1 argument which is a list of N arguments. + + (funcall (-applify #'+) nil) + ⇒ 0 + (mapcar (-applify #'+) '((1 1 1) (1 2 3) (5 5 5))) + ⇒ (3 6 15) + (funcall (-applify #'<) '(3 6)) + ⇒ t + + -- Function: -on (operator transformer) + Return a function of two arguments that first applies TRANSFORMER + to each of them and then applies OPERATOR on the results (in the + same order). + + In types: (b -> b -> c) -> (a -> b) -> a -> a -> c + + (-sort (-on '< 'length) '((1 2 3) (1) (1 2))) + ⇒ ((1) (1 2) (1 2 3)) + (-min-by (-on '> 'length) '((1 2 3) (4) (1 2))) + ⇒ (4) + (-min-by (-on 'string-lessp 'number-to-string) '(2 100 22)) + ⇒ 22 + + -- Function: -flip (func) + Swap the order of arguments for binary function FUNC. + + In types: (a -> b -> c) -> b -> a -> c + + (funcall (-flip '<) 2 1) + ⇒ t + (funcall (-flip '-) 3 8) + ⇒ 5 + (-sort (-flip '<) '(4 3 6 1)) + ⇒ (6 4 3 1) + + -- Function: -const (c) + Return a function that returns C ignoring any additional arguments. + + In types: a -> b -> a + + (funcall (-const 2) 1 3 "foo") + ⇒ 2 + (-map (-const 1) '("a" "b" "c" "d")) + ⇒ (1 1 1 1) + (-sum (-map (-const 1) '("a" "b" "c" "d"))) + ⇒ 4 + + -- Macro: -cut (&rest params) + Take n-ary function and n arguments and specialize some of them. + Arguments denoted by <> will be left unspecialized. + + See SRFI-26 for detailed description. + + (funcall (-cut list 1 <> 3 <> 5) 2 4) + ⇒ (1 2 3 4 5) + (-map (-cut funcall <> 5) `(1+ 1- ,(lambda (x) (/ 1.0 x)))) + ⇒ (6 4 0.2) + (-map (-cut <> 1 2 3) '(list vector string)) + ⇒ ((1 2 3) [1 2 3] "\1\2\3") + + -- Function: -not (pred) + Take a unary predicate PRED and return a unary predicate that + returns t if PRED returns nil and nil if PRED returns non-nil. + + (funcall (-not 'even?) 5) + ⇒ t + (-filter (-not (-partial '< 4)) '(1 2 3 4 5 6 7 8)) + ⇒ (1 2 3 4) + + -- Function: -orfn (&rest preds) + Take list of unary predicates PREDS and return a unary predicate + with argument x that returns non-nil if at least one of the PREDS + returns non-nil on x. + + In types: [a -> Bool] -> a -> Bool + + (-filter (-orfn 'even? (-partial (-flip '<) 5)) '(1 2 3 4 5 6 7 8 9 10)) + ⇒ (1 2 3 4 6 8 10) + (funcall (-orfn 'stringp 'even?) "foo") + ⇒ t + + -- Function: -andfn (&rest preds) + Take list of unary predicates PREDS and return a unary predicate + with argument x that returns non-nil if all of the PREDS returns + non-nil on x. + + In types: [a -> Bool] -> a -> Bool + + (funcall (-andfn (-cut < <> 10) 'even?) 6) + ⇒ t + (funcall (-andfn (-cut < <> 10) 'even?) 12) + ⇒ nil + (-filter (-andfn (-not 'even?) (-cut >= 5 <>)) '(1 2 3 4 5 6 7 8 9 10)) + ⇒ (1 3 5) + + -- Function: -iteratefn (fn n) + Return a function FN composed N times with itself. + + FN is a unary function. If you need to use a function of higher + arity, use ‘-applify’ (*note -applify::) first to turn it into a + unary function. + + With n = 0, this acts as identity function. + + In types: (a -> a) -> Int -> a -> a. + + This function satisfies the following law: + + (funcall (-iteratefn fn n) init) = (-last-item (-iterate fn init + (1+ n))). + + (funcall (-iteratefn (lambda (x) (* x x)) 3) 2) + ⇒ 256 + (funcall (-iteratefn '1+ 3) 1) + ⇒ 4 + (funcall (-iteratefn 'cdr 3) '(1 2 3 4 5)) + ⇒ (4 5) + + -- Function: -fixfn (fn &optional equal-test halt-test) + Return a function that computes the (least) fixpoint of FN. + + FN must be a unary function. The returned lambda takes a single + argument, X, the initial value for the fixpoint iteration. The + iteration halts when either of the following conditions is + satisfied: + + 1. Iteration converges to the fixpoint, with equality being tested + using EQUAL-TEST. If EQUAL-TEST is not specified, ‘equal’ is used. + For functions over the floating point numbers, it may be necessary + to provide an appropriate approximate comparison test. + + 2. HALT-TEST returns a non-nil value. HALT-TEST defaults to a + simple counter that returns t after ‘-fixfn-max-iterations’, to + guard against infinite iteration. Otherwise, HALT-TEST must be a + function that accepts a single argument, the current value of X, + and returns non-nil as long as iteration should continue. In this + way, a more sophisticated convergence test may be supplied by the + caller. + + The return value of the lambda is either the fixpoint or, if + iteration halted before converging, a cons with car ‘halted’ and + cdr the final output from HALT-TEST. + + In types: (a -> a) -> a -> a. + + (funcall (-fixfn #'cos #'approx=) 0.7) + ⇒ 0.7390851332151607 + (funcall (-fixfn (lambda (x) (expt (+ x 10) 0.25))) 2.0) + ⇒ 1.8555845286409378 + (funcall (-fixfn #'sin #'approx=) 0.1) + ⇒ (halted . t) + + -- Function: -prodfn (&rest fns) + Take a list of n functions and return a function that takes a list + of length n, applying i-th function to i-th element of the input + list. Returns a list of length n. + + In types (for n=2): ((a -> b), (c -> d)) -> (a, c) -> (b, d) + + This function satisfies the following laws: + + (-compose (-prodfn f g ...) (-prodfn f’ g’ ...)) = (-prodfn + (-compose f f’) (-compose g g’) ...) (-prodfn f g ...) = (-juxt + (-compose f (-partial ’nth 0)) (-compose g (-partial ’nth 1)) ...) + (-compose (-prodfn f g ...) (-juxt f’ g’ ...)) = (-juxt (-compose f + f’) (-compose g g’) ...) (-compose (-partial ’nth n) (-prod f1 f2 + ...)) = (-compose fn (-partial ’nth n)) + + (funcall (-prodfn '1+ '1- 'number-to-string) '(1 2 3)) + ⇒ (2 1 "3") + (-map (-prodfn '1+ '1-) '((1 2) (3 4) (5 6) (7 8))) + ⇒ ((2 1) (4 3) (6 5) (8 7)) + (apply '+ (funcall (-prodfn 'length 'string-to-number) '((1 2 3) "15"))) + ⇒ 18 + + +File: dash.info, Node: Development, Next: FDL, Prev: Functions, Up: Top + +3 Development +************* + +The Dash repository is hosted on GitHub at +<https://github.com/magnars/dash.el>. + +* Menu: + +* Contribute:: How to contribute. +* Contributors:: List of contributors. + + +File: dash.info, Node: Contribute, Next: Contributors, Up: Development + +3.1 Contribute +============== + +Yes, please do. Pure functions in the list manipulation realm only, +please. There’s a suite of examples/tests in ‘dev/examples.el’, so +remember to add tests for your additions, or they may get broken later. + + Run the tests with ‘make check’. Regenerate the docs with ‘make +docs’. Contributors are encouraged to install these commands as a Git +pre-commit hook, so that the tests are always running and the docs are +always in sync: + + $ cp dev/pre-commit.sh .git/hooks/pre-commit + + Oh, and don’t edit ‘README.md’ or ‘dash.texi’ directly, as they are +auto-generated. Instead, change their respective templates +‘readme-template.md’ or ‘dash-template.texi’. + + To ensure that Dash can be distributed with GNU ELPA or Emacs, we +require that all contributors assign copyright to the Free Software +Foundation. For more on this, *note (emacs)Copyright Assignment::. + + +File: dash.info, Node: Contributors, Prev: Contribute, Up: Development + +3.2 Contributors +================ + + • Matus Goljer (https://github.com/Fuco1) contributed lots of + features and functions. + • Takafumi Arakaki (https://github.com/tkf) contributed ‘-group-by’. + • tali713 (https://github.com/tali713) is the author of ‘-applify’. + • Víctor M. Valenzuela (https://github.com/vemv) contributed + ‘-repeat’. + • Nic Ferrier (https://github.com/nicferrier) contributed ‘-cons*’. + • Wilfred Hughes (https://github.com/Wilfred) contributed ‘-slice’, + ‘-first-item’, and ‘-last-item’. + • Emanuel Evans (https://github.com/shosti) contributed ‘-if-let’, + ‘-when-let’, and ‘-insert-at’. + • Johan Andersson (https://github.com/rejeep) contributed ‘-sum’, + ‘-product’, and ‘-same-items?’. + • Christina Whyte (https://github.com/kurisuwhyte) contributed + ‘-compose’. + • Steve Lamb (https://github.com/steventlamb) contributed ‘-cycle’, + ‘-pad’, ‘-annotate’, ‘-zip-fill’, and a variadic version of ‘-zip’. + • Fredrik Bergroth (https://github.com/fbergroth) made the ‘-if-let’ + family use ‘-let’ destructuring and improved the script for + generating documentation. + • Mark Oteiza (https://github.com/holomorph) contributed ‘-iota’ and + the script to create an Info manual. + • Vasilij Schneidermann (https://github.com/wasamasa) contributed + ‘-some’. + • William West (https://github.com/occidens) made ‘-fixfn’ more + robust at handling floats. + • Cam Saul (https://github.com/camsaul) contributed ‘-some->’, + ‘-some->>’, and ‘-some-->’. + • Basil L. Contovounesios (https://github.com/basil-conto) + contributed ‘-common-prefix’, ‘-common-suffix’, and various other + improvements. + • Paul Pogonyshev (https://github.com/doublep) contributed ‘-each-r’ + and ‘-each-r-while’. + + Thanks! + + New contributors are very welcome. *Note Contribute::. + + +File: dash.info, Node: FDL, Next: GPL, Prev: Development, Up: Top + +Appendix A GNU Free Documentation License +***************************************** + + Version 1.3, 3 November 2008 + + Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. + <https://fsf.org/> + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + 0. PREAMBLE + + The purpose of this License is to make a manual, textbook, or other + functional and useful document “free” in the sense of freedom: to + assure everyone the effective freedom to copy and redistribute it, + with or without modifying it, either commercially or + noncommercially. Secondarily, this License preserves for the + author and publisher a way to get credit for their work, while not + being considered responsible for modifications made by others. + + This License is a kind of “copyleft”, which means that derivative + works of the document must themselves be free in the same sense. + It complements the GNU General Public License, which is a copyleft + license designed for free software. + + We have designed this License in order to use it for manuals for + free software, because free software needs free documentation: a + free program should come with manuals providing the same freedoms + that the software does. But this License is not limited to + software manuals; it can be used for any textual work, regardless + of subject matter or whether it is published as a printed book. We + recommend this License principally for works whose purpose is + instruction or reference. + + 1. APPLICABILITY AND DEFINITIONS + + This License applies to any manual or other work, in any medium, + that contains a notice placed by the copyright holder saying it can + be distributed under the terms of this License. Such a notice + grants a world-wide, royalty-free license, unlimited in duration, + to use that work under the conditions stated herein. The + “Document”, below, refers to any such manual or work. Any member + of the public is a licensee, and is addressed as “you”. You accept + the license if you copy, modify or distribute the work in a way + requiring permission under copyright law. + + A “Modified Version” of the Document means any work containing the + Document or a portion of it, either copied verbatim, or with + modifications and/or translated into another language. + + A “Secondary Section” is a named appendix or a front-matter section + of the Document that deals exclusively with the relationship of the + publishers or authors of the Document to the Document’s overall + subject (or to related matters) and contains nothing that could + fall directly within that overall subject. (Thus, if the Document + is in part a textbook of mathematics, a Secondary Section may not + explain any mathematics.) The relationship could be a matter of + historical connection with the subject or with related matters, or + of legal, commercial, philosophical, ethical or political position + regarding them. + + The “Invariant Sections” are certain Secondary Sections whose + titles are designated, as being those of Invariant Sections, in the + notice that says that the Document is released under this License. + If a section does not fit the above definition of Secondary then it + is not allowed to be designated as Invariant. The Document may + contain zero Invariant Sections. If the Document does not identify + any Invariant Sections then there are none. + + The “Cover Texts” are certain short passages of text that are + listed, as Front-Cover Texts or Back-Cover Texts, in the notice + that says that the Document is released under this License. A + Front-Cover Text may be at most 5 words, and a Back-Cover Text may + be at most 25 words. + + A “Transparent” copy of the Document means a machine-readable copy, + represented in a format whose specification is available to the + general public, that is suitable for revising the document + straightforwardly with generic text editors or (for images composed + of pixels) generic paint programs or (for drawings) some widely + available drawing editor, and that is suitable for input to text + formatters or for automatic translation to a variety of formats + suitable for input to text formatters. A copy made in an otherwise + Transparent file format whose markup, or absence of markup, has + been arranged to thwart or discourage subsequent modification by + readers is not Transparent. An image format is not Transparent if + used for any substantial amount of text. A copy that is not + “Transparent” is called “Opaque”. + + Examples of suitable formats for Transparent copies include plain + ASCII without markup, Texinfo input format, LaTeX input format, + SGML or XML using a publicly available DTD, and standard-conforming + simple HTML, PostScript or PDF designed for human modification. + Examples of transparent image formats include PNG, XCF and JPG. + Opaque formats include proprietary formats that can be read and + edited only by proprietary word processors, SGML or XML for which + the DTD and/or processing tools are not generally available, and + the machine-generated HTML, PostScript or PDF produced by some word + processors for output purposes only. + + The “Title Page” means, for a printed book, the title page itself, + plus such following pages as are needed to hold, legibly, the + material this License requires to appear in the title page. For + works in formats which do not have any title page as such, “Title + Page” means the text near the most prominent appearance of the + work’s title, preceding the beginning of the body of the text. + + The “publisher” means any person or entity that distributes copies + of the Document to the public. + + A section “Entitled XYZ” means a named subunit of the Document + whose title either is precisely XYZ or contains XYZ in parentheses + following text that translates XYZ in another language. (Here XYZ + stands for a specific section name mentioned below, such as + “Acknowledgements”, “Dedications”, “Endorsements”, or “History”.) + To “Preserve the Title” of such a section when you modify the + Document means that it remains a section “Entitled XYZ” according + to this definition. + + The Document may include Warranty Disclaimers next to the notice + which states that this License applies to the Document. These + Warranty Disclaimers are considered to be included by reference in + this License, but only as regards disclaiming warranties: any other + implication that these Warranty Disclaimers may have is void and + has no effect on the meaning of this License. + + 2. VERBATIM COPYING + + You may copy and distribute the Document in any medium, either + commercially or noncommercially, provided that this License, the + copyright notices, and the license notice saying this License + applies to the Document are reproduced in all copies, and that you + add no other conditions whatsoever to those of this License. You + may not use technical measures to obstruct or control the reading + or further copying of the copies you make or distribute. However, + you may accept compensation in exchange for copies. If you + distribute a large enough number of copies you must also follow the + conditions in section 3. + + You may also lend copies, under the same conditions stated above, + and you may publicly display copies. + + 3. COPYING IN QUANTITY + + If you publish printed copies (or copies in media that commonly + have printed covers) of the Document, numbering more than 100, and + the Document’s license notice requires Cover Texts, you must + enclose the copies in covers that carry, clearly and legibly, all + these Cover Texts: Front-Cover Texts on the front cover, and + Back-Cover Texts on the back cover. Both covers must also clearly + and legibly identify you as the publisher of these copies. The + front cover must present the full title with all words of the title + equally prominent and visible. You may add other material on the + covers in addition. Copying with changes limited to the covers, as + long as they preserve the title of the Document and satisfy these + conditions, can be treated as verbatim copying in other respects. + + If the required texts for either cover are too voluminous to fit + legibly, you should put the first ones listed (as many as fit + reasonably) on the actual cover, and continue the rest onto + adjacent pages. + + If you publish or distribute Opaque copies of the Document + numbering more than 100, you must either include a machine-readable + Transparent copy along with each Opaque copy, or state in or with + each Opaque copy a computer-network location from which the general + network-using public has access to download using public-standard + network protocols a complete Transparent copy of the Document, free + of added material. If you use the latter option, you must take + reasonably prudent steps, when you begin distribution of Opaque + copies in quantity, to ensure that this Transparent copy will + remain thus accessible at the stated location until at least one + year after the last time you distribute an Opaque copy (directly or + through your agents or retailers) of that edition to the public. + + It is requested, but not required, that you contact the authors of + the Document well before redistributing any large number of copies, + to give them a chance to provide you with an updated version of the + Document. + + 4. MODIFICATIONS + + You may copy and distribute a Modified Version of the Document + under the conditions of sections 2 and 3 above, provided that you + release the Modified Version under precisely this License, with the + Modified Version filling the role of the Document, thus licensing + distribution and modification of the Modified Version to whoever + possesses a copy of it. In addition, you must do these things in + the Modified Version: + + A. Use in the Title Page (and on the covers, if any) a title + distinct from that of the Document, and from those of previous + versions (which should, if there were any, be listed in the + History section of the Document). You may use the same title + as a previous version if the original publisher of that + version gives permission. + + B. List on the Title Page, as authors, one or more persons or + entities responsible for authorship of the modifications in + the Modified Version, together with at least five of the + principal authors of the Document (all of its principal + authors, if it has fewer than five), unless they release you + from this requirement. + + C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. + + D. Preserve all the copyright notices of the Document. + + E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. + + F. Include, immediately after the copyright notices, a license + notice giving the public permission to use the Modified + Version under the terms of this License, in the form shown in + the Addendum below. + + G. Preserve in that license notice the full lists of Invariant + Sections and required Cover Texts given in the Document’s + license notice. + + H. Include an unaltered copy of this License. + + I. Preserve the section Entitled “History”, Preserve its Title, + and add to it an item stating at least the title, year, new + authors, and publisher of the Modified Version as given on the + Title Page. If there is no section Entitled “History” in the + Document, create one stating the title, year, authors, and + publisher of the Document as given on its Title Page, then add + an item describing the Modified Version as stated in the + previous sentence. + + J. Preserve the network location, if any, given in the Document + for public access to a Transparent copy of the Document, and + likewise the network locations given in the Document for + previous versions it was based on. These may be placed in the + “History” section. You may omit a network location for a work + that was published at least four years before the Document + itself, or if the original publisher of the version it refers + to gives permission. + + K. For any section Entitled “Acknowledgements” or “Dedications”, + Preserve the Title of the section, and preserve in the section + all the substance and tone of each of the contributor + acknowledgements and/or dedications given therein. + + L. Preserve all the Invariant Sections of the Document, unaltered + in their text and in their titles. Section numbers or the + equivalent are not considered part of the section titles. + + M. Delete any section Entitled “Endorsements”. Such a section + may not be included in the Modified Version. + + N. Do not retitle any existing section to be Entitled + “Endorsements” or to conflict in title with any Invariant + Section. + + O. Preserve any Warranty Disclaimers. + + If the Modified Version includes new front-matter sections or + appendices that qualify as Secondary Sections and contain no + material copied from the Document, you may at your option designate + some or all of these sections as invariant. To do this, add their + titles to the list of Invariant Sections in the Modified Version’s + license notice. These titles must be distinct from any other + section titles. + + You may add a section Entitled “Endorsements”, provided it contains + nothing but endorsements of your Modified Version by various + parties—for example, statements of peer review or that the text has + been approved by an organization as the authoritative definition of + a standard. + + You may add a passage of up to five words as a Front-Cover Text, + and a passage of up to 25 words as a Back-Cover Text, to the end of + the list of Cover Texts in the Modified Version. Only one passage + of Front-Cover Text and one of Back-Cover Text may be added by (or + through arrangements made by) any one entity. If the Document + already includes a cover text for the same cover, previously added + by you or by arrangement made by the same entity you are acting on + behalf of, you may not add another; but you may replace the old + one, on explicit permission from the previous publisher that added + the old one. + + The author(s) and publisher(s) of the Document do not by this + License give permission to use their names for publicity for or to + assert or imply endorsement of any Modified Version. + + 5. COMBINING DOCUMENTS + + You may combine the Document with other documents released under + this License, under the terms defined in section 4 above for + modified versions, provided that you include in the combination all + of the Invariant Sections of all of the original documents, + unmodified, and list them all as Invariant Sections of your + combined work in its license notice, and that you preserve all + their Warranty Disclaimers. + + The combined work need only contain one copy of this License, and + multiple identical Invariant Sections may be replaced with a single + copy. If there are multiple Invariant Sections with the same name + but different contents, make the title of each such section unique + by adding at the end of it, in parentheses, the name of the + original author or publisher of that section if known, or else a + unique number. Make the same adjustment to the section titles in + the list of Invariant Sections in the license notice of the + combined work. + + In the combination, you must combine any sections Entitled + “History” in the various original documents, forming one section + Entitled “History”; likewise combine any sections Entitled + “Acknowledgements”, and any sections Entitled “Dedications”. You + must delete all sections Entitled “Endorsements.” + + 6. COLLECTIONS OF DOCUMENTS + + You may make a collection consisting of the Document and other + documents released under this License, and replace the individual + copies of this License in the various documents with a single copy + that is included in the collection, provided that you follow the + rules of this License for verbatim copying of each of the documents + in all other respects. + + You may extract a single document from such a collection, and + distribute it individually under this License, provided you insert + a copy of this License into the extracted document, and follow this + License in all other respects regarding verbatim copying of that + document. + + 7. AGGREGATION WITH INDEPENDENT WORKS + + A compilation of the Document or its derivatives with other + separate and independent documents or works, in or on a volume of a + storage or distribution medium, is called an “aggregate” if the + copyright resulting from the compilation is not used to limit the + legal rights of the compilation’s users beyond what the individual + works permit. When the Document is included in an aggregate, this + License does not apply to the other works in the aggregate which + are not themselves derivative works of the Document. + + If the Cover Text requirement of section 3 is applicable to these + copies of the Document, then if the Document is less than one half + of the entire aggregate, the Document’s Cover Texts may be placed + on covers that bracket the Document within the aggregate, or the + electronic equivalent of covers if the Document is in electronic + form. Otherwise they must appear on printed covers that bracket + the whole aggregate. + + 8. TRANSLATION + + Translation is considered a kind of modification, so you may + distribute translations of the Document under the terms of section + 4. Replacing Invariant Sections with translations requires special + permission from their copyright holders, but you may include + translations of some or all Invariant Sections in addition to the + original versions of these Invariant Sections. You may include a + translation of this License, and all the license notices in the + Document, and any Warranty Disclaimers, provided that you also + include the original English version of this License and the + original versions of those notices and disclaimers. In case of a + disagreement between the translation and the original version of + this License or a notice or disclaimer, the original version will + prevail. + + If a section in the Document is Entitled “Acknowledgements”, + “Dedications”, or “History”, the requirement (section 4) to + Preserve its Title (section 1) will typically require changing the + actual title. + + 9. TERMINATION + + You may not copy, modify, sublicense, or distribute the Document + except as expressly provided under this License. Any attempt + otherwise to copy, modify, sublicense, or distribute it is void, + and will automatically terminate your rights under this License. + + However, if you cease all violation of this License, then your + license from a particular copyright holder is reinstated (a) + provisionally, unless and until the copyright holder explicitly and + finally terminates your license, and (b) permanently, if the + copyright holder fails to notify you of the violation by some + reasonable means prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is + reinstated permanently if the copyright holder notifies you of the + violation by some reasonable means, this is the first time you have + received notice of violation of this License (for any work) from + that copyright holder, and you cure the violation prior to 30 days + after your receipt of the notice. + + Termination of your rights under this section does not terminate + the licenses of parties who have received copies or rights from you + under this License. If your rights have been terminated and not + permanently reinstated, receipt of a copy of some or all of the + same material does not give you any rights to use it. + + 10. FUTURE REVISIONS OF THIS LICENSE + + The Free Software Foundation may publish new, revised versions of + the GNU Free Documentation License from time to time. Such new + versions will be similar in spirit to the present version, but may + differ in detail to address new problems or concerns. See + <https://www.gnu.org/licenses/>. + + Each version of the License is given a distinguishing version + number. If the Document specifies that a particular numbered + version of this License “or any later version” applies to it, you + have the option of following the terms and conditions either of + that specified version or of any later version that has been + published (not as a draft) by the Free Software Foundation. If the + Document does not specify a version number of this License, you may + choose any version ever published (not as a draft) by the Free + Software Foundation. If the Document specifies that a proxy can + decide which future versions of this License can be used, that + proxy’s public statement of acceptance of a version permanently + authorizes you to choose that version for the Document. + + 11. RELICENSING + + “Massive Multiauthor Collaboration Site” (or “MMC Site”) means any + World Wide Web server that publishes copyrightable works and also + provides prominent facilities for anybody to edit those works. A + public wiki that anybody can edit is an example of such a server. + A “Massive Multiauthor Collaboration” (or “MMC”) contained in the + site means any set of copyrightable works thus published on the MMC + site. + + “CC-BY-SA” means the Creative Commons Attribution-Share Alike 3.0 + license published by Creative Commons Corporation, a not-for-profit + corporation with a principal place of business in San Francisco, + California, as well as future copyleft versions of that license + published by that same organization. + + “Incorporate” means to publish or republish a Document, in whole or + in part, as part of another Document. + + An MMC is “eligible for relicensing” if it is licensed under this + License, and if all works that were first published under this + License somewhere other than this MMC, and subsequently + incorporated in whole or in part into the MMC, (1) had no cover + texts or invariant sections, and (2) were thus incorporated prior + to November 1, 2008. + + The operator of an MMC Site may republish an MMC contained in the + site under CC-BY-SA on the same site at any time before August 1, + 2009, provided the MMC is eligible for relicensing. + +ADDENDUM: How to use this License for your documents +==================================================== + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and license +notices just after the title page: + + Copyright (C) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover + Texts. A copy of the license is included in the section entitled ``GNU + Free Documentation License''. + + If you have Invariant Sections, Front-Cover Texts and Back-Cover +Texts, replace the “with...Texts.” line with this: + + with the Invariant Sections being LIST THEIR TITLES, with + the Front-Cover Texts being LIST, and with the Back-Cover Texts + being LIST. + + If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + + If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of free +software license, such as the GNU General Public License, to permit +their use in free software. + + +File: dash.info, Node: GPL, Next: Index, Prev: FDL, Up: Top + +Appendix B GNU General Public License +************************************* + + Version 3, 29 June 2007 + + Copyright © 2007 Free Software Foundation, Inc. <https://fsf.org/> + + Everyone is permitted to copy and distribute verbatim copies of this + license document, but changing it is not allowed. + +Preamble +======== + +The GNU General Public License is a free, copyleft license for software +and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program—to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers’ and authors’ protection, the GPL clearly explains +that there is no warranty for this free software. For both users’ and +authors’ sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users’ freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + +TERMS AND CONDITIONS +==================== + + 0. Definitions. + + “This License” refers to version 3 of the GNU General Public + License. + + “Copyright” also means copyright-like laws that apply to other + kinds of works, such as semiconductor masks. + + “The Program” refers to any copyrightable work licensed under this + License. Each licensee is addressed as “you”. “Licensees” and + “recipients” may be individuals or organizations. + + To “modify” a work means to copy from or adapt all or part of the + work in a fashion requiring copyright permission, other than the + making of an exact copy. The resulting work is called a “modified + version” of the earlier work or a work “based on” the earlier work. + + A “covered work” means either the unmodified Program or a work + based on the Program. + + To “propagate” a work means to do anything with it that, without + permission, would make you directly or secondarily liable for + infringement under applicable copyright law, except executing it on + a computer or modifying a private copy. Propagation includes + copying, distribution (with or without modification), making + available to the public, and in some countries other activities as + well. + + To “convey” a work means any kind of propagation that enables other + parties to make or receive copies. Mere interaction with a user + through a computer network, with no transfer of a copy, is not + conveying. + + An interactive user interface displays “Appropriate Legal Notices” + to the extent that it includes a convenient and prominently visible + feature that (1) displays an appropriate copyright notice, and (2) + tells the user that there is no warranty for the work (except to + the extent that warranties are provided), that licensees may convey + the work under this License, and how to view a copy of this + License. If the interface presents a list of user commands or + options, such as a menu, a prominent item in the list meets this + criterion. + + 1. Source Code. + + The “source code” for a work means the preferred form of the work + for making modifications to it. “Object code” means any non-source + form of a work. + + A “Standard Interface” means an interface that either is an + official standard defined by a recognized standards body, or, in + the case of interfaces specified for a particular programming + language, one that is widely used among developers working in that + language. + + The “System Libraries” of an executable work include anything, + other than the work as a whole, that (a) is included in the normal + form of packaging a Major Component, but which is not part of that + Major Component, and (b) serves only to enable use of the work with + that Major Component, or to implement a Standard Interface for + which an implementation is available to the public in source code + form. A “Major Component”, in this context, means a major + essential component (kernel, window system, and so on) of the + specific operating system (if any) on which the executable work + runs, or a compiler used to produce the work, or an object code + interpreter used to run it. + + The “Corresponding Source” for a work in object code form means all + the source code needed to generate, install, and (for an executable + work) run the object code and to modify the work, including scripts + to control those activities. However, it does not include the + work’s System Libraries, or general-purpose tools or generally + available free programs which are used unmodified in performing + those activities but which are not part of the work. For example, + Corresponding Source includes interface definition files associated + with source files for the work, and the source code for shared + libraries and dynamically linked subprograms that the work is + specifically designed to require, such as by intimate data + communication or control flow between those subprograms and other + parts of the work. + + The Corresponding Source need not include anything that users can + regenerate automatically from other parts of the Corresponding + Source. + + The Corresponding Source for a work in source code form is that + same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of + copyright on the Program, and are irrevocable provided the stated + conditions are met. This License explicitly affirms your unlimited + permission to run the unmodified Program. The output from running + a covered work is covered by this License only if the output, given + its content, constitutes a covered work. This License acknowledges + your rights of fair use or other equivalent, as provided by + copyright law. + + You may make, run and propagate covered works that you do not + convey, without conditions so long as your license otherwise + remains in force. You may convey covered works to others for the + sole purpose of having them make modifications exclusively for you, + or provide you with facilities for running those works, provided + that you comply with the terms of this License in conveying all + material for which you do not control copyright. Those thus making + or running the covered works for you must do so exclusively on your + behalf, under your direction and control, on terms that prohibit + them from making any copies of your copyrighted material outside + their relationship with you. + + Conveying under any other circumstances is permitted solely under + the conditions stated below. Sublicensing is not allowed; section + 10 makes it unnecessary. + + 3. Protecting Users’ Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological + measure under any applicable law fulfilling obligations under + article 11 of the WIPO copyright treaty adopted on 20 December + 1996, or similar laws prohibiting or restricting circumvention of + such measures. + + When you convey a covered work, you waive any legal power to forbid + circumvention of technological measures to the extent such + circumvention is effected by exercising rights under this License + with respect to the covered work, and you disclaim any intention to + limit operation or modification of the work as a means of + enforcing, against the work’s users, your or third parties’ legal + rights to forbid circumvention of technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program’s source code as you + receive it, in any medium, provided that you conspicuously and + appropriately publish on each copy an appropriate copyright notice; + keep intact all notices stating that this License and any + non-permissive terms added in accord with section 7 apply to the + code; keep intact all notices of the absence of any warranty; and + give all recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, + and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to + produce it from the Program, in the form of source code under the + terms of section 4, provided that you also meet all of these + conditions: + + a. The work must carry prominent notices stating that you + modified it, and giving a relevant date. + + b. The work must carry prominent notices stating that it is + released under this License and any conditions added under + section 7. This requirement modifies the requirement in + section 4 to “keep intact all notices”. + + c. You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable + section 7 additional terms, to the whole of the work, and all + its parts, regardless of how they are packaged. This License + gives no permission to license the work in any other way, but + it does not invalidate such permission if you have separately + received it. + + d. If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has + interactive interfaces that do not display Appropriate Legal + Notices, your work need not make them do so. + + A compilation of a covered work with other separate and independent + works, which are not by their nature extensions of the covered + work, and which are not combined with it such as to form a larger + program, in or on a volume of a storage or distribution medium, is + called an “aggregate” if the compilation and its resulting + copyright are not used to limit the access or legal rights of the + compilation’s users beyond what the individual works permit. + Inclusion of a covered work in an aggregate does not cause this + License to apply to the other parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms + of sections 4 and 5, provided that you also convey the + machine-readable Corresponding Source under the terms of this + License, in one of these ways: + + a. Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b. Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that + product model, to give anyone who possesses the object code + either (1) a copy of the Corresponding Source for all the + software in the product that is covered by this License, on a + durable physical medium customarily used for software + interchange, for a price no more than your reasonable cost of + physically performing this conveying of source, or (2) access + to copy the Corresponding Source from a network server at no + charge. + + c. Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, + and only if you received the object code with such an offer, + in accord with subsection 6b. + + d. Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to + the Corresponding Source in the same way through the same + place at no further charge. You need not require recipients + to copy the Corresponding Source along with the object code. + If the place to copy the object code is a network server, the + Corresponding Source may be on a different server (operated by + you or a third party) that supports equivalent copying + facilities, provided you maintain clear directions next to the + object code saying where to find the Corresponding Source. + Regardless of what server hosts the Corresponding Source, you + remain obligated to ensure that it is available for as long as + needed to satisfy these requirements. + + e. Convey the object code using peer-to-peer transmission, + provided you inform other peers where the object code and + Corresponding Source of the work are being offered to the + general public at no charge under subsection 6d. + + A separable portion of the object code, whose source code is + excluded from the Corresponding Source as a System Library, need + not be included in conveying the object code work. + + A “User Product” is either (1) a “consumer product”, which means + any tangible personal property which is normally used for personal, + family, or household purposes, or (2) anything designed or sold for + incorporation into a dwelling. In determining whether a product is + a consumer product, doubtful cases shall be resolved in favor of + coverage. For a particular product received by a particular user, + “normally used” refers to a typical or common use of that class of + product, regardless of the status of the particular user or of the + way in which the particular user actually uses, or expects or is + expected to use, the product. A product is a consumer product + regardless of whether the product has substantial commercial, + industrial or non-consumer uses, unless such uses represent the + only significant mode of use of the product. + + “Installation Information” for a User Product means any methods, + procedures, authorization keys, or other information required to + install and execute modified versions of a covered work in that + User Product from a modified version of its Corresponding Source. + The information must suffice to ensure that the continued + functioning of the modified object code is in no case prevented or + interfered with solely because modification has been made. + + If you convey an object code work under this section in, or with, + or specifically for use in, a User Product, and the conveying + occurs as part of a transaction in which the right of possession + and use of the User Product is transferred to the recipient in + perpetuity or for a fixed term (regardless of how the transaction + is characterized), the Corresponding Source conveyed under this + section must be accompanied by the Installation Information. But + this requirement does not apply if neither you nor any third party + retains the ability to install modified object code on the User + Product (for example, the work has been installed in ROM). + + The requirement to provide Installation Information does not + include a requirement to continue to provide support service, + warranty, or updates for a work that has been modified or installed + by the recipient, or for the User Product in which it has been + modified or installed. Access to a network may be denied when the + modification itself materially and adversely affects the operation + of the network or violates the rules and protocols for + communication across the network. + + Corresponding Source conveyed, and Installation Information + provided, in accord with this section must be in a format that is + publicly documented (and with an implementation available to the + public in source code form), and must require no special password + or key for unpacking, reading or copying. + + 7. Additional Terms. + + “Additional permissions” are terms that supplement the terms of + this License by making exceptions from one or more of its + conditions. Additional permissions that are applicable to the + entire Program shall be treated as though they were included in + this License, to the extent that they are valid under applicable + law. If additional permissions apply only to part of the Program, + that part may be used separately under those permissions, but the + entire Program remains governed by this License without regard to + the additional permissions. + + When you convey a copy of a covered work, you may at your option + remove any additional permissions from that copy, or from any part + of it. (Additional permissions may be written to require their own + removal in certain cases when you modify the work.) You may place + additional permissions on material, added by you to a covered work, + for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material + you add to a covered work, you may (if authorized by the copyright + holders of that material) supplement the terms of this License with + terms: + + a. Disclaiming warranty or limiting liability differently from + the terms of sections 15 and 16 of this License; or + + b. Requiring preservation of specified reasonable legal notices + or author attributions in that material or in the Appropriate + Legal Notices displayed by works containing it; or + + c. Prohibiting misrepresentation of the origin of that material, + or requiring that modified versions of such material be marked + in reasonable ways as different from the original version; or + + d. Limiting the use for publicity purposes of names of licensors + or authors of the material; or + + e. Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f. Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified + versions of it) with contractual assumptions of liability to + the recipient, for any liability that these contractual + assumptions directly impose on those licensors and authors. + + All other non-permissive additional terms are considered “further + restrictions” within the meaning of section 10. If the Program as + you received it, or any part of it, contains a notice stating that + it is governed by this License along with a term that is a further + restriction, you may remove that term. If a license document + contains a further restriction but permits relicensing or conveying + under this License, you may add to a covered work material governed + by the terms of that license document, provided that the further + restriction does not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you + must place, in the relevant source files, a statement of the + additional terms that apply to those files, or a notice indicating + where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in + the form of a separately written license, or stated as exceptions; + the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly + provided under this License. Any attempt otherwise to propagate or + modify it is void, and will automatically terminate your rights + under this License (including any patent licenses granted under the + third paragraph of section 11). + + However, if you cease all violation of this License, then your + license from a particular copyright holder is reinstated (a) + provisionally, unless and until the copyright holder explicitly and + finally terminates your license, and (b) permanently, if the + copyright holder fails to notify you of the violation by some + reasonable means prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is + reinstated permanently if the copyright holder notifies you of the + violation by some reasonable means, this is the first time you have + received notice of violation of this License (for any work) from + that copyright holder, and you cure the violation prior to 30 days + after your receipt of the notice. + + Termination of your rights under this section does not terminate + the licenses of parties who have received copies or rights from you + under this License. If your rights have been terminated and not + permanently reinstated, you do not qualify to receive new licenses + for the same material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or + run a copy of the Program. Ancillary propagation of a covered work + occurring solely as a consequence of using peer-to-peer + transmission to receive a copy likewise does not require + acceptance. However, nothing other than this License grants you + permission to propagate or modify any covered work. These actions + infringe copyright if you do not accept this License. Therefore, + by modifying or propagating a covered work, you indicate your + acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically + receives a license from the original licensors, to run, modify and + propagate that work, subject to this License. You are not + responsible for enforcing compliance by third parties with this + License. + + An “entity transaction” is a transaction transferring control of an + organization, or substantially all assets of one, or subdividing an + organization, or merging organizations. If propagation of a + covered work results from an entity transaction, each party to that + transaction who receives a copy of the work also receives whatever + licenses to the work the party’s predecessor in interest had or + could give under the previous paragraph, plus a right to possession + of the Corresponding Source of the work from the predecessor in + interest, if the predecessor has it or can get it with reasonable + efforts. + + You may not impose any further restrictions on the exercise of the + rights granted or affirmed under this License. For example, you + may not impose a license fee, royalty, or other charge for exercise + of rights granted under this License, and you may not initiate + litigation (including a cross-claim or counterclaim in a lawsuit) + alleging that any patent claim is infringed by making, using, + selling, offering for sale, or importing the Program or any portion + of it. + + 11. Patents. + + A “contributor” is a copyright holder who authorizes use under this + License of the Program or a work on which the Program is based. + The work thus licensed is called the contributor’s “contributor + version”. + + A contributor’s “essential patent claims” are all patent claims + owned or controlled by the contributor, whether already acquired or + hereafter acquired, that would be infringed by some manner, + permitted by this License, of making, using, or selling its + contributor version, but do not include claims that would be + infringed only as a consequence of further modification of the + contributor version. For purposes of this definition, “control” + includes the right to grant patent sublicenses in a manner + consistent with the requirements of this License. + + Each contributor grants you a non-exclusive, worldwide, + royalty-free patent license under the contributor’s essential + patent claims, to make, use, sell, offer for sale, import and + otherwise run, modify and propagate the contents of its contributor + version. + + In the following three paragraphs, a “patent license” is any + express agreement or commitment, however denominated, not to + enforce a patent (such as an express permission to practice a + patent or covenant not to sue for patent infringement). To “grant” + such a patent license to a party means to make such an agreement or + commitment not to enforce a patent against the party. + + If you convey a covered work, knowingly relying on a patent + license, and the Corresponding Source of the work is not available + for anyone to copy, free of charge and under the terms of this + License, through a publicly available network server or other + readily accessible means, then you must either (1) cause the + Corresponding Source to be so available, or (2) arrange to deprive + yourself of the benefit of the patent license for this particular + work, or (3) arrange, in a manner consistent with the requirements + of this License, to extend the patent license to downstream + recipients. “Knowingly relying” means you have actual knowledge + that, but for the patent license, your conveying the covered work + in a country, or your recipient’s use of the covered work in a + country, would infringe one or more identifiable patents in that + country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or + arrangement, you convey, or propagate by procuring conveyance of, a + covered work, and grant a patent license to some of the parties + receiving the covered work authorizing them to use, propagate, + modify or convey a specific copy of the covered work, then the + patent license you grant is automatically extended to all + recipients of the covered work and works based on it. + + A patent license is “discriminatory” if it does not include within + the scope of its coverage, prohibits the exercise of, or is + conditioned on the non-exercise of one or more of the rights that + are specifically granted under this License. You may not convey a + covered work if you are a party to an arrangement with a third + party that is in the business of distributing software, under which + you make payment to the third party based on the extent of your + activity of conveying the work, and under which the third party + grants, to any of the parties who would receive the covered work + from you, a discriminatory patent license (a) in connection with + copies of the covered work conveyed by you (or copies made from + those copies), or (b) primarily for and in connection with specific + products or compilations that contain the covered work, unless you + entered into that arrangement, or that patent license was granted, + prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting + any implied license or other defenses to infringement that may + otherwise be available to you under applicable patent law. + + 12. No Surrender of Others’ Freedom. + + If conditions are imposed on you (whether by court order, agreement + or otherwise) that contradict the conditions of this License, they + do not excuse you from the conditions of this License. If you + cannot convey a covered work so as to satisfy simultaneously your + obligations under this License and any other pertinent obligations, + then as a consequence you may not convey it at all. For example, + if you agree to terms that obligate you to collect a royalty for + further conveying from those to whom you convey the Program, the + only way you could satisfy both those terms and this License would + be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have + permission to link or combine any covered work with a work licensed + under version 3 of the GNU Affero General Public License into a + single combined work, and to convey the resulting work. The terms + of this License will continue to apply to the part which is the + covered work, but the special requirements of the GNU Affero + General Public License, section 13, concerning interaction through + a network will apply to the combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new + versions of the GNU General Public License from time to time. Such + new versions will be similar in spirit to the present version, but + may differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the + Program specifies that a certain numbered version of the GNU + General Public License “or any later version” applies to it, you + have the option of following the terms and conditions either of + that numbered version or of any later version published by the Free + Software Foundation. If the Program does not specify a version + number of the GNU General Public License, you may choose any + version ever published by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future + versions of the GNU General Public License can be used, that + proxy’s public statement of acceptance of a version permanently + authorizes you to choose that version for the Program. + + Later license versions may give you additional or different + permissions. However, no additional obligations are imposed on any + author or copyright holder as a result of your choosing to follow a + later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY + APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE + COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” + WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE + RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. + SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL + NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN + WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES + AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR + DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR + CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE + THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA + BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD + PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER + PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF + THE POSSIBILITY OF SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided + above cannot be given local legal effect according to their terms, + reviewing courts shall apply local law that most closely + approximates an absolute waiver of all civil liability in + connection with the Program, unless a warranty or assumption of + liability accompanies a copy of the Program in return for a fee. + +END OF TERMS AND CONDITIONS +=========================== + +How to Apply These Terms to Your New Programs +============================================= + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these +terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least the +“copyright” line and a pointer to where the full notice is found. + + ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES. + Copyright (C) YEAR NAME OF AUTHOR + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or (at + your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <https://www.gnu.org/licenses/>. + + Also add information on how to contact you by electronic and paper +mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + PROGRAM Copyright (C) YEAR NAME OF AUTHOR + This program comes with ABSOLUTELY NO WARRANTY; for details type ‘show w’. + This is free software, and you are welcome to redistribute it + under certain conditions; type ‘show c’ for details. + + The hypothetical commands ‘show w’ and ‘show c’ should show the +appropriate parts of the General Public License. Of course, your +program’s commands might be different; for a GUI interface, you would +use an “about box”. + + You should also get your employer (if you work as a programmer) or +school, if any, to sign a “copyright disclaimer” for the program, if +necessary. For more information on this, and how to apply and follow +the GNU GPL, see <https://www.gnu.org/licenses/>. + + The GNU General Public License does not permit incorporating your +program into proprietary programs. If your program is a subroutine +library, you may consider it more useful to permit linking proprietary +applications with the library. If this is what you want to do, use the +GNU Lesser General Public License instead of this License. But first, +please read <https://www.gnu.org/licenses/why-not-lgpl.html>. + + +File: dash.info, Node: Index, Prev: GPL, Up: Top + +Index +***** + +�[index�] +* Menu: + +* !cdr: Destructive operations. + (line 16) +* !cons: Destructive operations. + (line 8) +* -->: Threading macros. (line 35) +* ->: Threading macros. (line 9) +* ->>: Threading macros. (line 22) +* -all?: Predicates. (line 20) +* -andfn: Function combinators. + (line 147) +* -annotate: Maps. (line 84) +* -any?: Predicates. (line 8) +* -applify: Function combinators. + (line 63) +* -as->: Threading macros. (line 49) +* -butlast: Other list operations. + (line 350) +* -clone: Tree operations. (line 122) +* -common-prefix: Reductions. (line 242) +* -common-suffix: Reductions. (line 252) +* -compose: Function combinators. + (line 49) +* -concat: List to list. (line 23) +* -cons*: Other list operations. + (line 30) +* -cons-pair?: Predicates. (line 126) +* -const: Function combinators. + (line 101) +* -contains?: Predicates. (line 59) +* -copy: Maps. (line 139) +* -count: Reductions. (line 172) +* -cut: Function combinators. + (line 113) +* -cycle: Other list operations. + (line 180) +* -difference: Set operations. (line 20) +* -distinct: Set operations. (line 62) +* -dotimes: Side effects. (line 80) +* -doto: Threading macros. (line 99) +* -drop: Sublist selection. (line 147) +* -drop-last: Sublist selection. (line 161) +* -drop-while: Sublist selection. (line 192) +* -each: Side effects. (line 8) +* -each-indexed: Side effects. (line 38) +* -each-r: Side effects. (line 52) +* -each-r-while: Side effects. (line 65) +* -each-while: Side effects. (line 24) +* -elem-index: Indexing. (line 9) +* -elem-indices: Indexing. (line 21) +* -fifth-item: Other list operations. + (line 330) +* -filter: Sublist selection. (line 8) +* -find-index: Indexing. (line 32) +* -find-indices: Indexing. (line 60) +* -find-last-index: Indexing. (line 46) +* -first: Other list operations. + (line 246) +* -first-item: Other list operations. + (line 287) +* -fix: Other list operations. + (line 390) +* -fixfn: Function combinators. + (line 184) +* -flatten: List to list. (line 34) +* -flatten-n: List to list. (line 56) +* -flip: Function combinators. + (line 89) +* -fourth-item: Other list operations. + (line 320) +* -grade-down: Indexing. (line 81) +* -grade-up: Indexing. (line 71) +* -group-by: Partitioning. (line 194) +* -if-let: Binding. (line 34) +* -if-let*: Binding. (line 45) +* -inits: Reductions. (line 222) +* -insert-at: List to list. (line 110) +* -interleave: Other list operations. + (line 67) +* -interpose: Other list operations. + (line 57) +* -intersection: Set operations. (line 32) +* -iota: Other list operations. + (line 78) +* -is-infix?: Predicates. (line 112) +* -is-prefix?: Predicates. (line 88) +* -is-suffix?: Predicates. (line 100) +* -iterate: Unfolding. (line 9) +* -iteratefn: Function combinators. + (line 161) +* -juxt: Function combinators. + (line 37) +* -keep: List to list. (line 8) +* -lambda: Binding. (line 247) +* -last: Other list operations. + (line 277) +* -last-item: Other list operations. + (line 340) +* -let: Binding. (line 61) +* -let*: Binding. (line 227) +* -list: Other list operations. + (line 373) +* -map: Maps. (line 10) +* -map-first: Maps. (line 38) +* -map-indexed: Maps. (line 66) +* -map-last: Maps. (line 52) +* -map-when: Maps. (line 22) +* -mapcat: Maps. (line 128) +* -max: Reductions. (line 286) +* -max-by: Reductions. (line 296) +* -min: Reductions. (line 262) +* -min-by: Reductions. (line 272) +* -non-nil: Sublist selection. (line 94) +* -none?: Predicates. (line 32) +* -not: Function combinators. + (line 126) +* -on: Function combinators. + (line 75) +* -only-some?: Predicates. (line 44) +* -orfn: Function combinators. + (line 135) +* -pad: Other list operations. + (line 191) +* -partial: Function combinators. + (line 8) +* -partition: Partitioning. (line 80) +* -partition-after-item: Partitioning. (line 184) +* -partition-after-pred: Partitioning. (line 151) +* -partition-all: Partitioning. (line 92) +* -partition-all-in-steps: Partitioning. (line 115) +* -partition-before-item: Partitioning. (line 174) +* -partition-before-pred: Partitioning. (line 163) +* -partition-by: Partitioning. (line 127) +* -partition-by-header: Partitioning. (line 138) +* -partition-in-steps: Partitioning. (line 103) +* -permutations: Set operations. (line 52) +* -powerset: Set operations. (line 44) +* -prodfn: Function combinators. + (line 218) +* -product: Reductions. (line 201) +* -reduce: Reductions. (line 53) +* -reduce-from: Reductions. (line 8) +* -reduce-r: Reductions. (line 72) +* -reduce-r-from: Reductions. (line 26) +* -reductions: Reductions. (line 136) +* -reductions-from: Reductions. (line 100) +* -reductions-r: Reductions. (line 154) +* -reductions-r-from: Reductions. (line 118) +* -remove: Sublist selection. (line 26) +* -remove-at: List to list. (line 146) +* -remove-at-indices: List to list. (line 159) +* -remove-first: Sublist selection. (line 43) +* -remove-item: Sublist selection. (line 83) +* -remove-last: Sublist selection. (line 64) +* -repeat: Other list operations. + (line 19) +* -replace: List to list. (line 68) +* -replace-at: List to list. (line 121) +* -replace-first: List to list. (line 82) +* -replace-last: List to list. (line 96) +* -rotate: Other list operations. + (line 8) +* -rpartial: Function combinators. + (line 22) +* -running-product: Reductions. (line 211) +* -running-sum: Reductions. (line 190) +* -same-items?: Predicates. (line 74) +* -second-item: Other list operations. + (line 300) +* -select-by-indices: Sublist selection. (line 208) +* -select-column: Sublist selection. (line 238) +* -select-columns: Sublist selection. (line 219) +* -separate: Partitioning. (line 69) +* -setq: Binding. (line 270) +* -slice: Sublist selection. (line 104) +* -snoc: Other list operations. + (line 43) +* -some: Other list operations. + (line 262) +* -some-->: Threading macros. (line 86) +* -some->: Threading macros. (line 62) +* -some->>: Threading macros. (line 74) +* -sort: Other list operations. + (line 360) +* -splice: Maps. (line 95) +* -splice-list: Maps. (line 115) +* -split-at: Partitioning. (line 8) +* -split-on: Partitioning. (line 34) +* -split-when: Partitioning. (line 52) +* -split-with: Partitioning. (line 23) +* -sum: Reductions. (line 180) +* -table: Other list operations. + (line 202) +* -table-flat: Other list operations. + (line 221) +* -tails: Reductions. (line 232) +* -take: Sublist selection. (line 120) +* -take-last: Sublist selection. (line 133) +* -take-while: Sublist selection. (line 175) +* -third-item: Other list operations. + (line 310) +* -tree-map: Tree operations. (line 28) +* -tree-map-nodes: Tree operations. (line 39) +* -tree-mapreduce: Tree operations. (line 84) +* -tree-mapreduce-from: Tree operations. (line 103) +* -tree-reduce: Tree operations. (line 52) +* -tree-reduce-from: Tree operations. (line 69) +* -tree-seq: Tree operations. (line 8) +* -unfold: Unfolding. (line 25) +* -union: Set operations. (line 8) +* -unzip: Other list operations. + (line 158) +* -update-at: List to list. (line 133) +* -when-let: Binding. (line 9) +* -when-let*: Binding. (line 21) +* -zip: Other list operations. + (line 107) +* -zip-fill: Other list operations. + (line 150) +* -zip-lists: Other list operations. + (line 131) +* -zip-with: Other list operations. + (line 91) +* dash-fontify-mode: Fontification of special variables. + (line 6) +* dash-register-info-lookup: Info symbol lookup. (line 6) +* global-dash-fontify-mode: Fontification of special variables. + (line 12) + + + +Tag Table: +Node: Top742 +Node: Installation2397 +Node: Using in a package3159 +Node: Fontification of special variables3504 +Node: Info symbol lookup4294 +Node: Functions4877 +Node: Maps6361 +Ref: -map6658 +Ref: -map-when7031 +Ref: -map-first7606 +Ref: -map-last8081 +Ref: -map-indexed8551 +Ref: -annotate9237 +Ref: -splice9724 +Ref: -splice-list10502 +Ref: -mapcat10961 +Ref: -copy11334 +Node: Sublist selection11522 +Ref: -filter11715 +Ref: -remove12262 +Ref: -remove-first12800 +Ref: -remove-last13642 +Ref: -remove-item14367 +Ref: -non-nil14767 +Ref: -slice15043 +Ref: -take15572 +Ref: -take-last15979 +Ref: -drop16410 +Ref: -drop-last16851 +Ref: -take-while17277 +Ref: -drop-while17892 +Ref: -select-by-indices18508 +Ref: -select-columns19019 +Ref: -select-column19722 +Node: List to list20185 +Ref: -keep20377 +Ref: -concat20941 +Ref: -flatten21235 +Ref: -flatten-n21991 +Ref: -replace22375 +Ref: -replace-first22836 +Ref: -replace-last23331 +Ref: -insert-at23819 +Ref: -replace-at24144 +Ref: -update-at24531 +Ref: -remove-at25019 +Ref: -remove-at-indices25504 +Node: Reductions26083 +Ref: -reduce-from26279 +Ref: -reduce-r-from27003 +Ref: -reduce28266 +Ref: -reduce-r29017 +Ref: -reductions-from30295 +Ref: -reductions-r-from31101 +Ref: -reductions31931 +Ref: -reductions-r32642 +Ref: -count33387 +Ref: -sum33611 +Ref: -running-sum33799 +Ref: -product34120 +Ref: -running-product34328 +Ref: -inits34669 +Ref: -tails34914 +Ref: -common-prefix35158 +Ref: -common-suffix35452 +Ref: -min35746 +Ref: -min-by35972 +Ref: -max36493 +Ref: -max-by36718 +Node: Unfolding37244 +Ref: -iterate37485 +Ref: -unfold37932 +Node: Predicates38737 +Ref: -any?38914 +Ref: -all?39234 +Ref: -none?39564 +Ref: -only-some?39866 +Ref: -contains?40351 +Ref: -same-items?40740 +Ref: -is-prefix?41125 +Ref: -is-suffix?41451 +Ref: -is-infix?41777 +Ref: -cons-pair?42131 +Node: Partitioning42456 +Ref: -split-at42644 +Ref: -split-with43308 +Ref: -split-on43708 +Ref: -split-when44381 +Ref: -separate45018 +Ref: -partition45457 +Ref: -partition-all45906 +Ref: -partition-in-steps46331 +Ref: -partition-all-in-steps46825 +Ref: -partition-by47307 +Ref: -partition-by-header47685 +Ref: -partition-after-pred48286 +Ref: -partition-before-pred48733 +Ref: -partition-before-item49118 +Ref: -partition-after-item49425 +Ref: -group-by49727 +Node: Indexing50160 +Ref: -elem-index50362 +Ref: -elem-indices50757 +Ref: -find-index51137 +Ref: -find-last-index51626 +Ref: -find-indices52130 +Ref: -grade-up52535 +Ref: -grade-down52942 +Node: Set operations53356 +Ref: -union53539 +Ref: -difference53977 +Ref: -intersection54389 +Ref: -powerset54821 +Ref: -permutations55031 +Ref: -distinct55327 +Node: Other list operations55701 +Ref: -rotate55926 +Ref: -repeat56293 +Ref: -cons*56572 +Ref: -snoc56988 +Ref: -interpose57398 +Ref: -interleave57692 +Ref: -iota58058 +Ref: -zip-with58541 +Ref: -zip59255 +Ref: -zip-lists60084 +Ref: -zip-fill60782 +Ref: -unzip61104 +Ref: -cycle61846 +Ref: -pad62245 +Ref: -table62564 +Ref: -table-flat63350 +Ref: -first64355 +Ref: -some64841 +Ref: -last65325 +Ref: -first-item65659 +Ref: -second-item66058 +Ref: -third-item66322 +Ref: -fourth-item66584 +Ref: -fifth-item66850 +Ref: -last-item67112 +Ref: -butlast67403 +Ref: -sort67648 +Ref: -list68134 +Ref: -fix68703 +Node: Tree operations69192 +Ref: -tree-seq69388 +Ref: -tree-map70243 +Ref: -tree-map-nodes70683 +Ref: -tree-reduce71530 +Ref: -tree-reduce-from72412 +Ref: -tree-mapreduce73012 +Ref: -tree-mapreduce-from73871 +Ref: -clone75156 +Node: Threading macros75483 +Ref: ->75708 +Ref: ->>76196 +Ref: -->76699 +Ref: -as->77255 +Ref: -some->77709 +Ref: -some->>78082 +Ref: -some-->78517 +Ref: -doto79066 +Node: Binding79619 +Ref: -when-let79826 +Ref: -when-let*80281 +Ref: -if-let80804 +Ref: -if-let*81164 +Ref: -let81781 +Ref: -let*87853 +Ref: -lambda88790 +Ref: -setq89596 +Node: Side effects90397 +Ref: -each90591 +Ref: -each-while91112 +Ref: -each-indexed91714 +Ref: -each-r92300 +Ref: -each-r-while92736 +Ref: -dotimes93362 +Node: Destructive operations93915 +Ref: !cons94133 +Ref: !cdr94337 +Node: Function combinators94530 +Ref: -partial94734 +Ref: -rpartial95252 +Ref: -juxt95900 +Ref: -compose96352 +Ref: -applify96959 +Ref: -on97389 +Ref: -flip97913 +Ref: -const98224 +Ref: -cut98562 +Ref: -not99042 +Ref: -orfn99351 +Ref: -andfn99784 +Ref: -iteratefn100278 +Ref: -fixfn100980 +Ref: -prodfn102536 +Node: Development103594 +Node: Contribute103883 +Node: Contributors104895 +Node: FDL106988 +Node: GPL132308 +Node: Index170057 + +End Tag Table + + +Local Variables: +coding: utf-8 +End: diff --git a/.emacs.d/elpa/dash-20210609.1330/dir b/.emacs.d/elpa/dash-20210609.1330/dir new file mode 100644 index 0000000..7d473f4 --- /dev/null +++ b/.emacs.d/elpa/dash-20210609.1330/dir @@ -0,0 +1,18 @@ +This is the file .../info/dir, which contains the +topmost node of the Info hierarchy, called (dir)Top. +The first time you invoke Info you start off looking at this node. + +File: dir, Node: Top This is the top of the INFO tree + + This (the Directory node) gives a menu of major topics. + Typing "q" exits, "H" lists all Info commands, "d" returns here, + "h" gives a primer for first-timers, + "mEmacs<Return>" visits the Emacs manual, etc. + + In Emacs, you can click mouse button 2 on a menu item or cross reference + to select it. + +* Menu: + +Emacs +* Dash: (dash.info). A modern list library for GNU Emacs. diff --git a/.emacs.d/elpa/dashboard-20210427.705/banners/1.txt b/.emacs.d/elpa/dashboard-20210427.705/banners/1.txt new file mode 100644 index 0000000..8bd71a7 --- /dev/null +++ b/.emacs.d/elpa/dashboard-20210427.705/banners/1.txt @@ -0,0 +1,8 @@ + +######## ## ## ### ###### ###### +## ### ### ## ## ## ## ## ## +## #### #### ## ## ## ## +###### ## ### ## ## ## ## ###### +## ## ## ######### ## ## +## ## ## ## ## ## ## ## ## +######## ## ## ## ## ###### ###### diff --git a/.emacs.d/elpa/dashboard-20210427.705/banners/2.txt b/.emacs.d/elpa/dashboard-20210427.705/banners/2.txt new file mode 100644 index 0000000..73b761b --- /dev/null +++ b/.emacs.d/elpa/dashboard-20210427.705/banners/2.txt @@ -0,0 +1,6 @@ + _______ .___ ___. ___ ______ _______. +| ____|| \/ | / \ / | / | +| |__ | \ / | / ^ \ | ,----' | (----` +| __| | |\/| | / /_\ \ | | \ \ +| |____ | | | | / _____ \ | `----.----) | +|_______||__| |__| /__/ \__\ \______|_______/ diff --git a/.emacs.d/elpa/dashboard-20210427.705/banners/3.txt b/.emacs.d/elpa/dashboard-20210427.705/banners/3.txt new file mode 100644 index 0000000..3abfd82 --- /dev/null +++ b/.emacs.d/elpa/dashboard-20210427.705/banners/3.txt @@ -0,0 +1,8 @@ + _______ _____ ______ ________ ________ ________ +|\ ___ \ |\ _ \ _ \|\ __ \|\ ____\|\ ____\ +\ \ __/|\ \ \\\__\ \ \ \ \|\ \ \ \___|\ \ \___|_ + \ \ \_|/_\ \ \\|__| \ \ \ __ \ \ \ \ \_____ \ + \ \ \_|\ \ \ \ \ \ \ \ \ \ \ \ \____\|____|\ \ + \ \_______\ \__\ \ \__\ \__\ \__\ \_______\____\_\ \ + \|_______|\|__| \|__|\|__|\|__|\|_______|\_________\ + \|_________| diff --git a/.emacs.d/elpa/dashboard-20210427.705/banners/emacs.png b/.emacs.d/elpa/dashboard-20210427.705/banners/emacs.png new file mode 100644 index 0000000..718b071 Binary files /dev/null and b/.emacs.d/elpa/dashboard-20210427.705/banners/emacs.png differ diff --git a/.emacs.d/elpa/dashboard-20210427.705/banners/logo.png b/.emacs.d/elpa/dashboard-20210427.705/banners/logo.png new file mode 100644 index 0000000..c9de00c Binary files /dev/null and b/.emacs.d/elpa/dashboard-20210427.705/banners/logo.png differ diff --git a/.emacs.d/elpa/dashboard-20210427.705/dashboard-autoloads.el b/.emacs.d/elpa/dashboard-20210427.705/dashboard-autoloads.el new file mode 100644 index 0000000..dadde4c --- /dev/null +++ b/.emacs.d/elpa/dashboard-20210427.705/dashboard-autoloads.el @@ -0,0 +1,39 @@ +;;; dashboard-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "dashboard" "dashboard.el" (0 0 0 0)) +;;; Generated autoloads from dashboard.el + +(autoload 'dashboard-setup-startup-hook "dashboard" "\ +Setup post initialization hooks. +If a command line argument is provided, +assume a filename and skip displaying Dashboard." nil nil) + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "dashboard" '("dashboard-"))) + +;;;*** + +;;;### (autoloads nil "dashboard-widgets" "dashboard-widgets.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from dashboard-widgets.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "dashboard-widgets" '("dashboard-" "org-" "recentf-list"))) + +;;;*** + +;;;### (autoloads nil nil ("dashboard-pkg.el") (0 0 0 0)) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; dashboard-autoloads.el ends here diff --git a/.emacs.d/elpa/dashboard-20210427.705/dashboard-pkg.el b/.emacs.d/elpa/dashboard-20210427.705/dashboard-pkg.el new file mode 100644 index 0000000..2022612 --- /dev/null +++ b/.emacs.d/elpa/dashboard-20210427.705/dashboard-pkg.el @@ -0,0 +1,13 @@ +(define-package "dashboard" "20210427.705" "A startup screen extracted from Spacemacs" + '((emacs "25.3") + (page-break-lines "0.11")) + :commit "9983aa0838ce5a2219ef4b674e6b37de41b5b585" :authors + '(("Rakan Al-Hneiti")) + :maintainer + '("Rakan Al-Hneiti") + :keywords + '("startup" "screen" "tools" "dashboard") + :url "https://github.com/emacs-dashboard/emacs-dashboard") +;; Local Variables: +;; no-byte-compile: t +;; End: diff --git a/.emacs.d/elpa/dashboard-20210427.705/dashboard-widgets.el b/.emacs.d/elpa/dashboard-20210427.705/dashboard-widgets.el new file mode 100644 index 0000000..ecea505 --- /dev/null +++ b/.emacs.d/elpa/dashboard-20210427.705/dashboard-widgets.el @@ -0,0 +1,1150 @@ +;;; dashboard-widgets.el --- A startup screen extracted from Spacemacs -*- lexical-binding: t -*- + +;; Copyright (c) 2016-2020 Rakan Al-Hneiti <rakan.alhneiti@gmail.com> +;; Copyright (c) 2019-2021 Jesús Martínez <jesusmartinez93@gmail.com> +;; Copyright (c) 2020-2021 Shen, Jen-Chieh <jcs090218@gmail.com> +;; +;; Author: Rakan Al-Hneiti +;; URL: https://github.com/emacs-dashboard/emacs-dashboard +;; +;; This file is not part of GNU Emacs. +;; +;;; License: GPLv3 +;; +;; Created: October 05, 2016 +;; Package-Version: 1.8.0-SNAPSHOT +;; Keywords: startup, screen, tools, dashboard +;; Package-Requires: ((emacs "25.3") (page-break-lines "0.11")) +;;; Commentary: + +;; An extensible Emacs dashboard, with sections for +;; bookmarks, projects (projectile or project.el), org-agenda and more. + +;;; Code: + +(require 'cl-lib) +(require 'subr-x) + +;; Compiler pacifier +(declare-function all-the-icons-icon-for-dir "ext:all-the-icons.el") +(declare-function all-the-icons-icon-for-file "ext:all-the-icons.el") +(declare-function all-the-icons-fileicon "ext:data-fileicons.el") +(declare-function all-the-icons-octicon "ext:data-octicons.el") +(declare-function bookmark-get-filename "ext:bookmark.el") +(declare-function bookmark-all-names "ext:bookmark.el") +(declare-function calendar-date-compare "ext:calendar.el") +(declare-function projectile-cleanup-known-projects "ext:projectile.el") +(declare-function projectile-load-known-projects "ext:projectile.el") +(declare-function projectile-mode "ext:projectile.el") +(declare-function projectile-relevant-known-projects "ext:projectile.el") +;;; project.el in Emacs 26 does not contain this function +(declare-function project-known-project-roots "ext:project.el" nil t) +(declare-function org-agenda-format-item "ext:org-agenda.el") +(declare-function org-compile-prefix-format "ext:org-agenda.el") +(declare-function org-entry-is-done-p "ext:org.el") +(declare-function org-get-category "ext:org.el") +(declare-function org-get-deadline-time "ext:org.el") +(declare-function org-get-heading "ext:org.el") +(declare-function org-get-scheduled-time "ext:org.el") +(declare-function org-get-tags "ext:org.el") +(declare-function org-map-entries "ext:org.el") +(declare-function org-outline-level "ext:org.el") +(declare-function org-today "ext:org.el") +(declare-function org-get-todo-face "ext:org.el") +(declare-function org-get-todo-state "ext:org.el") +(declare-function org-entry-is-todo-p "ext:org.el") +(declare-function org-release-buffers "ext:org.el") +(defalias 'org-time-less-p 'time-less-p) +(defvar org-level-faces "ext:org-faces.el") +(defvar org-agenda-new-buffers "ext:org.el") +(defvar all-the-icons-dir-icon-alist) +(defvar package-activated-list) + +(defcustom dashboard-page-separator "\n\f\n" + "Separator to use between the different pages." + :type 'string + :group 'dashboard) + +(defcustom dashboard-image-banner-max-height 0 + "Maximum height of banner image. + +This setting applies only if Emacs supports image transforms or +compiled with Imagemagick support. When value is non-zero the image +banner will be resized to the specified height in pixels, with aspect +ratio preserved." + :type 'integer + :group 'dashboard) + +(defcustom dashboard-image-banner-max-width 0 + "Maximum width of banner image. + +This setting applies if Emacs supports image transforms or compiled +with Imagemagick support. When value is non-zero the image banner +will be resized to the specified width in pixels, with aspect ratio +preserved." + :type 'integer + :group 'dashboard) + +(defcustom dashboard-set-heading-icons nil + "When non nil, heading sections will have icons." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-set-file-icons nil + "When non nil, file lists will have icons." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-set-navigator nil + "When non nil, a navigator will be displayed under the banner." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-set-init-info t + "When non nil, init info will be displayed under the banner." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-set-footer t + "When non nil, a footer will be displayed at the bottom." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-footer-messages + '("The one true editor, Emacs!" + "Who the hell uses VIM anyway? Go Evil!" + "Free as free speech, free as free Beer" + "Happy coding!" + "Vi Vi Vi, the editor of the beast" + "Welcome to the church of Emacs" + "While any text editor can save your files, only Emacs can save your soul" + "I showed you my source code, pls respond") + "A list of messages, one of which dashboard chooses to display." + :type 'list + :group 'dashboard) + +(defcustom dashboard-show-shortcuts t + "Whether to show shortcut keys for each section." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-org-agenda-categories nil + "Specify the Categories to consider when using agenda in dashboard. +Example: +'(\"Tasks\" \"Habits\")" + :type 'list + :group 'dashboard) + +(defconst dashboard-banners-directory + (concat (file-name-directory (locate-library "dashboard")) "/banners/") + "Default banner directory.") + +(defconst dashboard-banner-official-png + (expand-file-name (concat dashboard-banners-directory "emacs.png")) + "Emacs banner image.") + +(defconst dashboard-banner-logo-png + (expand-file-name (concat dashboard-banners-directory "logo.png")) + "Emacs banner image.") + +(defconst dashboard-banner-length 75 + "Width of a banner.") + +(defcustom dashboard-banner-logo-title "Welcome to Emacs!" + "Specify the startup banner." + :type 'string + :group 'dashboard) + +(defcustom dashboard-navigator-buttons nil + "Specify the navigator buttons. +The format is: 'icon title help action face prefix suffix'. + +Example: +'((\"☆\" \"Star\" \"Show stars\" (lambda (&rest _) (show-stars)) 'warning \"[\" \"]\"))" + :type '(repeat (repeat (list string string string function symbol string string))) + :group 'dashboard) + +(defcustom dashboard-init-info + (let ((package-count 0) (time (emacs-init-time))) + (when (bound-and-true-p package-alist) + (setq package-count (length package-activated-list))) + (when (boundp 'straight--profile-cache) + (setq package-count (+ (hash-table-size straight--profile-cache) package-count))) + (if (zerop package-count) + (format "Emacs started in %s" time) + (format "%d packages loaded in %s" package-count time))) + "Init info with packages loaded and init time." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-footer + (nth (random (1- (1+ (length dashboard-footer-messages)))) dashboard-footer-messages) + "A footer with some short message." + :type 'string + :group 'dashboard) + +(defcustom dashboard-footer-icon + (if (and (display-graphic-p) + (or (fboundp 'all-the-icons-fileicon) + (require 'all-the-icons nil 'noerror))) + (all-the-icons-fileicon "emacs" + :height 1.1 + :v-adjust -0.05 + :face 'font-lock-keyword-face) + (propertize ">" 'face 'dashboard-footer)) + "Footer's icon." + :type 'string + :group 'dashboard) + +(defcustom dashboard-startup-banner 'official + "Specify the startup banner. +Default value is `official', it displays +the Emacs logo. `logo' displays Emacs alternative logo. +An integer value is the index of text +banner. A string value must be a path to a .PNG or .TXT file. +If the value is nil then no banner is displayed." + :type '(choice (const :tag "offical" official) + (const :tag "logo" logo) + (string :tag "a png or txt path")) + :group 'dashboard) + +(defcustom dashboard-buffer-last-width nil + "Previous width of dashboard-buffer." + :type 'integer + :group 'dashboard) + +(defcustom dashboard-item-generators + '((recents . dashboard-insert-recents) + (bookmarks . dashboard-insert-bookmarks) + (projects . dashboard-insert-projects) + (agenda . dashboard-insert-agenda) + (registers . dashboard-insert-registers)) + "Association list of items to how to generate in the startup buffer. +Will be of the form `(list-type . list-function)'. +Possible values for list-type are: `recents', `bookmarks', `projects', +`agenda' ,`registers'." + :type '(repeat (alist :key-type symbol :value-type function)) + :group 'dashboard) + +(defcustom dashboard-projects-backend 'projectile + "The package that supplies the list of recent projects. +With the value `projectile', the projects widget uses the package +projectile (available in MELPA). With the value `project-el', +the widget uses the package project (available in GNU ELPA). + +To activate the projects widget, add e.g. `(projects . 10)' to +`dashboard-items' after making sure the necessary package is +installed." + :type '(choice (const :tag "Use projectile" projectile) + (const :tag "Use project.el" project-el)) + :group 'dashboard) + +(defcustom dashboard-items '((recents . 5) + (bookmarks . 5) + (agenda . 5)) + "Association list of items to show in the startup buffer. +Will be of the form `(list-type . list-size)'. +If nil it is disabled. Possible values for list-type are: +`recents' `bookmarks' `projects' `agenda' `registers'." + :type '(repeat (alist :key-type symbol :value-type integer)) + :group 'dashboard) + +(defcustom dashboard-item-shortcuts '((recents . "r") + (bookmarks . "m") + (projects . "p") + (agenda . "a") + (registers . "e")) + "Association list of items and their corresponding shortcuts. +Will be of the form `(list-type . keys)' as understood by +`(kbd keys)'. If nil, shortcuts are disabled. If an entry's +value is nil, that item's shortcut is disbaled. See +`dashboard-items' for possible values of list-type.'" + :type '(repeat (alist :key-type symbol :value-type string)) + :group 'dashboard) + +(defcustom dashboard-items-default-length 20 + "Length used for startup lists with otherwise unspecified bounds. +Set to nil for unbounded." + :type 'integer + :group 'dashboard) + +(defcustom dashboard-heading-icons '((recents . "history") + (bookmarks . "bookmark") + (agenda . "calendar") + (projects . "rocket") + (registers . "database")) + "Association list for the icons of the heading sections. +Will be of the form `(list-type . icon-name-string)`. +If nil it is disabled. Possible values for list-type are: +`recents' `bookmarks' `projects' `agenda' `registers'" + :type '(repeat (alist :key-type symbol :value-type string)) + :group 'dashboard) + +(defcustom dashboard-path-style nil + "Style to display path." + :type '(choice + (const :tag "No specify" nil) + (const :tag "Truncate the beginning part of the path" truncate-beginning) + (const :tag "Truncate the middle part of the path" truncate-middle) + (const :tag "Truncate the end part of the path" truncate-end)) + :group 'dashboard) + +(defcustom dashboard-path-max-length 70 + "Maximum length for path to display." + :type 'integer + :group 'dashboard) + +(defcustom dashboard-path-shorten-string "..." + "String the that displays in the center of the path." + :type 'string + :group 'dashboard) + +(defvar recentf-list nil) + +(defvar dashboard-buffer-name) + +;; +;; Faces +;; +(defface dashboard-text-banner + '((t (:inherit font-lock-keyword-face))) + "Face used for text banners." + :group 'dashboard) + +(defface dashboard-banner-logo-title + '((t :inherit default)) + "Face used for the banner title." + :group 'dashboard) + +(defface dashboard-navigator + '((t (:inherit font-lock-keyword-face))) + "Face used for the navigator." + :group 'dashboard) + +(defface dashboard-heading + '((t (:inherit font-lock-keyword-face))) + "Face used for widget headings." + :group 'dashboard) + +(defface dashboard-items-face + '((t (:inherit widget-button))) + "Face used for items." + :group 'dashboard) + +(defface dashboard-no-items-face + '((t (:inherit widget-button))) + "Face used for no items." + :group 'dashboard) + +(defface dashboard-footer + '((t (:inherit font-lock-doc-face))) + "Face used for widget headings." + :group 'dashboard) + +(define-obsolete-face-alias + 'dashboard-text-banner-face 'dashboard-text-banner "1.2.6") +(define-obsolete-face-alias + 'dashboard-banner-logo-title-face 'dashboard-banner-logo-title "1.2.6") +(define-obsolete-face-alias + 'dashboard-heading-face 'dashboard-heading "1.2.6") + +;; +;; Generic widget helpers +;; +(defun dashboard-subseq (seq start end) + "Return the subsequence of SEQ from START to END.. +Uses `cl-subseq`, but accounts for end points greater than the size of the list. +Return entire list if `END' is omitted." + (let ((len (length seq))) + (cl-subseq seq start (and (number-or-marker-p end) + (min len end))))) + +(defun dashboard-get-shortcut (item) + "Get the shortcut to be used for ITEM." + (let ((elem (assq item dashboard-item-shortcuts))) + (and elem (cdr elem)))) + +(defmacro dashboard-insert-shortcut (shortcut-char + search-label + &optional no-next-line) + "Insert a shortcut SHORTCUT-CHAR for a given SEARCH-LABEL. +Optionally, provide NO-NEXT-LINE to move the cursor forward a line." + (let* (;; Ensure punctuation and upper case in search string is not + ;; used to construct the `defun' + (name (downcase (replace-regexp-in-string + "[[:punct:]]+" "" (format "%s" search-label) nil nil nil))) + ;; Ensure whitespace in e.g. "recent files" is replaced with dashes. + (sym (intern (format "dashboard-jump-to-%s" (replace-regexp-in-string + "[[:blank:]]+" "-" name nil nil nil))))) + `(progn + (eval-when-compile (defvar dashboard-mode-map)) + (defun ,sym nil + ,(concat + "Jump to " + name + ". This code is dynamically generated in `dashboard-insert-shortcut'.") + (interactive) + (unless (search-forward ,search-label (point-max) t) + (search-backward ,search-label (point-min) t)) + ,@(unless no-next-line + '((forward-line 1))) + (back-to-indentation)) + (eval-after-load 'dashboard + (define-key dashboard-mode-map ,shortcut-char ',sym))))) + +(defun dashboard-append (msg &optional _messagebuf) + "Append MSG to dashboard buffer. +If MESSAGEBUF is not nil then MSG is also written in message buffer." + (with-current-buffer (get-buffer-create dashboard-buffer-name) + (goto-char (point-max)) + (let ((buffer-read-only nil)) (insert msg)))) + +(defun dashboard-modify-heading-icons (alist) + "Append ALIST items to `dashboard-heading-icons' to modify icons." + (dolist (icon alist) + (add-to-list 'dashboard-heading-icons icon))) + +(defun dashboard-insert-page-break () + "Insert a page break line in dashboard buffer." + (dashboard-append dashboard-page-separator)) + +(defun dashboard-insert-heading (heading &optional shortcut) + "Insert a widget HEADING in dashboard buffer, adding SHORTCUT if provided." + (when (and (display-graphic-p) + dashboard-set-heading-icons) + ;; Try loading `all-the-icons' + (unless (or (fboundp 'all-the-icons-octicon) + (require 'all-the-icons nil 'noerror)) + (error "Package `all-the-icons' isn't installed")) + + (insert (cond + ((string-equal heading "Recent Files:") + (all-the-icons-octicon (cdr (assoc 'recents dashboard-heading-icons)) + :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) + ((string-equal heading "Bookmarks:") + (all-the-icons-octicon (cdr (assoc 'bookmarks dashboard-heading-icons)) + :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) + ((or (string-equal heading "Agenda for today:") + (string-equal heading "Agenda for the coming week:")) + (all-the-icons-octicon (cdr (assoc 'agenda dashboard-heading-icons)) + :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) + ((string-equal heading "Registers:") + (all-the-icons-octicon (cdr (assoc 'registers dashboard-heading-icons)) + :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) + ((string-equal heading "Projects:") + (all-the-icons-octicon (cdr (assoc 'projects dashboard-heading-icons)) + :height 1.2 :v-adjust 0.0 :face 'dashboard-heading)) + (t " "))) + (insert " ")) + + (insert (propertize heading 'face 'dashboard-heading)) + (when shortcut (insert (format " (%s)" shortcut)))) + +(defun dashboard-center-line (string) + "Center a STRING accoring to it's size." + (insert (make-string (max 0 (floor (/ (- dashboard-banner-length + (+ (length string) 1)) 2))) ?\ ))) + +;; +;; BANNER +;; +(defun dashboard-insert-ascii-banner-centered (file) + "Insert banner from FILE." + (let ((ascii-banner + (with-temp-buffer + (insert-file-contents file) + (let ((banner-width 0)) + (while (not (eobp)) + (let ((line-length (- (line-end-position) (line-beginning-position)))) + (if (< banner-width line-length) + (setq banner-width line-length))) + (forward-line 1)) + (goto-char 0) + (let ((margin + (max 0 (floor (/ (- dashboard-banner-length banner-width) 2))))) + (while (not (eobp)) + (insert (make-string margin ?\ )) + (forward-line 1)))) + (buffer-string)))) + (put-text-property 0 (length ascii-banner) 'face 'dashboard-text-banner ascii-banner) + (insert ascii-banner))) + +(defun dashboard-insert-image-banner (banner) + "Display an image BANNER." + (when (file-exists-p banner) + (let* ((title dashboard-banner-logo-title) + (size-props + (append (when (> dashboard-image-banner-max-width 0) + (list :max-width dashboard-image-banner-max-width)) + (when (> dashboard-image-banner-max-height 0) + (list :max-height dashboard-image-banner-max-height)))) + (spec + (if (image-type-available-p 'imagemagick) + (apply 'create-image banner 'imagemagick nil size-props) + (apply 'create-image banner nil nil + (when (and (fboundp 'image-transforms-p) + (memq 'scale (funcall 'image-transforms-p))) + size-props)))) + ;; TODO: For some reason, `elisp-lint' is reporting error void + ;; function `image-size'. + (size (when (fboundp 'image-size) (image-size spec))) + (width (car size)) + (left-margin (max 0 (floor (- dashboard-banner-length width) 2)))) + (goto-char (point-min)) + (insert "\n") + (insert (make-string left-margin ?\ )) + (insert-image spec) + (insert "\n\n") + (when title + (dashboard-center-line title) + (insert (format "%s\n\n" (propertize title 'face 'dashboard-banner-logo-title))))))) + +;; +;; INIT INFO +;; +(defun dashboard-insert-init-info () + "Insert init info when `dashboard-set-init-info' is t." + (when dashboard-set-init-info + (dashboard-center-line dashboard-init-info) + (insert (propertize dashboard-init-info 'face 'font-lock-comment-face)))) + +(defun dashboard-get-banner-path (index) + "Return the full path to banner with index INDEX." + (concat dashboard-banners-directory (format "%d.txt" index))) + +(defun dashboard-choose-banner () + "Return the full path of a banner based on the dotfile value." + (when dashboard-startup-banner + (cond ((eq 'official dashboard-startup-banner) + (if (and (display-graphic-p) (image-type-available-p 'png)) + dashboard-banner-official-png + (dashboard-get-banner-path 1))) + ((eq 'logo dashboard-startup-banner) + (if (and (display-graphic-p) (image-type-available-p 'png)) + dashboard-banner-logo-png + (dashboard-get-banner-path 1))) + ((integerp dashboard-startup-banner) + (dashboard-get-banner-path dashboard-startup-banner)) + ((stringp dashboard-startup-banner) + (if (and (file-exists-p dashboard-startup-banner) + (or (string-suffix-p ".txt" dashboard-startup-banner) + (and (display-graphic-p) + (image-type-available-p (intern (file-name-extension + dashboard-startup-banner)))))) + dashboard-startup-banner + (message "could not find banner %s, use default instead" dashboard-startup-banner) + (dashboard-get-banner-path 1))) + (t (dashboard-get-banner-path 1))))) + +(defun dashboard-insert-banner () + "Insert Banner at the top of the dashboard." + (goto-char (point-max)) + (let ((banner (dashboard-choose-banner)) + (buffer-read-only nil)) + (when banner + (if (image-type-available-p (intern (file-name-extension banner))) + (dashboard-insert-image-banner banner) + (dashboard-insert-ascii-banner-centered banner)) + (dashboard-insert-navigator) + (dashboard-insert-init-info)))) + +(defun dashboard-insert-navigator () + "Insert Navigator of the dashboard." + (when (and dashboard-set-navigator dashboard-navigator-buttons) + (dolist (line dashboard-navigator-buttons) + (dolist (btn line) + (let* ((icon (car btn)) + (title (cadr btn)) + (help (or (cadr (cdr btn)) "")) + (action (or (cadr (cddr btn)) #'ignore)) + (face (or (cadr (cddr (cdr btn))) 'dashboard-navigator)) + (prefix (or (cadr (cddr (cddr btn))) (propertize "[" 'face face))) + (suffix (or (cadr (cddr (cddr (cdr btn)))) (propertize "]" 'face face)))) + (widget-create 'item + :tag (concat + (when icon + (propertize icon 'face + (let ((prop-face (get-text-property 0 'face icon))) + (if prop-face + `(:inherit ,prop-face :inherit ,face) + `(:inherit ,face))))) + (when (and icon title + (not (string-equal icon "")) + (not (string-equal title ""))) + (propertize " " 'face 'variable-pitch)) + (when title (propertize title 'face face))) + :help-echo help + :action action + :button-face 'dashboard-items-face + :mouse-face 'highlight + :button-prefix prefix + :button-suffix suffix + :format "%[%t%]") + (insert " "))) + (let* ((width (current-column))) + (beginning-of-line) + (dashboard-center-line (make-string width ?\s)) + (end-of-line)) + (insert "\n")) + (insert "\n"))) + +(defmacro dashboard-insert-section (section-name list list-size shortcut action &rest widget-params) + "Add a section with SECTION-NAME and LIST of LIST-SIZE items to the dashboard. +SHORTCUT is the keyboard shortcut used to access the section. +ACTION is theaction taken when the user activates the widget button. +WIDGET-PARAMS are passed to the \"widget-create\" function." + `(progn + (dashboard-insert-heading ,section-name + (if (and ,list ,shortcut dashboard-show-shortcuts) ,shortcut)) + (if ,list + (when (and (dashboard-insert-section-list + ,section-name + (dashboard-subseq ,list 0 ,list-size) + ,action + ,@widget-params) + ,shortcut) + (dashboard-insert-shortcut ,shortcut ,section-name)) + (insert (propertize "\n --- No items ---" 'face 'dashboard-no-items-face))))) + +;; +;; Section list +;; +(defmacro dashboard-insert-section-list (section-name list action &rest rest) + "Insert into SECTION-NAME a LIST of items, expanding ACTION and passing REST to widget creation." + `(when (car ,list) + (mapc + (lambda (el) + (let ((tag ,@rest)) + (insert "\n ") + + (when (and (display-graphic-p) + dashboard-set-file-icons + (or (fboundp 'all-the-icons-icon-for-dir) + (require 'all-the-icons nil 'noerror))) + (let* ((path (car (last (split-string ,@rest " - ")))) + (icon (if (and (not (file-remote-p path)) + (file-directory-p path)) + (all-the-icons-icon-for-dir path nil "") + (cond + ((or (string-equal ,section-name "Agenda for today:") + (string-equal ,section-name "Agenda for the coming week:")) + (all-the-icons-octicon "primitive-dot" :height 1.0 :v-adjust 0.01)) + ((file-remote-p path) + (all-the-icons-octicon "radio-tower" :height 1.0 :v-adjust 0.01)) + (t (all-the-icons-icon-for-file (file-name-nondirectory path) + :v-adjust -0.05)))))) + (setq tag (concat icon " " ,@rest)))) + + (widget-create 'item + :tag tag + :action ,action + :button-face 'dashboard-items-face + :mouse-face 'highlight + :button-prefix "" + :button-suffix "" + :format "%[%t%]"))) + ,list))) + +;; Footer +(defun dashboard-random-footer () + "Return a random footer from `dashboard-footer-messages'." + (nth (random (length dashboard-footer-messages)) dashboard-footer-messages)) + +(defun dashboard-insert-footer () + "Insert footer of dashboard." + (let ((footer (and dashboard-set-footer (dashboard-random-footer)))) + (when footer + (insert "\n") + (dashboard-center-line footer) + (insert dashboard-footer-icon) + (insert " ") + (insert (propertize footer 'face 'dashboard-footer)) + (insert "\n")))) + +;; +;; Truncate +;; +(defcustom dashboard-shorten-by-window-width nil + "Shorten path by window edges." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-shorten-path-offset 0 + "Shorten path offset on the edges." + :type 'integer + :group 'dashboard) + +(defun dashboard-f-filename (path) + "Return file name from PATH." + (file-name-nondirectory path)) + +(defun dashboard-f-base (path) + "Return directory name from PATH." + (file-name-nondirectory (directory-file-name (file-name-directory path)))) + +(defun dashboard-shorten-path-beginning (path) + "Shorten PATH from beginning if exceeding maximum length." + (let* ((len-path (length path)) (len-rep (length dashboard-path-shorten-string)) + (len-total (- dashboard-path-max-length len-rep)) + front) + (if (<= len-path dashboard-path-max-length) path + (setq front (ignore-errors (substring path (- len-path len-total) len-path))) + (if front (concat dashboard-path-shorten-string front) "")))) + +(defun dashboard-shorten-path-middle (path) + "Shorten PATH from middle if exceeding maximum length." + (let* ((len-path (length path)) (len-rep (length dashboard-path-shorten-string)) + (len-total (- dashboard-path-max-length len-rep)) + (center (/ len-total 2)) + (end-back center) + (start-front (- len-path center)) + back front) + (if (<= len-path dashboard-path-max-length) path + (setq back (substring path 0 end-back) + front (ignore-errors (substring path start-front len-path))) + (if front (concat back dashboard-path-shorten-string front) "")))) + +(defun dashboard-shorten-path-end (path) + "Shorten PATH from end if exceeding maximum length." + (let* ((len-path (length path)) (len-rep (length dashboard-path-shorten-string)) + (len-total (- dashboard-path-max-length len-rep)) + back) + (if (<= len-path dashboard-path-max-length) path + (setq back (ignore-errors (substring path 0 len-total))) + (if (and back (< 0 dashboard-path-max-length)) + (concat back dashboard-path-shorten-string) "")))) + +(defun dashboard--get-base-length (path type) + "Return the length of the base from the PATH by TYPE." + (let* ((is-dir (file-directory-p path)) + (base (if is-dir (dashboard-f-base path) (dashboard-f-filename path))) + (option (cl-case type + (recents 'dashboard-recentf-show-base) + (bookmarks 'dashboard-bookmarks-show-base) + (projects 'dashboard-projects-show-base))) + (option-val (symbol-value option)) + base-len) + (cond ((eq option-val 'align) + (setq base-len (dashboard--align-length-by-type type))) + ((null option-val) (setq base-len 0)) + (t (setq base-len (length base)))) + base-len)) + +(defun dashboard-shorten-path (path type) + "Shorten the PATH by TYPE." + (setq path (abbreviate-file-name path)) + (let ((dashboard-path-max-length + (if (and dashboard-path-style dashboard-shorten-by-window-width) + (- (window-width) (dashboard--get-base-length path type) + dashboard-shorten-path-offset) + dashboard-path-max-length))) + (cl-case dashboard-path-style + (truncate-beginning (dashboard-shorten-path-beginning path)) + (truncate-middle (dashboard-shorten-path-middle path)) + (truncate-end (dashboard-shorten-path-end path)) + (t path)))) + +(defun dashboard-shorten-paths (paths alist type) + "Shorten all path from PATHS by TYPE and store it to ALIST." + (let (lst-display abbrev (index 0)) + (setf (symbol-value alist) nil) ; reset + (dolist (item paths) + (setq abbrev (dashboard-shorten-path item type) + ;; Add salt here, and use for extraction. + ;; See function `dashboard-extract-key-path-alist'. + abbrev (format "%s|%s" index abbrev)) + ;; store `abbrev' as id; and `item' with value + (push (cons abbrev item) (symbol-value alist)) + (push abbrev lst-display) + (cl-incf index)) + (reverse lst-display))) + +(defun dashboard-extract-key-path-alist (key alist) + "Remove salt from KEY, and return true shorten path from ALIST." + (let* ((key (car (assoc key alist))) (split (split-string key "|"))) + (nth 1 split))) + +(defun dashboard-expand-path-alist (key alist) + "Get the full path (un-shorten) using KEY from ALIST." + (cdr (assoc key alist))) + +(defun dashboard--generate-align-format (fmt len) + "Return FMT after inserting align LEN." + (let ((pos (1+ (string-match-p "%s" fmt)))) + (concat (substring fmt 0 pos) + (concat "-" (number-to-string len)) + (substring fmt pos (length fmt))))) + +(defun dashboard--align-length-by-type (type) + "Return the align length by TYPE of the section." + (let ((len-item (cdr (assoc type dashboard-items))) (count 0) (align-length -1) + len-list base) + (cl-case type + (recents + (require 'recentf) + (setq len-list (length recentf-list)) + (while (and (< count len-item) (< count len-list)) + (setq base (nth count recentf-list) + align-length (max align-length (length (dashboard-f-filename base)))) + (cl-incf count))) + (bookmarks + (let ((bookmarks-lst (bookmark-all-names))) + (setq len-list (length bookmarks-lst)) + (while (and (< count len-item) (< count len-list)) + (setq base (nth count bookmarks-lst) + align-length (max align-length (length base))) + (cl-incf count)))) + (projects + (let ((projects-lst (dashboard-projects-backend-load-projects))) + (setq len-list (length projects-lst)) + (while (and (< count len-item) (< count len-list)) + (setq base (nth count projects-lst) + align-length (max align-length (length (dashboard-f-base base)))) + (cl-incf count)))) + (t (error "Unknown type for align length: %s" type))) + align-length)) + +;; +;; Recentf +;; +(defcustom dashboard-recentf-show-base nil + "Show the base file name infront of it's path." + :type '(choice + (const :tag "Don't show the base infront" nil) + (const :tag "Respect format" t) + (const :tag "Align the from base" align)) + :group 'dashboard) + +(defcustom dashboard-recentf-item-format "%s %s" + "Format to use when showing the base of the file name." + :type 'string + :group 'dashboard) + +(defvar dashboard-recentf-alist nil + "Alist records shorten's recent files and it's full paths.") + +(defvar dashboard--recentf-cache-item-format nil + "Cache to record the new generated align format.") + +(defun dashboard-insert-recents (list-size) + "Add the list of LIST-SIZE items from recently edited files." + (setq dashboard--recentf-cache-item-format nil) + (recentf-mode) + (let ((inhibit-message t) (message-log-max nil)) (recentf-cleanup)) + (dashboard-insert-section + "Recent Files:" + (dashboard-shorten-paths recentf-list 'dashboard-recentf-alist 'recents) + list-size + (dashboard-get-shortcut 'recents) + `(lambda (&rest ignore) + (find-file-existing (dashboard-expand-path-alist ,el dashboard-recentf-alist))) + (let* ((file (dashboard-expand-path-alist el dashboard-recentf-alist)) + (filename (dashboard-f-filename file)) + (path (dashboard-extract-key-path-alist el dashboard-recentf-alist))) + (cond + ((eq dashboard-recentf-show-base 'align) + (unless dashboard--recentf-cache-item-format + (let* ((len-align (dashboard--align-length-by-type 'recents)) + (new-fmt (dashboard--generate-align-format + dashboard-recentf-item-format len-align))) + (setq dashboard--recentf-cache-item-format new-fmt))) + (format dashboard--recentf-cache-item-format filename path)) + ((null dashboard-recentf-show-base) path) + (t (format dashboard-recentf-item-format filename path)))))) + +;; +;; Bookmarks +;; +(defcustom dashboard-bookmarks-show-base t + "Show the base file name infront of it's path." + :type '(choice + (const :tag "Don't show the base infront" nil) + (const :tag "Respect format" t) + (const :tag "Align the from base" align)) + :group 'dashboard) + +(defcustom dashboard-bookmarks-item-format "%s - %s" + "Format to use when showing the base of the file name." + :type 'string + :group 'dashboard) + +(defvar dashboard--bookmarks-cache-item-format nil + "Cache to record the new generated align format.") + +(defun dashboard-insert-bookmarks (list-size) + "Add the list of LIST-SIZE items of bookmarks." + (require 'bookmark) + (dashboard-insert-section + "Bookmarks:" + (dashboard-subseq (bookmark-all-names) 0 list-size) + list-size + (dashboard-get-shortcut 'bookmarks) + `(lambda (&rest ignore) (bookmark-jump ,el)) + (if-let* ((filename el) + (path (bookmark-get-filename el)) + (path-shorten (dashboard-shorten-path path 'bookmarks))) + (cond + ((eq dashboard-bookmarks-show-base 'align) + (unless dashboard--bookmarks-cache-item-format + (let* ((len-align (dashboard--align-length-by-type 'bookmarks)) + (new-fmt (dashboard--generate-align-format + dashboard-bookmarks-item-format len-align))) + (setq dashboard--bookmarks-cache-item-format new-fmt))) + (format dashboard--bookmarks-cache-item-format filename path-shorten)) + ((null dashboard-bookmarks-show-base) path-shorten) + (t (format dashboard-bookmarks-item-format filename path-shorten))) + el))) + +;; +;; Projects +;; +(defcustom dashboard-projects-switch-function + nil + "Custom function to switch to projects from dashboard. +If non-NIL, should be bound to a function with one argument. The +function will be called with the root directory of the project to +switch to." + :type '(choice (const :tag "Default" nil) function) + :group 'dashboard) + +(defcustom dashboard-projects-show-base nil + "Show the project name infront of it's path." + :type '(choice + (const :tag "Don't show the base infront" nil) + (const :tag "Respect format" t) + (const :tag "Align the from base" align)) + :group 'dashboard) + +(defcustom dashboard-projects-item-format "%s %s" + "Format to use when showing the base of the project name." + :type 'string + :group 'dashboard) + +(defvar dashboard-projects-alist nil + "Alist records the shorten's project paths and it's full paths.") + +(defvar dashboard--projects-cache-item-format nil + "Cache to record the new generated align format.") + +(defun dashboard-insert-projects (list-size) + "Add the list of LIST-SIZE items of projects." + (setq dashboard--projects-cache-item-format nil) + (dashboard-insert-section + "Projects:" + (dashboard-shorten-paths + (dashboard-subseq (dashboard-projects-backend-load-projects) 0 list-size) + 'dashboard-projects-alist 'projects) + list-size + (dashboard-get-shortcut 'projects) + `(lambda (&rest ignore) + (funcall (dashboard-projects-backend-switch-function) + (dashboard-expand-path-alist ,el dashboard-projects-alist))) + (let* ((file (dashboard-expand-path-alist el dashboard-projects-alist)) + (filename (dashboard-f-base file)) + (path (dashboard-extract-key-path-alist el dashboard-projects-alist))) + (cond + ((eq dashboard-projects-show-base 'align) + (unless dashboard--projects-cache-item-format + (let* ((len-align (dashboard--align-length-by-type 'projects)) + (new-fmt (dashboard--generate-align-format + dashboard-projects-item-format len-align))) + (setq dashboard--projects-cache-item-format new-fmt))) + (format dashboard--projects-cache-item-format filename path)) + ((null dashboard-projects-show-base) path) + (t (format dashboard-projects-item-format filename path)))))) + +(defun dashboard-projects-backend-load-projects () + "Depending on `dashboard-projects-backend' load corresponding backend. +Return function that returns a list of projects." + (cond + ((eq dashboard-projects-backend 'projectile) + (require 'projectile) + (let ((inhibit-message t) (message-log-max nil)) + (projectile-cleanup-known-projects)) + (projectile-load-known-projects)) + ((eq dashboard-projects-backend 'project-el) + (require 'project) + (project-known-project-roots)) + (t + (display-warning '(dashboard) + "Invalid value for `dashboard-projects-backend'" + :error)))) + +(defun dashboard-projects-backend-switch-function () + "Return the function to switch to a project. +Custom variable `dashboard-projects-switch-function' variable takes preference +over custom backends." + (or dashboard-projects-switch-function + (cond + ((eq dashboard-projects-backend 'projectile) + 'projectile-switch-project-by-name) + ((eq dashboard-projects-backend 'project-el) + (lambda (project) + "This function is used to switch to `PROJECT'." + (let ((default-directory project)) + (project-find-file)))) + (t + (display-warning '(dashboard) + "Invalid value for `dashboard-projects-backend'" + :error))))) +;; +;; Org Agenda +;; +(defcustom dashboard-week-agenda t + "Show agenda weekly if its not nil." + :type 'boolean + :group 'dashboard) + +(defcustom dashboard-agenda-time-string-format "%Y-%m-%d" + "Format time of agenda entries." + :type 'string + :group 'dashboard) + +(defcustom dashboard-match-agenda-entry nil + "Match agenda to extra filter. +It is the MATCH attribute for `org-map-entries'" + :type 'string + :group 'dashboard) + +(defcustom dashboard-agenda-release-buffers nil + "If not nil use `org-release-buffers' after getting the entries." + :type 'boolean + :group 'dashboard) + +(defun dashboard-agenda-entry-time (schedule-time) + "Format SCHEDULE-TIME with custom format. +If SCHEDULE-TIME is nil returns a blank string which length +is todays date format." + (let* ((time (or schedule-time (org-today))) + (formated-time (format-time-string + dashboard-agenda-time-string-format time))) + (if schedule-time + formated-time + (replace-regexp-in-string "." " " formated-time)))) + +(defun dashboard-agenda-entry-format () + "Format agenda entry to show it on dashboard." + (let* ((schedule-time (org-get-scheduled-time (point))) + (deadline-time (org-get-deadline-time (point))) + (item (org-agenda-format-item + (dashboard-agenda-entry-time (or schedule-time deadline-time)) + (org-get-heading) + (org-outline-level) + (org-get-category) + (org-get-tags) + t)) + (loc (point)) + (file (buffer-file-name))) + (dashboard-agenda--set-agenda-headline-face item) + (list item loc file))) + +(defun dashboard-agenda--set-agenda-headline-face (headline) + "Set agenda faces to `HEADLINE' when face text property is nil." + (let ((todo (org-get-todo-state)) + (org-level-face (nth (- (org-outline-level) 1) org-level-faces))) + (dashboard-agenda--set-face-when-match org-level-face + (org-get-heading t t t t) + headline) + (dashboard-agenda--set-face-when-match (org-get-todo-face todo) + todo + headline))) + +(defun dashboard-agenda--set-face-when-match (face text entry) + "Set `FACE' to match text between `TEXT' and `ENTRY'. +Do nothing if `TEXT' has already a face property or is nil." + (let ((match-part (and text (string-match text entry)))) + (when (and match-part (null (get-text-property 0 'face text))) + (add-face-text-property (match-beginning 0) (match-end 0) + face t entry)))) + +(defun dashboard-due-date-for-agenda () + "Return due-date for agenda period." + (if dashboard-week-agenda + (time-add (current-time) (* 86400 8)) + (time-add (current-time) 86400))) + +(defun dashboard-filter-agenda-by-time () + "Include entry if it has a schedule-time or deadline-time in the future. +An entry is included if this function returns nil and excluded +if returns a point." + (let ((schedule-time (org-get-scheduled-time (point))) + (deadline-time (org-get-deadline-time (point))) + (due-date (dashboard-due-date-for-agenda))) + (unless (and (not (org-entry-is-done-p)) + (or (and schedule-time + (org-time-less-p schedule-time due-date)) + (and deadline-time + (org-time-less-p deadline-time due-date)))) + (point)))) + +(defun dashboard-filter-agenda-by-todo () + "Include entry if it is todo and not done. +An entry is included if this function returns nil and excluded +if returns a point." + (unless (and (org-entry-is-todo-p) + (not (org-entry-is-done-p))) + (point))) + +(defun dashboard-no-filter-agenda () + "No filter agenda entries." + (when (org-entry-is-done-p) (point))) + +(defcustom dashboard-filter-agenda-entry 'dashboard-filter-agenda-by-time + "Function to filter `org-agenda' entries." + :type '(choice + (const :tag "No filter" dashboard-no-filter-agenda) + (const :tag "Filter by time" dashboard-filter-agenda-by-time) + (const :tag "Filter by todo" dashboard-filter-agenda-by-todo) + (function :tag "Custom function")) + :group 'dashboard) + +(defun dashboard-get-agenda () + "Get agenda items for today or for a week from now." + (org-compile-prefix-format 'agenda) + (prog1 (org-map-entries 'dashboard-agenda-entry-format + dashboard-match-agenda-entry + 'agenda + dashboard-filter-agenda-entry) + (dashboard-agenda--release-buffers))) + +(defun dashboard-agenda--release-buffers () + "Release agenda buffers buffers. +This is what `org-agenda-exit' do." + (when dashboard-agenda-release-buffers + (org-release-buffers org-agenda-new-buffers) + (setq org-agenda-new-buffers nil))) + +(defun dashboard-insert-agenda (list-size) + "Add the list of LIST-SIZE items of agenda." + (require 'org-agenda) + (let ((agenda (dashboard-get-agenda))) + (dashboard-insert-section + (if dashboard-week-agenda + "Agenda for the coming week:" + "Agenda for today:") + agenda + list-size + (dashboard-get-shortcut 'agenda) + `(lambda (&rest ignore) + (let ((buffer (find-file-other-window (nth 2 ',el)))) + (with-current-buffer buffer + (goto-char (nth 1 ',el)) + (switch-to-buffer buffer)))) + (format "%s" (nth 0 el))))) + +;; +;; Registers +;; +(defun dashboard-insert-registers (list-size) + "Add the list of LIST-SIZE items of registers." + (require 'register) + (dashboard-insert-section + "Registers:" + register-alist + list-size + (dashboard-get-shortcut 'registers) + (lambda (&rest _ignore) (jump-to-register (car el))) + (format "%c - %s" (car el) (register-describe-oneline (car el))))) + +(provide 'dashboard-widgets) +;;; dashboard-widgets.el ends here diff --git a/.emacs.d/elpa/dashboard-20210427.705/dashboard-widgets.elc b/.emacs.d/elpa/dashboard-20210427.705/dashboard-widgets.elc new file mode 100644 index 0000000..a7f45f7 Binary files /dev/null and b/.emacs.d/elpa/dashboard-20210427.705/dashboard-widgets.elc differ diff --git a/.emacs.d/elpa/dashboard-20210427.705/dashboard.el b/.emacs.d/elpa/dashboard-20210427.705/dashboard.el new file mode 100644 index 0000000..6725a7b --- /dev/null +++ b/.emacs.d/elpa/dashboard-20210427.705/dashboard.el @@ -0,0 +1,275 @@ +;;; dashboard.el --- A startup screen extracted from Spacemacs -*- lexical-binding: t -*- + +;; Copyright (c) 2016-2020 Rakan Al-Hneiti <rakan.alhneiti@gmail.com> +;; Copyright (c) 2019-2021 Jesús Martínez <jesusmartinez93@gmail.com> +;; Copyright (c) 2020-2021 Shen, Jen-Chieh <jcs090218@gmail.com> +;; +;; Author: Rakan Al-Hneiti +;; URL: https://github.com/emacs-dashboard/emacs-dashboard +;; +;; This file is not part of GNU Emacs. +;; +;;; License: GPLv3 +;; +;; Created: October 05, 2016 +;; Package-Version: 1.8.0-SNAPSHOT +;; Keywords: startup, screen, tools, dashboard +;; Package-Requires: ((emacs "25.3") (page-break-lines "0.11")) +;;; Commentary: + +;; An extensible Emacs dashboard, with sections for +;; bookmarks, projects (projectile or project.el), org-agenda and more. + +;;; Code: + +(require 'seq) +(require 'recentf) + +(require 'dashboard-widgets) + +;; Custom splash screen +(defvar dashboard-mode-map + (let ((map (make-sparse-keymap))) + (define-key map (kbd "C-p") 'dashboard-previous-line) + (define-key map (kbd "C-n") 'dashboard-next-line) + (define-key map (kbd "<up>") 'dashboard-previous-line) + (define-key map (kbd "<down>") 'dashboard-next-line) + (define-key map (kbd "k") 'dashboard-previous-line) + (define-key map (kbd "j") 'dashboard-next-line) + (define-key map [tab] 'widget-forward) + (define-key map (kbd "C-i") 'widget-forward) + (define-key map [backtab] 'widget-backward) + (define-key map (kbd "RET") 'dashboard-return) + (define-key map [mouse-1] 'dashboard-mouse-1) + (define-key map (kbd "g") #'dashboard-refresh-buffer) + (define-key map (kbd "}") #'dashboard-next-section) + (define-key map (kbd "{") #'dashboard-previous-section) + map) + "Keymap for dashboard mode.") + +(defcustom dashboard-after-initialize-hook nil + "Hook that is run after dashboard buffer is initialized." + :group 'dashboard + :type 'hook) + +(define-derived-mode dashboard-mode special-mode "Dashboard" + "Dashboard major mode for startup screen." + :group 'dashboard + :syntax-table nil + :abbrev-table nil + (buffer-disable-undo) + (whitespace-mode -1) + (linum-mode -1) + (when (>= emacs-major-version 26) + (display-line-numbers-mode -1)) + (page-break-lines-mode 1) + (setq inhibit-startup-screen t + buffer-read-only t + truncate-lines t)) + +(defgroup dashboard nil + "Extensible startup screen." + :group 'applications) + +(defcustom dashboard-center-content nil + "Whether to center content within the window." + :type 'boolean + :group 'dashboard) + +(defconst dashboard-buffer-name "*dashboard*" + "Dashboard's buffer name.") + +(defvar dashboard--section-starts nil + "List of section starting positions.") + +(defvar dashboard-force-refresh nil + "If non-nil, force refresh dashboard buffer.") + +(defun dashboard-previous-section () + "Navigate back to previous section." + (interactive) + (let ((current-section-start nil) + (current-position (point)) + (previous-section-start nil)) + (dolist (elt dashboard--section-starts) + (when (and current-section-start + (not previous-section-start)) + (setq previous-section-start elt)) + (when (and (not current-section-start) + (< elt current-position)) + (setq current-section-start elt))) + (goto-char (if (eq current-position current-section-start) + previous-section-start + current-section-start)))) + +(defun dashboard-next-section () + "Navigate forward to next section." + (interactive) + (let ((current-position (point)) + (next-section-start nil) + (section-starts (reverse dashboard--section-starts))) + (dolist (elt section-starts) + (when (and (not next-section-start) + (> elt current-position)) + (setq next-section-start elt))) + (when next-section-start + (goto-char next-section-start)))) + +(defun dashboard-previous-line (arg) + "Move point up and position it at that line’s item. +Optional prefix ARG says how many lines to move; default is one line." + (interactive "^p") + (dashboard-next-line (- arg))) + +(defun dashboard-next-line (arg) + "Move point down and position it at that line’s item. +Optional prefix ARG says how many lines to move; default is one line." + ;; code heavily inspired by `dired-next-line' + (interactive "^p") + (let ((line-move-visual nil) + (goal-column nil)) + (line-move arg t)) + ;; We never want to move point into an invisible line. Dashboard doesn’t + ;; use invisible text currently but when it does we’re ready! + (while (and (invisible-p (point)) + (not (if (and arg (< arg 0)) (bobp) (eobp)))) + (forward-char (if (and arg (< arg 0)) -1 1))) + (beginning-of-line-text)) + +(defun dashboard-return () + "Hit return key in dashboard buffer." + (interactive) + (let ((start-ln (line-number-at-pos)) + (fd-cnt 0) + (diff-line nil) + (entry-pt nil)) + (save-excursion + (while (and (not diff-line) + (not (= (point) (point-min))) + (not (get-char-property (point) 'button)) + (not (= (point) (point-max)))) + (forward-char 1) + (setq fd-cnt (1+ fd-cnt)) + (unless (= start-ln (line-number-at-pos)) + (setq diff-line t))) + (unless (= (point) (point-max)) + (setq entry-pt (point)))) + (when (= fd-cnt 1) + (setq entry-pt (1- (point)))) + (if entry-pt + (widget-button-press entry-pt) + (call-interactively #'widget-button-press)))) + +(defun dashboard-mouse-1 () + "Key for keymap `mouse-1'." + (interactive) + (let ((old-track-mouse track-mouse)) + (when (call-interactively #'widget-button-click) + (setq track-mouse old-track-mouse)))) + +(defun dashboard-maximum-section-length () + "For the just-inserted section, calculate the length of the longest line." + (let ((max-line-length 0)) + (save-excursion + (dashboard-previous-section) + (while (not (eobp)) + (setq max-line-length + (max max-line-length + (- (line-end-position) (line-beginning-position)))) + (forward-line 1))) + max-line-length)) + +(defun dashboard-insert-startupify-lists () + "Insert the list of widgets into the buffer." + (interactive) + (let ((buffer-exists (buffer-live-p (get-buffer dashboard-buffer-name))) + (recentf-is-on (recentf-enabled-p)) + (origial-recentf-list recentf-list) + (dashboard-num-recents (or (cdr (assoc 'recents dashboard-items)) 0)) + (max-line-length 0)) + ;; disable recentf mode, + ;; so we don't flood the recent files list with org mode files + ;; do this by making a copy of the part of the list we'll use + ;; let dashboard widgets change that + ;; then restore the orginal list afterwards + ;; (this avoids many saves/loads that would result from + ;; disabling/enabling recentf-mode) + (when recentf-is-on + (setq recentf-list (seq-take recentf-list dashboard-num-recents))) + (when (or dashboard-force-refresh + (not (eq dashboard-buffer-last-width (window-width))) + (not buffer-exists)) + (setq dashboard-banner-length (window-width) + dashboard-buffer-last-width dashboard-banner-length) + (with-current-buffer (get-buffer-create dashboard-buffer-name) + (let ((buffer-read-only nil)) + (erase-buffer) + (dashboard-insert-banner) + (dashboard-insert-page-break) + (setq dashboard--section-starts nil) + (mapc (lambda (els) + (let* ((el (or (car-safe els) els)) + (list-size + (or (cdr-safe els) + dashboard-items-default-length)) + (item-generator + (cdr-safe (assoc el dashboard-item-generators)))) + (add-to-list 'dashboard--section-starts (point)) + (funcall item-generator list-size) + (when recentf-is-on + (setq recentf-list origial-recentf-list)) + (setq max-line-length + (max max-line-length (dashboard-maximum-section-length))) + (dashboard-insert-page-break))) + dashboard-items) + (when dashboard-center-content + (when dashboard--section-starts + (goto-char (car (last dashboard--section-starts)))) + (let ((margin (floor (/ (max (- (window-width) max-line-length) 0) 2)))) + (while (not (eobp)) + (unless (string-suffix-p (thing-at-point 'line) dashboard-page-separator) + (insert (make-string margin ?\ ))) + (forward-line 1)))) + (dashboard-insert-footer)) + (goto-char (point-min)) + (dashboard-mode))) + (when recentf-is-on + (setq recentf-list origial-recentf-list)))) + +(add-hook 'window-setup-hook + (lambda () + (add-hook 'window-size-change-functions 'dashboard-resize-on-hook) + (dashboard-resize-on-hook))) + +(defun dashboard-refresh-buffer () + "Refresh buffer." + (interactive) + (let ((dashboard-force-refresh t)) (dashboard-insert-startupify-lists)) + (switch-to-buffer dashboard-buffer-name)) + +(defun dashboard-resize-on-hook (&optional _) + "Re-render dashboard on window size change." + (let ((space-win (get-buffer-window dashboard-buffer-name)) + (frame-win (frame-selected-window))) + (when (and space-win + (not (window-minibuffer-p frame-win))) + (with-selected-window space-win + (dashboard-insert-startupify-lists))))) + +;;;###autoload +(defun dashboard-setup-startup-hook () + "Setup post initialization hooks. +If a command line argument is provided, +assume a filename and skip displaying Dashboard." + (when (< (length command-line-args) 2) + (add-hook 'after-init-hook (lambda () + ;; Display useful lists of items + (dashboard-insert-startupify-lists))) + (add-hook 'emacs-startup-hook (lambda () + (switch-to-buffer dashboard-buffer-name) + (goto-char (point-min)) + (redisplay) + (run-hooks 'dashboard-after-initialize-hook))))) + +(provide 'dashboard) +;;; dashboard.el ends here diff --git a/.emacs.d/elpa/dashboard-20210427.705/dashboard.elc b/.emacs.d/elpa/dashboard-20210427.705/dashboard.elc new file mode 100644 index 0000000..8eeae09 Binary files /dev/null and b/.emacs.d/elpa/dashboard-20210427.705/dashboard.elc differ diff --git a/.emacs.d/elpa/doom-modeline-20210608.516/doom-modeline-autoloads.el b/.emacs.d/elpa/doom-modeline-20210608.516/doom-modeline-autoloads.el new file mode 100644 index 0000000..5b5fdf7 --- /dev/null +++ b/.emacs.d/elpa/doom-modeline-20210608.516/doom-modeline-autoloads.el @@ -0,0 +1,126 @@ +;;; doom-modeline-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "doom-modeline" "doom-modeline.el" (0 0 0 0)) +;;; Generated autoloads from doom-modeline.el + +(autoload 'doom-modeline-init "doom-modeline" "\ +Initialize doom mode-line." nil nil) + +(autoload 'doom-modeline-set-main-modeline "doom-modeline" "\ +Set main mode-line. +If DEFAULT is non-nil, set the default mode-line for all buffers. + +\(fn &optional DEFAULT)" nil nil) + +(autoload 'doom-modeline-set-minimal-modeline "doom-modeline" "\ +Set minimal mode-line." nil nil) + +(autoload 'doom-modeline-set-special-modeline "doom-modeline" "\ +Set special mode-line." nil nil) + +(autoload 'doom-modeline-set-project-modeline "doom-modeline" "\ +Set project mode-line." nil nil) + +(autoload 'doom-modeline-set-dashboard-modeline "doom-modeline" "\ +Set dashboard mode-line." nil nil) + +(autoload 'doom-modeline-set-vcs-modeline "doom-modeline" "\ +Set vcs mode-line." nil nil) + +(autoload 'doom-modeline-set-info-modeline "doom-modeline" "\ +Set Info mode-line." nil nil) + +(autoload 'doom-modeline-set-package-modeline "doom-modeline" "\ +Set package mode-line." nil nil) + +(autoload 'doom-modeline-set-media-modeline "doom-modeline" "\ +Set media mode-line." nil nil) + +(autoload 'doom-modeline-set-message-modeline "doom-modeline" "\ +Set message mode-line." nil nil) + +(autoload 'doom-modeline-set-pdf-modeline "doom-modeline" "\ +Set pdf mode-line." nil nil) + +(autoload 'doom-modeline-set-org-src-modeline "doom-modeline" "\ +Set org-src mode-line." nil nil) + +(autoload 'doom-modeline-set-helm-modeline "doom-modeline" "\ +Set helm mode-line. + +\(fn &rest _)" nil nil) + +(autoload 'doom-modeline-set-timemachine-modeline "doom-modeline" "\ +Set timemachine mode-line." nil nil) + +(defvar doom-modeline-mode nil "\ +Non-nil if Doom-Modeline mode is enabled. +See the `doom-modeline-mode' command +for a description of this minor mode. +Setting this variable directly does not take effect; +either customize it (see the info node `Easy Customization') +or call the function `doom-modeline-mode'.") + +(custom-autoload 'doom-modeline-mode "doom-modeline" nil) + +(autoload 'doom-modeline-mode "doom-modeline" "\ +Toggle doom-modeline on or off. + +If called interactively, enable Doom-Modeline mode if ARG is +positive, and disable it if ARG is zero or negative. If called +from Lisp, also enable the mode if ARG is omitted or nil, and +toggle it if ARG is `toggle'; disable the mode otherwise. + +\(fn &optional ARG)" t nil) + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "doom-modeline" '("doom-modeline-mode-map"))) + +;;;*** + +;;;### (autoloads nil "doom-modeline-core" "doom-modeline-core.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from doom-modeline-core.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "doom-modeline-core" '("doom-modeline"))) + +;;;*** + +;;;### (autoloads nil "doom-modeline-env" "doom-modeline-env.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from doom-modeline-env.el + (autoload 'doom-modeline-env-setup-python "doom-modeline-env") + (autoload 'doom-modeline-env-setup-ruby "doom-modeline-env") + (autoload 'doom-modeline-env-setup-perl "doom-modeline-env") + (autoload 'doom-modeline-env-setup-go "doom-modeline-env") + (autoload 'doom-modeline-env-setup-elixir "doom-modeline-env") + (autoload 'doom-modeline-env-setup-rust "doom-modeline-env") + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "doom-modeline-env" '("doom-modeline-"))) + +;;;*** + +;;;### (autoloads nil "doom-modeline-segments" "doom-modeline-segments.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from doom-modeline-segments.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "doom-modeline-segments" '("doom-modeline-"))) + +;;;*** + +;;;### (autoloads nil nil ("doom-modeline-pkg.el") (0 0 0 0)) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; doom-modeline-autoloads.el ends here diff --git a/.emacs.d/elpa/doom-modeline-20210608.516/doom-modeline-core.el b/.emacs.d/elpa/doom-modeline-20210608.516/doom-modeline-core.el new file mode 100644 index 0000000..61796ec --- /dev/null +++ b/.emacs.d/elpa/doom-modeline-20210608.516/doom-modeline-core.el @@ -0,0 +1,1353 @@ +;;; doom-modeline-core.el --- The core libraries for doom-modeline -*- lexical-binding: t; -*- + +;; Copyright (C) 2018-2020 Vincent Zhang + +;; This file is not part of GNU Emacs. + +;; +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License as +;; published by the Free Software Foundation; either version 2, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; see the file COPYING. If not, write to +;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth +;; Floor, Boston, MA 02110-1301, USA. +;; + +;;; Commentary: +;; +;; The core libraries for doom-modeline. +;; + +;;; Code: + +(require 'cl-lib) +(require 'subr-x) +(require 'dash) +(require 'all-the-icons) +(require 'shrink-path) + + +;; +;; Compatibilities +;; + +(eval-and-compile + (when (< emacs-major-version 26) + ;; Define `if-let*' and `when-let*' variants for 25 users. + (unless (fboundp 'if-let*) (defalias 'if-let* #'if-let)) + (unless (fboundp 'when-let*) (defalias 'when-let* #'when-let)))) + +;; Don’t compact font caches during GC. +(when (eq system-type 'windows-nt) + (setq inhibit-compacting-font-caches t)) + +;;`file-local-name' is introduced in 25.2.2. +(unless (fboundp 'file-local-name) + (defun file-local-name (file) + "Return the local name component of FILE. +It returns a file name which can be used directly as argument of +`process-file', `start-file-process', or `shell-command'." + (or (file-remote-p file 'localname) file))) + +;; Set correct font width for `all-the-icons' for appropriate mode-line width. +;; @see https://emacs.stackexchange.com/questions/14420/how-can-i-fix-incorrect-character-width +(defun doom-modeline--set-char-widths (alist) + "Set correct widths of icons characters in ALIST." + (while (char-table-parent char-width-table) + (setq char-width-table (char-table-parent char-width-table))) + (dolist (pair alist) + (let ((width (car pair)) + (chars (cdr pair)) + (table (make-char-table nil))) + (dolist (char chars) + (set-char-table-range table char width)) + (optimize-char-table table) + (set-char-table-parent table char-width-table) + (setq char-width-table table)))) + +(defconst doom-modeline-rhs-icons-alist + '((2 . (;; VCS + ?\xf0ac ; git-compare + ?\xf023 ; git-merge + ?\xf03f ; arrow-down + ?\xf02d ; alert + ?\xf020 ; git-branch + + ;; Checker + ?\xe611 ; do_not_disturb_alt + ?\xe5ca ; check + ?\xe192 ; access_time + ?\xe624 ; sim_card_alert + ?\xe034 ; pause + ?\xe645 ; priority_high + + ;; Minor modes + ?\xf02f ; gear + + ;; Persp + ?\xe2c7 ; folder + + ;; Preview + ?\xe8a0 ; pageview + + ;; REPL + ?\xf155 ; dollar-sign + + ;; LSP + ?\xf135 ; rocket + + ;; GitHub + ?\xf09b ; github + + ;; Debug + ?\xf188 ; bug + + ;; Mail + ?\xe0be ; email + + ;; IRC + ?\xe0c9 ; message + + ;; Battery + ?\xe939 ; battery-charging + ?\xf244 ; battery-empty + ?\xf240 ; battery-full + ?\xf242 ; battery-half + ?\xf243 ; battery-quarter + ?\xf241 ; battery-three-quarters + )))) +(when (display-graphic-p) + (doom-modeline--set-char-widths doom-modeline-rhs-icons-alist)) + + +;; +;; Customization +;; + +(defgroup doom-modeline nil + "A minimal and modern mode-line." + :group 'mode-line + :link '(url-link :tag "Homepage" "https://github.com/seagle0128/doom-modeline")) + +(defcustom doom-modeline-height 25 + "How tall the mode-line should be. It's only respected in GUI. +If the actual char height is larger, it respects the actual char height." + :type 'integer + :set (lambda (sym val) + (set sym (if (> val 0) val 1))) + :group 'doom-modeline) + +(defcustom doom-modeline-bar-width 4 + "How wide the mode-line bar should be. It's only respected in GUI." + :type 'integer + :set (lambda (sym val) + (set sym (if (> val 0) val 1))) + :group 'doom-modeline) + +(defcustom doom-modeline-hud nil + "Whether to use hud instead of default bar. It's only respected in GUI." + :type 'boolean + :group 'doom-modeline) + +(defcustom doom-modeline-hud-min-height 2 + "Minimum height in pixels of the \"thumb\" of the hud. +Only respected in GUI." + :type 'integer + :set (lambda (sym val) + (set sym (if (> val 1) val 1))) + :group 'doom-modeline) + +(defcustom doom-modeline-window-width-limit fill-column + "The limit of the window width. + +If `window-width' is smaller than the limit, some information won't be +displayed." + :type '(choice integer + (const :tag "Disable" nil)) + :group 'doom-modeline) + +(defcustom doom-modeline-project-detection + (cond ((fboundp 'ffip-get-project-root-directory) 'ffip) + ((fboundp 'projectile-project-root) 'projectile) + ((fboundp 'project-current) 'project) + (t nil)) + "How to detect the project root. + +The default priority is `ffip' > `projectile' > `project'. +nil means to use `default-directory'. + +The project management packages have some issues on detecting project root. +e.g. `projectile' doesn't handle symlink folders well, while `project' is +unable to hanle sub-projects. +Specify another one if you encounter the issue." + :type '(choice (const :tag "Find File in Project" ffip) + (const :tag "Projectile" projectile) + (const :tag "Built-in Project" project) + (const :tag "Disable" nil)) + :group 'doom-modeline) + +(defcustom doom-modeline-buffer-file-name-style 'auto + "Determines the style used by `doom-modeline-buffer-file-name'. + +Given ~/Projects/FOSS/emacs/lisp/comint.el + auto => emacs/lisp/comint.el (in a project) or comint.el + truncate-upto-project => ~/P/F/emacs/lisp/comint.el + truncate-from-project => ~/Projects/FOSS/emacs/l/comint.el + truncate-with-project => emacs/l/comint.el + truncate-except-project => ~/P/F/emacs/l/comint.el + truncate-upto-root => ~/P/F/e/lisp/comint.el + truncate-all => ~/P/F/e/l/comint.el + truncate-nil => ~/Projects/FOSS/emacs/lisp/comint.el + relative-from-project => emacs/lisp/comint.el + relative-to-project => lisp/comint.el + file-name => comint.el + buffer-name => comint.el<2> (uniquify buffer name)" + :type '(choice (const auto) + (const truncate-upto-project) + (const truncate-upto-project) + (const truncate-from-project) + (const truncate-with-project) + (const truncate-except-project) + (const truncate-upto-root) + (const truncate-all) + (const truncate-nil) + (const relative-from-project) + (const relative-to-project) + (const file-name) + (const buffer-name)) + :group'doom-modeline) + +(defcustom doom-modeline-icon (display-graphic-p) + "Whether display the icons in the mode-line. + +While using the server mode in GUI, should set the value explicitly." + :type 'boolean + :group 'doom-modeline) + +(defcustom doom-modeline-major-mode-icon t + "Whether display the icon for `major-mode'. + +It respects `doom-modeline-icon'." + :type 'boolean + :group'doom-modeline) + +(defcustom doom-modeline-major-mode-color-icon t + "Whether display the colorful icon for `major-mode'. + +It respects `all-the-icons-color-icons'." + :type 'boolean + :group'doom-modeline) + +(defcustom doom-modeline-buffer-state-icon t + "Whether display the icon for the buffer state. + +It respects `doom-modeline-icon'." + :type 'boolean + :group 'doom-modeline) + +(defcustom doom-modeline-buffer-modification-icon t + "Whether display the modification icon for the buffer. + +It respects `doom-modeline-icon' and `doom-modeline-buffer-state-icon'." + :type 'boolean + :group 'doom-modeline) + +(defcustom doom-modeline-unicode-fallback nil + "Whether to use unicode as a fallback (instead of ASCII) when not using icons." + :type 'boolean + :group 'doom-modeline) + +(defcustom doom-modeline-minor-modes nil + "Whether display the minor modes in the mode-line." + :type 'boolean + :group 'doom-modeline) + +(defcustom doom-modeline-enable-word-count nil + "If non-nil, a word count will be added to the selection-info modeline segment." + :type 'boolean + :group 'doom-modeline) + +(defcustom doom-modeline-continuous-word-count-modes + '(markdown-mode gfm-mode org-mode) + "Major modes in which to display word count continuously. + +It respects `doom-modeline-enable-word-count'." + :type '(repeat (symbol :tag "Major-Mode") ) + :group 'doom-modeline) + +(defcustom doom-modeline-buffer-encoding t + "Whether display the buffer encoding." + :type '(choice (const :tag "Always" t) + (const :tag "When non-default" nondefault) + (const :tag "Never" nil)) + :group 'doom-modeline) + +(defcustom doom-modeline-default-coding-system 'utf-8 + "Default coding system for `doom-modeline-buffer-encoding' `nondefault'." + :type 'coding-system + :group 'doom-modeline) + +(defcustom doom-modeline-default-eol-type 0 + "Default EOL type for `doom-modeline-buffer-encoding' `nondefault'." + :type '(choice (const :tag "Unix-style LF" 0) + (const :tag "DOS-style CRLF" 1) + (const :tag "Mac-style CR" 2)) + :group 'doom-modeline) + +(defcustom doom-modeline-indent-info nil + "Whether display the indentation information." + :type 'boolean + :group 'doom-modeline) + +;; It is based upon `editorconfig-indentation-alist' but is used to read indentation levels instead +;; of setting them. (https://github.com/editorconfig/editorconfig-emacs) +(defcustom doom-modeline-indent-alist + '((apache-mode apache-indent-level) + (awk-mode c-basic-offset) + (bpftrace-mode c-basic-offset) + (c++-mode c-basic-offset) + (c-mode c-basic-offset) + (cmake-mode cmake-tab-width) + (coffee-mode coffee-tab-width) + (cperl-mode cperl-indent-level) + (crystal-mode crystal-indent-level) + (csharp-mode c-basic-offset) + (css-mode css-indent-offset) + (d-mode c-basic-offset) + (emacs-lisp-mode lisp-indent-offset) + (enh-ruby-mode enh-ruby-indent-level) + (erlang-mode erlang-indent-level) + (ess-mode ess-indent-offset) + (f90-mode f90-associate-indent + f90-continuation-indent + f90-critical-indent + f90-do-indent + f90-if-indent + f90-program-indent + f90-type-indent) + (feature-mode feature-indent-offset + feature-indent-level) + (fsharp-mode fsharp-continuation-offset + fsharp-indent-level + fsharp-indent-offset) + (groovy-mode groovy-indent-offset) + (haskell-mode haskell-indent-spaces + haskell-indent-offset + haskell-indentation-layout-offset + haskell-indentation-left-offset + haskell-indentation-starter-offset + haskell-indentation-where-post-offset + haskell-indentation-where-pre-offset + shm-indent-spaces) + (haxor-mode haxor-tab-width) + (idl-mode c-basic-offset) + (jade-mode jade-tab-width) + (java-mode c-basic-offset) + (js-mode js-indent-level) + (js-jsx-mode js-indent-level + sgml-basic-offset) + (js2-mode js2-basic-offset) + (js2-jsx-mode js2-basic-offset + sgml-basic-offset) + (js3-mode js3-indent-level) + (json-mode js-indent-level) + (julia-mode julia-indent-offset) + (kotlin-mode kotlin-tab-width) + (latex-mode tex-indent-basic) + (lisp-mode lisp-indent-offset) + (livescript-mode livescript-tab-width) + (lua-mode lua-indent-level) + (matlab-mode matlab-indent-level) + (mips-mode mips-tab-width) + (mustache-mode mustache-basic-offset) + (nasm-mode nasm-basic-offset) + (nginx-mode nginx-indent-level) + (nxml-mode nxml-child-indent) + (objc-mode c-basic-offset) + (octave-mode octave-block-offset) + (perl-mode perl-indent-level) + (php-mode c-basic-offset) + (pike-mode c-basic-offset) + (ps-mode ps-mode-tab) + (pug-mode pug-tab-width) + (puppet-mode puppet-indent-level) + (python-mode python-indent-offset) + (ruby-mode ruby-indent-level) + (rust-mode rust-indent-offset) + (rustic-mode rustic-indent-offset) + (scala-mode scala-indent:step) + (scss-mode css-indent-offset) + (sgml-mode sgml-basic-offset) + (sh-mode sh-basic-offset + sh-indentation) + (slim-mode slim-indent-offset) + (sml-mode sml-indent-level) + (tcl-mode tcl-indent-level + tcl-continued-indent-level) + (terra-mode terra-indent-level) + (typescript-mode typescript-indent-level) + (verilog-mode verilog-indent-level + verilog-indent-level-behavioral + verilog-indent-level-declaration + verilog-indent-level-module + verilog-cexp-indent + verilog-case-indent) + (web-mode web-mode-attr-indent-offset + web-mode-attr-value-indent-offset + web-mode-code-indent-offset + web-mode-css-indent-offset + web-mode-markup-indent-offset + web-mode-sql-indent-offset + web-mode-block-padding + web-mode-script-padding + web-mode-style-padding) + (yaml-mode yaml-indent-offset)) + "Indentation retrieving variables matched to major modes used + when `doom-modeline-indent-info' is non-nil. When multiple + variables are specified for a mode, they will be tried resolved + in the given order." + :type '(alist :key-type symbol :value-type sexp) + :group 'doom-modeline) + +(defcustom doom-modeline-checker-simple-format t + "If non-nil, only display one number for checker information if applicable." + :type 'boolean + :group 'doom-modeline) + +(defcustom doom-modeline-number-limit 99 + "The maximum number displayed for notifications." + :type 'integer + :group 'doom-modeline) + +(defcustom doom-modeline-vcs-max-length 12 + "The maximum displayed length of the branch name of version control." + :type 'integer + :group 'doom-modeline) + +(defcustom doom-modeline-workspace-name t + "Whether display the workspace name. + +Non-nil to display in the mode-line." + :type 'boolean + :group 'doom-modeline) + +(defcustom doom-modeline-persp-name t + "Whether display the perspective name. + +Non-nil to display in the mode-line." + :type 'boolean + :group 'doom-modeline) + +(defcustom doom-modeline-display-default-persp-name nil + "If non nil the default perspective name is displayed in the mode-line." + :type 'boolean + :group 'doom-modeline) + +(defcustom doom-modeline-persp-icon t + "If non nil the perspective name is displayed alongside a folder icon." + :type 'boolean + :group 'doom-modeline) + +(defcustom doom-modeline-repl t + "Whether display the `repl' state. + +Non-nil to display in the mode-line." + :type 'boolean + :group 'doom-modeline) + +(defcustom doom-modeline-lsp t + "Whether display the `lsp' state. + +Non-nil to display in the mode-line." + :type 'boolean + :group 'doom-modeline) + +(defcustom doom-modeline-github nil + "Whether display the GitHub notifications. + +It requires `ghub' and `async' packages." + :type 'boolean + :group 'doom-modeline) + +(defcustom doom-modeline-github-interval 1800 ; (* 30 60) + "The interval of checking GitHub." + :type 'integer + :group 'doom-modeline) + +(defcustom doom-modeline-env-version t + "Whether display the environment version." + :type 'boolean + :group 'doom-modeline) + +(defcustom doom-modeline-modal-icon t + "Whether display the modal state icon. + +Including `evil', `overwrite', `god', `ryo' and `xah-fly-keys', etc." + :type 'boolean + :group 'doom-modeline) + +(defcustom doom-modeline-mu4e nil + "Whether display the mu4e notifications. + +It requires `mu4e-alert' package." + :type 'boolean + :group 'doom-modeline) + +(defcustom doom-modeline-gnus nil + "Whether to display notifications from gnus. + +It requires `gnus' to be setup" + :type 'boolean + :group 'doom-modeline) + +(defcustom doom-modeline-gnus-timer 2 + "The wait time in minutes before gnus fetches mail. + +If nil, don't set up a hook." + :type 'integer + :group 'doom-modeline) + +(defcustom doom-modeline-gnus-excluded-groups nil + "A list of groups to be excluded from the unread count. +Groups' names list in `gnus-newsrc-alist'`" + :type '(repeat string) + :group 'doom-modeline) + +(defcustom doom-modeline-irc t + "Whether display the irc notifications. + +It requires `circe' or `erc' package." + :type 'boolean + :group 'doom-modeline) + +(defcustom doom-modeline-irc-buffers nil + "Whether display the unread irc buffers." + :type 'boolean + :group 'doom-modeline) + +(defcustom doom-modeline-irc-stylize 'identity + "Function to stylize the irc buffer names." + :type 'function + :group 'doom-modeline) + + +;; +;; Faces +;; + +(defgroup doom-modeline-faces nil + "The faces of `doom-modeline'." + :group 'doom-modeline + :group 'faces + :link '(url-link :tag "Homepage" "https://github.com/seagle0128/doom-modeline")) + +(defface doom-modeline-spc-face + '((t (:inherit mode-line))) + "Face used for the white space." + :group 'doom-modeline-faces) + +(defface doom-modeline-vspc-face + '((t (:inherit variable-pitch))) + "Face used for the variable white space." + :group 'doom-modeline-faces) + +(defface doom-modeline-buffer-path + '((t (:inherit (mode-line-emphasis bold)))) + "Face used for the dirname part of the buffer path." + :group 'doom-modeline-faces) + +(defface doom-modeline-buffer-file + '((t (:inherit (mode-line-buffer-id bold)))) + "Face used for the filename part of the mode-line buffer path." + :group 'doom-modeline-faces) + +(defface doom-modeline-buffer-modified + '((t (:inherit (error bold) :background nil))) + "Face used for the 'unsaved' symbol in the mode-line." + :group 'doom-modeline-faces) + +(defface doom-modeline-buffer-major-mode + '((t (:inherit (mode-line-emphasis bold)))) + "Face used for the major-mode segment in the mode-line." + :group 'doom-modeline-faces) + +(defface doom-modeline-buffer-minor-mode + '((t (:inherit font-lock-doc-face :slant normal))) + "Face used for the minor-modes segment in the mode-line." + :group 'doom-modeline-faces) + +(defface doom-modeline-project-parent-dir + '((t (:inherit (font-lock-comment-face bold)))) + "Face used for the project parent directory of the mode-line buffer path." + :group 'doom-modeline-faces) + +(defface doom-modeline-project-dir + '((t (:inherit (font-lock-string-face bold)))) + "Face used for the project directory of the mode-line buffer path." + :group 'doom-modeline-faces) + +(defface doom-modeline-project-root-dir + '((t (:inherit (mode-line-emphasis bold)))) + "Face used for the project part of the mode-line buffer path." + :group 'doom-modeline-faces) + +(defface doom-modeline-highlight + '((t (:inherit mode-line-emphasis))) + "Face for bright segments of the mode-line." + :group 'doom-modeline-faces) + +(defface doom-modeline-panel + '((t (:inherit mode-line-highlight))) + "Face for 'X out of Y' segments, such as `anzu', `evil-substitute' and`iedit', etc." + :group 'doom-modeline-faces) + +(defface doom-modeline-host + '((t (:inherit italic))) + "Face for remote hosts in the mode-line." + :group 'doom-modeline-faces) + +(defface doom-modeline-input-method + '((t (:inherit (mode-line-emphasis bold)))) + "Face for input method in the mode-line." + :group 'doom-modeline-faces) + +(defface doom-modeline-input-method-alt + '((t (:inherit (font-lock-doc-face bold) :slant normal))) + "Alternative face for input method in the mode-line." + :group 'doom-modeline-faces) + +(defface doom-modeline-debug + '((t (:inherit (font-lock-doc-face bold) :slant normal))) + "Face for debug-level messages in the mode-line. Used by vcs, checker, etc." + :group 'doom-modeline-faces) + +(defface doom-modeline-info + '((t (:inherit (success bold)))) + "Face for info-level messages in the mode-line. Used by vcs, checker, etc." + :group 'doom-modeline-faces) + +(defface doom-modeline-warning + '((t (:inherit (warning bold)))) + "Face for warnings in the mode-line. Used by vcs, checker, etc." + :group 'doom-modeline-faces) + +(defface doom-modeline-urgent + '((t (:inherit (error bold)))) + "Face for errors in the mode-line. Used by vcs, checker, etc." + :group 'doom-modeline-faces) + +(defface doom-modeline-notification + '((t (:inherit doom-modeline-warning))) + "Face for notifications in the mode-line. Used by GitHub, mu4e, +etc. (also see the face `doom-modeline-unread-number')." + :group 'doom-modeline-faces) + +(defface doom-modeline-unread-number + '((t (:slant italic :weight normal))) + "Face for unread number in the mode-line. Used by GitHub, mu4e, etc." + :group 'doom-modeline-faces) + +(defface doom-modeline-bar + '((t (:inherit highlight))) + "The face used for the left-most bar in the mode-line of an active window." + :group 'doom-modeline-faces) + +(defface doom-modeline-bar-inactive + `((t (:background ,(face-foreground 'mode-line-inactive)))) + "The face used for the left-most bar in the mode-line of an inactive window." + :group 'doom-modeline-faces) + +(defface doom-modeline-debug-visual + `((((class color) (background light)) + (:background ,(face-foreground 'all-the-icons-orange))) + (((class color) (background dark)) + (:background ,(face-foreground 'all-the-icons-dorange)))) + "Face to use for the mode-line while debugging." + :group 'doom-modeline) + +(defface doom-modeline-evil-emacs-state + '((t (:inherit (font-lock-builtin-face bold)))) + "Face for the Emacs state tag in evil state indicator." + :group 'doom-modeline-faces) + +(defface doom-modeline-evil-insert-state + '((t (:inherit (font-lock-keyword-face bold)))) + "Face for the insert state tag in evil state indicator." + :group 'doom-modeline-faces) + +(defface doom-modeline-evil-motion-state + '((t :inherit (font-lock-doc-face bold) :slant normal)) + "Face for the motion state tag in evil state indicator." + :group 'doom-modeline-faces) + +(defface doom-modeline-evil-normal-state + '((t (:inherit doom-modeline-info))) + "Face for the normal state tag in evil state indicator." + :group 'doom-modeline-faces) + +(defface doom-modeline-evil-operator-state + '((t (:inherit doom-modeline-buffer-file))) + "Face for the operator state tag in evil state indicator." + :group 'doom-modeline-faces) + +(defface doom-modeline-evil-visual-state + '((t (:inherit doom-modeline-warning))) + "Face for the visual state tag in evil state indicator." + :group 'doom-modeline-faces) + +(defface doom-modeline-evil-replace-state + '((t (:inherit doom-modeline-urgent))) + "Face for the replace state tag in evil state indicator." + :group 'doom-modeline-faces) + +(defface doom-modeline-persp-name + '((t (:inherit (font-lock-comment-face italic)))) + "Face for the persp name." + :group 'doom-modeline-faces) + +(defface doom-modeline-persp-buffer-not-in-persp + '((t (:inherit (font-lock-doc-face bold italic)))) + "Face for the buffers which are not in the persp." + :group 'doom-modeline-faces) + +(defface doom-modeline-repl-success + '((t (:inherit success :weight normal))) + "Face for REPL success state." + :group 'doom-modeline-faces) + +(defface doom-modeline-repl-warning + '((t (:inherit warning :weight normal))) + "Face for REPL warning state." + :group 'doom-modeline-faces) + +(defface doom-modeline-lsp-success + '((t (:inherit success :weight normal))) + "Face for LSP success state." + :group 'doom-modeline-faces) + +(defface doom-modeline-lsp-warning + '((t (:inherit warning :weight normal))) + "Face for LSP warning state." + :group 'doom-modeline-faces) + +(defface doom-modeline-lsp-error + '((t (:inherit error :weight normal))) + "Face for LSP error state." + :group 'doom-modeline-faces) + +(defface doom-modeline-lsp-running + '((t (:inherit compilation-mode-line-run :weight normal :slant normal))) + "Face for LSP running state." + :group 'doom-modeline-faces) + +(defface doom-modeline-battery-charging + '((t (:inherit success :weight normal))) + "Face for battery charging status." + :group 'doom-modeline-faces) + +(defface doom-modeline-battery-full + '((t (:inherit success :weight normal))) + "Face for battery full status." + :group 'doom-modeline-faces) + +(defface doom-modeline-battery-normal + '((t (:inherit mode-line :weight normal))) + "Face for battery normal status." + :group 'doom-modeline-faces) + +(defface doom-modeline-battery-warning + '((t (:inherit warning :weight normal))) + "Face for battery warning status." + :group 'doom-modeline-faces) + +(defface doom-modeline-battery-critical + '((t (:inherit error :weight normal))) + "Face for battery critical status." + :group 'doom-modeline-faces) + +(defface doom-modeline-battery-error + '((t (:inherit error :weight normal))) + "Face for battery error status." + :group 'doom-modeline-faces) + +(defface doom-modeline-buffer-timemachine + '((t (:inherit (doom-modeline-buffer-file italic underline)))) + "Face for timemachine status." + :group 'doom-modeline-faces) + + +;; +;; Externals +;; + +(declare-function face-remap-remove-relative 'face-remap) +(declare-function ffip-get-project-root-directory 'find-file-in-project) +(declare-function project-roots 'project) +(declare-function projectile-project-root 'projectile) + + +;; +;; Core helpers +;; + +;; FIXME #183: Force to calculate mode-line height +;; @see https://github.com/seagle0128/doom-modeline/issues/183 +(defvar-local doom-modeline--size-hacked-p nil) +(defun doom-modeline-redisplay (&rest _) + "Call `redisplay' to trigger mode-line height calculations. + +Certain functions, including e.g. `fit-window-to-buffer', base +their size calculations on values which are incorrect if the +mode-line has a height different from that of the `default' face +and certain other calculations have not yet taken place for the +window in question. + +These calculations can be triggered by calling `redisplay' +explicitly at the appropriate time and this functions purpose +is to make it easier to do so. + +This function is like `redisplay' with non-nil FORCE argument. +It accepts an arbitrary number of arguments making it suitable +as a `:before' advice for any function. If the current buffer +has no mode-line or this function has already been called in it, +then this function does nothing." + (when (and (bound-and-true-p doom-modeline-mode) + mode-line-format + (not doom-modeline--size-hacked-p)) + (setq doom-modeline--size-hacked-p t) + (redisplay t))) +(advice-add #'fit-window-to-buffer :before #'doom-modeline-redisplay) +(advice-add #'resize-temp-buffer-window :before #'doom-modeline-redisplay) + +;; Keep `doom-modeline-current-window' up-to-date +(defun doom-modeline--get-current-window (&optional frame) + "Get the current window but should exclude the child windows." + (if (and (fboundp 'frame-parent) (frame-parent frame)) + (frame-selected-window (frame-parent frame)) + (frame-selected-window frame))) + +(defvar doom-modeline-current-window (doom-modeline--get-current-window)) + +(defun doom-modeline--active () + "Whether is an active window." + (unless (and (bound-and-true-p mini-frame-frame) + (and (frame-live-p mini-frame-frame) + (frame-visible-p mini-frame-frame))) + (and doom-modeline-current-window + (eq (doom-modeline--get-current-window) doom-modeline-current-window)))) + +(defun doom-modeline-set-selected-window (&rest _) + "Set `doom-modeline-current-window' appropriately." + (when-let ((win (doom-modeline--get-current-window))) + (unless (or (minibuffer-window-active-p win) + (and (bound-and-true-p lv-wnd) (eq lv-wnd win))) + (setq doom-modeline-current-window win)))) + +(defun doom-modeline-unset-selected-window () + "Unset `doom-modeline-current-window' appropriately." + (setq doom-modeline-current-window nil)) + +(add-hook 'after-make-frame-functions #'doom-modeline-set-selected-window) +(add-hook 'buffer-list-update-hook #'doom-modeline-set-selected-window) +(add-hook 'window-configuration-change-hook #'doom-modeline-set-selected-window) +(add-hook 'window-selection-change-functions #'doom-modeline-set-selected-window) +(add-hook 'exwm-workspace-switch-hook #'doom-modeline-set-selected-window) +(with-no-warnings + (if (boundp 'after-focus-change-function) + (progn + (defun doom-modeline-refresh-frame () + (setq doom-modeline-current-window nil) + (cl-loop for frame in (frame-list) + if (eq (frame-focus-state frame) t) + return (setq doom-modeline-current-window + (doom-modeline--get-current-window frame))) + (force-mode-line-update)) + (add-function :after after-focus-change-function #'doom-modeline-refresh-frame)) + (progn + (add-hook 'focus-in-hook #'doom-modeline-set-selected-window) + (add-hook 'focus-out-hook #'doom-modeline-unset-selected-window)))) + +;; Ensure modeline is inactive when Emacs is unfocused (and active otherwise) +(defvar doom-modeline-remap-face-cookie nil) +(defun doom-modeline-focus () + "Focus mode-line." + (when doom-modeline-remap-face-cookie + (require 'face-remap) + (face-remap-remove-relative doom-modeline-remap-face-cookie))) +(defun doom-modeline-unfocus () + "Unfocus mode-line." + (setq doom-modeline-remap-face-cookie + (face-remap-add-relative 'mode-line 'mode-line-inactive))) + +(with-no-warnings + (if (boundp 'after-focus-change-function) + (progn + (defun doom-modeline-focus-change (&rest _) + (if (frame-focus-state) + (doom-modeline-focus) + (doom-modeline-unfocus))) + (advice-add #'handle-switch-frame :after #'doom-modeline-focus-change) + (add-function :after after-focus-change-function #'doom-modeline-focus-change)) + (progn + (add-hook 'focus-in-hook #'doom-modeline-focus) + (add-hook 'focus-out-hook #'doom-modeline-unfocus)))) + + +;; +;; Core +;; + +(defvar doom-modeline-fn-alist ()) +(defvar doom-modeline-var-alist ()) + +(defmacro doom-modeline-def-segment (name &rest body) + "Defines a modeline segment NAME with BODY and byte compiles it." + (declare (indent defun) (doc-string 2)) + (let ((sym (intern (format "doom-modeline-segment--%s" name))) + (docstring (if (stringp (car body)) + (pop body) + (format "%s modeline segment" name)))) + (cond ((and (symbolp (car body)) + (not (cdr body))) + (add-to-list 'doom-modeline-var-alist (cons name (car body))) + `(add-to-list 'doom-modeline-var-alist (cons ',name ',(car body)))) + (t + (add-to-list 'doom-modeline-fn-alist (cons name sym)) + `(progn + (fset ',sym (lambda () ,docstring ,@body)) + (add-to-list 'doom-modeline-fn-alist (cons ',name ',sym)) + ,(unless (bound-and-true-p byte-compile-current-file) + `(let (byte-compile-warnings) + (byte-compile #',sym)))))))) + +(defun doom-modeline--prepare-segments (segments) + "Prepare mode-line `SEGMENTS'." + (let (forms it) + (dolist (seg segments) + (cond ((stringp seg) + (push seg forms)) + ((symbolp seg) + (cond ((setq it (cdr (assq seg doom-modeline-fn-alist))) + (push (list :eval (list it)) forms)) + ((setq it (cdr (assq seg doom-modeline-var-alist))) + (push it forms)) + ((error "%s is not a defined segment" seg)))) + ((error "%s is not a valid segment" seg)))) + (nreverse forms))) + +(defvar doom-modeline--font-width-cache nil) +(defun doom-modeline--font-width () + "Cache the font width." + (let ((attributes (face-all-attributes 'mode-line))) + (or (cdr (assoc attributes doom-modeline--font-width-cache)) + (let ((width (window-font-width nil 'mode-line))) + (push (cons attributes width) doom-modeline--font-width-cache) + width)))) + +;; Refresh the font width after setting frame parameters +;; to ensure the font width is correct. +(defun doom-modeline-refresh-font-width-cache (&rest _) + "Refresh the font width cache." + (setq doom-modeline--font-width-cache nil) + (doom-modeline--font-width)) +(add-hook 'window-setup-hook #'doom-modeline-refresh-font-width-cache) +(add-hook 'after-make-frame-functions #'doom-modeline-refresh-font-width-cache) +(add-hook 'after-setting-font-hook #'doom-modeline-refresh-font-width-cache) +(add-hook 'server-after-make-frame-hook #'doom-modeline-refresh-font-width-cache) + +(defun doom-modeline-def-modeline (name lhs &optional rhs) + "Defines a modeline format and byte-compiles it. +NAME is a symbol to identify it (used by `doom-modeline' for retrieval). +LHS and RHS are lists of symbols of modeline segments defined with +`doom-modeline-def-segment'. + +Example: + (doom-modeline-def-modeline 'minimal + '(bar matches \" \" buffer-info) + '(media-info major-mode)) + (doom-modeline-set-modeline 'minimal t)" + (let ((sym (intern (format "doom-modeline-format--%s" name))) + (lhs-forms (doom-modeline--prepare-segments lhs)) + (rhs-forms (doom-modeline--prepare-segments rhs))) + (defalias sym + (lambda () + (list lhs-forms + (propertize + " " + 'face (if (doom-modeline--active) 'mode-line 'mode-line-inactive) + 'display `((space + :align-to + (- (+ right right-fringe right-margin) + ,(* (let ((width (doom-modeline--font-width))) + (or (and (= width 1) 1) + (/ width (frame-char-width) 1.0))) + (string-width + (format-mode-line (cons "" rhs-forms)))))))) + rhs-forms)) + (concat "Modeline:\n" + (format " %s\n %s" + (prin1-to-string lhs) + (prin1-to-string rhs)))))) +(put 'doom-modeline-def-modeline 'lisp-indent-function 'defun) + +(defun doom-modeline (key) + "Return a mode-line configuration associated with KEY (a symbol). +Throws an error if it doesn't exist." + (let ((fn (intern-soft (format "doom-modeline-format--%s" key)))) + (when (functionp fn) + `(:eval (,fn))))) + +(defun doom-modeline-set-modeline (key &optional default) + "Set the modeline format. Does nothing if the modeline KEY doesn't exist. +If DEFAULT is non-nil, set the default mode-line for all buffers." + (when-let ((modeline (doom-modeline key))) + (setf (if default + (default-value 'mode-line-format) + (buffer-local-value 'mode-line-format (current-buffer))) + (list "%e" modeline)))) + + +;; +;; Helpers +;; + +(defsubst doom-modeline-spc () + "Text style with whitespace." + (propertize " " 'face (if (doom-modeline--active) + 'doom-modeline-spc-face + '(:inherit mode-line-inactive)))) + +(defsubst doom-modeline-vspc () + "Text style with icons in mode-line." + (propertize " " 'face (if (doom-modeline--active) + 'doom-modeline-vspc-face + '(:inherit (doom-modeline-vspc-face mode-line-inactive))))) + +(defun doom-modeline--font-height () + "Calculate the actual char height of the mode-line." + (let ((height (face-attribute 'mode-line :height))) + ;; WORKAROUND: Fix tall issue of 27 on Linux + ;; @see https://github.com/seagle0128/doom-modeline/issues/271 + (round + (* (if (and (>= emacs-major-version 27) + (not (eq system-type 'darwin))) + 1.0 + (if doom-modeline-icon 1.68 1.25)) + (cond ((integerp height) (/ height 10)) + ((floatp height) (* height (frame-char-height))) + (t (frame-char-height))))))) + +(defun doom-modeline--original-value (sym) + "Return the original value for SYM, if any. + +If SYM has an original value, return it in a list. Return nil +otherwise." + (let* ((orig-val-expr (get sym 'standard-value))) + (when (consp orig-val-expr) + (ignore-errors + (list + (eval (car orig-val-expr))))))) + +(defun doom-modeline-add-variable-watcher (symbol watch-function) + "Cause WATCH-FUNCTION to be called when SYMBOL is set if possible. + +See docs of `add-variable-watcher'." + (when (fboundp 'add-variable-watcher) + (add-variable-watcher symbol watch-function))) + +(defun doom-modeline-propertize-icon (icon &optional face) + "Propertize the ICON with the specified FACE. + +The face should be the first attribute, or the font family may be overridden. +So convert the face \":family XXX :height XXX :inherit XXX\" to +\":inherit XXX :family XXX :height XXX\". +See https://github.com/seagle0128/doom-modeline/issues/301." + (if doom-modeline-icon + (when-let ((props (get-text-property 0 'face icon))) + (cl-destructuring-bind (&key family height inherit &allow-other-keys) props + (propertize icon 'face `(:inherit ,(or face inherit props) + :family ,family + :height ,height)))) + (propertize icon 'face face))) + +(defun doom-modeline-icon (icon-set icon-name unicode text &rest args) + "Display icon of ICON-NAME with ARGS in mode-line. + +ICON-SET includes `octicon', `faicon', `material', `alltheicons' and `fileicon'. +UNICODE is the unicode char fallback. TEXT is the ASCII char fallback. +ARGS is same as `all-the-icons-octicon' and others." + (let ((face (or (plist-get args :face) 'mode-line))) + (or + ;; Icons + (when (and doom-modeline-icon + icon-name + (not (string-empty-p icon-name))) + (let ((icon (pcase icon-set + ('octicon + (apply #'all-the-icons-octicon icon-name args)) + ('faicon + (apply #'all-the-icons-faicon icon-name args)) + ('material + (apply #'all-the-icons-material icon-name args)) + ('alltheicon + (apply #'all-the-icons-alltheicon icon-name args)) + ('fileicon + (apply #'all-the-icons-fileicon icon-name args))))) + (doom-modeline-propertize-icon icon face))) + ;; Unicode fallback + (and doom-modeline-unicode-fallback + unicode + (not (string-empty-p unicode)) + (char-displayable-p (string-to-char unicode)) + (propertize unicode 'face face)) + ;; ASCII text + (and text (propertize text 'face face))))) + +(defun doom-modeline--create-bar-image (face width height) + "Create the bar image. +Use FACE1 for the bar, FACE2 for the background. +WIDTH and HEIGHT are the image size in pixels." + (when (and (display-graphic-p) + (image-type-available-p 'pbm)) + (propertize + " " 'display + (let ((color (or (face-background face nil t) "None"))) + (ignore-errors + (create-image + (concat (format "P1\n%i %i\n" width height) + (make-string (* width height) ?1) + "\n") + 'pbm t :foreground color :ascent 'center)))))) + +(defun doom-modeline--create-hud-image + (face1 face2 width height top-margin bottom-margin) + "Create the hud image. +Use FACE1 for the bar, FACE2 for the background. +WIDTH and HEIGHT are the image size in pixels. +TOP-MARGIN and BOTTOM-MARGIN are the size of the margin above and below the bar, +respectively." + (when (and (display-graphic-p) + (image-type-available-p 'pbm)) + (let ((min-height (min height doom-modeline-hud-min-height))) + (unless (> (- height top-margin bottom-margin) min-height) + (let ((margin (- height min-height))) + (setq top-margin (/ (* margin top-margin) (+ top-margin bottom-margin)) + bottom-margin (- margin top-margin))))) + (propertize + " " 'display + (let ((color1 (or (face-background face1 nil t) "None")) + (color2 (or (face-background face2 nil t) "None"))) + (create-image + (concat + (format "P1\n%i %i\n" width height) + (make-string (* top-margin width) ?0) + (make-string (* (- height top-margin bottom-margin) width) ?1) + (make-string (* bottom-margin width) ?0) + "\n") + 'pbm t :foreground color1 :background color2 :ascent 'center))))) + +;; Check whether `window-total-width' is smaller than the limit +(defvar-local doom-modeline--limited-width-p nil) +(defun doom-modeline-window-size-change-function (&rest _) + "Function for `window-size-change-functions'." + (setq doom-modeline--limited-width-p + (and (numberp doom-modeline-window-width-limit) + (<= (+ (window-total-width) + (or scroll-bar-width 0) + (or left-fringe-width 0) + (or right-fringe-width 0) + (or left-margin-width 0) + (or right-margin-width 0)) + doom-modeline-window-width-limit)))) + +(add-hook 'window-size-change-functions #'doom-modeline-window-size-change-function) +(add-hook 'buffer-list-update-hook #'doom-modeline-window-size-change-function) + +(defvar-local doom-modeline--project-root nil) +(defun doom-modeline--project-root () + "Get the path to the root of your project. +Return nil if no project was found." + (or doom-modeline--project-root + (setq doom-modeline--project-root + (pcase doom-modeline-project-detection + ('ffip + (when (fboundp 'ffip-get-project-root-directory) + (let ((inhibit-message t)) + (ffip-get-project-root-directory)))) + ('projectile + (when (fboundp 'projectile-project-root) + (projectile-project-root))) + ('project + (when (fboundp 'project-current) + (when-let ((project (project-current))) + (car (project-roots project))))))))) + +(defun doom-modeline-project-p () + "Check if the file is in a project." + (doom-modeline--project-root)) + +(defun doom-modeline-project-root () + "Get the path to the root of your project. +Return `default-directory' if no project was found." + (or (doom-modeline--project-root) default-directory)) + +;; HACK: fix invalid-regexp "Trailing backslash" while handling $HOME on Windows +(defun doom-modeline-shrink-path--dirs-internal (full-path &optional truncate-all) + "Return fish-style truncated string based on FULL-PATH. +Optional parameter TRUNCATE-ALL will cause the function to truncate the last +directory too." + (let* ((home (expand-file-name "~")) + (path (replace-regexp-in-string + (s-concat "^" home) "~" full-path)) + (split (s-split "/" path 'omit-nulls)) + (split-len (length split)) + shrunk) + (->> split + (--map-indexed (if (= it-index (1- split-len)) + (if truncate-all (shrink-path--truncate it) it) + (shrink-path--truncate it))) + (s-join "/") + (setq shrunk)) + (s-concat (unless (s-matches? (rx bos (or "~" "/")) shrunk) "/") + shrunk + (unless (s-ends-with? "/" shrunk) "/")))) +(advice-add #'shrink-path--dirs-internal :override #'doom-modeline-shrink-path--dirs-internal) + +(defun doom-modeline-buffer-file-name () + "Propertized variable `buffer-file-name' based on `doom-modeline-buffer-file-name-style'." + (let* ((buffer-file-name (file-local-name (or (buffer-file-name (buffer-base-buffer)) ""))) + (buffer-file-truename (file-local-name + (or buffer-file-truename (file-truename buffer-file-name) ""))) + (file-name + (pcase doom-modeline-buffer-file-name-style + ('auto + (if (doom-modeline-project-p) + (doom-modeline--buffer-file-name buffer-file-name buffer-file-truename nil nil 'hide) + (propertize "%b" 'face 'doom-modeline-buffer-file))) + ('truncate-upto-project + (doom-modeline--buffer-file-name buffer-file-name buffer-file-truename 'shrink)) + ('truncate-from-project + (doom-modeline--buffer-file-name buffer-file-name buffer-file-truename nil 'shrink)) + ('truncate-with-project + (doom-modeline--buffer-file-name buffer-file-name buffer-file-truename 'shrink 'shink 'hide)) + ('truncate-except-project + (doom-modeline--buffer-file-name buffer-file-name buffer-file-truename 'shrink 'shink)) + ('truncate-upto-root + (doom-modeline--buffer-file-name-truncate buffer-file-name buffer-file-truename)) + ('truncate-all + (doom-modeline--buffer-file-name-truncate buffer-file-name buffer-file-truename t)) + ('truncate-nil + (doom-modeline--buffer-file-name buffer-file-name buffer-file-truename)) + ('relative-to-project + (doom-modeline--buffer-file-name-relative buffer-file-name buffer-file-truename)) + ('relative-from-project + (doom-modeline--buffer-file-name buffer-file-name buffer-file-truename nil nil 'hide)) + ('file-name + (propertize (file-name-nondirectory buffer-file-name) + 'face 'doom-modeline-buffer-file)) + ((or 'buffer-name _) + (propertize "%b" 'face 'doom-modeline-buffer-file))))) + (propertize (if (string-empty-p file-name) + (propertize "%b" 'face 'doom-modeline-buffer-file) + file-name) + 'mouse-face 'mode-line-highlight + 'help-echo (concat buffer-file-truename + (unless (string= (file-name-nondirectory buffer-file-truename) + (buffer-name)) + (concat "\n" (buffer-name))) + "\nmouse-1: Previous buffer\nmouse-3: Next buffer") + 'local-map mode-line-buffer-identification-keymap))) + +(defun doom-modeline--buffer-file-name-truncate (file-path true-file-path &optional truncate-tail) + "Propertized variable `buffer-file-name' that truncates every dir along path. +If TRUNCATE-TAIL is t also truncate the parent directory of the file." + (let ((dirs (shrink-path-prompt (file-name-directory true-file-path)))) + (if (null dirs) + (propertize "%b" 'face 'doom-modeline-buffer-file) + (let ((dirname (car dirs)) + (basename (cdr dirs))) + (concat (propertize (concat dirname + (if truncate-tail (substring basename 0 1) basename) + "/") + 'face 'doom-modeline-project-root-dir) + (propertize (file-name-nondirectory file-path) + 'face 'doom-modeline-buffer-file)))))) + +(defun doom-modeline--buffer-file-name-relative (_file-path true-file-path &optional include-project) + "Propertized variable `buffer-file-name' showing directories relative to project's root only." + (let ((root (file-local-name (doom-modeline-project-root)))) + (if (null root) + (propertize "%b" 'face 'doom-modeline-buffer-file) + (let ((relative-dirs (file-relative-name (file-name-directory true-file-path) + (if include-project (concat root "../") root)))) + (and (equal "./" relative-dirs) (setq relative-dirs "")) + (concat (propertize relative-dirs 'face 'doom-modeline-buffer-path) + (propertize (file-name-nondirectory true-file-path) + 'face 'doom-modeline-buffer-file)))))) + +(defun doom-modeline--buffer-file-name (file-path + _true-file-path + &optional + truncate-project-root-parent + truncate-project-relative-path + hide-project-root-parent) + "Propertized variable `buffer-file-name' given by FILE-PATH. +If TRUNCATE-PROJECT-ROOT-PARENT is non-nil will be saved by truncating project +root parent down fish-shell style. + +Example: + ~/Projects/FOSS/emacs/lisp/comint.el => ~/P/F/emacs/lisp/comint.el + +If TRUNCATE-PROJECT-RELATIVE-PATH is non-nil will be saved by truncating project +relative path down fish-shell style. + +Example: + ~/Projects/FOSS/emacs/lisp/comint.el => ~/Projects/FOSS/emacs/l/comint.el + +If HIDE-PROJECT-ROOT-PARENT is non-nil will hide project root parent. + +Example: + ~/Projects/FOSS/emacs/lisp/comint.el => emacs/lisp/comint.el" + (let ((project-root (file-local-name (doom-modeline-project-root)))) + (concat + ;; Project root parent + (unless hide-project-root-parent + (when-let (root-path-parent + (file-name-directory (directory-file-name project-root))) + (propertize + (if (and truncate-project-root-parent + (not (string-empty-p root-path-parent)) + (not (string= root-path-parent "/"))) + (shrink-path--dirs-internal root-path-parent t) + (abbreviate-file-name root-path-parent)) + 'face 'doom-modeline-project-parent-dir))) + ;; Project directory + (propertize + (concat (file-name-nondirectory (directory-file-name project-root)) "/") + 'face 'doom-modeline-project-dir) + ;; relative path + (propertize + (when-let (relative-path (file-relative-name + (or (file-name-directory file-path) "./") + project-root)) + (if (string= relative-path "./") + "" + (if truncate-project-relative-path + (substring (shrink-path--dirs-internal relative-path t) 1) + relative-path))) + 'face 'doom-modeline-buffer-path) + ;; File name + (propertize (file-name-nondirectory file-path) + 'face 'doom-modeline-buffer-file)))) + +(provide 'doom-modeline-core) + +;;; doom-modeline-core.el ends here diff --git a/.emacs.d/elpa/doom-modeline-20210608.516/doom-modeline-core.elc b/.emacs.d/elpa/doom-modeline-20210608.516/doom-modeline-core.elc new file mode 100644 index 0000000..6255f87 Binary files /dev/null and b/.emacs.d/elpa/doom-modeline-20210608.516/doom-modeline-core.elc differ diff --git a/.emacs.d/elpa/doom-modeline-20210608.516/doom-modeline-env.el b/.emacs.d/elpa/doom-modeline-20210608.516/doom-modeline-env.el new file mode 100644 index 0000000..394e41c --- /dev/null +++ b/.emacs.d/elpa/doom-modeline-20210608.516/doom-modeline-env.el @@ -0,0 +1,277 @@ +;;; doom-modeline-env.el --- A environment parser for doom-modeline -*- lexical-binding: t -*- + +;; Copyright (C) 2019-2020 Justin Barclay, Vincent Zhang + +;; This file is not part of GNU Emacs. + +;; +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License as +;; published by the Free Software Foundation; either version 2, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; see the file COPYING. If not, write to +;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth +;; Floor, Boston, MA 02110-1301, USA. +;; +;;; Commentary: +;; +;; Parse programming environment. +;; + +;;; Code: + +(require 'subr-x) +(require 'doom-modeline-core) + + +;; Externals +(defvar python-shell-interpreter) + + +;; Customizations + +(defgroup doom-modeline-env nil + "The environment parser for doom-modeline." + :group 'doom-modeline + :link '(url-link :tag "Homepage" "https://github.com/seagle0128/doom-modeline")) + +(defcustom doom-modeline-env-load-string "..." + "What to display as the version while a new one is being loaded." + :type 'string + :group 'doom-modeline-env) + +(defcustom doom-modeline-before-update-env-hook nil + "Hooks that run before the modeline version string is updated." + :type 'hook + :group 'doom-modeline-env) + +(defcustom doom-modeline-after-update-env-hook nil + "Hooks that run after the modeline version string is updated." + :type 'hook + :group 'doom-modeline-env) + + +;; Variables + +;; Show version string for multi-version managers like rvm, rbenv, pyenv, etc. +(defvar-local doom-modeline-env--version nil + "The version to display with major-mode in mode-line. +Example: \"2.6.0\"") + +(defvar-local doom-modeline-env--command nil + "A program that we're looking to extract version information from. +Example: \"ruby\"") + +(defvar-local doom-modeline-env--command-args nil + "A list of arguments for the command to extract the version from. +Example: '(\"--version\") ") + +(defvar-local doom-modeline-env--parser nil + "A function that returns version number from a command --version (or similar). +Example: 'doom-modeline-env--ruby") + + +;; Functions & Macros + +(defun doom-modeline-update-env () + "Update environment info on mode-line." + (when (and doom-modeline-env-version + doom-modeline-env--command + (executable-find doom-modeline-env--command) + doom-modeline-env--command-args + doom-modeline-env--parser) + (let ((default-directory (doom-modeline-project-root)) + (buffer (current-buffer))) + (run-hooks 'doom-modeline-before-update-env-hook) + (setq doom-modeline-env--version doom-modeline-env-load-string) + (doom-modeline-env--get + doom-modeline-env--command + doom-modeline-env--command-args + (lambda (prog-version) + (with-current-buffer buffer + (setq doom-modeline-env--version + (funcall doom-modeline-env--parser prog-version)) + (run-hooks 'doom-modeline-after-update-env-hook))))))) + +(add-hook 'find-file-hook #'doom-modeline-update-env) +(with-no-warnings + (if (boundp 'after-focus-change-function) + (add-function + :after after-focus-change-function + (lambda () + (if (frame-focus-state) + (doom-modeline-update-env)))) + (add-hook 'focus-in-hook #'doom-modeline-update-env))) + +(defun doom-modeline-env--get (prog args callback) + "Start a sub process using PROG and apply the ARGS to the sub process. +Once it receives information from STDOUT, it closes off the subprocess and +passes on the information into the CALLBACK. +Example: + (doom-modeline-env--get + \"ruby\" + '(\"--version\") + (lambda (line) + (message (doom-modeline-parser--ruby line)))" + (let ((proc (apply 'start-process + ;; Flaten process-args into a single list so we can handle + ;; variadic length args + (append + (list "doom-modeline-env" nil prog) + args))) + (parser callback)) + (set-process-filter proc + (lambda (_proc line) + (ignore-errors + (funcall parser line)))))) + +(cl-defmacro doom-modeline-def-env (name &key hooks command parser) + "Defines a handler for updating & displaying a version string for a language. + +NAME is an unquoted symbol representing the handler's unique ID. +HOOKS is a list of hook symbols where this handler should be triggered. +COMMAND should be a function that returns a shell command and its arguments (as + a list). It is run on HOOKS. It takes no arguments. +PARSER should be a function for parsing COMMAND's output line-by-line, to + extract the version string." + (declare (indent defun)) + (unless (and hooks command parser) + (error "'%s' env is missing either :hooks, :command or :parser" name)) + (let ((parse-fn (intern (format "doom-modeline-env--%s-parse" name))) + (action-fn (intern (format "doom-modeline-env--%s-args" name))) + (setup-fn (intern (format "doom-modeline-env-setup-%s" name))) + (update-fn (intern (format "doom-modeline-env-update-%s" name))) + (enable-var (intern (format "doom-modeline-env-enable-%s" name))) + (command-var (intern (format "doom-modeline-env-%s-command" name))) + (parser-var (intern (format "doom-modeline-env-%s-parser-fn" name))) + (exe-var (intern (format "doom-modeline-env-%s-executable" name)))) + (macroexp-progn + `((defcustom ,enable-var t + ,(format "Whether to display the version string for %s buffers." name) + :type 'boolean + :group 'doom-modeline-env) + (defvar ,command-var ',action-fn + ,(concat "A function that returns the shell command and arguments (as a list) to\n" + "produce a version string.")) + (defvar ,parser-var ',parse-fn + ,(format "The function to parse each line of `%s'\'s output." command-var)) + (defcustom ,exe-var nil + ,(format (concat "What executable to use for the version indicator in %s buffers.\n\n" + "If nil, the default binary for this language is used.") + name) + :type 'string + :group 'doom-modeline-env) + (defalias ',parse-fn ,parser + (format "The line parser for %s buffers.\n\nUsed by `%s'." + ',name ',update-fn)) + (defalias ',action-fn ,command + (format "The command resolver for %s buffers.\n\nUsed by `%s'." + ',name ',update-fn)) + (defalias ',setup-fn + (lambda () + (if enable-local-variables + (add-hook 'hack-local-variables-hook #',update-fn nil t) + (,update-fn))) + (format "Prepares the modeline to later display the %s version string." + ',name)) + (defalias ',update-fn + (lambda () + (when ,enable-var + (when-let* ((command-list (funcall ,command-var)) + (exe (executable-find (car command-list)))) + (setq doom-modeline-env--command exe + doom-modeline-env--command-args (cdr command-list) + doom-modeline-env--parser ,parser-var) + (doom-modeline-update-env)))) + (format "Updates the %s version string in the modeline." ',name)) + (let ((hooks ',(eval hooks))) + (dolist (hook (if (listp hooks) hooks (list hooks))) + (add-hook hook #',setup-fn))))))) + + +;; Bootstrap +;; Versions, support Python, Ruby, Perl and Golang, etc. + +;;;###autoload (autoload 'doom-modeline-env-setup-python "doom-modeline-env") +(doom-modeline-def-env python + :hooks 'python-mode-hook + :command (lambda () (cond ((and (fboundp 'pipenv-project-p) + (pipenv-project-p)) + (list "pipenv" "run" + (or doom-modeline-env-python-executable + python-shell-interpreter + "python") + "--version")) + ((executable-find "pyenv") (list "pyenv" "version-name")) + ((list (or doom-modeline-env-python-executable + python-shell-interpreter + "python") + "--version")))) + :parser (lambda (line) (let ((version (split-string line))) + (if (>= (length version) 2) + (cadr version) + (car version))))) + +;;;###autoload (autoload 'doom-modeline-env-setup-ruby "doom-modeline-env") +(doom-modeline-def-env ruby + :hooks '(ruby-mode-hook enh-ruby-mode-hook) + :command (lambda () (list (or doom-modeline-env-ruby-executable "ruby") "--version")) + :parser (lambda (line) + (car (split-string + (cadr + (split-string line)) + "p")))) + +;;;###autoload (autoload 'doom-modeline-env-setup-perl "doom-modeline-env") +(doom-modeline-def-env perl + :hooks 'perl-mode-hook + :command (lambda () (list (or doom-modeline-env-perl-executable "perl") "--version")) + :parser (lambda (line) + (cadr + (split-string + (car + (split-string + (cadr + (split-string line "(")) + ")")) + "v")))) + +;;;###autoload (autoload 'doom-modeline-env-setup-go "doom-modeline-env") +(doom-modeline-def-env go + :hooks 'go-mode-hook + :command (lambda () (list (or doom-modeline-env-go-executable "go") "version")) + :parser (lambda (line) + (cadr + (split-string + (cadr + (cdr + (split-string line))) + "go")))) + +;;;###autoload (autoload 'doom-modeline-env-setup-elixir "doom-modeline-env") +(doom-modeline-def-env elixir + :hooks 'elixir-mode-hook + :command (lambda () (list (or doom-modeline-env-elixir-executable "iex") "--version")) + :parser (lambda (line) (cadr (split-string line)))) + +;;;###autoload (autoload 'doom-modeline-env-setup-rust "doom-modeline-env") +(doom-modeline-def-env rust + :hooks 'rust-mode-hook + :command (lambda () (list (or doom-modeline-env-rust-executable "rustc") "--version")) + :parser (lambda (line) + (car + (split-string + (cadr + (split-string line)) + "-")))) + +(provide 'doom-modeline-env) + +;;; doom-modeline-env.el ends here diff --git a/.emacs.d/elpa/doom-modeline-20210608.516/doom-modeline-env.elc b/.emacs.d/elpa/doom-modeline-20210608.516/doom-modeline-env.elc new file mode 100644 index 0000000..6d20c4b Binary files /dev/null and b/.emacs.d/elpa/doom-modeline-20210608.516/doom-modeline-env.elc differ diff --git a/.emacs.d/elpa/doom-modeline-20210608.516/doom-modeline-pkg.el b/.emacs.d/elpa/doom-modeline-20210608.516/doom-modeline-pkg.el new file mode 100644 index 0000000..3ad113b --- /dev/null +++ b/.emacs.d/elpa/doom-modeline-20210608.516/doom-modeline-pkg.el @@ -0,0 +1,15 @@ +(define-package "doom-modeline" "20210608.516" "A minimal and modern mode-line" + '((emacs "25.1") + (all-the-icons "2.2.0") + (shrink-path "0.2.0") + (dash "2.11.0")) + :commit "d514f43679513819b37333a64a44523f239150b6" :authors + '(("Vincent Zhang" . "seagle0128@gmail.com")) + :maintainer + '("Vincent Zhang" . "seagle0128@gmail.com") + :keywords + '("faces" "mode-line") + :url "https://github.com/seagle0128/doom-modeline") +;; Local Variables: +;; no-byte-compile: t +;; End: diff --git a/.emacs.d/elpa/doom-modeline-20210608.516/doom-modeline-segments.el b/.emacs.d/elpa/doom-modeline-20210608.516/doom-modeline-segments.el new file mode 100644 index 0000000..dc7557c --- /dev/null +++ b/.emacs.d/elpa/doom-modeline-20210608.516/doom-modeline-segments.el @@ -0,0 +1,2896 @@ +;;; doom-modeline-segments.el --- The segments for doom-modeline -*- lexical-binding: t; -*- + +;; Copyright (C) 2018-2020 Vincent Zhang + +;; This file is not part of GNU Emacs. + +;; +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License as +;; published by the Free Software Foundation; either version 2, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; see the file COPYING. If not, write to +;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth +;; Floor, Boston, MA 02110-1301, USA. +;; + +;;; Commentary: +;; +;; The segments for doom-modeline. +;; Use `doom-modeline-def-segment' to create a new segment. +;; + +;;; Code: + +(require 'all-the-icons) +(require 'cl-lib) +(require 'seq) +(require 'subr-x) +(require 'doom-modeline-core) +(require 'doom-modeline-env) + + +;; +;; Externals +;; + +(defvar Info-current-file) +(defvar Info-current-node) +(defvar Info-mode-line-node-keymap) +(defvar anzu--cached-count) +(defvar anzu--current-position) +(defvar anzu--overflow-p) +(defvar anzu--state) +(defvar anzu--total-matched) +(defvar anzu-cons-mode-line-p) +(defvar aw-keys) +(defvar battery-echo-area-format) +(defvar battery-load-critical) +(defvar battery-mode-line-format) +(defvar battery-mode-line-limit) +(defvar battery-status-function) +(defvar boon-command-state) +(defvar boon-insert-state) +(defvar boon-off-state) +(defvar boon-special-state) +(defvar edebug-execution-mode) +(defvar eglot--managed-mode) +(defvar erc-modified-channels-alist) +(defvar evil-ex-active-highlights-alist) +(defvar evil-ex-argument) +(defvar evil-ex-range) +(defvar evil-mc-frozen) +(defvar evil-state) +(defvar evil-visual-beginning) +(defvar evil-visual-end) +(defvar evil-visual-selection) +(defvar flycheck-current-errors) +(defvar flycheck-mode-menu-map) +(defvar flymake--backend-state) +(defvar flymake--mode-line-format) +(defvar flymake-menu) +(defvar gnus-newsrc-alist) +(defvar gnus-newsrc-hashtb) +(defvar grip--process) +(defvar helm--mode-line-display-prefarg) +(defvar iedit-occurrences-overlays) +(defvar meow--indicator) +(defvar minions-direct) +(defvar minions-mode-line-minor-modes-map) +(defvar mlscroll-minimum-current-width) +(defvar mlscroll-right-align) +(defvar mu4e-alert-mode-line) +(defvar mu4e-alert-modeline-formatter) +(defvar nyan-minimum-window-width) +(defvar objed--obj-state) +(defvar objed--object) +(defvar objed-modeline-setup-func) +(defvar persp-nil-name) +(defvar phi-replace--mode-line-format) +(defvar phi-search--selection) +(defvar phi-search-mode-line-format) +(defvar poke-line-minimum-window-width) +(defvar rcirc-activity) +(defvar symbol-overlay-keywords-alist) +(defvar symbol-overlay-temp-symbol) +(defvar text-scale-mode-amount) +(defvar tracking-buffers) +(defvar winum-auto-setup-mode-line) +(defvar xah-fly-insert-state-q) + +(declare-function anzu--reset-status 'anzu) +(declare-function anzu--where-is-here 'anzu) +(declare-function async-inject-variables 'async) +(declare-function async-start 'async) +(declare-function avy-traverse 'avy) +(declare-function avy-tree 'avy) +(declare-function aw-update 'ace-window) +(declare-function aw-window-list 'ace-window) +(declare-function battery-format 'battery) +(declare-function battery-update 'battery) +(declare-function boon-modeline-string 'boon) +(declare-function boon-state-string 'boon) +(declare-function cider--connection-info 'cider) +(declare-function cider-connected-p 'cider) +(declare-function cider-current-repl 'cider) +(declare-function cider-jack-in 'cider) +(declare-function cider-quit 'cider) +(declare-function dap--cur-session 'dap-mode) +(declare-function dap--debug-session-name 'dap-mode) +(declare-function dap--debug-session-state 'dap-mode) +(declare-function dap--session-running 'dap-mode) +(declare-function dap-debug-recent 'dap-mode) +(declare-function dap-disconnect 'dap-mode) +(declare-function dap-hydra 'dap-hydra) +(declare-function edebug-help 'edebug) +(declare-function edebug-next-mode 'edebug) +(declare-function edebug-stop 'edebug) +(declare-function eglot 'eglot) +(declare-function eglot--major-mode 'eglot) +(declare-function eglot--project-nickname 'eglot) +(declare-function eglot--spinner 'eglot) +(declare-function eglot-clear-status 'eglot) +(declare-function eglot-current-server 'eglot) +(declare-function eglot-events-buffer 'eglot) +(declare-function eglot-forget-pending-continuations 'eglot) +(declare-function eglot-reconnect 'eglot) +(declare-function eglot-shutdown 'eglot) +(declare-function eglot-stderr-buffer 'eglot) +(declare-function erc-switch-to-buffer 'erc) +(declare-function erc-track-switch-buffer 'erc-track) +(declare-function evil-delimited-arguments 'evil-common) +(declare-function evil-emacs-state-p 'evil-states) +(declare-function evil-force-normal-state 'evil-commands) +(declare-function evil-insert-state-p 'evil-states) +(declare-function evil-motion-state-p 'evil-states) +(declare-function evil-normal-state-p 'evil-states) +(declare-function evil-operator-state-p 'evil-states) +(declare-function evil-replace-state-p 'evil-states) +(declare-function evil-state-property 'evil-common) +(declare-function evil-visual-state-p 'evil-states) +(declare-function eyebrowse--get 'eyebrowse) +(declare-function face-remap-remove-relative 'face-remap) +(declare-function fancy-narrow-active-p 'fancy-narrow) +(declare-function flycheck-buffer 'flycheck) +(declare-function flycheck-count-errors 'flycheck) +(declare-function flycheck-error-level-compilation-level 'flycheck) +(declare-function flycheck-list-errors 'flycheck) +(declare-function flycheck-next-error 'flycheck) +(declare-function flycheck-previous-error 'flycheck) +(declare-function flymake--backend-state-diags 'flymake) +(declare-function flymake--diag-type 'flymake) +(declare-function flymake--handle-report 'flymake) +(declare-function flymake--lookup-type-property 'flymake) +(declare-function flymake-disabled-backends 'flymake) +(declare-function flymake-goto-next-error 'flymake) +(declare-function flymake-goto-prev-error 'flymake) +(declare-function flymake-reporting-backends 'flymake) +(declare-function flymake-running-backends 'flymake) +(declare-function flymake-show-diagnostics-buffer 'flymake) +(declare-function flymake-start 'flymake) +(declare-function gnus-demon-add-handler 'gnus-demon) +(declare-function grip--preview-url 'grip-mode) +(declare-function grip-browse-preview 'grip-mode) +(declare-function grip-restart-preview 'grip-mode) +(declare-function grip-stop-preview 'grip-mode) +(declare-function helm-candidate-number-at-point 'helm) +(declare-function helm-get-candidate-number 'helm) +(declare-function iedit-find-current-occurrence-overlay 'iedit-lib) +(declare-function iedit-prev-occurrence 'iedit-lib) +(declare-function image-get-display-property 'image-mode) +(declare-function jsonrpc--request-continuations 'jsonrpc) +(declare-function jsonrpc-last-error 'jsonrpc) +(declare-function lsp--workspace-print 'lsp-mode) +(declare-function lsp-describe-session 'lsp-mode) +(declare-function lsp-workspace-folders-open 'lsp-mode) +(declare-function lsp-workspace-restart 'lsp-mode) +(declare-function lsp-workspace-shutdown 'lsp-mode) +(declare-function lsp-workspaces 'lsp-mode) +(declare-function lv-message 'lv) +(declare-function mc/num-cursors 'multiple-cursors-core) +(declare-function mlscroll-mode-line 'mlscroll) +(declare-function mu4e-alert-default-mode-line-formatter 'mu4e-alert) +(declare-function mu4e-alert-enable-mode-line-display 'mu4e-alert) +(declare-function nyan-create 'nyan-mode) +(declare-function org-edit-src-save 'org-src) +(declare-function parrot-create 'parrot) +(declare-function pdf-cache-number-of-pages 'pdf-cache) +(declare-function persp-add-buffer 'persp-mode) +(declare-function persp-contain-buffer-p 'persp-mode) +(declare-function persp-switch 'persp-mode) +(declare-function phi-search--initialize 'phi-search) +(declare-function poke-line-create 'poke-line) +(declare-function popup-create 'popup) +(declare-function popup-delete 'popup) +(declare-function rcirc-next-active-buffer 'rcirc) +(declare-function rcirc-short-buffer-name 'rcirc) +(declare-function rcirc-switch-to-server-buffer 'rcirc) +(declare-function rcirc-window-configuration-change 'rcirc) +(declare-function rime--should-enable-p 'rime) +(declare-function rime--should-inline-ascii-p 'rime) +(declare-function symbol-overlay-assoc 'symbol-overlay) +(declare-function symbol-overlay-get-list 'symbol-overlay) +(declare-function symbol-overlay-get-symbol 'symbol-overlay) +(declare-function symbol-overlay-rename 'symbol-overlay) +(declare-function tab-bar--current-tab 'tab-bar) +(declare-function tab-bar--current-tab-index 'tab-bar) +(declare-function tracking-next-buffer 'tracking) +(declare-function tracking-previous-buffer 'tracking) +(declare-function tracking-shorten 'tracking) +(declare-function undo-tree-redo-1 'undo-tree) +(declare-function undo-tree-undo-1 'undo-tree) +(declare-function warning-numeric-level 'warnings) +(declare-function window-numbering-clear-mode-line 'window-numbering) +(declare-function window-numbering-get-number-string 'window-numbering) +(declare-function window-numbering-install-mode-line 'window-numbering) +(declare-function winum--clear-mode-line 'winum) +(declare-function winum--install-mode-line 'winum) +(declare-function winum-get-number-string 'winum) + + + +;; +;; Buffer information +;; + +(defvar-local doom-modeline--buffer-file-icon nil) +(defun doom-modeline-update-buffer-file-icon (&rest _) + "Update file icon in mode-line." + (setq doom-modeline--buffer-file-icon + (when (and doom-modeline-icon doom-modeline-major-mode-icon) + (let ((icon (all-the-icons-icon-for-buffer))) + (propertize (if (or (null icon) (symbolp icon)) + (doom-modeline-icon 'faicon "file-o" nil nil + :face 'all-the-icons-dsilver + :height 0.9 + :v-adjust 0.0) + icon) + 'help-echo (format "Major-mode: %s" (format-mode-line mode-name)) + 'display '(raise -0.135)))))) +(add-hook 'find-file-hook #'doom-modeline-update-buffer-file-icon) +(add-hook 'after-change-major-mode-hook #'doom-modeline-update-buffer-file-icon) +(add-hook 'clone-indirect-buffer-hook #'doom-modeline-update-buffer-file-icon) + +(doom-modeline-add-variable-watcher + 'doom-modeline-icon + (lambda (_sym val op _where) + (when (eq op 'set) + (setq doom-modeline-icon val) + (dolist (buf (buffer-list)) + (with-current-buffer buf + (doom-modeline-update-buffer-file-icon)))))) + +(defun doom-modeline-buffer-file-state-icon (icon unicode text face) + "Displays an ICON of buffer state with FACE. +UNICODE and TEXT are the alternatives if it is not applicable. +Uses `all-the-icons-material' to fetch the icon." + (doom-modeline-icon 'material icon unicode text + :face face + :height 1.1 + :v-adjust -0.225)) + +(defvar-local doom-modeline--buffer-file-state-icon nil) +(defun doom-modeline-update-buffer-file-state-icon (&rest _) + "Update the buffer or file state in mode-line." + (setq doom-modeline--buffer-file-state-icon + (when doom-modeline-buffer-state-icon + (ignore-errors + (concat + (cond (buffer-read-only + (doom-modeline-buffer-file-state-icon + "lock" "🔒" "%1*" `(:inherit doom-modeline-warning + :weight ,(if doom-modeline-icon + 'normal + 'bold)))) + ((and buffer-file-name (buffer-modified-p) + doom-modeline-buffer-modification-icon) + (doom-modeline-buffer-file-state-icon + "save" "💾" "%1*" `(:inherit doom-modeline-buffer-modified + :weight ,(if doom-modeline-icon + 'normal + 'bold)))) + ((and buffer-file-name + (not (file-remote-p buffer-file-name)) ; Avoid freezing while connection is lost + (not (file-exists-p buffer-file-name))) + (doom-modeline-buffer-file-state-icon + "do_not_disturb_alt" "🚫" "!" 'doom-modeline-urgent)) + (t "")) + (when (or (buffer-narrowed-p) + (and (bound-and-true-p fancy-narrow-mode) + (fancy-narrow-active-p)) + (bound-and-true-p dired-narrow-mode)) + (doom-modeline-buffer-file-state-icon + "vertical_align_center" "↕" "><" 'doom-modeline-warning))))))) + +(defvar-local doom-modeline--buffer-file-name nil) +(defun doom-modeline-update-buffer-file-name (&rest _) + "Update buffer file name in mode-line." + (setq doom-modeline--buffer-file-name + (ignore-errors + (save-match-data + (if buffer-file-name + (doom-modeline-buffer-file-name) + (propertize "%b" + 'face 'doom-modeline-buffer-file + 'mouse-face 'mode-line-highlight + 'help-echo "Buffer name +mouse-1: Previous buffer\nmouse-3: Next buffer" + 'local-map mode-line-buffer-identification-keymap)))))) +(add-hook 'find-file-hook #'doom-modeline-update-buffer-file-name) +(add-hook 'after-save-hook #'doom-modeline-update-buffer-file-name) +(add-hook 'clone-indirect-buffer-hook #'doom-modeline-update-buffer-file-name) +(add-hook 'evil-insert-state-exit-hook #'doom-modeline-update-buffer-file-name) +(advice-add #'not-modified :after #'doom-modeline-update-buffer-file-name) +(advice-add #'rename-buffer :after #'doom-modeline-update-buffer-file-name) +(advice-add #'set-visited-file-name :after #'doom-modeline-update-buffer-file-name) +(advice-add #'pop-to-buffer :after #'doom-modeline-update-buffer-file-name) +(advice-add #'undo :after #'doom-modeline-update-buffer-file-name) +(advice-add #'undo-tree-undo-1 :after #'doom-modeline-update-buffer-file-name) +(advice-add #'undo-tree-redo-1 :after #'doom-modeline-update-buffer-file-name) +(advice-add #'fill-paragraph :after #'doom-modeline-update-buffer-file-name) +(advice-add #'popup-create :after #'doom-modeline-update-buffer-file-name) +(advice-add #'popup-delete :after #'doom-modeline-update-buffer-file-name) +(advice-add #'org-edit-src-save :after #'doom-modeline-update-buffer-file-name) +(advice-add #'symbol-overlay-rename :after #'doom-modeline-update-buffer-file-name) + +(doom-modeline-add-variable-watcher + 'doom-modeline-buffer-file-name-style + (lambda (_sym val op _where) + (when (eq op 'set) + (setq doom-modeline-buffer-file-name-style val) + (dolist (buf (buffer-list)) + (with-current-buffer buf + (when buffer-file-name + (doom-modeline-update-buffer-file-name))))))) + +(defsubst doom-modeline--buffer-mode-icon () + "The icon of the current major mode." + (when (and doom-modeline-icon doom-modeline-major-mode-icon) + (when-let ((icon (or doom-modeline--buffer-file-icon + (doom-modeline-update-buffer-file-icon)))) + (concat + (let ((active (doom-modeline--active))) + (if (and active doom-modeline-major-mode-color-icon) + icon + (doom-modeline-propertize-icon icon (if active + 'mode-line + 'mode-line-inactive)))) + (doom-modeline-vspc))))) + +(defsubst doom-modeline--buffer-state-icon () + "The icon of the current buffer state." + (when doom-modeline-buffer-state-icon + (when-let ((icon (doom-modeline-update-buffer-file-state-icon))) + (concat + (if (doom-modeline--active) + icon + (doom-modeline-propertize-icon icon 'mode-line-inactive)) + (doom-modeline-vspc))))) + +(defsubst doom-modeline--buffer-name () + "The current buffer name." + ;; Only display the buffer name if the window is small, but doesn't need to + ;; respect file-name style. + (if (and (not (eq doom-modeline-buffer-file-name-style 'file-name)) + doom-modeline--limited-width-p) + (propertize "%b" + 'face (cond ((and buffer-file-name (buffer-modified-p)) + 'doom-modeline-buffer-modified) + ((doom-modeline--active) 'doom-modeline-buffer-file) + (t 'mode-line-inactive)) + 'mouse-face 'mode-line-highlight + 'help-echo "Buffer name +mouse-1: Previous buffer\nmouse-3: Next buffer" + 'local-map mode-line-buffer-identification-keymap) + (when-let ((name (or doom-modeline--buffer-file-name + (doom-modeline-update-buffer-file-name)))) + (if (doom-modeline--active) + ;; Check if the buffer is modified + (if (and buffer-file-name (buffer-modified-p)) + (propertize name 'face 'doom-modeline-buffer-modified) + name) + (propertize name 'face 'mode-line-inactive))))) + +(doom-modeline-def-segment buffer-info + "Combined information about the current buffer, including the current working +directory, the file name, and its state (modified, read-only or non-existent)." + (concat + (doom-modeline-spc) + (doom-modeline--buffer-mode-icon) + (doom-modeline--buffer-state-icon) + (doom-modeline--buffer-name))) + +(doom-modeline-def-segment buffer-info-simple + "Display only the current buffer's name, but with fontification." + (concat + (doom-modeline-spc) + (doom-modeline--buffer-mode-icon) + (doom-modeline--buffer-state-icon) + (propertize "%b" + 'face (cond ((and buffer-file-name (buffer-modified-p)) + 'doom-modeline-buffer-modified) + ((doom-modeline--active) 'doom-modeline-buffer-file) + (t 'mode-line-inactive)) + 'mouse-face 'mode-line-highlight + 'help-echo "Buffer name +mouse-1: Previous buffer\nmouse-3: Next buffer" + 'local-map mode-line-buffer-identification-keymap))) + +(doom-modeline-def-segment buffer-default-directory + "Displays `default-directory' with the icon and state . This is for special buffers +like the scratch buffer where knowing the current project directory is important." + (let ((face (cond ((buffer-modified-p) + 'doom-modeline-buffer-modified) + ((doom-modeline--active) 'doom-modeline-buffer-path) + (t 'mode-line-inactive)))) + (concat (doom-modeline-spc) + (doom-modeline--buffer-state-icon) + (and doom-modeline-major-mode-icon + (concat (doom-modeline-icon + 'octicon "file-directory" "🖿" "" + :face face :v-adjust -0.05 :height 1.25) + (doom-modeline-vspc))) + (propertize (abbreviate-file-name default-directory) 'face face)))) + +(doom-modeline-def-segment buffer-default-directory-simple + "Displays `default-directory'. This is for special buffers like the scratch +buffer where knowing the current project directory is important." + (let ((face (if (doom-modeline--active) 'doom-modeline-buffer-path 'mode-line-inactive))) + (concat (doom-modeline-spc) + (and doom-modeline-major-mode-icon + (concat (doom-modeline-icon + 'octicon "file-directory" "🖿" "" + :face face :v-adjust -0.05 :height 1.25) + (doom-modeline-vspc))) + (propertize (abbreviate-file-name default-directory) 'face face)))) + + +;; +;; Encoding +;; + +(doom-modeline-def-segment buffer-encoding + "Displays the eol and the encoding style of the buffer the same way Atom does." + (when doom-modeline-buffer-encoding + (let ((face (if (doom-modeline--active) 'mode-line 'mode-line-inactive)) + (mouse-face 'mode-line-highlight)) + (concat + (doom-modeline-spc) + + ;; eol type + (let ((eol (coding-system-eol-type buffer-file-coding-system))) + (when (or (eq doom-modeline-buffer-encoding t) + (and (eq doom-modeline-buffer-encoding 'nondefault) + (not (equal eol doom-modeline-default-eol-type)))) + (propertize + (pcase eol + (0 "LF ") + (1 "CRLF ") + (2 "CR ") + (_ "")) + 'face face + 'mouse-face mouse-face + 'help-echo (format "End-of-line style: %s\nmouse-1: Cycle" + (pcase eol + (0 "Unix-style LF") + (1 "DOS-style CRLF") + (2 "Mac-style CR") + (_ "Undecided"))) + 'local-map (let ((map (make-sparse-keymap))) + (define-key map [mode-line mouse-1] 'mode-line-change-eol) + map)))) + + ;; coding system + (let* ((sys (coding-system-plist buffer-file-coding-system)) + (cat (plist-get sys :category)) + (sym (if (memq cat + '(coding-category-undecided coding-category-utf-8)) + 'utf-8 + (plist-get sys :name)))) + (when (or (eq doom-modeline-buffer-encoding t) + (and (eq doom-modeline-buffer-encoding 'nondefault) + (not (eq cat 'coding-category-undecided)) + (not (eq sym doom-modeline-default-coding-system)))) + (propertize + (upcase (symbol-name sym)) + 'face face + 'mouse-face mouse-face + 'help-echo 'mode-line-mule-info-help-echo + 'local-map mode-line-coding-system-map))) + + (doom-modeline-spc))))) + + +;; +;; Indentation +;; + +(doom-modeline-def-segment indent-info + "Displays the indentation information." + (when doom-modeline-indent-info + (let ((do-propertize + (lambda (mode size) + (propertize + (format " %s %d " mode size) + 'face (if (doom-modeline--active) 'mode-line 'mode-line-inactive))))) + (if indent-tabs-mode + (funcall do-propertize "TAB" tab-width) + (let ((lookup-var + (seq-find (lambda (var) + (and var (boundp var) (symbol-value var))) + (cdr (assoc major-mode doom-modeline-indent-alist)) nil))) + (funcall do-propertize "SPC" + (if lookup-var + (symbol-value lookup-var) + tab-width))))))) + +;; +;; Remote host +;; + +(doom-modeline-def-segment remote-host + "Hostname for remote buffers." + (when default-directory + (when-let ((host (file-remote-p default-directory 'host))) + (propertize + (concat "@" host) + 'face (if (doom-modeline--active) 'doom-modeline-host 'mode-line-inactive))))) + + +;; +;; Major mode +;; + +(doom-modeline-def-segment major-mode + "The major mode, including environment and text-scale info." + (propertize + (concat + (doom-modeline-spc) + (propertize (format-mode-line + (or (and (boundp 'delighted-modes) + (cadr (assq major-mode delighted-modes))) + mode-name)) + 'help-echo "Major mode\n\ + mouse-1: Display major mode menu\n\ + mouse-2: Show help for major mode\n\ + mouse-3: Toggle minor modes" + 'mouse-face 'mode-line-highlight + 'local-map mode-line-major-mode-keymap) + (when (and doom-modeline-env-version doom-modeline-env--version) + (format " %s" doom-modeline-env--version)) + (and (boundp 'text-scale-mode-amount) + (/= text-scale-mode-amount 0) + (format + (if (> text-scale-mode-amount 0) + " (%+d)" + " (%-d)") + text-scale-mode-amount)) + (doom-modeline-spc)) + 'face (if (doom-modeline--active) + 'doom-modeline-buffer-major-mode + 'mode-line-inactive))) + + +;; +;; Process +;; + +(doom-modeline-def-segment process + "The process info." + (if (doom-modeline--active) + mode-line-process + (propertize (format-mode-line mode-line-process) + 'face 'mode-line-inactive))) + + +;; +;; Minor modes +;; + +(doom-modeline-def-segment minor-modes + (when doom-modeline-minor-modes + (let ((face (if (doom-modeline--active) + 'doom-modeline-buffer-minor-mode + 'mode-line-inactive)) + (mouse-face 'mode-line-highlight) + (help-echo "Minor mode + mouse-1: Display minor mode menu + mouse-2: Show help for minor mode + mouse-3: Toggle minor modes")) + (if (bound-and-true-p minions-mode) + `((:propertize ("" ,(--filter (memq (car it) minions-direct) + minor-mode-alist)) + face ,face + mouse-face ,mouse-face + help-echo ,help-echo + local-map ,mode-line-minor-mode-keymap) + ,(doom-modeline-spc) + (:propertize ("" ,(doom-modeline-icon 'octicon "gear" "⚙" ";-" + :face face :v-adjust -0.05)) + mouse-face ,mouse-face + help-echo "Minions +mouse-1: Display minor modes menu" + local-map ,minions-mode-line-minor-modes-map) + ,(doom-modeline-spc)) + `((:propertize ("" minor-mode-alist) + face ,face + mouse-face ,mouse-face + help-echo ,help-echo + local-map ,mode-line-minor-mode-keymap) + ,(doom-modeline-spc)))))) + + +;; +;; VCS +;; + +(defun doom-modeline-vcs-icon (icon &optional unicode text face voffset) + "Displays the vcs ICON with FACE and VOFFSET. + +UNICODE and TEXT are fallbacks. +Uses `all-the-icons-octicon' to fetch the icon." + (doom-modeline-icon 'octicon icon unicode text + :face face :v-adjust (or voffset -0.1))) + +(defvar-local doom-modeline--vcs-icon nil) +(defun doom-modeline-update-vcs-icon (&rest _) + "Update icon of vcs state in mode-line." + (setq doom-modeline--vcs-icon + (when (and vc-mode buffer-file-name) + (let* ((backend (vc-backend buffer-file-name)) + (state (vc-state buffer-file-name backend))) + (cond ((memq state '(edited added)) + (doom-modeline-vcs-icon "git-compare" "⇆" "*" 'doom-modeline-info -0.05)) + ((eq state 'needs-merge) + (doom-modeline-vcs-icon "git-merge" "⛙" "?" 'doom-modeline-info)) + ((eq state 'needs-update) + (doom-modeline-vcs-icon "arrow-down" "↓" "!" 'doom-modeline-warning)) + ((memq state '(removed conflict unregistered)) + (doom-modeline-vcs-icon "alert" "⚠" "!" 'doom-modeline-urgent)) + (t + (doom-modeline-vcs-icon "git-branch" "" "@" 'doom-modeline-info -0.05))))))) +(add-hook 'find-file-hook #'doom-modeline-update-vcs-icon) +(add-hook 'after-save-hook #'doom-modeline-update-vcs-icon) +(advice-add #'vc-refresh-state :after #'doom-modeline-update-vcs-icon) + +(doom-modeline-add-variable-watcher + 'doom-modeline-icon + (lambda (_sym val op _where) + (when (eq op 'set) + (setq doom-modeline-icon val) + (dolist (buf (buffer-list)) + (with-current-buffer buf + (doom-modeline-update-vcs-icon)))))) + +(doom-modeline-add-variable-watcher + 'doom-modeline-unicode-fallback + (lambda (_sym val op _where) + (when (eq op 'set) + (setq doom-modeline-unicode-fallback val) + (dolist (buf (buffer-list)) + (with-current-buffer buf + (doom-modeline-update-vcs-icon)))))) + +(defvar-local doom-modeline--vcs-text nil) +(defun doom-modeline-update-vcs-text (&rest _) + "Update text of vcs state in mode-line." + (setq doom-modeline--vcs-text + (when (and vc-mode buffer-file-name) + (let* ((backend (vc-backend buffer-file-name)) + (state (vc-state buffer-file-name backend)) + (str (if vc-display-status + (substring vc-mode (+ (if (eq backend 'Hg) 2 3) 2)) + ""))) + (propertize (if (> (length str) doom-modeline-vcs-max-length) + (concat + (substring str 0 (- doom-modeline-vcs-max-length 3)) + "...") + str) + 'mouse-face 'mode-line-highlight + 'face (cond ((eq state 'needs-update) + 'doom-modeline-warning) + ((memq state '(removed conflict unregistered)) + 'doom-modeline-urgent) + (t 'doom-modeline-info))))))) +(add-hook 'find-file-hook #'doom-modeline-update-vcs-text) +(add-hook 'after-save-hook #'doom-modeline-update-vcs-text) +(advice-add #'vc-refresh-state :after #'doom-modeline-update-vcs-text) + +(doom-modeline-def-segment vcs + "Displays the current branch, colored based on its state." + (let ((active (doom-modeline--active))) + (when-let ((icon doom-modeline--vcs-icon) + (text doom-modeline--vcs-text)) + (concat + (doom-modeline-spc) + (propertize + (concat + (if active + icon + (doom-modeline-propertize-icon icon 'mode-line-inactive)) + (doom-modeline-vspc)) + 'mouse-face 'mode-line-highlight + 'help-echo (get-text-property 1 'help-echo vc-mode) + 'local-map (get-text-property 1 'local-map vc-mode)) + (if active + text + (propertize text 'face 'mode-line-inactive)) + (doom-modeline-spc))))) + + +;; +;; Checker +;; + +(defun doom-modeline-checker-icon (icon unicode text face) + "Displays the checker ICON with FACE. + +UNICODE and TEXT are fallbacks. +Uses `all-the-icons-material' to fetch the icon." + (doom-modeline-icon 'material icon unicode text + :face face :height 1.1 :v-adjust -0.225)) + +(defun doom-modeline-checker-text (text &optional face) + "Displays TEXT with FACE." + (propertize text 'face (or face 'mode-line))) + +;; Flycheck + +(defun doom-modeline--flycheck-count-errors () + "Count the number of ERRORS, grouped by level. + +Return an alist, where each ITEM is a cons cell whose `car' is an +error level, and whose `cdr' is the number of errors of that +level." + (let ((info 0) (warning 0) (error 0)) + (mapc + (lambda (item) + (let ((count (cdr item))) + (pcase (flycheck-error-level-compilation-level (car item)) + (0 (cl-incf info count)) + (1 (cl-incf warning count)) + (2 (cl-incf error count))))) + (flycheck-count-errors flycheck-current-errors)) + `((info . ,info) (warning . ,warning) (error . ,error)))) + +(defvar-local doom-modeline--flycheck-icon nil) +(defun doom-modeline-update-flycheck-icon (&optional status) + "Update flycheck icon via STATUS." + (setq doom-modeline--flycheck-icon + (when-let + ((icon + (pcase status + ('finished (if flycheck-current-errors + (let-alist (doom-modeline--flycheck-count-errors) + (doom-modeline-checker-icon + "block" "🚫" "!" + (cond ((> .error 0) 'doom-modeline-urgent) + ((> .warning 0) 'doom-modeline-warning) + (t 'doom-modeline-info)))) + (doom-modeline-checker-icon "check" "✓" "-" 'doom-modeline-info))) + ('running (doom-modeline-checker-icon "access_time" "⏱" "*" 'doom-modeline-debug)) + ('no-checker (doom-modeline-checker-icon "sim_card_alert" "⚠" "-" 'doom-modeline-debug)) + ('errored (doom-modeline-checker-icon "sim_card_alert" "⚠" "-" 'doom-modeline-urgent)) + ('interrupted (doom-modeline-checker-icon "pause" "⏸" "=" 'doom-modeline-debug)) + ('suspicious (doom-modeline-checker-icon "priority_high" "❗" "!" 'doom-modeline-urgent)) + (_ nil)))) + (propertize icon + 'help-echo (concat "Flycheck\n" + (pcase status + ('finished "mouse-1: Display minor mode menu +mouse-2: Show help for minor mode") + ('running "Running...") + ('no-checker "No Checker") + ('errored "Error") + ('interrupted "Interrupted") + ('suspicious "Suspicious"))) + 'mouse-face 'mode-line-highlight + 'local-map (let ((map (make-sparse-keymap))) + (define-key map [mode-line down-mouse-1] + flycheck-mode-menu-map) + (define-key map [mode-line mouse-2] + (lambda () + (interactive) + (describe-function 'flycheck-mode))) + map))))) +(add-hook 'flycheck-status-changed-functions #'doom-modeline-update-flycheck-icon) +(add-hook 'flycheck-mode-hook #'doom-modeline-update-flycheck-icon) + +(doom-modeline-add-variable-watcher + 'doom-modeline-icon + (lambda (_sym val op _where) + (when (eq op 'set) + (setq doom-modeline-icon val) + (dolist (buf (buffer-list)) + (with-current-buffer buf + (when (bound-and-true-p flycheck-mode) + (flycheck-buffer))))))) + +(doom-modeline-add-variable-watcher + 'doom-modeline-unicode-fallback + (lambda (_sym val op _where) + (when (eq op 'set) + (setq doom-modeline-unicode-fallback val) + (dolist (buf (buffer-list)) + (with-current-buffer buf + (when (bound-and-true-p flycheck-mode) + (flycheck-buffer))))))) + +(defvar-local doom-modeline--flycheck-text nil) +(defun doom-modeline-update-flycheck-text (&optional status) + "Update flycheck text via STATUS." + (setq doom-modeline--flycheck-text + (when-let + ((text + (pcase status + ('finished (when flycheck-current-errors + (let-alist (doom-modeline--flycheck-count-errors) + (if doom-modeline-checker-simple-format + (doom-modeline-checker-text + (number-to-string (+ .error .warning .info)) + (cond ((> .error 0) 'doom-modeline-urgent) + ((> .warning 0) 'doom-modeline-warning) + (t 'doom-modeline-info))) + (format "%s/%s/%s" + (doom-modeline-checker-text (number-to-string .error) + 'doom-modeline-urgent) + (doom-modeline-checker-text (number-to-string .warning) + 'doom-modeline-warning) + (doom-modeline-checker-text (number-to-string .info) + 'doom-modeline-info)))))) + ('running nil) + ('no-checker nil) + ('errored (doom-modeline-checker-text "Error" 'doom-modeline-urgent)) + ('interrupted (doom-modeline-checker-text "Interrupted" 'doom-modeline-debug)) + ('suspicious (doom-modeline-checker-text "Suspicious" 'doom-modeline-urgent)) + (_ nil)))) + (propertize + text + 'help-echo (pcase status + ('finished + (concat + (when flycheck-current-errors + (let-alist (doom-modeline--flycheck-count-errors) + (format "error: %d, warning: %d, info: %d\n" .error .warning .info))) + "mouse-1: Show all errors +mouse-3: Next error" + (if (featurep 'mwheel) + "\nwheel-up/wheel-down: Previous/next error"))) + ('running "Running...") + ('no-checker "No Checker") + ('errored "Error") + ('interrupted "Interrupted") + ('suspicious "Suspicious")) + 'mouse-face 'mode-line-highlight + 'local-map (let ((map (make-sparse-keymap))) + (define-key map [mode-line mouse-1] + #'flycheck-list-errors) + (define-key map [mode-line mouse-3] + #'flycheck-next-error) + (when (featurep 'mwheel) + (define-key map (vector 'mode-line + mouse-wheel-down-event) + (lambda (event) + (interactive "e") + (with-selected-window (posn-window (event-start event)) + (flycheck-previous-error 1)))) + (define-key map (vector 'mode-line + mouse-wheel-up-event) + (lambda (event) + (interactive "e") + (with-selected-window (posn-window (event-start event)) + (flycheck-next-error 1)))) + map)))))) +(add-hook 'flycheck-status-changed-functions #'doom-modeline-update-flycheck-text) +(add-hook 'flycheck-mode-hook #'doom-modeline-update-flycheck-text) + +;; Flymake + +(defvar-local doom-modeline--flymake-icon nil) +(defun doom-modeline-update-flymake-icon (&rest _) + "Update flymake icon." + (setq flymake--mode-line-format nil) ; remove the lighter of minor mode + (setq doom-modeline--flymake-icon + (let* ((known (hash-table-keys flymake--backend-state)) + (running (flymake-running-backends)) + (disabled (flymake-disabled-backends)) + (reported (flymake-reporting-backends)) + (all-disabled (and disabled (null running))) + (some-waiting (cl-set-difference running reported))) + (when-let + ((icon + (cond + (some-waiting (doom-modeline-checker-icon "access_time" "⏰" "*" 'doom-modeline-debug)) + ((null known) (doom-modeline-checker-icon "sim_card_alert" "❓" "?" 'doom-modeline-debug)) + (all-disabled (doom-modeline-checker-icon "sim_card_alert" "❗" "!" 'doom-modeline-urgent)) + (t (let ((.error 0) + (.warning 0) + (.note 0)) + (progn + (cl-loop + with warning-level = (warning-numeric-level :warning) + with note-level = (warning-numeric-level :debug) + for state being the hash-values of flymake--backend-state + do (cl-loop + with diags = (flymake--backend-state-diags state) + for diag in diags do + (let ((severity (flymake--lookup-type-property (flymake--diag-type diag) 'severity + (warning-numeric-level :error)))) + (cond ((> severity warning-level) (cl-incf .error)) + ((> severity note-level) (cl-incf .warning)) + (t (cl-incf .note)))))) + (if (> (+ .error .warning .note) 0) + (doom-modeline-checker-icon "do_not_disturb_alt" "🚫" "!" + (cond ((> .error 0) 'doom-modeline-urgent) + ((> .warning 0) 'doom-modeline-warning) + (t 'doom-modeline-info))) + (doom-modeline-checker-icon "check" "✔" "-" 'doom-modeline-info)))))))) + (propertize + icon + 'help-echo (concat "Flymake\n" + (cond + (some-waiting "Running...") + ((null known) "No Checker") + (all-disabled "All Checkers Disabled") + (t (format "%d/%d backends running +mouse-1: Display minor mode menu +mouse-2: Show help for minor mode" + (length running) (length known))))) + 'mouse-face 'mode-line-highlight + 'local-map (let ((map (make-sparse-keymap))) + (define-key map [mode-line down-mouse-1] + flymake-menu) + (define-key map [mode-line mouse-2] + (lambda () + (interactive) + (describe-function 'flymake-mode))) + map)))))) +(advice-add #'flymake--handle-report :after #'doom-modeline-update-flymake-icon) + +(doom-modeline-add-variable-watcher + 'doom-modeline-icon + (lambda (_sym val op _where) + (when (eq op 'set) + (setq doom-modeline-icon val) + (dolist (buf (buffer-list)) + (with-current-buffer buf + (when (bound-and-true-p flymake-mode) + (flymake-start))))))) + +(doom-modeline-add-variable-watcher + 'doom-modeline-unicode-fallback + (lambda (_sym val op _where) + (when (eq op 'set) + (setq doom-modeline-unicode-fallback val) + (dolist (buf (buffer-list)) + (with-current-buffer buf + (when (bound-and-true-p flymake-mode) + (flymake-start))))))) + +(defvar-local doom-modeline--flymake-text nil) +(defun doom-modeline-update-flymake-text (&rest _) + "Update flymake text." + (setq flymake--mode-line-format nil) ; remove the lighter of minor mode + (setq doom-modeline--flymake-text + (let* ((known (hash-table-keys flymake--backend-state)) + (running (flymake-running-backends)) + (disabled (flymake-disabled-backends)) + (reported (flymake-reporting-backends)) + (all-disabled (and disabled (null running))) + (some-waiting (cl-set-difference running reported)) + (warning-level (warning-numeric-level :warning)) + (note-level (warning-numeric-level :debug)) + (.error 0) + (.warning 0) + (.note 0)) + (maphash (lambda (_b state) + (cl-loop + with diags = (flymake--backend-state-diags state) + for diag in diags do + (let ((severity (flymake--lookup-type-property (flymake--diag-type diag) 'severity + (warning-numeric-level :error)))) + (cond ((> severity warning-level) (cl-incf .error)) + ((> severity note-level) (cl-incf .warning)) + (t (cl-incf .note)))))) + flymake--backend-state) + (when-let + ((text + (cond + (some-waiting doom-modeline--flymake-text) + ((null known) nil) + (all-disabled nil) + (t (let ((num (+ .error .warning .note))) + (when (> num 0) + (if doom-modeline-checker-simple-format + (doom-modeline-checker-text (number-to-string num) + (cond ((> .error 0) 'doom-modeline-urgent) + ((> .warning 0) 'doom-modeline-warning) + (t 'doom-modeline-info))) + (format "%s/%s/%s" + (doom-modeline-checker-text (number-to-string .error) + 'doom-modeline-urgent) + (doom-modeline-checker-text (number-to-string .warning) + 'doom-modeline-warning) + (doom-modeline-checker-text (number-to-string .note) + 'doom-modeline-info))))))))) + (propertize + text + 'help-echo (cond + (some-waiting "Running...") + ((null known) "No Checker") + (all-disabled "All Checkers Disabled") + (t (format "error: %d, warning: %d, note: %d +mouse-1: List all problems%s" + .error .warning .note + (if (featurep 'mwheel) + "\nwheel-up/wheel-down: Previous/next problem")))) + 'mouse-face 'mode-line-highlight + 'local-map (let ((map (make-sparse-keymap))) + (define-key map [mode-line mouse-1] + #'flymake-show-diagnostics-buffer) + (when (featurep 'mwheel) + (define-key map (vector 'mode-line + mouse-wheel-down-event) + (lambda (event) + (interactive "e") + (with-selected-window (posn-window (event-start event)) + (flymake-goto-prev-error 1 nil t)))) + (define-key map (vector 'mode-line + mouse-wheel-up-event) + (lambda (event) + (interactive "e") + (with-selected-window (posn-window (event-start event)) + (flymake-goto-next-error 1 nil t)))) + map))))))) +(advice-add #'flymake--handle-report :after #'doom-modeline-update-flymake-text) + +(doom-modeline-def-segment checker + "Displays color-coded error status in the current buffer with pretty icons." + (let ((active (doom-modeline--active)) + (seg (cond ((and (bound-and-true-p flymake-mode) + (bound-and-true-p flymake--backend-state)) ; only support 26+ + `(,doom-modeline--flymake-icon . ,doom-modeline--flymake-text)) + ((bound-and-true-p flycheck-mode) + `(,doom-modeline--flycheck-icon . ,doom-modeline--flycheck-text))))) + (let ((icon (car seg)) + (text (cdr seg))) + (concat + (when icon + (concat + (doom-modeline-spc) + (if active + icon + (doom-modeline-propertize-icon icon 'mode-line-inactive)))) + (when text + (concat + (if icon (doom-modeline-vspc) (doom-modeline-spc)) + (if active + text + (propertize text 'face 'mode-line-inactive)))) + (doom-modeline-spc))))) + + +;; +;; Word Count +;; + +(doom-modeline-def-segment word-count + "The buffer word count. +Displayed when in a major mode in `doom-modeline-continuous-word-count-modes'. +Respects `doom-modeline-enable-word-count'." + (when (and doom-modeline-enable-word-count + (member major-mode doom-modeline-continuous-word-count-modes)) + (propertize (format " %dW" (count-words (point-min) (point-max))) + 'face (if (doom-modeline--active) + 'mode-line + 'mode-line-inactive)))) + + +;; +;; Selection +;; + +(defsubst doom-modeline-column (pos) + "Get the column of the position `POS'." + (save-excursion (goto-char pos) + (current-column))) + +(doom-modeline-def-segment selection-info + "Information about the current selection, such as how many characters and +lines are selected, or the NxM dimensions of a block selection." + (when (and (or mark-active (and (bound-and-true-p evil-local-mode) + (eq evil-state 'visual))) + (doom-modeline--active)) + (cl-destructuring-bind (beg . end) + (if (and (bound-and-true-p evil-local-mode) (eq evil-state 'visual)) + (cons evil-visual-beginning evil-visual-end) + (cons (region-beginning) (region-end))) + (propertize + (let ((lines (count-lines beg (min end (point-max))))) + (concat (doom-modeline-spc) + (cond ((or (bound-and-true-p rectangle-mark-mode) + (and (bound-and-true-p evil-visual-selection) + (eq 'block evil-visual-selection))) + (let ((cols (abs (- (doom-modeline-column end) + (doom-modeline-column beg))))) + (format "%dx%dB" lines cols))) + ((and (bound-and-true-p evil-visual-selection) + (eq evil-visual-selection 'line)) + (format "%dL" lines)) + ((> lines 1) + (format "%dC %dL" (- end beg) lines)) + ((format "%dC" (- end beg)))) + (when doom-modeline-enable-word-count + (format " %dW" (count-words beg end))) + (doom-modeline-spc))) + 'face 'doom-modeline-highlight)))) + + +;; +;; Matches (macro, anzu, evil-substitute, iedit, symbol-overlay and multi-cursors) +;; + +(defsubst doom-modeline--macro-recording () + "Display current Emacs or evil macro being recorded." + (when (and (doom-modeline--active) + (or defining-kbd-macro executing-kbd-macro)) + (let ((sep (propertize " " 'face 'doom-modeline-panel )) + (vsep (propertize " " 'face + '(:inherit (doom-modeline-panel variable-pitch))))) + (concat + sep + (doom-modeline-icon 'material "fiber_manual_record" "●" + (if (bound-and-true-p evil-this-macro) + (char-to-string evil-this-macro) + "Macro") + :face 'doom-modeline-panel + :v-adjust -0.225) + vsep + (doom-modeline-icon 'octicon "triangle-right" "▶" ">" + :face 'doom-modeline-panel + :v-adjust -0.05) + sep)))) + +;; `anzu' and `evil-anzu' expose current/total state that can be displayed in the +;; mode-line. +(defun doom-modeline-fix-anzu-count (positions here) + "Calulate anzu count via POSITIONS and HERE." + (cl-loop for (start . end) in positions + collect t into before + when (and (>= here start) (<= here end)) + return (length before) + finally return 0)) + +(advice-add #'anzu--where-is-here :override #'doom-modeline-fix-anzu-count) + +(setq anzu-cons-mode-line-p nil) ; manage modeline segment ourselves +;; Ensure anzu state is cleared when searches & iedit are done +(with-eval-after-load 'anzu + (add-hook 'isearch-mode-end-hook #'anzu--reset-status t) + (add-hook 'iedit-mode-end-hook #'anzu--reset-status) + (advice-add #'evil-force-normal-state :after #'anzu--reset-status) + ;; Fix matches segment mirroring across all buffers + (mapc #'make-variable-buffer-local + '(anzu--total-matched + anzu--current-position anzu--state anzu--cached-count + anzu--cached-positions anzu--last-command + anzu--last-isearch-string anzu--overflow-p))) + +(defsubst doom-modeline--anzu () + "Show the match index and total number thereof. +Requires `anzu', also `evil-anzu' if using `evil-mode' for compatibility with +`evil-search'." + (when (and (bound-and-true-p anzu--state) + (not (bound-and-true-p iedit-mode))) + (propertize + (let ((here anzu--current-position) + (total anzu--total-matched)) + (cond ((eq anzu--state 'replace-query) + (format " %d replace " anzu--cached-count)) + ((eq anzu--state 'replace) + (format " %d/%d " here total)) + (anzu--overflow-p + (format " %s+ " total)) + (t + (format " %s/%d " here total)))) + 'face (if (doom-modeline--active) 'doom-modeline-panel 'mode-line-inactive)))) + +(defsubst doom-modeline--evil-substitute () + "Show number of matches for evil-ex substitutions and highlights in real time." + (when (and (bound-and-true-p evil-local-mode) + (or (assq 'evil-ex-substitute evil-ex-active-highlights-alist) + (assq 'evil-ex-global-match evil-ex-active-highlights-alist) + (assq 'evil-ex-buffer-match evil-ex-active-highlights-alist))) + (propertize + (let ((range (if evil-ex-range + (cons (car evil-ex-range) (cadr evil-ex-range)) + (cons (line-beginning-position) (line-end-position)))) + (pattern (car-safe (evil-delimited-arguments evil-ex-argument 2)))) + (if pattern + (format " %s matches " (how-many pattern (car range) (cdr range))) + " - ")) + 'face (if (doom-modeline--active) 'doom-modeline-panel 'mode-line-inactive)))) + +(defun doom-modeline-themes--overlay-sort (a b) + "Sort overlay A and B." + (< (overlay-start a) (overlay-start b))) + +(defsubst doom-modeline--iedit () + "Show the number of iedit regions matches + what match you're on." + (when (and (bound-and-true-p iedit-mode) + (bound-and-true-p iedit-occurrences-overlays)) + (propertize + (let ((this-oc (or (let ((inhibit-message t)) + (iedit-find-current-occurrence-overlay)) + (save-excursion (iedit-prev-occurrence) + (iedit-find-current-occurrence-overlay)))) + (length (length iedit-occurrences-overlays))) + (format " %s/%d " + (if this-oc + (- length + (length (memq this-oc (sort (append iedit-occurrences-overlays nil) + #'doom-modeline-themes--overlay-sort))) + -1) + "-") + length)) + 'face (if (doom-modeline--active) 'doom-modeline-panel 'mode-line-inactive)))) + +(defsubst doom-modeline--symbol-overlay () + "Show the number of matches for symbol overlay." + (when-let ((active (doom-modeline--active))) + (when (and (bound-and-true-p symbol-overlay-keywords-alist) + (not (bound-and-true-p symbol-overlay-temp-symbol)) + (not (bound-and-true-p iedit-mode))) + (let* ((keyword (symbol-overlay-assoc (symbol-overlay-get-symbol t))) + (symbol (car keyword)) + (before (symbol-overlay-get-list -1 symbol)) + (after (symbol-overlay-get-list 1 symbol)) + (count (length before))) + (if (symbol-overlay-assoc symbol) + (propertize + (format (concat " %d/%d " (and (cadr keyword) "in scope ")) + (+ count 1) + (+ count (length after))) + 'face (if active 'doom-modeline-panel 'mode-line-inactive))))))) + +(defsubst doom-modeline--multiple-cursors () + "Show the number of multiple cursors." + (cl-destructuring-bind (count . face) + (cond ((bound-and-true-p multiple-cursors-mode) + (cons (mc/num-cursors) + (if (doom-modeline--active) + 'doom-modeline-panel + 'mode-line-inactive))) + ((bound-and-true-p evil-mc-cursor-list) + (cons (length evil-mc-cursor-list) + (cond ((not (doom-modeline--active)) 'mode-line-inactive) + (evil-mc-frozen 'doom-modeline-bar) + ('doom-modeline-panel)))) + ((cons nil nil))) + (when count + (concat (propertize " " 'face face) + (or (doom-modeline-icon 'faicon "i-cursor" nil nil + :face face :v-adjust -0.0575) + (propertize "I" + 'face `(:inherit ,face :height 1.4 :weight normal) + 'display '(raise -0.1))) + (propertize (doom-modeline-vspc) + 'face `(:inherit (variable-pitch ,face))) + (propertize (format "%d " count) + 'face face))))) + +(defsubst doom-modeline--phi-search () + "Show the number of matches for `phi-search' and `phi-replace'." + (when-let ((active (doom-modeline--active))) + (when (bound-and-true-p phi-search--overlays) + (let ((total (length phi-search--overlays)) + (selection phi-search--selection)) + (when selection + (propertize + (format " %d/%d " (1+ selection) total) + 'face (if active 'doom-modeline-panel 'mode-line-inactive))))))) + +(defun doom-modeline--override-phi-search-mode-line (orig-fun &rest args) + "Override the mode-line of `phi-search' and `phi-replace'." + (if (bound-and-true-p doom-modeline-mode) + (apply orig-fun mode-line-format (cdr args)) + (apply orig-fun args))) +(advice-add #'phi-search--initialize :around #'doom-modeline--override-phi-search-mode-line) + +(defsubst doom-modeline--buffer-size () + "Show buffer size." + (when size-indication-mode + (concat (doom-modeline-spc) + (propertize "%I" + 'face (if (doom-modeline--active) 'mode-line 'mode-line-inactive) + 'help-echo "Buffer size +mouse-1: Display Line and Column Mode Menu" + 'mouse-face 'mode-line-highlight + 'local-map mode-line-column-line-number-mode-map) + (doom-modeline-spc)))) + +(doom-modeline-def-segment matches + "Displays: 1. the currently recording macro, 2. A current/total for the +current search term (with `anzu'), 3. The number of substitutions being conducted +with `evil-ex-substitute', and/or 4. The number of active `iedit' regions, +5. The current/total for the highlight term (with `symbol-overlay'), 6. The number +of active `multiple-cursors'." + (let ((meta (concat (doom-modeline--macro-recording) + (doom-modeline--anzu) + (doom-modeline--phi-search) + (doom-modeline--evil-substitute) + (doom-modeline--iedit) + (doom-modeline--symbol-overlay) + (doom-modeline--multiple-cursors)))) + (or (and (not (equal meta "")) meta) + (doom-modeline--buffer-size))) + ) + +(doom-modeline-def-segment buffer-size + "Display buffer size" + (doom-modeline--buffer-size)) + +;; +;; Media +;; + +(doom-modeline-def-segment media-info + "Metadata regarding the current file, such as dimensions for images." + ;; TODO Include other information + (cond ((eq major-mode 'image-mode) + (cl-destructuring-bind (width . height) + (when (fboundp 'image-size) + (image-size (image-get-display-property) :pixels)) + (propertize + (format " %dx%d " width height) + 'face (if (doom-modeline--active) 'mode-line 'mode-line-inactive)))))) + + +;; +;; Bars +;; + +(defvar doom-modeline--bar-active nil) +(defvar doom-modeline--bar-inactive nil) + +(defsubst doom-modeline--bar () + "The default bar regulates the height of the mode-line in GUI." + (unless (and doom-modeline--bar-active doom-modeline--bar-inactive) + (let ((width doom-modeline-bar-width) + (height (max doom-modeline-height + (doom-modeline--font-height)))) + (when (and (numberp width) (numberp height)) + (setq doom-modeline--bar-active + (doom-modeline--create-bar-image 'doom-modeline-bar width height) + doom-modeline--bar-inactive + (doom-modeline--create-bar-image + 'doom-modeline-bar-inactive width height))))) + (if (doom-modeline--active) + doom-modeline--bar-active + doom-modeline--bar-inactive)) + +(defun doom-modeline-refresh-bars () + "Refresh mode-line bars on next redraw." + (setq doom-modeline--bar-active nil + doom-modeline--bar-inactive nil)) + +(cl-defstruct doom-modeline--hud-cache active inactive top-margin bottom-margin) + +(defsubst doom-modeline--hud () + "Powerline's hud segment reimplemented in the style of Doom's bar segment." + (let* ((ws (window-start)) + (we (window-end)) + (bs (buffer-size)) + (height (max doom-modeline-height + (doom-modeline--font-height))) + (top-margin (if (zerop bs) + 0 + (/ (* height (1- ws)) bs))) + (bottom-margin (if (zerop bs) + 0 + (max 0 (/ (* height (- bs we 1)) bs)))) + (cache (or (window-parameter nil 'doom-modeline--hud-cache) + (set-window-parameter nil 'doom-modeline--hud-cache + (make-doom-modeline--hud-cache))))) + (unless (and (doom-modeline--hud-cache-active cache) + (doom-modeline--hud-cache-inactive cache) + (= top-margin (doom-modeline--hud-cache-top-margin cache)) + (= bottom-margin + (doom-modeline--hud-cache-bottom-margin cache))) + (setf (doom-modeline--hud-cache-active cache) + (doom-modeline--create-hud-image + 'doom-modeline-bar 'default doom-modeline-bar-width + height top-margin bottom-margin) + (doom-modeline--hud-cache-inactive cache) + (doom-modeline--create-hud-image + 'doom-modeline-bar-inactive 'default doom-modeline-bar-width + height top-margin bottom-margin) + (doom-modeline--hud-cache-top-margin cache) top-margin + (doom-modeline--hud-cache-bottom-margin cache) bottom-margin)) + (if (doom-modeline--active) + (doom-modeline--hud-cache-active cache) + (doom-modeline--hud-cache-inactive cache)))) + +(defun doom-modeline-invalidate-huds () + "Invalidate all cached hud images." + (dolist (frame (frame-list)) + (dolist (window (window-list frame)) + (set-window-parameter window 'doom-modeline--hud-cache nil)))) + +(doom-modeline-add-variable-watcher + 'doom-modeline-height + (lambda (_sym val op _where) + (when (and (eq op 'set) (integerp val)) + (doom-modeline-refresh-bars) + (doom-modeline-invalidate-huds)))) + +(doom-modeline-add-variable-watcher + 'doom-modeline-bar-width + (lambda (_sym val op _where) + (when (and (eq op 'set) (integerp val)) + (doom-modeline-refresh-bars) + (doom-modeline-invalidate-huds)))) + +(add-hook 'after-setting-font-hook #'doom-modeline-refresh-bars) +(add-hook 'after-setting-font-hook #'doom-modeline-invalidate-huds) + +(doom-modeline-def-segment bar + "The bar regulates the height of the mode-line in GUI." + (if doom-modeline-hud + (doom-modeline--hud) + (doom-modeline--bar))) + +(doom-modeline-def-segment hud + "Powerline's hud segment reimplemented in the style of Doom's bar segment." + (doom-modeline--hud)) + + +;; +;; Window number +;; + +;; HACK: `ace-window-display-mode' should respect the ignore buffers. +(defun doom-modeline-aw-update () + "Update ace-window-path window parameter for all windows. +Ensure all windows are labeled so the user can select a specific +one. The ignored buffers are excluded unless `aw-ignore-on' is nil." + (let ((ignore-window-parameters t)) + (avy-traverse + (avy-tree (aw-window-list) aw-keys) + (lambda (path leaf) + (set-window-parameter + leaf 'ace-window-path + (propertize + (apply #'string (reverse path)) + 'face 'aw-mode-line-face)))))) +(advice-add #'aw-update :override #'doom-modeline-aw-update) + +;; Remove original window number of `ace-window-display-mode'. +(add-hook 'ace-window-display-mode-hook + (lambda () + (setq-default mode-line-format + (assq-delete-all 'ace-window-display-mode + (default-value 'mode-line-format))))) + +(advice-add #'window-numbering-install-mode-line :override #'ignore) +(advice-add #'window-numbering-clear-mode-line :override #'ignore) +(advice-add #'winum--install-mode-line :override #'ignore) +(advice-add #'winum--clear-mode-line :override #'ignore) + +(doom-modeline-def-segment window-number + "The current window number." + (let ((num (cond + ((bound-and-true-p ace-window-display-mode) + (aw-update) + (window-parameter (selected-window) 'ace-window-path)) + ((bound-and-true-p winum-mode) + (setq winum-auto-setup-mode-line nil) + (winum-get-number-string)) + ((bound-and-true-p window-numbering-mode) + (window-numbering-get-number-string)) + (t "")))) + (if (and (< 0 (length num)) + (< 1 (length (cl-mapcan + (lambda (frame) + ;; Exclude minibuffer and child frames + (unless (and (fboundp 'frame-parent) + (frame-parent frame)) + (window-list frame 'never))) + (visible-frame-list))))) + (propertize (format " %s " num) + 'face (if (doom-modeline--active) + 'doom-modeline-buffer-major-mode + 'mode-line-inactive))))) + + +;; +;; Workspace +;; + +(doom-modeline-def-segment workspace-name + "The current workspace name or number. +Requires `eyebrowse-mode' to be enabled or `tab-bar-mode' tabs to be created." + (when doom-modeline-workspace-name + (when-let + ((name (cond + ((and (bound-and-true-p eyebrowse-mode) + (< 1 (length (eyebrowse--get 'window-configs)))) + (assq-delete-all 'eyebrowse-mode mode-line-misc-info) + (when-let* + ((num (eyebrowse--get 'current-slot)) + (tag (nth 2 (assoc num (eyebrowse--get 'window-configs))))) + (if (< 0 (length tag)) tag (int-to-string num)))) + ((and (fboundp 'tab-bar-mode) + (< 1 (length (frame-parameter nil 'tabs)))) + (let* ((current-tab (tab-bar--current-tab)) + (tab-index (tab-bar--current-tab-index)) + (explicit-name (alist-get 'explicit-name current-tab)) + (tab-name (alist-get 'name current-tab))) + (if explicit-name tab-name (+ 1 tab-index))))))) + (propertize (format " %s " name) 'face + (if (doom-modeline--active) + 'doom-modeline-buffer-major-mode + 'mode-line-inactive))))) + + +;; +;; Perspective +;; + +(defvar-local doom-modeline--persp-name nil) +(defun doom-modeline-update-persp-name (&rest _) + "Update perspective name in mode-line." + (setq doom-modeline--persp-name + ;; Support `persp-mode', while not support `perspective' + (when (and doom-modeline-persp-name + (bound-and-true-p persp-mode) + (fboundp 'safe-persp-name) + (fboundp 'get-current-persp)) + (let* ((persp (get-current-persp)) + (name (safe-persp-name persp)) + (face (if (and persp + (not (persp-contain-buffer-p (current-buffer) persp))) + 'doom-modeline-persp-buffer-not-in-persp + 'doom-modeline-persp-name)) + (icon (doom-modeline-icon 'material "folder" "🖿" "#" + :face `(:inherit ,face :slant normal) + :height 1.1 + :v-adjust -0.225))) + (when (or doom-modeline-display-default-persp-name + (not (string-equal persp-nil-name name))) + (concat (doom-modeline-spc) + (propertize (concat (and doom-modeline-persp-icon + (concat icon (doom-modeline-vspc))) + (propertize name 'face face)) + 'help-echo "mouse-1: Switch perspective +mouse-2: Show help for minor mode" + 'mouse-face 'mode-line-highlight + 'local-map (let ((map (make-sparse-keymap))) + (define-key map [mode-line mouse-1] + #'persp-switch) + (define-key map [mode-line mouse-2] + (lambda () + (interactive) + (describe-function 'persp-mode))) + map)) + (doom-modeline-spc))))))) + +(add-hook 'buffer-list-update-hook #'doom-modeline-update-persp-name) +(add-hook 'find-file-hook #'doom-modeline-update-persp-name) +(add-hook 'persp-activated-functions #'doom-modeline-update-persp-name) +(add-hook 'persp-renamed-functions #'doom-modeline-update-persp-name) +(advice-add #'lv-message :after #'doom-modeline-update-persp-name) + +(doom-modeline-def-segment persp-name + "The current perspective name." + (when (and (doom-modeline--active) + (not doom-modeline--limited-width-p)) + doom-modeline--persp-name)) + + +;; +;; Misc info +;; + +(doom-modeline-def-segment misc-info + "Mode line construct for miscellaneous information. +By default, this shows the information specified by `global-mode-string'." + (when (and (doom-modeline--active) + (not doom-modeline--limited-width-p)) + '("" mode-line-misc-info))) + + +;; +;; Position +;; + +;; Be compatible with Emacs 25. +(defvar doom-modeline-column-zero-based + (if (boundp 'column-number-indicator-zero-based) + column-number-indicator-zero-based + t) + "When non-nil, mode line displays column numbers zero-based. +See `column-number-indicator-zero-based'.") + +(defvar doom-modeline-percent-position + (if (boundp 'mode-line-percent-position) + mode-line-percent-position + '(-3 "%p")) + "Specification of \"percentage offset\" of window through buffer. +See `mode-line-percent-position'.") + +(doom-modeline-add-variable-watcher + 'column-number-indicator-zero-based + (lambda (_sym val op _where) + (when (eq op 'set) + (setq doom-modeline-column-zero-based val)))) + +(doom-modeline-add-variable-watcher + 'mode-line-percent-position + (lambda (_sym val op _where) + (when (eq op 'set) + (setq doom-modeline-percent-position val)))) + +(doom-modeline-def-segment buffer-position + "The buffer position information." + (let* ((active (doom-modeline--active)) + (lc '(line-number-mode + (column-number-mode + (doom-modeline-column-zero-based "%l:%c" "%l:%C") + "%l") + (column-number-mode (doom-modeline-column-zero-based ":%c" ":%C")))) + (face (if active 'mode-line 'mode-line-inactive)) + (mouse-face 'mode-line-highlight) + (local-map mode-line-column-line-number-mode-map)) + (concat + (doom-modeline-spc) + (doom-modeline-spc) + + (propertize (format-mode-line lc) + 'face face + 'help-echo "Buffer position\n\ +mouse-1: Display Line and Column Mode Menu" + 'mouse-face mouse-face + 'local-map local-map) + + (cond ((and active + (bound-and-true-p nyan-mode) + (not doom-modeline--limited-width-p) + (>= (window-width) nyan-minimum-window-width)) + (concat + (doom-modeline-spc) + (doom-modeline-spc) + (propertize (nyan-create) 'mouse-face mouse-face))) + ((and active + (bound-and-true-p poke-line-mode) + (not doom-modeline--limited-width-p) + (>= (window-width) poke-line-minimum-window-width)) + (concat + (doom-modeline-spc) + (doom-modeline-spc) + (propertize (poke-line-create) 'mouse-face mouse-face))) + ((and active + (bound-and-true-p mlscroll-mode) + (not doom-modeline--limited-width-p) + (>= (window-width) mlscroll-minimum-current-width)) + (concat + (doom-modeline-spc) + (doom-modeline-spc) + (let ((mlscroll-right-align nil)) + (format-mode-line (mlscroll-mode-line))))) + (t + (when doom-modeline-percent-position + (concat + (doom-modeline-spc) + (propertize (format-mode-line '("" doom-modeline-percent-position "%%")) + 'face face + 'help-echo "Buffer percentage\n\ +mouse-1: Display Line and Column Mode Menu" + 'mouse-face mouse-face + 'local-map local-map))))) + (when (or line-number-mode column-number-mode doom-modeline-percent-position) + (doom-modeline-spc))))) + +;; +;; Party parrot +;; +(doom-modeline-def-segment parrot + "The party parrot animated icon. Requires `parrot-mode' to be enabled." + (when (and (doom-modeline--active) + (not doom-modeline--limited-width-p) + (bound-and-true-p parrot-mode)) + (concat (doom-modeline-spc) + (doom-modeline-spc) + (parrot-create) + (doom-modeline-spc)))) + +;; +;; Modals (evil, overwrite, god, ryo and xah-fly-keys, etc.) +;; + +(defun doom-modeline--modal-icon (text face help-echo) + "Display the model icon with FACE and HELP-ECHO. +TEXT is alternative if icon is not available." + (propertize (doom-modeline-icon + 'material + (when doom-modeline-modal-icon "fiber_manual_record") + "●" + text + :face (if (doom-modeline--active) face 'mode-line-inactive) + :v-adjust -0.225) + 'help-echo help-echo)) + +(defsubst doom-modeline--evil () + "The current evil state. Requires `evil-mode' to be enabled." + (when (bound-and-true-p evil-local-mode) + (doom-modeline--modal-icon + (let ((tag (evil-state-property evil-state :tag t))) + (if (stringp tag) tag (funcall tag))) + (cond + ((evil-normal-state-p) 'doom-modeline-evil-normal-state) + ((evil-emacs-state-p) 'doom-modeline-evil-emacs-state) + ((evil-insert-state-p) 'doom-modeline-evil-insert-state) + ((evil-motion-state-p) 'doom-modeline-evil-motion-state) + ((evil-visual-state-p) 'doom-modeline-evil-visual-state) + ((evil-operator-state-p) 'doom-modeline-evil-operator-state) + ((evil-replace-state-p) 'doom-modeline-evil-replace-state) + (t 'doom-modeline-evil-normal-state)) + (evil-state-property evil-state :name t)))) + +(defsubst doom-modeline--overwrite () + "The current overwrite state which is enabled by command `overwrite-mode'." + (when (and (bound-and-true-p overwrite-mode) + (not (bound-and-true-p evil-local-mode))) + (doom-modeline--modal-icon " <O> " 'doom-modeline-urgent "Overwrite mode"))) + +(defsubst doom-modeline--god () + "The current god state which is enabled by the command `god-mode'." + (when (bound-and-true-p god-local-mode) + (doom-modeline--modal-icon " <G> " 'doom-modeline-evil-normal-state "God mode"))) + +(defsubst doom-modeline--ryo () + "The current ryo-modal state which is enabled by the command `ryo-modal-mode'." + (when (bound-and-true-p ryo-modal-mode) + (doom-modeline--modal-icon "<R>" 'doom-modeline-evil-normal-state "Ryo modal"))) + +(defsubst doom-modeline--xah-fly-keys () + "The current `xah-fly-keys' state." + (when (bound-and-true-p xah-fly-keys) + (if xah-fly-insert-state-q + (doom-modeline--modal-icon " <I> " + 'doom-modeline-evil-insert-state + (format "Xah-fly insert mode")) + (doom-modeline--modal-icon " <C> " + 'doom-modeline-evil-normal-state + (format "Xah-fly command mode"))))) + +(defsubst doom-modeline--boon () + "The current Boon state. Requires `boon-mode' to be enabled." + (when (bound-and-true-p boon-local-mode) + (doom-modeline--modal-icon + (boon-state-string) + (cond + (boon-command-state 'doom-modeline-evil-normal-state) + (boon-insert-state 'doom-modeline-evil-insert-state) + (boon-special-state 'doom-modeline-evil-emacs-state) + (boon-off-state 'doom-modeline-evil-operator-state) + (t 'doom-modeline-evil-operator-state)) + (boon-modeline-string)))) + +(defsubst doom-modeline--meow () + "The current Meow state. Requires `meow-mode' to be enabled." + (when (bound-and-true-p meow-mode) + meow--indicator)) + +(doom-modeline-def-segment modals + "Displays modal editing states, including `evil', `overwrite', `god', `ryo' +and `xha-fly-kyes', etc." + (let* ((evil (doom-modeline--evil)) + (ow (doom-modeline--overwrite)) + (god (doom-modeline--god)) + (ryo (doom-modeline--ryo)) + (xf (doom-modeline--xah-fly-keys)) + (boon (doom-modeline--boon)) + (vsep (doom-modeline-vspc)) + (meow (doom-modeline--meow)) + (sep (and (or evil ow god ryo xf boon) (doom-modeline-spc)))) + (concat sep + (and evil (concat evil (and (or ow god ryo xf boon meow) vsep))) + (and ow (concat ow (and (or god ryo xf boon meow) vsep))) + (and god (concat god (and (or ryo xf boon meow) vsep))) + (and ryo (concat ryo (and (or xf boon meow) vsep))) + (and xf (concat xf (and (or boon meow) vsep))) + (and boon (concat boon (and meow vsep))) + meow + sep))) + +;; +;; Objed state +;; + +(defvar doom-modeline--objed-active nil) + +(defun doom-modeline-update-objed (_ &optional reset) + "Update `objed' status, inactive when RESET is true." + (setq doom-modeline--objed-active (not reset))) + +(setq objed-modeline-setup-func #'doom-modeline-update-objed) + +(doom-modeline-def-segment objed-state () + "The current objed state." + (when (and doom-modeline--objed-active + (doom-modeline--active)) + (propertize (format " %s(%s) " + (symbol-name objed--object) + (char-to-string (aref (symbol-name objed--obj-state) 0))) + 'face 'doom-modeline-evil-emacs-state + 'help-echo (format "Objed object: %s (%s)" + (symbol-name objed--object) + (symbol-name objed--obj-state))))) + + +;; +;; Input method +;; + +(doom-modeline-def-segment input-method + "The current input method." + (propertize (cond (current-input-method + (concat (doom-modeline-spc) + current-input-method-title + (doom-modeline-spc))) + ((and (bound-and-true-p evil-local-mode) + (bound-and-true-p evil-input-method)) + (concat + (doom-modeline-spc) + (nth 3 (assoc default-input-method input-method-alist)) + (doom-modeline-spc))) + (t "")) + 'face (if (doom-modeline--active) + (if (and (bound-and-true-p rime-mode) + (equal current-input-method "rime")) + (if (and (rime--should-enable-p) + (not (rime--should-inline-ascii-p))) + 'doom-modeline-input-method + 'doom-modeline-input-method-alt) + 'doom-modeline-input-method) + 'mode-line-inactive) + 'help-echo (concat + "Current input method: " + current-input-method + "\n\ +mouse-2: Disable input method\n\ +mouse-3: Describe current input method") + 'mouse-face 'mode-line-highlight + 'local-map mode-line-input-method-map)) + + +;; +;; Info +;; + +(doom-modeline-def-segment info-nodes + "The topic and nodes in the Info buffer." + (let ((active (doom-modeline--active))) + (concat + (propertize " (" 'face (if active 'mode-line 'mode-line-inactive)) + ;; topic + (propertize (if (stringp Info-current-file) + (replace-regexp-in-string + "%" "%%" + (file-name-sans-extension + (file-name-nondirectory Info-current-file))) + (format "*%S*" Info-current-file)) + 'face (if active 'doom-modeline-info 'mode-line-inactive)) + (propertize ") " 'face (if active 'mode-line 'mode-line-inactive)) + ;; node + (when Info-current-node + (propertize (replace-regexp-in-string + "%" "%%" Info-current-node) + 'face (if active 'doom-modeline-buffer-path 'mode-line-inactive) + 'help-echo + "mouse-1: scroll forward, mouse-3: scroll back" + 'mouse-face 'mode-line-highlight + 'local-map Info-mode-line-node-keymap))))) + + +;; +;; REPL +;; + +(defun doom-modeline-repl-icon (text face) + "Display REPL icon (or TEXT in terminal) with FACE." + (doom-modeline-icon 'faicon "terminal" "$" text + :face face :height 1.0 :v-adjust -0.0575)) + +(defvar doom-modeline--cider nil) + +(defun doom-modeline-update-cider () + "Update cider repl state." + (setq doom-modeline--cider + (let* ((connected (cider-connected-p)) + (face (if connected 'doom-modeline-repl-success 'doom-modeline-repl-warning)) + (repl-buffer (cider-current-repl nil nil)) + (cider-info (when repl-buffer + (cider--connection-info repl-buffer t))) + (icon (doom-modeline-repl-icon "REPL" face))) + (propertize icon + 'help-echo + (if connected + (format "CIDER Connected %s\nmouse-2: CIDER quit" cider-info) + "CIDER Disconnected\nmouse-1: CIDER jack-in") + 'mouse-face 'mode-line-highlight + 'local-map (let ((map (make-sparse-keymap))) + (if connected + (define-key map [mode-line mouse-2] + #'cider-quit) + (define-key map [mode-line mouse-1] + #'cider-jack-in)) + map))))) + +(add-hook 'cider-connected-hook #'doom-modeline-update-cider) +(add-hook 'cider-disconnected-hook #'doom-modeline-update-cider) +(add-hook 'cider-mode-hook #'doom-modeline-update-cider) + +(doom-modeline-def-segment repl + "The REPL state." + (when doom-modeline-repl + (when-let (icon (when (bound-and-true-p cider-mode) + doom-modeline--cider)) + (concat + (doom-modeline-spc) + (if (doom-modeline--active) + icon + (doom-modeline-propertize-icon icon 'mode-line-inactive)) + (doom-modeline-spc))))) + + +;; +;; LSP +;; + +(defun doom-modeline-lsp-icon (text face) + "Display LSP icon (or TEXT in terminal) with FACE." + (doom-modeline-icon 'faicon "rocket" "🚀" text + :face face :height 1.0 :v-adjust -0.0575)) + +(defvar-local doom-modeline--lsp nil) +(defun doom-modeline-update-lsp (&rest _) + "Update `lsp-mode' state." + (setq doom-modeline--lsp + (let* ((workspaces (lsp-workspaces)) + (face (if workspaces 'doom-modeline-lsp-success 'doom-modeline-lsp-warning)) + (icon (doom-modeline-lsp-icon "LSP" face))) + (propertize icon + 'help-echo + (if workspaces + (concat "LSP Connected " + (string-join + (mapcar (lambda (w) + (format "[%s]\n" (lsp--workspace-print w))) + workspaces)) + "C-mouse-1: Switch to another workspace folder +mouse-1: Describe current session +mouse-2: Quit server +mouse-3: Reconnect to server") + "LSP Disconnected +mouse-1: Reload to start server") + 'mouse-face 'mode-line-highlight + 'local-map (let ((map (make-sparse-keymap))) + (if workspaces + (progn + (define-key map [mode-line C-mouse-1] + #'lsp-workspace-folders-open) + (define-key map [mode-line mouse-1] + #'lsp-describe-session) + (define-key map [mode-line mouse-2] + #'lsp-workspace-shutdown) + (define-key map [mode-line mouse-3] + #'lsp-workspace-restart)) + (progn + (define-key map [mode-line mouse-1] + (lambda () + (interactive) + (ignore-errors (revert-buffer t t)))))) + map))))) +(add-hook 'lsp-before-initialize-hook #'doom-modeline-update-lsp) +(add-hook 'lsp-after-initialize-hook #'doom-modeline-update-lsp) +(add-hook 'lsp-after-uninitialized-functions #'doom-modeline-update-lsp) +(add-hook 'lsp-before-open-hook #'doom-modeline-update-lsp) +(add-hook 'lsp-after-open-hook #'doom-modeline-update-lsp) + +(defvar-local doom-modeline--eglot nil) +(defun doom-modeline-update-eglot () + "Update `eglot' state." + (setq doom-modeline--eglot + (pcase-let* ((server (eglot-current-server)) + (nick (and server (eglot--project-nickname server))) + (pending (and server (hash-table-count + (jsonrpc--request-continuations server)))) + (`(,_id ,doing ,done-p ,detail) (and server (eglot--spinner server))) + (last-error (and server (jsonrpc-last-error server))) + (face (cond (last-error 'doom-modeline-lsp-error) + ((and doing (not done-p)) 'doom-modeline-lsp-running) + ((and pending (cl-plusp pending)) 'doom-modeline-lsp-warning) + (nick 'doom-modeline-lsp-success) + (t 'doom-modeline-lsp-warning))) + (icon (doom-modeline-lsp-icon "EGLOT" face))) + (propertize icon + 'help-echo (cond + (last-error + (format "EGLOT\nAn error occured: %s +mouse-3: Clear this status" (plist-get last-error :message))) + ((and doing (not done-p)) + (format "EGLOT\n%s%s" doing + (if detail (format "%s" detail) ""))) + ((and pending (cl-plusp pending)) + (format "EGLOT\n%d outstanding requests" pending)) + (nick (format "EGLOT Connected (%s/%s) +C-mouse-1: Go to server errors +mouse-1: Go to server events +mouse-2: Quit server +mouse-3: Reconnect to server" nick (eglot--major-mode server))) + (t "EGLOT Disconnected +mouse-1: Start server")) + 'mouse-face 'mode-line-highlight + 'local-map (let ((map (make-sparse-keymap))) + (cond (last-error + (define-key map [mode-line mouse-3] + #'eglot-clear-status)) + ((and pending (cl-plusp pending)) + (define-key map [mode-line mouse-3] + #'eglot-forget-pending-continuations)) + (nick + (define-key map [mode-line C-mouse-1] + #'eglot-stderr-buffer) + (define-key map [mode-line mouse-1] + #'eglot-events-buffer) + (define-key map [mode-line mouse-2] + #'eglot-shutdown) + (define-key map [mode-line mouse-3] + #'eglot-reconnect)) + (t (define-key map [mode-line mouse-1] + #'eglot))) + map))))) +(add-hook 'eglot--managed-mode-hook #'doom-modeline-update-eglot) + +(doom-modeline-def-segment lsp + "The LSP server state." + (when (and doom-modeline-lsp + (not doom-modeline--limited-width-p)) + (let ((active (doom-modeline--active)) + (icon (cond ((bound-and-true-p lsp-mode) + doom-modeline--lsp) + ((bound-and-true-p eglot--managed-mode) + doom-modeline--eglot)))) + (when icon + (concat + (doom-modeline-spc) + (if active + icon + (doom-modeline-propertize-icon icon 'mode-line-inactive)) + (doom-modeline-spc)))))) + +(defun doom-modeline-override-eglot-modeline () + "Override `eglot' mode-line." + (if (bound-and-true-p doom-modeline-mode) + (setq mode-line-misc-info + (delq (assq 'eglot--managed-mode mode-line-misc-info) mode-line-misc-info)) + (add-to-list 'mode-line-misc-info + `(eglot--managed-mode (" [" eglot--mode-line-format "] "))))) +(add-hook 'eglot--managed-mode-hook #'doom-modeline-override-eglot-modeline) +(add-hook 'doom-modeline-mode-hook #'doom-modeline-override-eglot-modeline) + + +;; +;; GitHub +;; + +(defvar doom-modeline--github-notification-number 0) +(defvar doom-modeline-before-github-fetch-notification-hook nil + "Hooks before fetching GitHub notifications. +Example: + (add-hook 'doom-modeline-before-github-fetch-notification-hook + #'auth-source-pass-enable)") +(defun doom-modeline--github-fetch-notifications () + "Fetch GitHub notifications." + (when (and doom-modeline-github + (require 'async nil t)) + (async-start + `(lambda () + ,(async-inject-variables + "\\`\\(load-path\\|auth-sources\\|doom-modeline-before-github-fetch-notification-hook\\)\\'") + (run-hooks 'doom-modeline-before-github-fetch-notification-hook) + (when (require 'ghub nil t) + (with-timeout (10) + (ignore-errors + (when-let* ((username (ghub--username ghub-default-host)) + (token (ghub--token ghub-default-host username 'ghub t))) + (ghub-get "/notifications" nil + :query '((notifications . "true")) + :username username + :auth token + :noerror t)))))) + (lambda (result) + (message "") ; suppress message + (setq doom-modeline--github-notification-number (length result)))))) + +(defvar doom-modeline--github-timer nil) +(defun doom-modeline-github-timer () + "Start/Stop the timer for GitHub fetching." + (if (timerp doom-modeline--github-timer) + (cancel-timer doom-modeline--github-timer)) + (setq doom-modeline--github-timer + (and doom-modeline-github + (run-with-idle-timer 30 + doom-modeline-github-interval + #'doom-modeline--github-fetch-notifications)))) + +(doom-modeline-add-variable-watcher + 'doom-modeline-github + (lambda (_sym val op _where) + (when (eq op 'set) + (setq doom-modeline-github val) + (doom-modeline-github-timer)))) + +(doom-modeline-github-timer) + +(doom-modeline-def-segment github + "The GitHub notifications." + (when (and doom-modeline-github + (doom-modeline--active) + (not doom-modeline--limited-width-p) + (numberp doom-modeline--github-notification-number) + (> doom-modeline--github-notification-number 0)) + (concat + (doom-modeline-spc) + (propertize + (concat + (doom-modeline-icon 'faicon "github" "🔔" "#" + :face 'doom-modeline-notification + :v-adjust -0.0575) + (doom-modeline-vspc) + ;; GitHub API is paged, and the limit is 50 + (propertize + (if (>= doom-modeline--github-notification-number 50) + "50+" + (number-to-string doom-modeline--github-notification-number)) + 'face '(:inherit + (doom-modeline-unread-number doom-modeline-notification)))) + 'help-echo "Github Notifications +mouse-1: Show notifications +mouse-3: Fetch notifications" + 'mouse-face 'mode-line-highlight + 'local-map (let ((map (make-sparse-keymap))) + (define-key map [mode-line mouse-1] + (lambda () + "Open GitHub notifications page." + (interactive) + (run-with-idle-timer 300 nil #'doom-modeline--github-fetch-notifications) + (browse-url "https://github.com/notifications"))) + (define-key map [mode-line mouse-3] + (lambda () + "Fetching GitHub notifications." + (interactive) + (message "Fetching GitHub notifications...") + (doom-modeline--github-fetch-notifications))) + map)) + (doom-modeline-spc)))) + + +;; +;; Debug states +;; + +;; Highlight the mode-line while debugging. +(defvar-local doom-modeline--debug-cookie nil) +(defun doom-modeline--debug-visual (&rest _) + "Update the face of mode-line for debugging." + (mapc (lambda (buffer) + (with-current-buffer buffer + (setq doom-modeline--debug-cookie + (face-remap-add-relative 'mode-line 'doom-modeline-debug-visual)) + (force-mode-line-update))) + (buffer-list))) + +(defun doom-modeline--normal-visual (&rest _) + "Restore the face of mode-line." + (mapc (lambda (buffer) + (with-current-buffer buffer + (when doom-modeline--debug-cookie + (face-remap-remove-relative doom-modeline--debug-cookie) + (force-mode-line-update)))) + (buffer-list))) + +(add-hook 'dap-session-created-hook #'doom-modeline--debug-visual) +(add-hook 'dap-terminated-hook #'doom-modeline--normal-visual) + +(defun doom-modeline-debug-icon (face &rest args) + "Display debug icon with FACE and ARGS." + (doom-modeline-icon 'faicon "bug" "🐛" "!" :face face :v-adjust -0.0575 args)) + +(defun doom-modeline--debug-dap () + "The current `dap-mode' state." + (when (and (bound-and-true-p dap-mode) + (bound-and-true-p lsp-mode)) + (when-let ((session (dap--cur-session))) + (when (dap--session-running session) + (propertize (doom-modeline-debug-icon 'doom-modeline-info) + 'help-echo (format "DAP (%s - %s) +mouse-1: Display debug hydra +mouse-2: Display recent configurations +mouse-3: Disconnect session" + (dap--debug-session-name session) + (dap--debug-session-state session)) + 'mouse-face 'mode-line-highlight + 'local-map (let ((map (make-sparse-keymap))) + (define-key map [mode-line mouse-1] + #'dap-hydra) + (define-key map [mode-line mouse-2] + #'dap-debug-recent) + (define-key map [mode-line mouse-3] + #'dap-disconnect) + map)))))) + +(defvar-local doom-modeline--debug-dap nil) +(defun doom-modeline-update-debug-dap (&rest _) + "Update dap debug state." + (setq doom-modeline--debug-dap (doom-modeline--debug-dap))) + +(add-hook 'dap-session-created-hook #'doom-modeline-update-debug-dap) +(add-hook 'dap-session-changed-hook #'doom-modeline-update-debug-dap) +(add-hook 'dap-terminated-hook #'doom-modeline-update-debug-dap) + +(defsubst doom-modeline--debug-edebug () + "The current `edebug' state." + (when (bound-and-true-p edebug-mode) + (propertize (doom-modeline-debug-icon 'doom-modeline-info) + 'help-echo (format "EDebug (%s) +mouse-1: Show help +mouse-2: Next +mouse-3: Stop debugging" + edebug-execution-mode) + 'mouse-face 'mode-line-highlight + 'local-map (let ((map (make-sparse-keymap))) + (define-key map [mode-line mouse-1] + #'edebug-help) + (define-key map [mode-line mouse-2] + #'edebug-next-mode) + (define-key map [mode-line mouse-3] + #'edebug-stop) + map)))) + +(defsubst doom-modeline--debug-on-error () + "The current `debug-on-error' state." + (when debug-on-error + (propertize (doom-modeline-debug-icon 'doom-modeline-urgent) + 'help-echo "Debug on Error +mouse-1: Toggle Debug on Error" + 'mouse-face 'mode-line-highlight + 'local-map (make-mode-line-mouse-map 'mouse-1 #'toggle-debug-on-error)))) + +(defsubst doom-modeline--debug-on-quit () + "The current `debug-on-quit' state." + (when debug-on-quit + (propertize (doom-modeline-debug-icon 'doom-modeline-warning) + 'help-echo "Debug on Quit +mouse-1: Toggle Debug on Quit" + 'mouse-face 'mode-line-highlight + 'local-map (make-mode-line-mouse-map 'mouse-1 #'toggle-debug-on-quit)))) + +(doom-modeline-def-segment debug + "The current debug state." + (when (and (doom-modeline--active) + (not doom-modeline--limited-width-p)) + (let* ((dap doom-modeline--debug-dap) + (edebug (doom-modeline--debug-edebug)) + (on-error (doom-modeline--debug-on-error)) + (on-quit (doom-modeline--debug-on-quit)) + (vsep (doom-modeline-vspc)) + (sep (and (or dap edebug on-error on-quit) (doom-modeline-spc)))) + (concat sep + (and dap (concat dap (and (or edebug on-error on-quit) vsep))) + (and edebug (concat edebug (and (or on-error on-quit) vsep))) + (and on-error (concat on-error (and on-quit vsep))) + on-quit + sep)))) + + +;; +;; PDF pages +;; + +(defvar-local doom-modeline--pdf-pages nil) +(defun doom-modeline-update-pdf-pages () + "Update PDF pages." + (setq doom-modeline--pdf-pages + (format " P%d/%d " + (eval `(pdf-view-current-page)) + (pdf-cache-number-of-pages)))) +(add-hook 'pdf-view-change-page-hook #'doom-modeline-update-pdf-pages) + +(doom-modeline-def-segment pdf-pages + "Display PDF pages." + (propertize doom-modeline--pdf-pages + 'face (if (doom-modeline--active) 'mode-line 'mode-line-inactive))) + + +;; +;; `mu4e-alert' notifications +;; + +(doom-modeline-def-segment mu4e + "Show notifications of any unread emails in `mu4e'." + (when (and doom-modeline-mu4e + (doom-modeline--active) + (not doom-modeline--limited-width-p) + (bound-and-true-p mu4e-alert-mode-line) + (numberp mu4e-alert-mode-line) + ;; don't display if the unread mails count is zero + (> mu4e-alert-mode-line 0)) + (concat + (doom-modeline-spc) + (propertize + (concat + (doom-modeline-icon 'material "email" "📧" "#" + :face 'doom-modeline-notification + :height 1.1 :v-adjust -0.2) + (doom-modeline-vspc) + (propertize + (if (> mu4e-alert-mode-line doom-modeline-number-limit) + (format "%d+" doom-modeline-number-limit) + (number-to-string mu4e-alert-mode-line)) + 'face '(:inherit + (doom-modeline-unread-number doom-modeline-notification)))) + 'mouse-face 'mode-line-highlight + 'keymap '(mode-line keymap + (mouse-1 . mu4e-alert-view-unread-mails) + (mouse-2 . mu4e-alert-view-unread-mails) + (mouse-3 . mu4e-alert-view-unread-mails)) + 'help-echo (concat (if (= mu4e-alert-mode-line 1) + "You have an unread email" + (format "You have %s unread emails" mu4e-alert-mode-line)) + "\nClick here to view " + (if (= mu4e-alert-mode-line 1) "it" "them"))) + (doom-modeline-spc)))) + +(defun doom-modeline-override-mu4e-alert-modeline (&rest _) + "Delete `mu4e-alert-mode-line' from global modeline string." + (when (featurep 'mu4e-alert) + (if (and doom-modeline-mu4e + (bound-and-true-p doom-modeline-mode)) + ;; Delete original modeline + (progn + (setq global-mode-string + (delete '(:eval mu4e-alert-mode-line) global-mode-string)) + (setq mu4e-alert-modeline-formatter #'identity)) + ;; Recover default settings + (setq mu4e-alert-modeline-formatter #'mu4e-alert-default-mode-line-formatter)))) +(advice-add #'mu4e-alert-enable-mode-line-display + :after #'doom-modeline-override-mu4e-alert-modeline) +(add-hook 'doom-modeline-mode-hook #'doom-modeline-override-mu4e-alert-modeline) + + +;; +;; `gnus' notifications +;; + +(defvar doom-modeline--gnus-unread-mail 0) +(defvar doom-modeline--gnus-started nil + "Used to determine if gnus has started.") +(defun doom-modeline-update-gnus-status (&rest _) + "Get the total number of unread news of gnus group." + (setq doom-modeline--gnus-unread-mail + (when (and doom-modeline-gnus + doom-modeline--gnus-started) + (let ((total-unread-news-number 0)) + (mapc (lambda (g) + (let* ((group (car g)) + (unread (eval `(gnus-group-unread ,group)))) + (when (and (not (seq-contains-p doom-modeline-gnus-excluded-groups group)) + (numberp unread) + (> unread 0)) + (setq total-unread-news-number (+ total-unread-news-number unread))))) + gnus-newsrc-alist) + total-unread-news-number)))) + +;; Update the modeline after changes have been made +(add-hook 'gnus-group-update-hook #'doom-modeline-update-gnus-status) +(add-hook 'gnus-summary-update-hook #'doom-modeline-update-gnus-status) +(add-hook 'gnus-group-update-group-hook #'doom-modeline-update-gnus-status) +(add-hook 'gnus-after-getting-new-news-hook #'doom-modeline-update-gnus-status) + +;; Only start to listen to gnus when gnus is actually running +(defun doom-modeline-start-gnus-listener () + "Start GNUS listener." + (when (and doom-modeline-gnus + (not doom-modeline--gnus-started)) + (setq doom-modeline--gnus-started t) + ;; Scan gnus in the background if the timer is higher than 0 + (doom-modeline-update-gnus-status) + (if (> doom-modeline-gnus-timer 0) + (gnus-demon-add-handler 'gnus-demon-scan-news doom-modeline-gnus-timer nil)))) +(add-hook 'gnus-started-hook #'doom-modeline-start-gnus-listener) + +;; Stop the listener if gnus isn't running +(defun doom-modeline-stop-gnus-listener () + "Stop GNUS listener." + (setq doom-modeline--gnus-started nil)) +(add-hook 'gnus-exit-gnus-hook #'doom-modeline-stop-gnus-listener) + +(doom-modeline-def-segment gnus + "Show notifications of any unread emails in `gnus'." + (when (and (doom-modeline--active) + (not doom-modeline--limited-width-p) + doom-modeline-gnus + doom-modeline--gnus-started + ;; Don't display if the unread mails count is zero + (numberp doom-modeline--gnus-unread-mail) + (> doom-modeline--gnus-unread-mail 0)) + (concat + (doom-modeline-spc) + (propertize + (concat + (doom-modeline-icon 'material "email" "📧" "#" + :face 'doom-modeline-notification + :height 1.1 :v-adjust -0.2) + (doom-modeline-vspc) + (propertize + (if (> doom-modeline--gnus-unread-mail doom-modeline-number-limit) + (format "%d+" doom-modeline-number-limit) + (number-to-string doom-modeline--gnus-unread-mail)) + 'face '(:inherit + (doom-modeline-unread-number doom-modeline-notification)))) + 'mouse-face 'mode-line-highlight + 'help-echo (if (= doom-modeline--gnus-unread-mail 1) + "You have an unread email" + (format "You have %s unread emails" doom-modeline--gnus-unread-mail))) + (doom-modeline-spc)))) + + +;; +;; IRC notifications +;; + +(defun doom-modeline--shorten-irc (name) + "Wrapper for `tracking-shorten' and `erc-track-shorten-function' with NAME. + +One key difference is that when `tracking-shorten' and +`erc-track-shorten-function' returns nil we will instead return the original +value of name. This is necessary in cases where the user has stylized the name +to be an icon and we don't want to remove that so we just return the original." + (or (and (boundp 'tracking-shorten) + (car (tracking-shorten (list name)))) + (and (boundp 'erc-track-shorten-function) + (functionp erc-track-shorten-function) + (car (funcall erc-track-shorten-function (list name)))) + (and (boundp 'rcirc-short-buffer-name) + (rcirc-short-buffer-name name)) + name)) + +(defun doom-modeline--tracking-buffers (buffers) + "Logic to convert some irc BUFFERS to their font-awesome icon." + (mapconcat + (lambda (b) + (propertize + (doom-modeline--shorten-irc (funcall doom-modeline-irc-stylize b)) + 'face '(:inherit (doom-modeline-unread-number doom-modeline-notification)) + 'help-echo (format "IRC Notification: %s\nmouse-1: Switch to buffer" b) + 'mouse-face 'mode-line-highlight + 'local-map (make-mode-line-mouse-map 'mouse-1 + (lambda () + (interactive) + (when (buffer-live-p (get-buffer b)) + (switch-to-buffer b)))))) + buffers + (doom-modeline-vspc))) + +(defun doom-modeline--circe-p () + "Check if `circe' is in use." + (boundp 'tracking-mode-line-buffers)) + +(defun doom-modeline--erc-p () + "Check if `erc' is in use." + (boundp 'erc-modified-channels-alist)) + +(defun doom-modeline--rcirc-p () + "Check if `rcirc' is in use." + (bound-and-true-p rcirc-track-minor-mode)) + +(defun doom-modeline--get-buffers () + "Gets the buffers that have activity." + (cond + ((doom-modeline--circe-p) + tracking-buffers) + ((doom-modeline--erc-p) + (mapcar (lambda (l) + (buffer-name (car l))) + erc-modified-channels-alist)) + ((doom-modeline--rcirc-p) + (mapcar (lambda (b) + (buffer-name b)) + rcirc-activity)))) + +;; Create a modeline segment that contains all the irc tracked buffers +(doom-modeline-def-segment irc-buffers + "The list of shortened, unread irc buffers." + (when (and doom-modeline-irc + (doom-modeline--active) + (not doom-modeline--limited-width-p)) + (let* ((buffers (doom-modeline--get-buffers)) + (number (length buffers))) + (when (> number 0) + (concat + (doom-modeline-spc) + (doom-modeline--tracking-buffers buffers) + (doom-modeline-spc)))))) + +(doom-modeline-def-segment irc + "A notification icon for any unread irc buffer." + (when (and doom-modeline-irc + (doom-modeline--active) + (not doom-modeline--limited-width-p)) + (let* ((buffers (doom-modeline--get-buffers)) + (number (length buffers))) + (when (> number 0) + (concat + (doom-modeline-spc) + + (propertize (concat + (doom-modeline-icon 'material "message" "🗊" "#" + :face 'doom-modeline-notification + :height 1.0 :v-adjust -0.225) + (doom-modeline-vspc) + ;; Display the number of unread buffers + (propertize (number-to-string number) + 'face '(:inherit + (doom-modeline-unread-number + doom-modeline-notification)))) + 'help-echo (format "IRC Notifications: %s\n%s" + (mapconcat + (lambda (b) (funcall doom-modeline-irc-stylize b)) + buffers + ", ") + (cond + ((doom-modeline--circe-p) + "mouse-1: Switch to previous unread buffer +mouse-3: Switch to next unread buffer") + ((doom-modeline--erc-p) + "mouse-1: Switch to buffer +mouse-3: Switch to next unread buffer") + ((doom-modeline--rcirc-p) + "mouse-1: Switch to server buffer +mouse-3: Switch to next unread buffer"))) + 'mouse-face 'mode-line-highlight + 'local-map (let ((map (make-sparse-keymap))) + (cond + ((doom-modeline--circe-p) + (define-key map [mode-line mouse-1] + #'tracking-previous-buffer) + (define-key map [mode-line mouse-3] + #'tracking-next-buffer)) + ((doom-modeline--erc-p) + (define-key map [mode-line mouse-1] + #'erc-switch-to-buffer) + (define-key map [mode-line mouse-3] + #'erc-track-switch-buffer)) + ((doom-modeline--rcirc-p) + (define-key map [mode-line mouse-1] + #'rcirc-switch-to-server-buffer) + (define-key map [mode-line mouse-3] + #'rcirc-next-active-buffer))) + map)) + + ;; Display the unread irc buffers as well + (when doom-modeline-irc-buffers + (concat (doom-modeline-spc) + (doom-modeline--tracking-buffers buffers))) + + (doom-modeline-spc)))))) + +(defun doom-modeline-override-rcirc-modeline () + "Override default `rcirc' mode-line." + (if (bound-and-true-p doom-modeline-mode) + (setq global-mode-string + (delq 'rcirc-activity-string global-mode-string)) + (when (and rcirc-track-minor-mode + (not (memq 'rcirc-activity-string global-mode-string))) + (setq global-mode-string + (append global-mode-string '(rcirc-activity-string)))))) +(add-hook 'rcirc-track-minor-mode-hook #'doom-modeline-override-rcirc-modeline) +(add-hook 'doom-modeline-mode-hook #'doom-modeline-override-rcirc-modeline) + + +;; +;; Battery status +;; + +(defvar doom-modeline--battery-status nil) +(defun doom-modeline-update-battery-status () + "Update battery status." + (setq doom-modeline--battery-status + (when (bound-and-true-p display-battery-mode) + (let* ((data (and battery-status-function + (functionp battery-status-function) + (funcall battery-status-function))) + (charging? (string-equal "AC" (cdr (assoc ?L data)))) + (percentage (car (read-from-string (or (cdr (assq ?p data)) "ERR")))) + (valid-percentage? (and (numberp percentage) + (>= percentage 0) + (<= percentage battery-mode-line-limit))) + (face (if valid-percentage? + (cond (charging? 'doom-modeline-battery-charging) + ((< percentage battery-load-critical) 'doom-modeline-battery-critical) + ((< percentage 25) 'doom-modeline-battery-warning) + ((< percentage 95) 'doom-modeline-battery-normal) + (t 'doom-modeline-battery-full)) + 'doom-modeline-battery-error)) + (icon (if valid-percentage? + (cond (charging? + (doom-modeline-icon 'alltheicon "battery-charging" "🔋" "+" + :face face :height 1.4 :v-adjust -0.1)) + ((> percentage 95) + (doom-modeline-icon 'faicon "battery-full" "🔋" "-" + :face face :v-adjust -0.0575)) + ((> percentage 70) + (doom-modeline-icon 'faicon "battery-three-quarters" "🔋" "-" + :face face :v-adjust -0.0575)) + ((> percentage 40) + (doom-modeline-icon 'faicon "battery-half" "🔋" "-" + :face face :v-adjust -0.0575)) + ((> percentage battery-load-critical) + (doom-modeline-icon 'faicon "battery-quarter" "🔋" "-" + :face face :v-adjust -0.0575)) + (t (doom-modeline-icon 'faicon "battery-empty" "🔋" "!" + :face face :v-adjust -0.0575))) + (doom-modeline-icon 'faicon "battery-empty" "⚠" "N/A" + :face face :v-adjust -0.0575))) + (text (if valid-percentage? (format "%d%%%%" percentage) "")) + (help-echo (if (and battery-echo-area-format data valid-percentage?) + (battery-format battery-echo-area-format data) + "Battery status not available"))) + (cons (propertize icon 'help-echo help-echo) + (propertize text 'face face 'help-echo help-echo)))))) + +(doom-modeline-add-variable-watcher + 'doom-modeline-icon + (lambda (_sym val op _where) + (when (eq op 'set) + (setq doom-modeline-icon val) + (dolist (buf (buffer-list)) + (with-current-buffer buf + (doom-modeline-update-battery-status)))))) + +(doom-modeline-add-variable-watcher + 'doom-modeline-unicode-fallback + (lambda (_sym val op _where) + (when (eq op 'set) + (setq doom-modeline-unicode-fallback val) + (dolist (buf (buffer-list)) + (with-current-buffer buf + (doom-modeline-update-battery-status)))))) + +(doom-modeline-def-segment battery + "Display battery status." + (when (and (doom-modeline--active) + (not doom-modeline--limited-width-p) + (bound-and-true-p display-battery-mode)) + (concat (doom-modeline-spc) + (concat + (car doom-modeline--battery-status) + (doom-modeline-vspc) + (cdr doom-modeline--battery-status)) + (doom-modeline-spc)))) + +(defun doom-modeline-override-battery-modeline () + "Override default battery mode-line." + (if (bound-and-true-p doom-modeline-mode) + (progn + (advice-add #'battery-update :override #'doom-modeline-update-battery-status) + (setq global-mode-string + (delq 'battery-mode-line-string global-mode-string)) + (and (bound-and-true-p display-battery-mode) (battery-update))) + (progn + (advice-remove #'battery-update #'doom-modeline-update-battery-status) + (when (and display-battery-mode battery-status-function battery-mode-line-format + (not (memq 'battery-mode-line-string global-mode-string))) + (setq global-mode-string + (append global-mode-string '(battery-mode-line-string))))))) +(add-hook 'display-battery-mode-hook #'doom-modeline-override-battery-modeline) +(add-hook 'doom-modeline-mode-hook #'doom-modeline-override-battery-modeline) + + +;; +;; Package information +;; + +(doom-modeline-def-segment package + "Show package information via `paradox'." + (let ((active (doom-modeline--active))) + (concat + (let ((front (format-mode-line 'mode-line-front-space))) + (if active + front + (propertize front 'face 'mode-line-inactive))) + + (when (and doom-modeline-icon doom-modeline-major-mode-icon) + (concat + (doom-modeline-spc) + (doom-modeline-icon 'faicon "archive" nil nil + :face (if active + (if doom-modeline-major-mode-color-icon + 'all-the-icons-silver + 'mode-line) + 'mode-line-inactive) + :height 1.0 + :v-adjust -0.0575))) + (let ((info (format-mode-line 'mode-line-buffer-identification))) + (if active + info + (propertize info 'face 'mode-line-inactive)))))) + + +;; +;; Helm +;; + +(defvar doom-modeline--helm-buffer-ids + '(("*helm*" . "HELM") + ("*helm M-x*" . "HELM M-x") + ("*swiper*" . "SWIPER") + ("*Projectile Perspectives*" . "HELM Projectile Perspectives") + ("*Projectile Layouts*" . "HELM Projectile Layouts") + ("*helm-ag*" . (lambda () + (format "HELM Ag: Using %s" + (car (split-string helm-ag-base-command)))))) + "Alist of custom helm buffer names to use. +The cdr can also be a function that returns a name to use.") + +(doom-modeline-def-segment helm-buffer-id + "Helm session identifier." + (when (bound-and-true-p helm-alive-p) + (let ((active (doom-modeline--active))) + (concat + (doom-modeline-spc) + (when doom-modeline-icon + (concat + (doom-modeline-icon 'fileicon "elisp" nil nil + :face (if active + (if doom-modeline-major-mode-color-icon + 'all-the-icons-blue + 'mode-line) + 'mode-line-inactive) + :height 1.0 + :v-adjust -0.15) + (doom-modeline-spc))) + (propertize + (let ((custom (cdr (assoc (buffer-name) doom-modeline--helm-buffer-ids))) + (case-fold-search t) + (name (replace-regexp-in-string "-" " " (buffer-name)))) + (cond ((stringp custom) custom) + ((functionp custom) (funcall custom)) + (t + (string-match "\\*helm:? \\(mode \\)?\\([^\\*]+\\)\\*" name) + (concat "HELM " (capitalize (match-string 2 name)))))) + 'face (if active' doom-modeline-buffer-file 'mode-line-inactive)) + (doom-modeline-spc))))) + +(doom-modeline-def-segment helm-number + "Number of helm candidates." + (when (bound-and-true-p helm-alive-p) + (let ((active (doom-modeline--active))) + (concat + (propertize (format " %d/%d" + (helm-candidate-number-at-point) + (helm-get-candidate-number t)) + 'face (if active 'doom-modeline-buffer-path 'mode-line-inactive)) + (propertize (format " (%d total) " (helm-get-candidate-number)) + 'face (if active 'doom-modeline-info 'mode-line-inactive)))))) + +(doom-modeline-def-segment helm-help + "Helm keybindings help." + (when (bound-and-true-p helm-alive-p) + (let ((active (doom-modeline--active))) + (-interleave + (mapcar (lambda (s) + (propertize (substitute-command-keys s) + 'face (if active + 'doom-modeline-buffer-file + 'mode-line-inactive))) + '("\\<helm-map>\\[helm-help]" + "\\<helm-map>\\[helm-select-action]" + "\\<helm-map>\\[helm-maybe-exit-minibuffer]/F1/F2...")) + (mapcar (lambda (s) + (propertize s 'face (if active 'mode-line 'mode-line-inactive))) + '("(help) " "(actions) " "(action) ")))))) + +(doom-modeline-def-segment helm-prefix-argument + "Helm prefix argument." + (when (and (bound-and-true-p helm-alive-p) + helm--mode-line-display-prefarg) + (let ((arg (prefix-numeric-value (or prefix-arg current-prefix-arg)))) + (unless (= arg 1) + (propertize (format "C-u %s" arg) + 'face (if (doom-modeline--active) + 'doom-modeline-info + 'mode-line-inactive)))))) + +(defvar doom-modeline--helm-current-source nil + "The currently active helm source.") +(doom-modeline-def-segment helm-follow + "Helm follow indicator." + (when (and (bound-and-true-p helm-alive-p) + doom-modeline--helm-current-source + (eq 1 (cdr (assq 'follow doom-modeline--helm-current-source)))) + (propertize "HF" 'face (if (doom-modeline--active) + 'mode-line + 'mode-line-inactive)))) + +;; +;; Git timemachine +;; + +(doom-modeline-def-segment git-timemachine + (let ((active (doom-modeline--active))) + (concat + (doom-modeline-spc) + (doom-modeline--buffer-mode-icon) + ;; Snapshot icon + (doom-modeline-icon 'material "camera_alt" "📷" "%1*" + :face (if active + '(:inherit doom-modeline-warning :weight normal) + 'mode-line-inactive) + :height 1.1 :v-adjust -0.25) + (and doom-modeline-icon (doom-modeline-vspc)) + ;; Buffer name + (propertize "*%b*" 'face (if active + 'doom-modeline-buffer-timemachine + 'mode-line-inactive))))) + +;; +;; Markdown/Org preview +;; + +(doom-modeline-def-segment grip + (when (bound-and-true-p grip-mode) + (concat + (doom-modeline-spc) + (let ((face (if (doom-modeline--active) + (if grip--process + (pcase (process-status grip--process) + ('run 'doom-modeline-buffer-path) + ('exit 'doom-modeline-warning) + (_ 'doom-modeline-urgent)) + 'doom-modeline-urgent) + 'mode-line-inactive))) + (propertize (doom-modeline-icon 'material "pageview" "🗐" "@" + :face (if doom-modeline-icon + `(:inherit ,face :weight normal) + face) + :height 1.2 :v-adjust -0.2) + 'help-echo (format "Preview on %s +mouse-1: Preview in browser +mouse-2: Stop preview +mouse-3: Restart preview" + (grip--preview-url)) + 'mouse-face 'mode-line-highlight + 'local-map (let ((map (make-sparse-keymap))) + (define-key map [mode-line mouse-1] + #'grip-browse-preview) + (define-key map [mode-line mouse-2] + #'grip-stop-preview) + (define-key map [mode-line mouse-3] + #'grip-restart-preview) + map))) + (doom-modeline-spc)))) + +(provide 'doom-modeline-segments) + +;;; doom-modeline-segments.el ends here diff --git a/.emacs.d/elpa/doom-modeline-20210608.516/doom-modeline-segments.elc b/.emacs.d/elpa/doom-modeline-20210608.516/doom-modeline-segments.elc new file mode 100644 index 0000000..3eb3842 Binary files /dev/null and b/.emacs.d/elpa/doom-modeline-20210608.516/doom-modeline-segments.elc differ diff --git a/.emacs.d/elpa/doom-modeline-20210608.516/doom-modeline.el b/.emacs.d/elpa/doom-modeline-20210608.516/doom-modeline.el new file mode 100644 index 0000000..b1cc62e --- /dev/null +++ b/.emacs.d/elpa/doom-modeline-20210608.516/doom-modeline.el @@ -0,0 +1,313 @@ +;;; doom-modeline.el --- A minimal and modern mode-line -*- lexical-binding: t; -*- + +;; Copyright (C) 2018-2020 Vincent Zhang + +;; Author: Vincent Zhang <seagle0128@gmail.com> +;; Homepage: https://github.com/seagle0128/doom-modeline +;; Version: 3.2.0 +;; Package-Requires: ((emacs "25.1") (all-the-icons "2.2.0") (shrink-path "0.2.0") (dash "2.11.0")) +;; Keywords: faces mode-line + +;; This file is not part of GNU Emacs. + +;; +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License as +;; published by the Free Software Foundation; either version 2, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; see the file COPYING. If not, write to +;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth +;; Floor, Boston, MA 02110-1301, USA. +;; + +;;; Commentary: +;; +;; This package offers a fancy and fast mode-line inspired by minimalism design. +;; +;; It's integrated into Doom Emacs (https://github.com/hlissner/doom-emacs) and +;; Centaur Emacs (https://github.com/seagle0128/.emacs.d). +;; +;; The doom-modeline offers: +;; - A match count panel (for anzu, iedit, multiple-cursors, symbol-overlay, +;; evil-search and evil-substitute) +;; - An indicator for recording a macro +;; - Current environment version (e.g. python, ruby, go, etc.) in the major-mode +;; - A customizable mode-line height (see doom-modeline-height) +;; - A minor modes segment which is compatible with minions +;; - An error/warning count segment for flymake/flycheck +;; - A workspace number segment for eyebrowse +;; - A perspective name segment for persp-mode +;; - A window number segment for winum and window-numbering +;; - An indicator for modal editing state, including evil, overwrite, god, ryo +;; and xah-fly-keys, etc. +;; - An indicator for battery status +;; - An indicator for current input method +;; - An indicator for debug state +;; - An indicator for remote host +;; - An indicator for LSP state with lsp-mode or eglot +;; - An indicator for github notifications +;; - An indicator for unread emails with mu4e-alert +;; - An indicator for unread emails with gnus (basically builtin) +;; - An indicator for irc notifications with circe, rcirc or erc. +;; - An indicator for buffer position which is compatible with nyan-mode or poke-line +;; - An indicator for party parrot +;; - An indicator for PDF page number with pdf-tools +;; - An indicator for markdown/org previews with grip +;; - Truncated file name, file icon, buffer state and project name in buffer +;; information segment, which is compatible with project, find-file-in-project +;; and projectile +;; - New mode-line for Info-mode buffers +;; - New package mode-line for paradox +;; - New mode-line for helm buffers +;; - New mode-line for git-timemachine buffers +;; +;; Installation: +;; From melpa, `M-x package-install RET doom-modeline RET`. +;; In `init.el`, +;; (require 'doom-modeline) +;; (doom-modeline-mode 1) +;; or +;; (use-package doom-modeline +;; :ensure t +;; :hook (after-init . doom-modeline-mode)) +;; + +;;; Code: + +(require 'doom-modeline-core) +(require 'doom-modeline-segments) + + +;; +;; Mode lines +;; + +(doom-modeline-def-modeline 'main + '(bar workspace-name window-number modals matches buffer-info remote-host buffer-position word-count parrot selection-info) + '(objed-state misc-info persp-name battery grip irc mu4e gnus github debug repl lsp minor-modes input-method indent-info buffer-encoding major-mode process vcs checker)) + +(doom-modeline-def-modeline 'minimal + '(bar matches buffer-info-simple) + '(media-info major-mode)) + +(doom-modeline-def-modeline 'special + '(bar window-number modals matches buffer-info buffer-position word-count parrot selection-info) + '(objed-state misc-info battery irc-buffers debug minor-modes input-method indent-info buffer-encoding major-mode process)) + +(doom-modeline-def-modeline 'project + '(bar window-number buffer-default-directory) + '(misc-info battery irc mu4e gnus github debug minor-modes input-method major-mode process)) + +(doom-modeline-def-modeline 'dashboard + '(bar window-number buffer-default-directory-simple) + '(misc-info battery irc mu4e gnus github debug minor-modes input-method major-mode process)) + +(doom-modeline-def-modeline 'vcs + '(bar window-number modals matches buffer-info buffer-position parrot selection-info) + '(misc-info battery irc mu4e gnus github debug minor-modes buffer-encoding major-mode process)) + +(doom-modeline-def-modeline 'package + '(bar window-number package) + '(misc-info major-mode process)) + +(doom-modeline-def-modeline 'info + '(bar window-number buffer-info info-nodes buffer-position parrot selection-info) + '(misc-info buffer-encoding major-mode)) + +(doom-modeline-def-modeline 'media + '(bar window-number buffer-size buffer-info) + '(misc-info media-info major-mode process vcs)) + +(doom-modeline-def-modeline 'message + '(bar window-number modals matches buffer-info-simple buffer-position word-count parrot selection-info) + '(objed-state misc-info battery debug minor-modes input-method indent-info buffer-encoding major-mode)) + +(doom-modeline-def-modeline 'pdf + '(bar window-number matches buffer-info pdf-pages) + '(misc-info major-mode process vcs)) + +(doom-modeline-def-modeline 'org-src + '(bar window-number modals matches buffer-info-simple buffer-position word-count parrot selection-info) + '(objed-state misc-info debug lsp minor-modes input-method indent-info buffer-encoding major-mode process checker)) + +(doom-modeline-def-modeline 'helm + '(bar helm-buffer-id helm-number helm-follow helm-prefix-argument) + '(helm-help)) + +(doom-modeline-def-modeline 'timemachine + '(bar window-number matches git-timemachine buffer-position word-count parrot selection-info) + '(misc-info minor-modes indent-info buffer-encoding major-mode)) + + +;; +;; Interfaces +;; + +;;;###autoload +(defun doom-modeline-init () + "Initialize doom mode-line." + (doom-modeline-mode 1)) +(make-obsolete 'doom-modeline-init 'doom-modeline-mode "1.6.0") + +;;;###autoload +(defun doom-modeline-set-main-modeline (&optional default) + "Set main mode-line. +If DEFAULT is non-nil, set the default mode-line for all buffers." + (doom-modeline-set-modeline 'main default)) + +;;;###autoload +(defun doom-modeline-set-minimal-modeline () + "Set minimal mode-line." + (doom-modeline-set-modeline 'minimal)) + +;;;###autoload +(defun doom-modeline-set-special-modeline () + "Set special mode-line." + (doom-modeline-set-modeline 'special)) + +;;;###autoload +(defun doom-modeline-set-project-modeline () + "Set project mode-line." + (doom-modeline-set-modeline 'project)) + +;;;###autoload +(defun doom-modeline-set-dashboard-modeline () + "Set dashboard mode-line." + (doom-modeline-set-modeline 'dashboard)) + +;;;###autoload +(defun doom-modeline-set-vcs-modeline () + "Set vcs mode-line." + (doom-modeline-set-modeline 'vcs)) + +;;;###autoload +(defun doom-modeline-set-info-modeline () + "Set Info mode-line." + (doom-modeline-set-modeline 'info)) + +;;;###autoload +(defun doom-modeline-set-package-modeline () + "Set package mode-line." + (doom-modeline-set-modeline 'package)) + +;;;###autoload +(defun doom-modeline-set-media-modeline () + "Set media mode-line." + (doom-modeline-set-modeline 'media)) + +;;;###autoload +(defun doom-modeline-set-message-modeline () + "Set message mode-line." + (doom-modeline-set-modeline 'message)) + +;;;###autoload +(defun doom-modeline-set-pdf-modeline () + "Set pdf mode-line." + (doom-modeline-set-modeline 'pdf)) + +;;;###autoload +(defun doom-modeline-set-org-src-modeline () + "Set org-src mode-line." + (doom-modeline-set-modeline 'org-src)) + +;;;###autoload +(defun doom-modeline-set-helm-modeline (&rest _) ; To advice helm + "Set helm mode-line." + (doom-modeline-set-modeline 'helm)) + +;;;###autoload +(defun doom-modeline-set-timemachine-modeline () + "Set timemachine mode-line." + (doom-modeline-set-modeline 'timemachine)) + + +;; +;; Minor mode +;; + +(defvar doom-modeline-mode-map (make-sparse-keymap)) + +;; Suppress warnings +(defvar 2C-mode-line-format) +(declare-function helm-display-mode-line 'helm) + +;;;###autoload +(define-minor-mode doom-modeline-mode + "Toggle doom-modeline on or off." + :group 'doom-modeline + :global t + :lighter nil + :keymap doom-modeline-mode-map + (if doom-modeline-mode + (progn + (doom-modeline-refresh-bars) ; Create bars + (doom-modeline-set-main-modeline t) ; Set default mode-line + + ;; Apply to all existing buffers. + (dolist (buf (buffer-list)) + (with-current-buffer buf + (doom-modeline-set-main-modeline))) + + ;; For two-column editing + (setq 2C-mode-line-format (doom-modeline 'special)) + + ;; Add hooks + (add-hook 'Info-mode-hook #'doom-modeline-set-info-modeline) + (add-hook 'dired-mode-hook #'doom-modeline-set-project-modeline) + (add-hook 'dashboard-mode-hook #'doom-modeline-set-dashboard-modeline) + (add-hook 'image-mode-hook #'doom-modeline-set-media-modeline) + (add-hook 'message-mode-hook #'doom-modeline-set-message-modeline) + (add-hook 'git-commit-mode-hook #'doom-modeline-set-message-modeline) + (add-hook 'magit-mode-hook #'doom-modeline-set-vcs-modeline) + (add-hook 'circe-mode-hook #'doom-modeline-set-special-modeline) + (add-hook 'erc-mode-hook #'doom-modeline-set-special-modeline) + (add-hook 'rcirc-mode-hook #'doom-modeline-set-special-modeline) + (add-hook 'pdf-view-mode-hook #'doom-modeline-set-pdf-modeline) + (add-hook 'org-src-mode-hook #'doom-modeline-set-org-src-modeline) + (add-hook 'git-timemachine-mode-hook #'doom-modeline-set-timemachine-modeline) + (add-hook 'paradox-menu-mode-hook #'doom-modeline-set-package-modeline) + (add-hook 'xwidget-webkit-mode-hook #'doom-modeline-set-minimal-modeline) + + ;; Add advices + (advice-add #'helm-display-mode-line :after #'doom-modeline-set-helm-modeline)) + (progn + ;; Restore mode-line + (let ((original-format (doom-modeline--original-value 'mode-line-format))) + (setq-default mode-line-format original-format) + (dolist (buf (buffer-list)) + (with-current-buffer buf + (setq mode-line-format original-format)))) + + ;; For two-column editing + (setq 2C-mode-line-format (doom-modeline--original-value '2C-mode-line-format)) + + ;; Remove hooks + (remove-hook 'Info-mode-hook #'doom-modeline-set-info-modeline) + (remove-hook 'dired-mode-hook #'doom-modeline-set-project-modeline) + (remove-hook 'dashboard-mode-hook #'doom-modeline-set-dashboard-modeline) + (remove-hook 'image-mode-hook #'doom-modeline-set-media-modeline) + (remove-hook 'message-mode-hook #'doom-modeline-set-message-modeline) + (remove-hook 'git-commit-mode-hook #'doom-modeline-set-message-modeline) + (remove-hook 'magit-mode-hook #'doom-modeline-set-vcs-modeline) + (remove-hook 'circe-mode-hook #'doom-modeline-set-special-modeline) + (remove-hook 'erc-mode-hook #'doom-modeline-set-special-modeline) + (remove-hook 'rcirc-mode-hook #'doom-modeline-set-special-modeline) + (remove-hook 'pdf-view-mode-hook #'doom-modeline-set-pdf-modeline) + (remove-hook 'org-src-mode-hook #'doom-modeline-set-org-src-modeline) + (remove-hook 'git-timemachine-mode-hook #'doom-modeline-set-timemachine-modeline) + (remove-hook 'paradox-menu-mode-hook #'doom-modeline-set-package-modeline) + (remove-hook 'xwidget-webkit-mode-hook #'doom-modeline-set-minimal-modeline) + + ;; Remove advices + (advice-remove #'helm-display-mode-line #'doom-modeline-set-helm-modeline)))) + +(provide 'doom-modeline) + +;;; doom-modeline.el ends here diff --git a/.emacs.d/elpa/doom-modeline-20210608.516/doom-modeline.elc b/.emacs.d/elpa/doom-modeline-20210608.516/doom-modeline.elc new file mode 100644 index 0000000..bc4c27e Binary files /dev/null and b/.emacs.d/elpa/doom-modeline-20210608.516/doom-modeline.elc differ diff --git a/.emacs.d/elpa/epl-20180205.2049/epl-autoloads.el b/.emacs.d/elpa/epl-20180205.2049/epl-autoloads.el new file mode 100644 index 0000000..c6221c5 --- /dev/null +++ b/.emacs.d/elpa/epl-20180205.2049/epl-autoloads.el @@ -0,0 +1,22 @@ +;;; epl-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "epl" "epl.el" (0 0 0 0)) +;;; Generated autoloads from epl.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "epl" '("epl-"))) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; epl-autoloads.el ends here diff --git a/.emacs.d/elpa/epl-20180205.2049/epl-pkg.el b/.emacs.d/elpa/epl-20180205.2049/epl-pkg.el new file mode 100644 index 0000000..7ef07f3 --- /dev/null +++ b/.emacs.d/elpa/epl-20180205.2049/epl-pkg.el @@ -0,0 +1,2 @@ +;;; Generated package description from epl.el -*- no-byte-compile: t -*- +(define-package "epl" "20180205.2049" "Emacs Package Library" '((cl-lib "0.3")) :commit "78ab7a85c08222cd15582a298a364774e3282ce6" :authors '(("Sebastian Wiesner" . "swiesner@lunaryorn.com")) :maintainer '("Johan Andersson" . "johan.rejeep@gmail.com") :keywords '("convenience") :url "http://github.com/cask/epl") diff --git a/.emacs.d/elpa/epl-20180205.2049/epl.el b/.emacs.d/elpa/epl-20180205.2049/epl.el new file mode 100644 index 0000000..a660ba8 --- /dev/null +++ b/.emacs.d/elpa/epl-20180205.2049/epl.el @@ -0,0 +1,712 @@ +;;; epl.el --- Emacs Package Library -*- lexical-binding: t; -*- + +;; Copyright (C) 2013-2015 Sebastian Wiesner +;; Copyright (C) 1985-1986, 1992, 1994-1995, 1999-2015 Free Software + +;; Author: Sebastian Wiesner <swiesner@lunaryorn.com> +;; Maintainer: Johan Andersson <johan.rejeep@gmail.com> +;; Sebastian Wiesner <swiesner@lunaryorn.com> +;; Version: 0.10-cvs +;; Package-Version: 20180205.2049 +;; Package-Commit: 78ab7a85c08222cd15582a298a364774e3282ce6 +;; Package-Requires: ((cl-lib "0.3")) +;; Keywords: convenience +;; URL: http://github.com/cask/epl + +;; This file is NOT part of GNU Emacs. + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: + +;; A package management library for Emacs, based on package.el. + +;; The purpose of this library is to wrap all the quirks and hassle of +;; package.el into a sane API. + +;; The following functions comprise the public interface of this library: + +;;; Package directory selection + +;; `epl-package-dir' gets the directory of packages. + +;; `epl-default-package-dir' gets the default package directory. + +;; `epl-change-package-dir' changes the directory of packages. + +;;; Package system management + +;; `epl-initialize' initializes the package system and activates all +;; packages. + +;; `epl-reset' resets the package system. + +;; `epl-refresh' refreshes all package archives. + +;; `epl-add-archive' adds a new package archive. + +;;; Package objects + +;; Struct `epl-requirement' describes a requirement of a package with `name' and +;; `version' slots. + +;; `epl-requirement-version-string' gets a requirement version as string. + +;; Struct `epl-package' describes an installed or installable package with a +;; `name' and some internal `description'. + +;; `epl-package-version' gets the version of a package. + +;; `epl-package-version-string' gets the version of a package as string. + +;; `epl-package-summary' gets the summary of a package. + +;; `epl-package-requirements' gets the requirements of a package. + +;; `epl-package-directory' gets the installation directory of a package. + +;; `epl-package-from-buffer' creates a package object for the package contained +;; in the current buffer. + +;; `epl-package-from-file' creates a package object for a package file, either +;; plain lisp or tarball. + +;; `epl-package-from-descriptor-file' creates a package object for a package +;; description (i.e. *-pkg.el) file. + +;;; Package database access + +;; `epl-package-installed-p' determines whether a package is installed, either +;; built-in or explicitly installed. + +;; `epl-package-outdated-p' determines whether a package is outdated, that is, +;; whether a package with a higher version number is available. + +;; `epl-built-in-packages', `epl-installed-packages', `epl-outdated-packages' +;; and `epl-available-packages' get all packages built-in, installed, outdated, +;; or available for installation respectively. + +;; `epl-find-built-in-package', `epl-find-installed-packages' and +;; `epl-find-available-packages' find built-in, installed and available packages +;; by name. + +;; `epl-find-upgrades' finds all upgradable packages. + +;; `epl-built-in-p' return true if package is built-in to Emacs. + +;;; Package operations + +;; `epl-install-file' installs a package file. + +;; `epl-package-install' installs a package. + +;; `epl-package-delete' deletes a package. + +;; `epl-upgrade' upgrades packages. + +;;; Code: + +(require 'cl-lib) +(require 'package) + + +(unless (fboundp #'define-error) + ;; `define-error' for 24.3 and earlier, copied from subr.el + (defun define-error (name message &optional parent) + "Define NAME as a new error signal. +MESSAGE is a string that will be output to the echo area if such an error +is signaled without being caught by a `condition-case'. +PARENT is either a signal or a list of signals from which it inherits. +Defaults to `error'." + (unless parent (setq parent 'error)) + (let ((conditions + (if (consp parent) + (apply #'append + (mapcar (lambda (parent) + (cons parent + (or (get parent 'error-conditions) + (error "Unknown signal `%s'" parent)))) + parent)) + (cons parent (get parent 'error-conditions))))) + (put name 'error-conditions + (delete-dups (copy-sequence (cons name conditions)))) + (when message (put name 'error-message message))))) + +(defsubst epl--package-desc-p (package) + "Whether PACKAGE is a `package-desc' object. + +Like `package-desc-p', but return nil, if `package-desc-p' is not +defined as function." + (and (fboundp 'package-desc-p) (package-desc-p package))) + + +;;; EPL errors +(define-error 'epl-error "EPL error") + +(define-error 'epl-invalid-package "Invalid EPL package" 'epl-error) + +(define-error 'epl-invalid-package-file "Invalid EPL package file" + 'epl-invalid-package) + + +;;; Package directory +(defun epl-package-dir () + "Get the directory of packages." + package-user-dir) + +(defun epl-default-package-dir () + "Get the default directory of packages." + (eval (car (get 'package-user-dir 'standard-value)))) + +(defun epl-change-package-dir (directory) + "Change the directory of packages to DIRECTORY." + (setq package-user-dir directory) + (epl-initialize)) + + +;;; Package system management +(defvar epl--load-path-before-initialize nil + "Remember the load path for `epl-reset'.") + +(defun epl-initialize (&optional no-activate) + "Load Emacs Lisp packages and activate them. + +With NO-ACTIVATE non-nil, do not activate packages." + (setq epl--load-path-before-initialize load-path) + (package-initialize no-activate)) + +(defalias 'epl-refresh 'package-refresh-contents) + +(defun epl-add-archive (name url) + "Add a package archive with NAME and URL." + (add-to-list 'package-archives (cons name url))) + +(defun epl-reset () + "Reset the package system. + +Clear the list of installed and available packages, the list of +package archives and reset the package directory." + (setq package-alist nil + package-archives nil + package-archive-contents nil + load-path epl--load-path-before-initialize) + (when (boundp 'package-obsolete-alist) ; Legacy package.el + (setq package-obsolete-alist nil)) + (epl-change-package-dir (epl-default-package-dir))) + + +;;; Package structures +(cl-defstruct (epl-requirement + (:constructor epl-requirement-create)) + "Structure describing a requirement. + +Slots: + +`name' The name of the required package, as symbol. + +`version' The version of the required package, as version list." + name + version) + +(defun epl-requirement-version-string (requirement) + "The version of a REQUIREMENT, as string." + (package-version-join (epl-requirement-version requirement))) + +(cl-defstruct (epl-package (:constructor epl-package-create)) + "Structure representing a package. + +Slots: + +`name' The package name, as symbol. + +`description' The package description. + +The format package description varies between package.el +variants. For `package-desc' variants, it is simply the +corresponding `package-desc' object. For legacy variants, it is +a vector `[VERSION REQS DOCSTRING]'. + +Do not access `description' directly, but instead use the +`epl-package' accessors." + name + description) + +(defmacro epl-package-as-description (var &rest body) + "Cast VAR to a package description in BODY. + +VAR is a symbol, bound to an `epl-package' object. This macro +casts this object to the `description' object, and binds the +description to VAR in BODY." + (declare (indent 1)) + (unless (symbolp var) + (signal 'wrong-type-argument (list #'symbolp var))) + `(if (epl-package-p ,var) + (let ((,var (epl-package-description ,var))) + ,@body) + (signal 'wrong-type-argument (list #'epl-package-p ,var)))) + +(defsubst epl-package--package-desc-p (package) + "Whether the description of PACKAGE is a `package-desc'." + (epl--package-desc-p (epl-package-description package))) + +(defun epl-package-version (package) + "Get the version of PACKAGE, as version list." + (epl-package-as-description package + (cond + ((fboundp 'package-desc-version) (package-desc-version package)) + ;; Legacy + ((fboundp 'package-desc-vers) + (let ((version (package-desc-vers package))) + (if (listp version) version (version-to-list version)))) + (:else (error "Cannot get version from %S" package))))) + +(defun epl-package-version-string (package) + "Get the version from a PACKAGE, as string." + (package-version-join (epl-package-version package))) + +(defun epl-package-summary (package) + "Get the summary of PACKAGE, as string." + (epl-package-as-description package + (cond + ((fboundp 'package-desc-summary) (package-desc-summary package)) + ((fboundp 'package-desc-doc) (package-desc-doc package)) ; Legacy + (:else (error "Cannot get summary from %S" package))))) + +(defsubst epl-requirement--from-req (req) + "Create a `epl-requirement' from a `package-desc' REQ." + (let ((version (cadr req))) + (epl-requirement-create :name (car req) + :version (if (listp version) version + (version-to-list version))))) + +(defun epl-package-requirements (package) + "Get the requirements of PACKAGE. + +The requirements are a list of `epl-requirement' objects." + (epl-package-as-description package + (mapcar #'epl-requirement--from-req (package-desc-reqs package)))) + +(defun epl-package-directory (package) + "Get the directory PACKAGE is installed to. + +Return the absolute path of the installation directory of +PACKAGE, or nil, if PACKAGE is not installed." + (cond + ((fboundp 'package-desc-dir) + (package-desc-dir (epl-package-description package))) + ((fboundp 'package--dir) + (package--dir (symbol-name (epl-package-name package)) + (epl-package-version-string package))) + (:else (error "Cannot get package directory from %S" package)))) + +(defun epl-package-->= (pkg1 pkg2) + "Determine whether PKG1 is before PKG2 by version." + (not (version-list-< (epl-package-version pkg1) + (epl-package-version pkg2)))) + +(defun epl-package--from-package-desc (package-desc) + "Create an `epl-package' from a PACKAGE-DESC. + +PACKAGE-DESC is a `package-desc' object, from recent package.el +variants." + (if (and (fboundp 'package-desc-name) + (epl--package-desc-p package-desc)) + (epl-package-create :name (package-desc-name package-desc) + :description package-desc) + (signal 'wrong-type-argument (list 'epl--package-desc-p package-desc)))) + +(defun epl-package--parse-info (info) + "Parse a package.el INFO." + (if (epl--package-desc-p info) + (epl-package--from-package-desc info) + ;; For legacy package.el, info is a vector [NAME REQUIRES DESCRIPTION + ;; VERSION COMMENTARY]. We need to re-shape this vector into the + ;; `package-alist' format [VERSION REQUIRES DESCRIPTION] to attach it to the + ;; new `epl-package'. + (let ((name (intern (aref info 0))) + (info (vector (aref info 3) (aref info 1) (aref info 2)))) + (epl-package-create :name name :description info)))) + +(defun epl-package-from-buffer (&optional buffer) + "Create an `epl-package' object from BUFFER. + +BUFFER defaults to the current buffer. + +Signal `epl-invalid-package' if the buffer does not contain a +valid package file." + (let ((info (with-current-buffer (or buffer (current-buffer)) + (condition-case err + (package-buffer-info) + (error (signal 'epl-invalid-package (cdr err))))))) + (epl-package--parse-info info))) + +(defun epl-package-from-lisp-file (file-name) + "Parse the package headers the file at FILE-NAME. + +Return an `epl-package' object with the header metadata." + (with-temp-buffer + (insert-file-contents file-name) + (condition-case err + (epl-package-from-buffer (current-buffer)) + ;; Attach file names to invalid package errors + (epl-invalid-package + (signal 'epl-invalid-package-file (cons file-name (cdr err)))) + ;; Forward other errors + (error (signal (car err) (cdr err)))))) + +(defun epl-package-from-tar-file (file-name) + "Parse the package tarball at FILE-NAME. + +Return a `epl-package' object with the meta data of the tarball +package in FILE-NAME." + (condition-case nil + ;; In legacy package.el, `package-tar-file-info' takes the name of the tar + ;; file to parse as argument. In modern package.el, it has no arguments + ;; and works on the current buffer. Hence, we just try to call the legacy + ;; version, and if that fails because of a mismatch between formal and + ;; actual arguments, we use the modern approach. To avoid spurious + ;; signature warnings by the byte compiler, we suppress warnings when + ;; calling the function. + (epl-package--parse-info (with-no-warnings + (package-tar-file-info file-name))) + (wrong-number-of-arguments + (with-temp-buffer + (insert-file-contents-literally file-name) + ;; Switch to `tar-mode' to enable extraction of the file. Modern + ;; `package-tar-file-info' relies on `tar-mode', and signals an error if + ;; called in a buffer with a different mode. + (tar-mode) + (epl-package--parse-info (with-no-warnings + (package-tar-file-info))))))) + +(defun epl-package-from-file (file-name) + "Parse the package at FILE-NAME. + +Return an `epl-package' object with the meta data of the package +at FILE-NAME." + (if (string-match-p (rx ".tar" string-end) file-name) + (epl-package-from-tar-file file-name) + (epl-package-from-lisp-file file-name))) + +(defun epl-package--parse-descriptor-requirement (requirement) + "Parse a REQUIREMENT in a package descriptor." + ;; This function is only called on legacy package.el. On package-desc + ;; package.el, we just let package.el do the work. + (cl-destructuring-bind (name version-string) requirement + (list name (version-to-list version-string)))) + +(defun epl-package-from-descriptor-file (descriptor-file) + "Load a `epl-package' from a package DESCRIPTOR-FILE. + +A package descriptor is a file defining a new package. Its name +typically ends with -pkg.el." + (with-temp-buffer + (insert-file-contents descriptor-file) + (goto-char (point-min)) + (let ((sexp (read (current-buffer)))) + (unless (eq (car sexp) 'define-package) + (error "%S is no valid package descriptor" descriptor-file)) + (if (and (fboundp 'package-desc-from-define) + (fboundp 'package-desc-name)) + ;; In Emacs snapshot, we can conveniently call a function to parse the + ;; descriptor + (let ((desc (apply #'package-desc-from-define (cdr sexp)))) + (epl-package-create :name (package-desc-name desc) + :description desc)) + ;; In legacy package.el, we must manually deconstruct the descriptor, + ;; because the load function has eval's the descriptor and has a lot of + ;; global side-effects. + (cl-destructuring-bind + (name version-string summary requirements) (cdr sexp) + (epl-package-create + :name (intern name) + :description + (vector (version-to-list version-string) + (mapcar #'epl-package--parse-descriptor-requirement + ;; Strip the leading `quote' from the package list + (cadr requirements)) + summary))))))) + + +;;; Package database access +(defun epl-package-installed-p (package &optional min-version) + "Determine whether a PACKAGE, of MIN-VERSION or newer, is installed. + +PACKAGE is either a package name as symbol, or a package object. +When a explicit MIN-VERSION is provided it overwrites the version of the PACKAGE object." + (let ((name (if (epl-package-p package) + (epl-package-name package) + package)) + (min-version (or min-version (and (epl-package-p package) + (epl-package-version package))))) + (package-installed-p name min-version))) + +(defun epl--parse-built-in-entry (entry) + "Parse an ENTRY from the list of built-in packages. + +Return the corresponding `epl-package' object." + (if (fboundp 'package--from-builtin) + ;; In package-desc package.el, convert the built-in package to a + ;; `package-desc' and convert that to an `epl-package' + (epl-package--from-package-desc (package--from-builtin entry)) + (epl-package-create :name (car entry) :description (cdr entry)))) + +(defun epl-built-in-packages () + "Get all built-in packages. + +Return a list of `epl-package' objects." + ;; This looks mighty strange, but it's the only way to force package.el to + ;; build the list of built-in packages. Without this, `package--builtins' + ;; might be empty. + (package-built-in-p 'foo) + (mapcar #'epl--parse-built-in-entry package--builtins)) + +(defun epl-find-built-in-package (name) + "Find a built-in package with NAME. + +NAME is a package name, as symbol. + +Return the built-in package as `epl-package' object, or nil if +there is no built-in package with NAME." + (when (package-built-in-p name) + ;; We must call `package-built-in-p' *before* inspecting + ;; `package--builtins', because otherwise `package--builtins' might be + ;; empty. + (epl--parse-built-in-entry (assq name package--builtins)))) + +(defun epl-package-outdated-p (package) + "Determine whether a PACKAGE is outdated. + +A package is outdated, if there is an available package with a +higher version. + +PACKAGE is either a package name as symbol, or a package object. +In the former case, test the installed or built-in package with +the highest version number, in the later case, test the package +object itself. + +Return t, if the package is outdated, or nil otherwise." + (let* ((package (if (epl-package-p package) + package + (or (car (epl-find-installed-packages package)) + (epl-find-built-in-package package)))) + (available (car (epl-find-available-packages + (epl-package-name package))))) + (and package available (version-list-< (epl-package-version package) + (epl-package-version available))))) + +(defun epl--parse-package-list-entry (entry) + "Parse a list of packages from ENTRY. + +ENTRY is a single entry in a package list, e.g. `package-alist', +`package-archive-contents', etc. Typically it is a cons cell, +but the exact format varies between package.el versions. This +function tries to parse all known variants. + +Return a list of `epl-package' objects parsed from ENTRY." + (let ((descriptions (cdr entry))) + (cond + ((listp descriptions) + (sort (mapcar #'epl-package--from-package-desc descriptions) + #'epl-package-->=)) + ;; Legacy package.el has just a single package in an entry, which is a + ;; standard description vector + ((vectorp descriptions) + (list (epl-package-create :name (car entry) + :description descriptions))) + (:else (error "Cannot parse entry %S" entry))))) + +(defun epl-installed-packages () + "Get all installed packages. + +Return a list of package objects." + (apply #'append (mapcar #'epl--parse-package-list-entry package-alist))) + +(defsubst epl--filter-outdated-packages (packages) + "Filter outdated packages from PACKAGES." + (let (res) + (dolist (package packages) + (when (epl-package-outdated-p package) + (push package res))) + (nreverse res))) + +(defun epl-outdated-packages () + "Get all outdated packages, as in `epl-package-outdated-p'. + +Return a list of package objects." + (epl--filter-outdated-packages (epl-installed-packages))) + +(defsubst epl--find-package-in-list (name list) + "Find a package by NAME in a package LIST. + +Return a list of corresponding `epl-package' objects." + (let ((entry (assq name list))) + (when entry + (epl--parse-package-list-entry entry)))) + +(defun epl-find-installed-package (name) + "Find the latest installed package by NAME. + +NAME is a package name, as symbol. + +Return the installed package with the highest version number as +`epl-package' object, or nil, if no package with NAME is +installed." + (car (epl-find-installed-packages name))) +(make-obsolete 'epl-find-installed-package 'epl-find-installed-packages "0.7") + +(defun epl-find-installed-packages (name) + "Find all installed packages by NAME. + +NAME is a package name, as symbol. + +Return a list of all installed packages with NAME, sorted by +version number in descending order. Return nil, if there are no +packages with NAME." + (epl--find-package-in-list name package-alist)) + +(defun epl-available-packages () + "Get all packages available for installation. + +Return a list of package objects." + (apply #'append (mapcar #'epl--parse-package-list-entry + package-archive-contents))) + +(defun epl-find-available-packages (name) + "Find available packages for NAME. + +NAME is a package name, as symbol. + +Return a list of available packages for NAME, sorted by version +number in descending order. Return nil, if there are no packages +for NAME." + (epl--find-package-in-list name package-archive-contents)) + +(cl-defstruct (epl-upgrade + (:constructor epl-upgrade-create)) + "Structure describing an upgradable package. +Slots: + +`installed' The installed package + +`available' The package available for installation." + installed + available) + +(defun epl-find-upgrades (&optional packages) + "Find all upgradable PACKAGES. + +PACKAGES is a list of package objects to upgrade, defaulting to +all installed packages. + +Return a list of `epl-upgrade' objects describing all upgradable +packages." + (let ((packages (or packages (epl-installed-packages))) + upgrades) + (dolist (pkg packages) + (let* ((version (epl-package-version pkg)) + (name (epl-package-name pkg)) + ;; Find the latest available package for NAME + (available-pkg (car (epl-find-available-packages name))) + (available-version (when available-pkg + (epl-package-version available-pkg)))) + (when (and available-version (version-list-< version available-version)) + (push (epl-upgrade-create :installed pkg + :available available-pkg) + upgrades)))) + (nreverse upgrades))) + +(defalias 'epl-built-in-p 'package-built-in-p) + + +;;; Package operations + +(defun epl-install-file (file) + "Install a package from FILE, like `package-install-file'." + (interactive (advice-eval-interactive-spec + (cadr (interactive-form #'package-install-file)))) + (apply #'package-install-file (list file)) + (let ((package (epl-package-from-file file))) + (unless (epl-package--package-desc-p package) + (epl--kill-autoload-buffer package)))) + +(defun epl--kill-autoload-buffer (package) + "Kill the buffer associated with autoloads for PACKAGE." + (let* ((auto-name (format "%s-autoloads.el" (epl-package-name package))) + (generated-autoload-file (expand-file-name auto-name (epl-package-directory package))) + (buf (find-buffer-visiting generated-autoload-file))) + (when buf (kill-buffer buf)))) + +(defun epl-package-install (package &optional force) + "Install a PACKAGE. + +PACKAGE is a `epl-package' object. If FORCE is given and +non-nil, install PACKAGE, even if it is already installed." + (when (or force (not (epl-package-installed-p package))) + (if (epl-package--package-desc-p package) + (package-install (epl-package-description package)) + ;; The legacy API installs by name. We have no control over versioning, + ;; etc. + (package-install (epl-package-name package)) + (epl--kill-autoload-buffer package)))) + +(defun epl-package-delete (package) + "Delete a PACKAGE. + +PACKAGE is a `epl-package' object to delete." + ;; package-delete allows for packages being trashed instead of fully deleted. + ;; Let's prevent his silly behavior + (let ((delete-by-moving-to-trash nil)) + ;; The byte compiler will warn us that we are calling `package-delete' with + ;; the wrong number of arguments, since it can't infer that we guarantee to + ;; always call the correct version. Thus we suppress all warnings when + ;; calling `package-delete'. I wish there was a more granular way to + ;; disable just that specific warning, but it is what it is. + (if (epl-package--package-desc-p package) + (with-no-warnings + (package-delete (epl-package-description package))) + ;; The legacy API deletes by name (as string!) and version instead by + ;; descriptor. Hence `package-delete' takes two arguments. For some + ;; insane reason, the arguments are strings here! + (let ((name (symbol-name (epl-package-name package))) + (version (epl-package-version-string package))) + (with-no-warnings + (package-delete name version)) + ;; Legacy package.el does not remove the deleted package + ;; from the `package-alist', so we do it manually here. + (let ((pkg (assq (epl-package-name package) package-alist))) + (when pkg + (setq package-alist (delq pkg package-alist)))))))) + +(defun epl-upgrade (&optional packages preserve-obsolete) + "Upgrade PACKAGES. + +PACKAGES is a list of package objects to upgrade, defaulting to +all installed packages. + +The old versions of the updated packages are deleted, unless +PRESERVE-OBSOLETE is non-nil. + +Return a list of all performed upgrades, as a list of +`epl-upgrade' objects." + (let ((upgrades (epl-find-upgrades packages))) + (dolist (upgrade upgrades) + (epl-package-install (epl-upgrade-available upgrade) 'force) + (unless preserve-obsolete + (epl-package-delete (epl-upgrade-installed upgrade)))) + upgrades)) + +(provide 'epl) + +;;; epl.el ends here diff --git a/.emacs.d/elpa/epl-20180205.2049/epl.elc b/.emacs.d/elpa/epl-20180205.2049/epl.elc new file mode 100644 index 0000000..97abfb4 Binary files /dev/null and b/.emacs.d/elpa/epl-20180205.2049/epl.elc differ diff --git a/.emacs.d/elpa/evil-20210527.2107/dir b/.emacs.d/elpa/evil-20210527.2107/dir new file mode 100644 index 0000000..b3717a5 --- /dev/null +++ b/.emacs.d/elpa/evil-20210527.2107/dir @@ -0,0 +1,18 @@ +This is the file .../info/dir, which contains the +topmost node of the Info hierarchy, called (dir)Top. +The first time you invoke Info you start off looking at this node. + +File: dir, Node: Top This is the top of the INFO tree + + This (the Directory node) gives a menu of major topics. + Typing "q" exits, "H" lists all Info commands, "d" returns here, + "h" gives a primer for first-timers, + "mEmacs<Return>" visits the Emacs manual, etc. + + In Emacs, you can click mouse button 2 on a menu item or cross reference + to select it. + +* Menu: + +Emacs +* evil: (evil.info). Extensible vi layer for Emacs diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-autoloads.el b/.emacs.d/elpa/evil-20210527.2107/evil-autoloads.el new file mode 100644 index 0000000..28941b1 --- /dev/null +++ b/.emacs.d/elpa/evil-20210527.2107/evil-autoloads.el @@ -0,0 +1,128 @@ +;;; evil-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "evil-command-window" "evil-command-window.el" +;;;;;; (0 0 0 0)) +;;; Generated autoloads from evil-command-window.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "evil-command-window" '("evil-"))) + +;;;*** + +;;;### (autoloads nil "evil-commands" "evil-commands.el" (0 0 0 0)) +;;; Generated autoloads from evil-commands.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "evil-commands" '("evil-"))) + +;;;*** + +;;;### (autoloads nil "evil-common" "evil-common.el" (0 0 0 0)) +;;; Generated autoloads from evil-common.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "evil-common" '("bounds-of-evil-" "evil-" "forward-evil-"))) + +;;;*** + +;;;### (autoloads nil "evil-core" "evil-core.el" (0 0 0 0)) +;;; Generated autoloads from evil-core.el + (autoload 'evil-mode "evil" nil t) + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "evil-core" '("evil-" "turn-o"))) + +;;;*** + +;;;### (autoloads nil "evil-digraphs" "evil-digraphs.el" (0 0 0 0)) +;;; Generated autoloads from evil-digraphs.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "evil-digraphs" '("evil-digraph"))) + +;;;*** + +;;;### (autoloads nil "evil-ex" "evil-ex.el" (0 0 0 0)) +;;; Generated autoloads from evil-ex.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "evil-ex" '("evil-"))) + +;;;*** + +;;;### (autoloads nil "evil-integration" "evil-integration.el" (0 +;;;;;; 0 0 0)) +;;; Generated autoloads from evil-integration.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "evil-integration" '("evil-"))) + +;;;*** + +;;;### (autoloads nil "evil-jumps" "evil-jumps.el" (0 0 0 0)) +;;; Generated autoloads from evil-jumps.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "evil-jumps" '("evil-"))) + +;;;*** + +;;;### (autoloads nil "evil-macros" "evil-macros.el" (0 0 0 0)) +;;; Generated autoloads from evil-macros.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "evil-macros" '("evil-"))) + +;;;*** + +;;;### (autoloads nil "evil-maps" "evil-maps.el" (0 0 0 0)) +;;; Generated autoloads from evil-maps.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "evil-maps" '("evil-"))) + +;;;*** + +;;;### (autoloads nil "evil-repeat" "evil-repeat.el" (0 0 0 0)) +;;; Generated autoloads from evil-repeat.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "evil-repeat" '("evil-"))) + +;;;*** + +;;;### (autoloads nil "evil-search" "evil-search.el" (0 0 0 0)) +;;; Generated autoloads from evil-search.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "evil-search" '("evil-"))) + +;;;*** + +;;;### (autoloads nil "evil-states" "evil-states.el" (0 0 0 0)) +;;; Generated autoloads from evil-states.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "evil-states" '("evil-"))) + +;;;*** + +;;;### (autoloads nil "evil-types" "evil-types.el" (0 0 0 0)) +;;; Generated autoloads from evil-types.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "evil-types" '("evil-ex-get-optional-register-and-count"))) + +;;;*** + +;;;### (autoloads nil "evil-vars" "evil-vars.el" (0 0 0 0)) +;;; Generated autoloads from evil-vars.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "evil-vars" '("evil-"))) + +;;;*** + +;;;### (autoloads nil nil ("evil-development.el" "evil-keybindings.el" +;;;;;; "evil-pkg.el" "evil.el") (0 0 0 0)) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; evil-autoloads.el ends here diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-command-window.el b/.emacs.d/elpa/evil-20210527.2107/evil-command-window.el new file mode 100644 index 0000000..3d3397f --- /dev/null +++ b/.emacs.d/elpa/evil-20210527.2107/evil-command-window.el @@ -0,0 +1,189 @@ +;;; evil-command-window.el --- Evil command line window implementation -*- lexical-binding: t -*- +;; Author: Emanuel Evans <emanuel.evans at gmail.com> +;; Maintainer: Vegard Øye <vegard_oye at hotmail.com> + +;; Version: 1.14.0 + +;; +;; This file is NOT part of GNU Emacs. + +;;; License: + +;; This file is part of Evil. +;; +;; Evil is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; Evil is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with Evil. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: + +;; This provides an implementation of the vim command line window for +;; editing and repeating past ex commands and searches. + +;;; Code: + +(require 'evil-vars) +(require 'evil-common) +(require 'evil-search) +(require 'evil-ex) + +(defvar evil-search-module) + +(define-derived-mode evil-command-window-mode fundamental-mode "Evil-cmd" + "Major mode for the Evil command line window." + (auto-fill-mode 0) + (setq-local after-change-functions (cons 'evil-command-window-draw-prefix + after-change-functions))) + +(defun evil-command-window (hist cmd-key execute-fn) + "Open a command line window for HIST with CMD-KEY and EXECUTE-FN. +HIST should be a list of commands. CMD-KEY should be the string of +the key whose history is being shown (one of \":\", \"/\", or +\"?\"). EXECUTE-FN should be a function of one argument to +execute on the result that the user selects." + (when (eq major-mode 'evil-command-window-mode) + (user-error "Cannot recursively open command line window")) + (dolist (win (window-list)) + (when (equal (buffer-name (window-buffer win)) + "*Command Line*") + (kill-buffer (window-buffer win)) + (delete-window win))) + (split-window nil + (unless (zerop evil-command-window-height) + evil-command-window-height) + 'above) + (setq evil-command-window-current-buffer (current-buffer)) + (ignore-errors (kill-buffer "*Command Line*")) + (switch-to-buffer "*Command Line*") + (setq-local evil-command-window-execute-fn execute-fn) + (setq-local evil-command-window-cmd-key cmd-key) + (evil-command-window-mode) + (evil-command-window-insert-commands hist)) + +(defun evil-command-window-ex (&optional current-command execute-fn) + "Open a command line window for editing and executing ex commands. +If CURRENT-COMMAND is present, it will be inserted under the +cursor as the current command to be edited. If EXECUTE-FN is given, +it will be used as the function to execute instead of +`evil-command-window-ex-execute', the default." + (interactive) + (evil-command-window (cons (or current-command "") evil-ex-history) + ":" + (or execute-fn 'evil-command-window-ex-execute))) + +(defun evil-ex-command-window () + "Start command window with ex history and current minibuffer content." + (interactive) + (let ((current (minibuffer-contents)) + (config (current-window-configuration))) + (evil-ex-teardown) + (select-window (minibuffer-selected-window) t) + (evil-command-window-ex current (apply-partially 'evil-ex-command-window-execute config)))) + +(defun evil-ex-search-command-window () + "Start command window with search history and current minibuffer content." + (interactive) + (let ((current (minibuffer-contents)) + (config (current-window-configuration))) + (select-window (minibuffer-selected-window) t) + (evil-command-window (cons current evil-ex-search-history) + (evil-search-prompt (eq evil-ex-search-direction 'forward)) + (apply-partially 'evil-ex-command-window-execute config)))) + +(defun evil-command-window-execute () + "Execute the command under the cursor in the appropriate buffer. +The local var `evil-command-window-execute-fn' determines which +function to execute." + (interactive) + (let ((result (buffer-substring (line-beginning-position) + (line-end-position))) + (execute-fn evil-command-window-execute-fn) + (command-window (get-buffer-window))) + (select-window (previous-window)) + (unless (equal evil-command-window-current-buffer (current-buffer)) + (user-error "Originating buffer is no longer active")) + (kill-buffer "*Command Line*") + (delete-window command-window) + (funcall execute-fn result) + (setq evil-command-window-current-buffer nil))) + +(defun evil-command-window-ex-execute (result) + "Execute RESULT as an ex command in the appropriate buffer." + (unless (string-match-p "^ *$" result) + (unless (equal result (car evil-ex-history)) + (setq evil-ex-history (cons result evil-ex-history))) + (let ((evil-ex-current-buffer evil-command-window-current-buffer)) + (evil-ex-execute result)))) + +(defun evil-command-window-search-forward () + "Open a command line window for forward searches." + (interactive) + (evil-command-window (cons "" + (if (eq evil-search-module 'evil-search) + evil-ex-search-history + evil-search-forward-history)) + "/" + (lambda (result) + (evil-command-window-search-execute result t)))) + +(defun evil-command-window-search-backward () + "Open a command line window for backward searches." + (interactive) + (evil-command-window (cons "" + (if (eq evil-search-module 'evil-search) + evil-ex-search-history + evil-search-backward-history)) + "?" + (lambda (result) + (evil-command-window-search-execute result nil)))) + +(defun evil-command-window-search-execute (result forward) + "Search for RESULT using FORWARD to determine direction." + (unless (zerop (length result)) + + (if (eq evil-search-module 'evil-search) + (progn + (setq evil-ex-search-pattern (evil-ex-make-search-pattern result) + evil-ex-search-direction (if forward 'forward 'backward)) + (unless (equal result (car-safe evil-ex-search-history)) + (push result evil-ex-search-history)) + (evil-ex-search)) + (if forward + (unless (equal result (car-safe evil-search-forward-history)) + (push result evil-search-forward-history)) + (unless (equal result (car-safe evil-search-backward-history)) + (push result evil-search-backward-history))) + (evil-search result forward evil-regexp-search)))) + +(defun evil-command-window-draw-prefix (&rest ignored) + "Display `evil-command-window-cmd-key' as a prefix to the current line. +Parameters passed in through IGNORED are ignored." + (let ((prefix (propertize evil-command-window-cmd-key + 'font-lock-face 'minibuffer-prompt))) + (set-text-properties (line-beginning-position) (line-beginning-position 2) + (list 'line-prefix prefix)))) + +(defun evil-command-window-insert-commands (hist) + "Insert the commands in HIST." + (let ((inhibit-modification-hooks t)) + (mapc #'(lambda (cmd) (insert cmd) (newline)) hist) + (reverse-region (point-min) (point-max))) + (let ((prefix (propertize evil-command-window-cmd-key + 'font-lock-face 'minibuffer-prompt))) + (set-text-properties (point-min) (point-max) (list 'line-prefix prefix))) + (goto-char (point-max)) + (when (and (bolp) (not (bobp))) (backward-char)) + (evil-adjust-cursor)) + +(provide 'evil-command-window) + +;;; evil-command-window.el ends here diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-command-window.elc b/.emacs.d/elpa/evil-20210527.2107/evil-command-window.elc new file mode 100644 index 0000000..79b9d53 Binary files /dev/null and b/.emacs.d/elpa/evil-20210527.2107/evil-command-window.elc differ diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-commands.el b/.emacs.d/elpa/evil-20210527.2107/evil-commands.el new file mode 100644 index 0000000..1688cc0 --- /dev/null +++ b/.emacs.d/elpa/evil-20210527.2107/evil-commands.el @@ -0,0 +1,4737 @@ +;;; evil-commands.el --- Evil commands and operators -*- lexical-binding: t -*- +;; Author: Vegard Øye <vegard_oye at hotmail.com> +;; Maintainer: Vegard Øye <vegard_oye at hotmail.com> + +;; Version: 1.14.0 + +;; +;; This file is NOT part of GNU Emacs. + +;;; License: + +;; This file is part of Evil. +;; +;; Evil is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; Evil is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with Evil. If not, see <http://www.gnu.org/licenses/>. + +(require 'evil-common) +(require 'evil-digraphs) +(require 'evil-search) +(require 'evil-ex) +(require 'evil-types) +(require 'evil-command-window) +(require 'evil-jumps) +(require 'evil-vars) +(require 'flyspell) +(require 'cl-lib) +(require 'reveal) + +(declare-function imenu--in-alist "imenu") + +;;; Motions + +;; Movement commands, or motions, are defined with the macro +;; `evil-define-motion'. A motion is a command with an optional +;; argument COUNT (interactively accessed by the code "<c>"). +;; It may specify the :type command property (e.g., :type line), +;; which determines how it is handled by an operator command. +;; Furthermore, the command must have the command properties +;; :keep-visual t and :repeat motion; these are automatically +;; set by the `evil-define-motion' macro. + +;;; Code: + +(evil-define-motion evil-forward-char (count &optional crosslines noerror) + "Move cursor to the right by COUNT characters. +Movement is restricted to the current line unless CROSSLINES is non-nil. +If NOERROR is non-nil, don't signal an error upon reaching the end +of the line or the buffer; just return nil." + :type exclusive + (interactive "<c>" (list evil-cross-lines + (evil-kbd-macro-suppress-motion-error))) + (cond + (noerror + (condition-case nil + (evil-forward-char count crosslines nil) + (error nil))) + ((not crosslines) + ;; for efficiency, narrow the buffer to the projected + ;; movement before determining the current line + (evil-with-restriction + (point) + (save-excursion + (evil-forward-char (1+ (or count 1)) t t) + (point)) + (condition-case err + (evil-narrow-to-line + (evil-forward-char count t noerror)) + (error + ;; Restore the previous command (this one never happend). + ;; Actually, this preserves the current column if the + ;; previous command was `evil-next-line' or + ;; `evil-previous-line'. + (setq this-command last-command) + (signal (car err) (cdr err)))))) + (t + (evil-motion-loop (nil (or count 1)) + (forward-char) + ;; don't put the cursor on a newline + (when (and (not evil-move-beyond-eol) + (not (evil-visual-state-p)) + (not (evil-operator-state-p)) + (eolp) (not (eobp)) (not (bolp))) + (forward-char)))))) + +(evil-define-motion evil-backward-char (count &optional crosslines noerror) + "Move cursor to the left by COUNT characters. +Movement is restricted to the current line unless CROSSLINES is non-nil. +If NOERROR is non-nil, don't signal an error upon reaching the beginning +of the line or the buffer; just return nil." + :type exclusive + (interactive "<c>" (list evil-cross-lines + (evil-kbd-macro-suppress-motion-error))) + (cond + (noerror + (condition-case nil + (evil-backward-char count crosslines nil) + (error nil))) + ((not crosslines) + ;; restrict movement to the current line + (evil-with-restriction + (save-excursion + (evil-backward-char (1+ (or count 1)) t t) + (point)) + (1+ (point)) + (condition-case err + (evil-narrow-to-line + (evil-backward-char count t noerror)) + (error + ;; Restore the previous command (this one never happened). + ;; Actually, this preserves the current column if the + ;; previous command was `evil-next-line' or + ;; `evil-previous-line'. + (setq this-command last-command) + (signal (car err) (cdr err)))))) + (t + (evil-motion-loop (nil (or count 1)) + (backward-char) + ;; don't put the cursor on a newline + (unless (or (evil-visual-state-p) (evil-operator-state-p)) + (evil-adjust-cursor)))))) + +(evil-define-motion evil-next-line (count) + "Move the cursor COUNT lines down." + :type line + (let (line-move-visual) + (evil-line-move (or count 1)))) + +(evil-define-motion evil-previous-line (count) + "Move the cursor COUNT lines up." + :type line + (let (line-move-visual) + (evil-line-move (- (or count 1))))) + +(evil-define-motion evil-next-visual-line (count) + "Move the cursor COUNT screen lines down." + :type exclusive + (let ((line-move-visual t)) + (evil-line-move (or count 1)))) + +(evil-define-motion evil-previous-visual-line (count) + "Move the cursor COUNT screen lines up." + :type exclusive + (let ((line-move-visual t)) + (evil-line-move (- (or count 1))))) + +;; used for repeated commands like "dd" +(evil-define-motion evil-line (count) + "Move COUNT - 1 lines down." + :type line + (let (line-move-visual) + ;; Catch bob and eob errors. These are caused when not moving + ;; point starting in the first or last line, respectively. In this + ;; case the current line should be selected. + (condition-case _err + (evil-line-move (1- (or count 1))) + ((beginning-of-buffer end-of-buffer))))) + +(evil-define-motion evil-line-or-visual-line (count) + "Move COUNT - 1 lines down." + :type screen-line + (let ((line-move-visual (and evil-respect-visual-line-mode + visual-line-mode))) + ;; Catch bob and eob errors. These are caused when not moving + ;; point starting in the first or last line, respectively. In this + ;; case the current line should be selected. + (condition-case _err + (evil-line-move (1- (or count 1))) + ((beginning-of-buffer end-of-buffer))))) + +(evil-define-motion evil-beginning-of-line () + "Move the cursor to the beginning of the current line." + :type exclusive + (move-beginning-of-line nil)) + +(evil-define-motion evil-end-of-line (count) + "Move the cursor to the end of the current line. +If COUNT is given, move COUNT - 1 lines downward first." + :type inclusive + (move-end-of-line count) + (when evil-track-eol + (setq temporary-goal-column most-positive-fixnum + this-command 'next-line)) + (unless (evil-visual-state-p) + (evil-adjust-cursor) + (when (eolp) + ;; prevent "c$" and "d$" from deleting blank lines + (setq evil-this-type 'exclusive)))) + +(evil-define-motion evil-beginning-of-visual-line () + "Move the cursor to the first character of the current screen line." + :type exclusive + (if (fboundp 'beginning-of-visual-line) + (beginning-of-visual-line) + (beginning-of-line))) + +(evil-define-motion evil-end-of-visual-line (count) + "Move the cursor to the last character of the current screen line. +If COUNT is given, move COUNT - 1 screen lines downward first." + :type inclusive + (if (fboundp 'end-of-visual-line) + (end-of-visual-line count) + (end-of-line count))) + +(evil-define-motion evil-end-of-line-or-visual-line (count) + "Move the cursor to the last character of the current screen +line if `visual-line-mode' is active and +`evil-respect-visual-line-mode' is non-nil. If COUNT is given, +move COUNT - 1 screen lines downward first." + :type inclusive + (if (and (fboundp 'end-of-visual-line) + evil-respect-visual-line-mode + visual-line-mode) + (end-of-visual-line count) + (evil-end-of-line count))) + +(evil-define-motion evil-middle-of-visual-line () + "Move the cursor to the middle of the current visual line." + :type exclusive + (beginning-of-visual-line) + (evil-with-restriction + nil + (save-excursion (end-of-visual-line) (point)) + (move-to-column (+ (current-column) + -1 + (/ (with-no-warnings (window-body-width)) 2))))) + +(evil-define-motion evil-beginning-of-line-or-digit-argument () + "Move the cursor to the beginning of the current line. +This function passes its command to `digit-argument' (usually a 0) +if it is not the first event." + :type exclusive + (cond + (current-prefix-arg + (setq this-command #'digit-argument) + (call-interactively #'digit-argument)) + (t + (setq this-command #'evil-beginning-of-line) + (call-interactively #'evil-beginning-of-line)))) + +(evil-define-motion evil-first-non-blank () + "Move the cursor to the first non-blank character of the current line." + :type exclusive + (evil-narrow-to-line (back-to-indentation))) + +(evil-define-motion evil-last-non-blank (count) + "Move the cursor to the last non-blank character of the current line. +If COUNT is given, move COUNT - 1 lines downward first." + :type inclusive + (goto-char + (save-excursion + (evil-move-beginning-of-line count) + (if (re-search-forward "[ \t]*$") + (max (line-beginning-position) + (1- (match-beginning 0))) + (line-beginning-position))))) + +(evil-define-motion evil-first-non-blank-of-visual-line () + "Move the cursor to the first non blank character +of the current screen line." + :type exclusive + (evil-beginning-of-visual-line) + (skip-chars-forward " \t\r")) + +(evil-define-motion evil-next-line-first-non-blank (count) + "Move the cursor COUNT lines down on the first non-blank character." + :type line + (let ((this-command this-command)) + (evil-next-line (or count 1))) + (evil-first-non-blank)) + +(evil-define-motion evil-next-line-1-first-non-blank (count) + "Move the cursor COUNT-1 lines down on the first non-blank character." + :type line + (let ((this-command this-command)) + (evil-next-line (1- (or count 1)))) + (evil-first-non-blank)) + +(evil-define-motion evil-previous-line-first-non-blank (count) + "Move the cursor COUNT lines up on the first non-blank character." + :type line + (let ((this-command this-command)) + (evil-previous-line (or count 1))) + (evil-first-non-blank)) + +(evil-define-motion evil-goto-line (count) + "Go to the first non-blank character of line COUNT. +By default the last line." + :jump t + :type line + (if (null count) + (with-no-warnings (end-of-buffer)) + (goto-char (point-min)) + (forward-line (1- count))) + (evil-first-non-blank)) + +(evil-define-motion evil-goto-first-line (count) + "Go to the first non-blank character of line COUNT. +By default the first line." + :jump t + :type line + (evil-goto-line (or count 1))) + +(evil-define-motion evil-forward-word-begin (count &optional bigword) + "Move the cursor to the beginning of the COUNT-th next word. +If BIGWORD is non-nil, move by WORDS. + +If this command is called in operator-pending state it behaves +differently. If point reaches the beginning of a word on a new +line point is moved back to the end of the previous line. + +If called after a change operator, i.e. cw or cW, +`evil-want-change-word-to-end' is non-nil and point is on a word, +then both behave like ce or cE. + +If point is at the end of the buffer and cannot be moved signal +'end-of-buffer is raised. +" + :type exclusive + (let ((thing (if bigword 'evil-WORD 'evil-word)) + (orig (point)) + (count (or count 1))) + (evil-signal-at-bob-or-eob count) + (cond + ;; default motion, beginning of next word + ((not (evil-operator-state-p)) + (evil-forward-beginning thing count)) + ;; the evil-change operator, maybe behave like ce or cE + ((and evil-want-change-word-to-end + (memq evil-this-operator evil-change-commands) + (< orig (or (cdr-safe (bounds-of-thing-at-point thing)) orig))) + ;; forward-thing moves point to the correct position because + ;; this is an exclusive motion + (forward-thing thing count)) + ;; operator state + (t + (prog1 (evil-forward-beginning thing count) + ;; if we reached the beginning of a word on a new line in + ;; Operator-Pending state, go back to the end of the previous + ;; line + (when (and (> (line-beginning-position) orig) + (looking-back "^[[:space:]]*" (line-beginning-position))) + ;; move cursor back as long as the line contains only + ;; whitespaces and is non-empty + (evil-move-end-of-line 0) + ;; skip non-empty lines containing only spaces + (while (and (looking-back "^[[:space:]]+$" (line-beginning-position)) + (not (<= (line-beginning-position) orig))) + (evil-move-end-of-line 0)) + ;; but if the previous line is empty, delete this line + (when (bolp) (forward-char)))))))) + +(evil-define-motion evil-forward-word-end (count &optional bigword) + "Move the cursor to the end of the COUNT-th next word. +If BIGWORD is non-nil, move by WORDS." + :type inclusive + (let ((thing (if bigword 'evil-WORD 'evil-word)) + (count (or count 1))) + (evil-signal-at-bob-or-eob count) + ;; Evil special behaviour: e or E on a one-character word in + ;; operator state does not move point + (unless (and (evil-operator-state-p) + (= 1 count) + (let ((bnd (bounds-of-thing-at-point thing))) + (and bnd + (= (car bnd) (point)) + (= (cdr bnd) (1+ (point))))) + (looking-at "[[:word:]]")) + (evil-forward-end thing count)))) + +(evil-define-motion evil-backward-word-begin (count &optional bigword) + "Move the cursor to the beginning of the COUNT-th previous word. +If BIGWORD is non-nil, move by WORDS." + :type exclusive + (let ((thing (if bigword 'evil-WORD 'evil-word))) + (evil-signal-at-bob-or-eob (- (or count 1))) + (evil-backward-beginning thing count))) + +(evil-define-motion evil-backward-word-end (count &optional bigword) + "Move the cursor to the end of the COUNT-th previous word. +If BIGWORD is non-nil, move by WORDS." + :type inclusive + (let ((thing (if bigword 'evil-WORD 'evil-word))) + (evil-signal-at-bob-or-eob (- (or count 1))) + (evil-backward-end thing count))) + +(evil-define-motion evil-forward-WORD-begin (count) + "Move the cursor to the beginning of the COUNT-th next WORD." + :type exclusive + (evil-forward-word-begin count t)) + +(evil-define-motion evil-forward-WORD-end (count) + "Move the cursor to the end of the COUNT-th next WORD." + :type inclusive + (evil-forward-word-end count t)) + +(evil-define-motion evil-backward-WORD-begin (count) + "Move the cursor to the beginning of the COUNT-th previous WORD." + :type exclusive + (evil-backward-word-begin count t)) + +(evil-define-motion evil-backward-WORD-end (count) + "Move the cursor to the end of the COUNT-th previous WORD." + :type inclusive + (evil-backward-word-end count t)) + +;; section movement +(evil-define-motion evil-forward-section-begin (count) + "Move the cursor to the beginning of the COUNT-th next section." + :jump t + :type exclusive + (evil-signal-at-bob-or-eob count) + (evil-forward-beginning 'evil-defun count)) + +(evil-define-motion evil-forward-section-end (count) + "Move the cursor to the end of the COUNT-th next section." + :jump t + :type inclusive + (evil-signal-at-bob-or-eob count) + (evil-forward-end 'evil-defun count) + (unless (eobp) (forward-line))) + +(evil-define-motion evil-backward-section-begin (count) + "Move the cursor to the beginning of the COUNT-th previous section." + :jump t + :type exclusive + (evil-signal-at-bob-or-eob (- (or count 1))) + (evil-backward-beginning 'evil-defun count)) + +(evil-define-motion evil-backward-section-end (count) + "Move the cursor to the end of the COUNT-th previous section." + :jump t + :type inclusive + (evil-signal-at-bob-or-eob (- (or count 1))) + (end-of-line -1) + (evil-backward-end 'evil-defun count) + (unless (eobp) (forward-line))) + +(evil-define-motion evil-forward-sentence-begin (count) + "Move to the next COUNT-th beginning of a sentence or end of a paragraph." + :jump t + :type exclusive + (evil-signal-at-bob-or-eob count) + (evil-forward-nearest count + #'(lambda (_cnt) + (evil-forward-beginning 'evil-sentence)) + #'evil-forward-paragraph)) + +(evil-define-motion evil-backward-sentence-begin (count) + "Move to the previous COUNT-th beginning of a sentence or paragraph." + :jump t + :type exclusive + (evil-signal-at-bob-or-eob (- (or count 1))) + (evil-forward-nearest (- (or count 1)) + #'(lambda (_cnt) + (evil-backward-beginning 'evil-sentence)) + #'(lambda (_cnt) + (evil-backward-paragraph)))) + +(evil-define-motion evil-forward-paragraph (count) + "Move to the end of the COUNT-th next paragraph." + :jump t + :type exclusive + (evil-signal-at-bob-or-eob count) + (evil-forward-end 'evil-paragraph count) + (unless (eobp) (forward-line))) + +(evil-define-motion evil-backward-paragraph (count) + "Move to the beginning of the COUNT-th previous paragraph." + :jump t + :type exclusive + (evil-signal-at-bob-or-eob (- (or count 1))) + (unless (eobp) (forward-line)) + (evil-backward-beginning 'evil-paragraph count) + (unless (bobp) (forward-line -1))) + +(defvar hif-ifx-else-endif-regexp) +(evil-define-motion evil-jump-item (count) + "Find the next item in this line after or under the cursor +and jump to the corresponding one." + :jump t + :type inclusive + (cond + ;; COUNT% jumps to a line COUNT percentage down the file + (count + (goto-char + (evil-normalize-position + (let ((size (- (point-max) (point-min)))) + (+ (point-min) + (if (> size 80000) + (* count (/ size 100)) + (/ (* count size) 100)))))) + (back-to-indentation) + (setq evil-this-type 'line)) + ((and (evil-looking-at-start-comment t) + (let ((pnt (point))) + (forward-comment 1) + (or (not (bolp)) + (prog1 nil (goto-char pnt))))) + (backward-char)) + ((and (not (eolp)) (evil-looking-at-end-comment t)) + (forward-comment -1)) + ((and + (memq major-mode '(c-mode c++-mode)) + (require 'hideif nil t) + (with-no-warnings + (let* ((hif-else-regexp (concat hif-cpp-prefix "\\(?:else\\|elif[ \t]+\\)")) + (hif-ifx-else-endif-regexp + (concat hif-ifx-regexp "\\|" hif-else-regexp "\\|" hif-endif-regexp))) + (cond + ((save-excursion (beginning-of-line) (or (hif-looking-at-ifX) (hif-looking-at-else))) + (hif-find-next-relevant) + (while (hif-looking-at-ifX) + (hif-ifdef-to-endif) + (hif-find-next-relevant)) + t) + ((save-excursion (beginning-of-line) (hif-looking-at-endif)) + (hif-endif-to-ifdef) + t)))))) + (t + (let* ((open (point-max)) + (close (point-max)) + (open-pair (condition-case nil + (save-excursion + ;; consider the character right before eol given that + ;; point may be placed there, e.g. in visual state + (when (and (eolp) (not (bolp))) + (backward-char)) + (setq open (1- (scan-lists (point) 1 -1))) + (when (< open (line-end-position)) + (goto-char open) + (forward-list) + (1- (point)))) + (error nil))) + (close-pair (condition-case nil + (save-excursion + ;; consider the character right before eol given that + ;; point may be placed there, e.g. in visual state + (when (and (eolp) (not (bolp))) + (backward-char)) + (setq close (1- (scan-lists (point) 1 1))) + (when (< close (line-end-position)) + (goto-char (1+ close)) + (backward-list) + (point))) + (error nil)))) + (cond + ((not (or open-pair close-pair)) + ;; nothing found, check if we are inside a string + (let ((pnt (point)) + (bnd (bounds-of-thing-at-point 'evil-string))) + (if (not (and bnd (< (point) (cdr bnd)))) + ;; no, then we really failed + (user-error "No matching item found on the current line") + ;; yes, go to the end of the string and try again + (let ((endstr (cdr bnd))) + (when (or (save-excursion + (goto-char endstr) + (let ((b (bounds-of-thing-at-point 'evil-string))) + (and b (< (point) (cdr b))))) ; not at end of string + (condition-case nil + (progn + (goto-char endstr) + (evil-jump-item) + nil) + (error t))) + ;; failed again, go back to original point + (goto-char pnt) + (user-error "No matching item found on the current line")))))) + ((< open close) (goto-char open-pair)) + (t (goto-char close-pair))))))) + +(defun evil--flyspell-overlays-in-p (beg end) + (let ((ovs (overlays-in beg end)) + done) + (while (and ovs (not done)) + (when (flyspell-overlay-p (car ovs)) + (setq done t)) + (setq ovs (cdr ovs))) + done)) + +(defun evil--flyspell-overlay-at (pos forwardp) + (when (not forwardp) + (setq pos (max (1- pos) (point-min)))) + (let ((ovs (overlays-at pos)) + done) + (while (and ovs (not done)) + (if (flyspell-overlay-p (car ovs)) + (setq done t) + (setq ovs (cdr ovs)))) + (when done + (car ovs)))) + +(defun evil--flyspell-overlay-after (pos limit forwardp) + (let (done) + (while (and (if forwardp + (< pos limit) + (> pos limit)) + (not done)) + (let ((ov (evil--flyspell-overlay-at pos forwardp))) + (when ov + (setq done ov))) + (setq pos (if forwardp + (next-overlay-change pos) + (previous-overlay-change pos)))) + done)) + +(defun evil--next-flyspell-error (forwardp) + (when (evil--flyspell-overlays-in-p (point-min) (point-max)) + (let ((pos (point)) + limit + ov) + (when (evil--flyspell-overlay-at pos forwardp) + (if (/= pos (point-min)) + (setq pos (save-excursion (goto-char pos) + (forward-word (if forwardp 1 -1)) + (point))) + (setq pos (point-max)))) + (setq limit (if forwardp (point-max) (point-min)) + ov (evil--flyspell-overlay-after pos limit forwardp)) + (if ov + (goto-char (overlay-start ov)) + (when evil-search-wrap + (setq limit pos + pos (if forwardp (point-min) (point-max)) + ov (evil--flyspell-overlay-after pos limit forwardp)) + (when ov + (goto-char (overlay-start ov)))))))) + +(evil-define-motion evil-next-flyspell-error (count) + "Go to the COUNT'th spelling mistake after point." + (interactive "p") + (dotimes (_ count) + (evil--next-flyspell-error t))) + +(evil-define-motion evil-prev-flyspell-error (count) + "Go to the COUNT'th spelling mistake preceding point." + (interactive "p") + (dotimes (_ count) + (evil--next-flyspell-error nil))) + +(evil-define-motion evil-previous-open-paren (count) + "Go to [count] previous unmatched '('." + :type exclusive + (evil-up-paren ?\( ?\) (- (or count 1)))) + +(evil-define-motion evil-next-close-paren (count) + "Go to [count] next unmatched ')'." + :type exclusive + (forward-char) + (evil-up-paren ?\( ?\) (or count 1)) + (backward-char)) + +(evil-define-motion evil-previous-open-brace (count) + "Go to [count] previous unmatched '{'." + :type exclusive + (evil-up-paren ?{ ?} (- (or count 1)))) + +(evil-define-motion evil-next-close-brace (count) + "Go to [count] next unmatched '}'." + :type exclusive + (forward-char) + (evil-up-paren ?{ ?} (or count 1)) + (backward-char)) + +(defun evil--lowercase-markers () + "Get all lowercase markers." + (cl-remove-if-not (lambda (x) (and (markerp (cdr x)) + (<= ?a (car x) ?z))) + evil-markers-alist)) + +(defun evil--next-mark (forwardp) + "Move to next lowercase mark. +Move forward if FORWARDP is truthy or backward if falsey. +Loop back to the top of buffer if the end is reached." + (let ((pos (point)) + (sorted-markers (sort (evil--lowercase-markers) + (lambda (a b) (< (cdr a) (cdr b)))))) + (cond + ((null sorted-markers) + (user-error "No marks in this buffer")) + (forwardp + (let ((next-marker (cl-some (lambda (x) (and (< pos (cdr x)) (cdr x))) + sorted-markers))) + (if next-marker + (goto-char (marker-position next-marker)) + (goto-char (marker-position (cdar sorted-markers)))))) + (t + (let* ((descending-markers (reverse sorted-markers)) + (prev-marker (cl-some (lambda (x) (and (> pos (cdr x)) (cdr x))) + descending-markers))) + (if prev-marker + (goto-char (marker-position prev-marker)) + (goto-char (marker-position (cdar descending-markers))))))))) + +(evil-define-motion evil-next-mark (count) + "Go to [count] next lowercase mark." + :keep-visual t + :repeat nil + :type exclusive + :jump t + (dotimes (_ (or count 1)) + (evil--next-mark t))) + +(evil-define-motion evil-next-mark-line (count) + "Go to [count] line of next lowercase mark after current line." + :keep-visual t + :repeat nil + :type exclusive + :jump t + (if (evil--lowercase-markers) + (dotimes (_ (or count 1)) + (evil-end-of-line) + (evil--next-mark t) + (evil-first-non-blank)) + (user-error "No marks in this buffer"))) + +(evil-define-motion evil-previous-mark (count) + "Go to [count] previous lowercase mark." + :keep-visual t + :repeat nil + :type exclusive + :jump t + (dotimes (_ (or count 1)) + (evil--next-mark nil))) + +(evil-define-motion evil-previous-mark-line (count) + "Go to [count] line of previous lowercase mark before current line." + :keep-visual t + :repeat nil + :type exclusive + :jump t + (if (evil--lowercase-markers) + (dotimes (_ (or count 1)) + (evil-beginning-of-line) + (evil--next-mark nil) + (evil-first-non-blank)) + (user-error "No marks in this buffer"))) + +(evil-define-command evil-set-col-0-mark (_beg end mark) + "Set MARK at column 0 of line of END. Default is cursor line." + (interactive "<r><a>") + (if (< 1 (length mark)) + (user-error "Trailing characters") + (save-excursion + (goto-char (if (eobp) end (1- end))) + (evil-beginning-of-line) + (evil-set-marker (string-to-char mark))))) + +(evil-define-motion evil-find-char (count char) + "Move to the next COUNT'th occurrence of CHAR. +Movement is restricted to the current line unless `evil-cross-lines' is non-nil." + :type inclusive + (interactive "<c><C>") + (setq count (or count 1)) + (let ((fwd (> count 0)) + (visual (and evil-respect-visual-line-mode + visual-line-mode))) + (setq evil-last-find (list #'evil-find-char char fwd)) + (when fwd (forward-char)) + (let ((case-fold-search nil)) + (unless (prog1 + (search-forward (char-to-string char) + (cond (evil-cross-lines + nil) + ((and fwd visual) + (save-excursion + (end-of-visual-line) + (point))) + (fwd + (line-end-position)) + (visual + (save-excursion + (beginning-of-visual-line) + (point))) + (t + (line-beginning-position))) + t count) + (when fwd (backward-char))) + (user-error "Can't find %c" char))))) + +(evil-define-motion evil-find-char-backward (count char) + "Move to the previous COUNT'th occurrence of CHAR." + :type exclusive + (interactive "<c><C>") + (evil-find-char (- (or count 1)) char)) + +(evil-define-motion evil-find-char-to (count char) + "Move before the next COUNT'th occurrence of CHAR." + :type inclusive + (interactive "<c><C>") + (unwind-protect + (progn + (evil-find-char count char) + (if (> (or count 1) 0) + (backward-char) + (forward-char))) + (setcar evil-last-find #'evil-find-char-to))) + +(evil-define-motion evil-find-char-to-backward (count char) + "Move before the previous COUNT'th occurrence of CHAR." + :type exclusive + (interactive "<c><C>") + (evil-find-char-to (- (or count 1)) char)) + +(evil-define-motion evil-repeat-find-char (count) + "Repeat the last find COUNT times." + :type inclusive + (setq count (or count 1)) + (if evil-last-find + (let ((cmd (car evil-last-find)) + (char (nth 1 evil-last-find)) + (fwd (nth 2 evil-last-find)) + evil-last-find) + ;; ensure count is non-negative + (when (< count 0) + (setq count (- count) + fwd (not fwd))) + ;; skip next character when repeating t or T + (and (eq cmd #'evil-find-char-to) + evil-repeat-find-to-skip-next + (= count 1) + (or (and fwd (= (char-after (1+ (point))) char)) + (and (not fwd) (= (char-before) char))) + (setq count (1+ count))) + (funcall cmd (if fwd count (- count)) char) + (unless (nth 2 evil-last-find) + (setq evil-this-type 'exclusive))) + (user-error "No previous search"))) + +(evil-define-motion evil-repeat-find-char-reverse (count) + "Repeat the last find COUNT times in the opposite direction." + :type inclusive + (evil-repeat-find-char (- (or count 1)))) + +;; ceci n'est pas une pipe +(evil-define-motion evil-goto-column (count) + "Go to column COUNT on the current line. +Columns are counted from zero." + :type exclusive + (move-to-column (or count 0))) + +(evil-define-command evil-goto-mark (char &optional noerror) + "Go to the marker specified by CHAR." + :keep-visual t + :repeat nil + :type exclusive + :jump t + (interactive (list (read-char))) + (let ((marker (evil-get-marker char))) + (cond + ((markerp marker) + (switch-to-buffer (marker-buffer marker)) + (goto-char (marker-position marker))) + ((numberp marker) + (goto-char marker)) + ((consp marker) + (when (or (find-buffer-visiting (car marker)) + (and (y-or-n-p (format "Visit file %s again? " + (car marker))) + (find-file (car marker)))) + (goto-char (cdr marker)))) + ((not noerror) + (user-error "Marker `%c' is not set%s" char + (if (evil-global-marker-p char) "" + " in this buffer")))))) + +(evil-define-command evil-goto-mark-line (char &optional noerror) + "Go to the line of the marker specified by CHAR." + :keep-visual t + :repeat nil + :type line + :jump t + (interactive (list (read-char))) + (evil-goto-mark char noerror) + (evil-first-non-blank)) + +(evil-define-motion evil-jump-backward (count) + "Go to older position in jump list. +To go the other way, press \ +\\<evil-motion-state-map>\\[evil-jump-forward]." + (evil--jump-backward count)) + +(evil-define-motion evil-jump-forward (count) + "Go to newer position in jump list. +To go the other way, press \ +\\<evil-motion-state-map>\\[evil-jump-backward]." + (evil--jump-forward count)) + +(evil-define-motion evil-jump-backward-swap (count) + "Go to the previous position in jump list. +The current position is placed in the jump list." + (let ((pnt (point))) + (evil--jump-backward 1) + (evil-set-jump pnt))) + +(defvar xref-prompt-for-identifier) +(evil-define-motion evil-jump-to-tag (arg) + "Jump to tag under point. +If called with a prefix argument, provide a prompt +for specifying the tag." + :jump t + (interactive "P") + (cond + ((fboundp 'xref-find-definitions) + (let ((xref-prompt-for-identifier arg)) + (call-interactively #'xref-find-definitions))) + ((fboundp 'find-tag) + (if arg (call-interactively #'find-tag) + (let ((tag (funcall (or find-tag-default-function + (get major-mode 'find-tag-default-function) + #'find-tag-default)))) + (unless tag (user-error "No tag candidate found around point")) + (find-tag tag)))))) + +(evil-define-motion evil-lookup () + "Look up the keyword at point. +Calls `evil-lookup-func'." + (funcall evil-lookup-func)) + +(defun evil-ret-gen (count indent?) + (let* ((field (get-char-property (point) 'field)) + (button (get-char-property (point) 'button)) + (doc (get-char-property (point) 'widget-doc)) + (widget (or field button doc))) + (cond + ((and widget + (fboundp 'widget-type) + (fboundp 'widget-button-press) + (or (and (symbolp widget) + (get widget 'widget-type)) + (and (consp widget) + (get (widget-type widget) 'widget-type)))) + (when (evil-operator-state-p) + (setq evil-inhibit-operator t)) + (when (fboundp 'widget-button-press) + (widget-button-press (point)))) + ((and (fboundp 'button-at) + (fboundp 'push-button) + (button-at (point))) + (when (evil-operator-state-p) + (setq evil-inhibit-operator t)) + (push-button)) + ((or (evil-emacs-state-p) + (and (evil-insert-state-p) + (not buffer-read-only))) + (if (not indent?) + (newline count) + (delete-horizontal-space t) + (newline count) + (indent-according-to-mode))) + (t + (evil-next-line-first-non-blank count))))) + +(evil-define-motion evil-ret (count) + "Move the cursor COUNT lines down. +If point is on a widget or a button, click on it. +In Insert state, insert a newline." + :type line + (evil-ret-gen count nil)) + +(evil-define-motion evil-ret-and-indent (count) + "Move the cursor COUNT lines down. +If point is on a widget or a button, click on it. +In Insert state, insert a newline and indent." + :type line + (evil-ret-gen count t)) + +(evil-define-motion evil-window-top (count) + "Move the cursor to line COUNT from the top of the window +on the first non-blank character." + :jump t + :type line + (move-to-window-line (max (or count 0) + (if (= (point-min) (window-start)) + 0 + scroll-margin))) + (back-to-indentation)) + +(evil-define-motion evil-window-middle () + "Move the cursor to the middle line in the window +on the first non-blank character." + :jump t + :type line + (move-to-window-line + (/ (1+ (save-excursion (move-to-window-line -1))) 2)) + (back-to-indentation)) + +(evil-define-motion evil-window-bottom (count) + "Move the cursor to line COUNT from the bottom of the window +on the first non-blank character." + :jump t + :type line + (move-to-window-line (- (max (or count 1) (1+ scroll-margin)))) + (back-to-indentation)) + +;; scrolling +(evil-define-command evil-scroll-line-up (count) + "Scrolls the window COUNT lines upwards." + :repeat nil + :keep-visual t + (interactive "p") + (let ((scroll-preserve-screen-position nil)) + (scroll-down count))) + +(evil-define-command evil-scroll-line-down (count) + "Scrolls the window COUNT lines downwards." + :repeat nil + :keep-visual t + (interactive "p") + (let ((scroll-preserve-screen-position nil)) + (scroll-up count))) + +(evil-define-command evil-scroll-count-reset () + "Sets `evil-scroll-count' to 0. +`evil-scroll-up' and `evil-scroll-down' will scroll +for a half of the screen(default)." + :repeat nil + :keep-visual t + (interactive) + (setq evil-scroll-count 0)) + +(evil-define-command evil-scroll-up (count) + "Scrolls the window and the cursor COUNT lines upwards. +If COUNT is not specified the function scrolls down +`evil-scroll-count', which is the last used count. +If the scroll count is zero the command scrolls half the screen." + :repeat nil + :keep-visual t + (interactive "<c>") + (evil-save-column + (setq count (or count (max 0 evil-scroll-count))) + (setq evil-scroll-count count) + (when (= (point-min) (line-beginning-position)) + (signal 'beginning-of-buffer nil)) + (when (zerop count) + (setq count (/ (window-body-height) 2))) + (let ((xy (evil-posn-x-y (posn-at-point)))) + (condition-case nil + (progn + (scroll-down count) + (goto-char (posn-point (posn-at-x-y (car xy) (cdr xy))))) + (beginning-of-buffer + (condition-case nil + (with-no-warnings (previous-line count)) + (beginning-of-buffer))))))) + +(evil-define-command evil-scroll-down (count) + "Scrolls the window and the cursor COUNT lines downwards. +If COUNT is not specified the function scrolls down +`evil-scroll-count', which is the last used count. +If the scroll count is zero the command scrolls half the screen." + :repeat nil + :keep-visual t + (interactive "<c>") + (evil-save-column + (setq count (or count (max 0 evil-scroll-count))) + (setq evil-scroll-count count) + (when (eobp) (signal 'end-of-buffer nil)) + (when (zerop count) + (setq count (/ (window-body-height) 2))) + ;; BUG #660: First check whether the eob is visible. + ;; In that case we do not scroll but merely move point. + (if (<= (point-max) (window-end)) + (with-no-warnings (next-line count nil)) + (let ((xy (evil-posn-x-y (posn-at-point)))) + (condition-case nil + (progn + (scroll-up count) + (let* ((wend (window-end nil t)) + (p (posn-at-x-y (car xy) (cdr xy))) + (margin (max 0 (- scroll-margin + (cdr (posn-col-row p)))))) + (goto-char (posn-point p)) + ;; ensure point is not within the scroll-margin + (when (> margin 0) + (with-no-warnings (next-line margin)) + (recenter scroll-margin)) + (when (<= (point-max) wend) + (save-excursion + (goto-char (point-max)) + (recenter (- (max 1 scroll-margin))))))) + (end-of-buffer + (goto-char (point-max)) + (recenter (- (max 1 scroll-margin))))))))) + +(evil-define-command evil-scroll-page-up (count) + "Scrolls the window COUNT pages upwards." + :repeat nil + :keep-visual t + (interactive "p") + (evil-save-column + (dotimes (i count) + (condition-case err + (scroll-down nil) + (beginning-of-buffer + (if (and (bobp) (zerop i)) + (signal (car err) (cdr err)) + (goto-char (point-min)))))))) + +(evil-define-command evil-scroll-page-down (count) + "Scrolls the window COUNT pages downwards." + :repeat nil + :keep-visual t + (interactive "p") + (evil-save-column + (dotimes (i count) + (condition-case err + (scroll-up nil) + (end-of-buffer + (if (and (eobp) (zerop i)) + (signal (car err) (cdr err)) + (goto-char (point-max)))))))) + +(evil-define-command evil-scroll-line-to-top (count) + "Scrolls line number COUNT (or the cursor line) to the top of the window." + :repeat nil + :keep-visual t + (interactive "<c>") + (evil-save-column + (let ((line (or count (line-number-at-pos (point))))) + (goto-char (point-min)) + (forward-line (1- line))) + (recenter (1- (max 1 scroll-margin))))) + +(evil-define-command evil-scroll-line-to-center (count) + "Scrolls line number COUNT (or the cursor line) to the center of the window." + :repeat nil + :keep-visual t + (interactive "<c>") + (evil-save-column + (when count + (goto-char (point-min)) + (forward-line (1- count))) + (recenter nil))) + +(evil-define-command evil-scroll-line-to-bottom (count) + "Scrolls line number COUNT (or the cursor line) to the bottom of the window." + :repeat nil + :keep-visual t + (interactive "<c>") + (evil-save-column + (let ((line (or count (line-number-at-pos (point))))) + (goto-char (point-min)) + (forward-line (1- line))) + (recenter (- (max 1 scroll-margin))))) + +(evil-define-command evil-scroll-bottom-line-to-top (count) + "Scrolls the line right below the window, +or line COUNT to the top of the window." + :repeat nil + :keep-visual t + (interactive "<c>") + (if count + (progn + (goto-char (point-min)) + (forward-line (1- count))) + (goto-char (window-end)) + (evil-move-cursor-back)) + (recenter (1- (max 0 scroll-margin))) + (evil-first-non-blank)) + +(evil-define-command evil-scroll-top-line-to-bottom (count) + "Scrolls the line right below the window, +or line COUNT to the top of the window." + :repeat nil + :keep-visual t + (interactive "<c>") + (if count + (progn + (goto-char (point-min)) + (forward-line (1- count))) + (goto-char (window-start))) + (recenter (- (max 1 scroll-margin))) + (evil-first-non-blank)) + +(evil-define-command evil-scroll-left (count) + "Scrolls the window COUNT half-screenwidths to the left." + :repeat nil + :keep-visual t + (interactive "p") + (evil-with-hproject-point-on-window + (scroll-right (* count (/ (window-width) 2))))) + +(evil-define-command evil-scroll-right (count) + "Scrolls the window COUNT half-screenwidths to the right." + :repeat nil + :keep-visual t + (interactive "p") + (evil-with-hproject-point-on-window + (scroll-left (* count (/ (window-width) 2))))) + +(evil-define-command evil-scroll-column-left (count) + "Scrolls the window COUNT columns to the left." + :repeat nil + :keep-visual t + (interactive "p") + (evil-with-hproject-point-on-window + (scroll-right count))) + +(evil-define-command evil-scroll-column-right (count) + "Scrolls the window COUNT columns to the right." + :repeat nil + :keep-visual t + (interactive "p") + (evil-with-hproject-point-on-window + (scroll-left count))) + +;;; Text objects + +;; Text objects are defined with `evil-define-text-object'. In Visual +;; state, they modify the current selection; in Operator-Pending +;; state, they return a pair of buffer positions. Outer text objects +;; are bound in the keymap `evil-outer-text-objects-map', and inner +;; text objects are bound in `evil-inner-text-objects-map'. +;; +;; Common text objects like words, WORDS, paragraphs and sentences are +;; defined via a corresponding move-function. This function must have +;; the following properties: +;; +;; 1. Take exactly one argument, the count. +;; 2. When the count is positive, move point forward to the first +;; character after the end of the next count-th object. +;; 3. When the count is negative, move point backward to the first +;; character of the count-th previous object. +;; 4. If point is placed on the first character of an object, the +;; backward motion does NOT count that object. +;; 5. If point is placed on the last character of an object, the +;; forward motion DOES count that object. +;; 6. The return value is "count left", i.e., in forward direction +;; count is decreased by one for each successful move and in +;; backward direction count is increased by one for each +;; successful move, returning the final value of count. +;; Therefore, if the complete move is successful, the return +;; value is 0. +;; +;; A useful macro in this regard is `evil-motion-loop', which quits +;; when point does not move further and returns the count difference. +;; It also provides a "unit value" of 1 or -1 for use in each +;; iteration. For example, a hypothetical "foo-bar" move could be +;; written as such: +;; +;; (defun foo-bar (count) +;; (evil-motion-loop (var count) +;; (forward-foo var) ; `var' is 1 or -1 depending on COUNT +;; (forward-bar var))) +;; +;; If "forward-foo" and "-bar" didn't accept negative arguments, +;; we could choose their backward equivalents by inspecting `var': +;; +;; (defun foo-bar (count) +;; (evil-motion-loop (var count) +;; (cond +;; ((< var 0) +;; (backward-foo 1) +;; (backward-bar 1)) +;; (t +;; (forward-foo 1) +;; (forward-bar 1))))) +;; +;; After a forward motion, point has to be placed on the first +;; character after some object, unless no motion was possible at all. +;; Similarly, after a backward motion, point has to be placed on the +;; first character of some object. This implies that point should +;; NEVER be moved to eob or bob, unless an object ends or begins at +;; eob or bob. (Usually, Emacs motions always move as far as possible. +;; But we want to use the motion-function to identify certain objects +;; in the buffer, and thus exact movement to object boundaries is +;; required.) + +(evil-define-text-object evil-a-word (count &optional beg end type) + "Select a word." + (evil-select-an-object 'evil-word beg end type count)) + +(evil-define-text-object evil-inner-word (count &optional beg end type) + "Select inner word." + (evil-select-inner-object 'evil-word beg end type count)) + +(evil-define-text-object evil-a-WORD (count &optional beg end type) + "Select a WORD." + (evil-select-an-object 'evil-WORD beg end type count)) + +(evil-define-text-object evil-inner-WORD (count &optional beg end type) + "Select inner WORD." + (evil-select-inner-object 'evil-WORD beg end type count)) + +(evil-define-text-object evil-a-symbol (count &optional beg end type) + "Select a symbol." + (evil-select-an-object 'evil-symbol beg end type count)) + +(evil-define-text-object evil-inner-symbol (count &optional beg end type) + "Select inner symbol." + (evil-select-inner-object 'evil-symbol beg end type count)) + +(evil-define-text-object evil-a-sentence (count &optional beg end type) + "Select a sentence." + (evil-select-an-object 'evil-sentence beg end type count)) + +(evil-define-text-object evil-inner-sentence (count &optional beg end type) + "Select inner sentence." + (evil-select-inner-object 'evil-sentence beg end type count)) + +(evil-define-text-object evil-a-paragraph (count &optional beg end type) + "Select a paragraph." + :type line + (evil-select-an-object 'evil-paragraph beg end type count t)) + +(evil-define-text-object evil-inner-paragraph (count &optional beg end type) + "Select inner paragraph." + :type line + (evil-select-inner-object 'evil-paragraph beg end type count t)) + +(evil-define-text-object evil-a-paren (count &optional beg end type) + "Select a parenthesis." + :extend-selection nil + (evil-select-paren ?\( ?\) beg end type count t)) + +(evil-define-text-object evil-inner-paren (count &optional beg end type) + "Select inner parenthesis." + :extend-selection nil + (evil-select-paren ?\( ?\) beg end type count)) + +(evil-define-text-object evil-a-bracket (count &optional beg end type) + "Select a square bracket." + :extend-selection nil + (evil-select-paren ?\[ ?\] beg end type count t)) + +(evil-define-text-object evil-inner-bracket (count &optional beg end type) + "Select inner square bracket." + :extend-selection nil + (evil-select-paren ?\[ ?\] beg end type count)) + +(evil-define-text-object evil-a-curly (count &optional beg end type) + "Select a curly bracket (\"brace\")." + :extend-selection nil + (evil-select-paren ?{ ?} beg end type count t)) + +(evil-define-text-object evil-inner-curly (count &optional beg end type) + "Select inner curly bracket (\"brace\")." + :extend-selection nil + (evil-select-paren ?{ ?} beg end type count)) + +(evil-define-text-object evil-an-angle (count &optional beg end type) + "Select an angle bracket." + :extend-selection nil + (evil-select-paren ?< ?> beg end type count t)) + +(evil-define-text-object evil-inner-angle (count &optional beg end type) + "Select inner angle bracket." + :extend-selection nil + (evil-select-paren ?< ?> beg end type count)) + +(evil-define-text-object evil-a-single-quote (count &optional beg end type) + "Select a single-quoted expression." + :extend-selection t + (evil-select-quote ?' beg end type count t)) + +(evil-define-text-object evil-inner-single-quote (count &optional beg end type) + "Select inner single-quoted expression." + :extend-selection nil + (evil-select-quote ?' beg end type count)) + +(evil-define-text-object evil-a-double-quote (count &optional beg end type) + "Select a double-quoted expression." + :extend-selection t + (evil-select-quote ?\" beg end type count t)) + +(evil-define-text-object evil-inner-double-quote (count &optional beg end type) + "Select inner double-quoted expression." + :extend-selection nil + (evil-select-quote ?\" beg end type count)) + +(evil-define-text-object evil-a-back-quote (count &optional beg end type) + "Select a back-quoted expression." + :extend-selection t + (evil-select-quote ?\` beg end type count t)) + +(evil-define-text-object evil-inner-back-quote (count &optional beg end type) + "Select inner back-quoted expression." + :extend-selection nil + (evil-select-quote ?\` beg end type count)) + +(evil-define-text-object evil-a-tag (count &optional beg end type) + "Select a tag block." + :extend-selection nil + (evil-select-xml-tag beg end type count t)) + +(evil-define-text-object evil-inner-tag (count &optional beg end type) + "Select inner tag block." + :extend-selection nil + (evil-select-xml-tag beg end type count)) + +(evil-define-text-object evil-next-match (count &optional beg end type) + "Select next match." + (unless (and (boundp 'evil-search-module) + (eq evil-search-module 'evil-search)) + (user-error "next-match text objects only work with Evil search module.")) + (let ((pnt (point))) + (cond + ((eq evil-ex-search-direction 'forward) + (unless (eobp) (forward-char)) + (evil-ex-search-previous 1) + (when (and (<= evil-ex-search-match-beg pnt) + (> evil-ex-search-match-end pnt) + (not (evil-visual-state-p))) + (setq count (1- count))) + (if (> count 0) (evil-ex-search-next count))) + (t + (unless (eobp) (forward-char)) + (evil-ex-search-next count)))) + ;; active visual state if command is executed in normal state + (when (evil-normal-state-p) + (evil-visual-select evil-ex-search-match-beg evil-ex-search-match-end 'inclusive +1 t)) + (list evil-ex-search-match-beg evil-ex-search-match-end)) + +(evil-define-text-object evil-previous-match (count &optional beg end type) + "Select next match." + (unless (and (boundp 'evil-search-module) + (eq evil-search-module 'evil-search)) + (user-error "previous-match text objects only work with Evil search module.")) + (let ((evil-ex-search-direction + (if (eq evil-ex-search-direction 'backward) + 'forward + 'backward))) + (evil-next-match count beg end type))) + +;;; Operator commands + +(evil-define-operator evil-yank (beg end type register yank-handler) + "Saves the characters in motion into the kill-ring." + :move-point nil + :repeat nil + (interactive "<R><x><y>") + (let ((evil-was-yanked-without-register + (and evil-was-yanked-without-register (not register)))) + (cond + ((and (fboundp 'cua--global-mark-active) + (fboundp 'cua-copy-region-to-global-mark) + (cua--global-mark-active)) + (cua-copy-region-to-global-mark beg end)) + ((eq type 'block) + (evil-yank-rectangle beg end register yank-handler)) + ((memq type '(line screen-line)) + (evil-yank-lines beg end register yank-handler)) + (t + (evil-yank-characters beg end register yank-handler))))) + +(evil-define-operator evil-yank-line (beg end type register) + "Saves whole lines into the kill-ring." + :motion evil-line-or-visual-line + :move-point nil + (interactive "<R><x>") + (when (evil-visual-state-p) + (unless (memq type '(line block screen-line)) + (let ((range (evil-expand beg end + (if (and evil-respect-visual-line-mode + visual-line-mode) + 'screen-line + 'line)))) + (setq beg (evil-range-beginning range) + end (evil-range-end range) + type (evil-type range)))) + (evil-exit-visual-state)) + (evil-yank beg end type register)) + +(evil-define-operator evil-delete (beg end type register yank-handler) + "Delete text from BEG to END with TYPE. +Save in REGISTER or in the kill-ring with YANK-HANDLER." + (interactive "<R><x><y>") + (unless register + (let ((text (filter-buffer-substring beg end))) + (unless (string-match-p "\n" text) + ;; set the small delete register + (evil-set-register ?- text)))) + (let ((evil-was-yanked-without-register nil)) + (evil-yank beg end type register yank-handler)) + (cond + ((eq type 'block) + (evil-apply-on-block #'delete-region beg end nil)) + ((and (eq type 'line) + (= end (point-max)) + (or (= beg end) + (/= (char-before end) ?\n)) + (/= beg (point-min)) + (= (char-before beg) ?\n)) + (delete-region (1- beg) end)) + (t + (delete-region beg end))) + ;; place cursor on beginning of line + (when (and (called-interactively-p 'any) + (eq type 'line)) + (evil-first-non-blank))) + +(evil-define-operator evil-delete-line (beg end type register yank-handler) + "Delete to end of line." + :motion nil + :keep-visual t + (interactive "<R><x>") + ;; act linewise in Visual state + (let* ((beg (or beg (point))) + (end (or end beg)) + (visual-line-mode (and evil-respect-visual-line-mode + visual-line-mode)) + (line-end (if visual-line-mode + (save-excursion + (end-of-visual-line) + (point)) + (line-end-position)))) + (when (evil-visual-state-p) + (unless (memq type '(line screen-line block)) + (let ((range (evil-expand beg end + (if visual-line-mode + 'screen-line + 'line)))) + (setq beg (evil-range-beginning range) + end (evil-range-end range) + type (evil-type range)))) + (evil-exit-visual-state)) + (cond + ((eq type 'block) + ;; equivalent to $d, i.e., we use the block-to-eol selection and + ;; call `evil-delete'. In this case we fake the call to + ;; `evil-end-of-line' by setting `temporary-goal-column' and + ;; `last-command' appropriately as `evil-end-of-line' would do. + (let ((temporary-goal-column most-positive-fixnum) + (last-command 'next-line)) + (evil-delete beg end 'block register yank-handler))) + ((memq type '(line screen-line)) + (evil-delete beg end type register yank-handler)) + (t + (evil-delete beg line-end type register yank-handler))))) + +(evil-define-operator evil-delete-whole-line + (beg end type register yank-handler) + "Delete whole line." + :motion evil-line-or-visual-line + (interactive "<R><x>") + (evil-delete beg end type register yank-handler)) + +(evil-define-operator evil-delete-char (beg end type register) + "Delete next character." + :motion evil-forward-char + (interactive "<R><x>") + (evil-delete beg end type register)) + +(evil-define-operator evil-delete-backward-char (beg end type register) + "Delete previous character." + :motion evil-backward-char + (interactive "<R><x>") + (evil-delete beg end type register)) + +(evil-define-command evil-delete-backward-char-and-join (count) + "Delete previous character and join lines. +If point is at the beginning of a line then the current line will +be joined with the previous line if and only if +`evil-backspace-join-lines'." + (interactive "p") + (if (or evil-backspace-join-lines (not (bolp))) + (call-interactively 'delete-backward-char) + (user-error "Beginning of line"))) + +(evil-define-command evil-delete-backward-word () + "Delete previous word." + (if (and (bolp) (not (bobp))) + (progn + (unless evil-backspace-join-lines (user-error "Beginning of line")) + (delete-char -1)) + (delete-region (max + (save-excursion + (evil-backward-word-begin) + (point)) + (line-beginning-position)) + (point)))) + +(evil-define-command evil-delete-back-to-indentation () + "Delete back to the first non-whitespace character. +If point is before the first non-whitespace character of a +current line then delete from the point to the beginning of the +current line. If point is on the beginning of the line, behave +according to `evil-backspace-join-lines'." + (if (bolp) + (evil-delete-backward-char-and-join 1) + (delete-region (if (<= (current-column) (current-indentation)) + (line-beginning-position) + (save-excursion + (evil-first-non-blank) + (point))) + (point)))) + +(defun evil-ex-delete-or-yank (should-delete beg end type register count yank-handler) + "Execute evil-delete or evil-yank on the given region. +If SHOULD-DELETE is t, evil-delete will be executed, otherwise +evil-yank. +The region specified by BEG and END will be adjusted if COUNT is +given." + (when count + ;; with COUNT, the command should go the end of the region and delete/yank + ;; COUNT lines from there + (setq beg (save-excursion + (goto-char end) + (forward-line -1) + (point)) + end (save-excursion + (goto-char end) + (point-at-bol count)) + type 'line)) + (funcall (if should-delete 'evil-delete 'evil-yank) beg end type register yank-handler)) + +(evil-define-operator evil-ex-delete (beg end type register count yank-handler) + "The Ex delete command. +\[BEG,END]delete [REGISTER] [COUNT]" + (interactive "<R><xc/><y>") + (evil-ex-delete-or-yank t beg end type register count yank-handler)) + +(evil-define-operator evil-ex-yank (beg end type register count yank-handler) + "The Ex yank command. +\[BEG,END]yank [REGISTER] [COUNT]" + (interactive "<R><xc/><y>") + (evil-ex-delete-or-yank nil beg end type register count yank-handler)) + +(evil-define-command evil-ex-put (_beg end ex-arg &optional force) + (interactive "<r><a><!>") + (let* ((arg-chars (remove ?\s (string-to-list ex-arg))) + (reg (or (car arg-chars) ?\")) + (text (cond + ((and (< 1 (length arg-chars)) + (/= ?= reg)) + (user-error "Trailing characters")) + ((eq ?= reg) + (evil--eval-expr (if (= 1 (length arg-chars)) + evil-last-=-register-input + (setq evil-last-=-register-input (substring ex-arg 1))))) + (t (evil-get-register reg))))) + (unless text (user-error "Nothing in register %c" reg)) + (evil-remove-yank-excluded-properties text) + (goto-char (if (= (point-max) end) end (1- end))) + (if force (evil-insert-newline-above) (evil-insert-newline-below)) + (evil-set-marker ?\[ (point)) + ;; `insert' rather than `insert-for-yank' as we want to ignore yank-handlers... + (insert (if (and (< 0 (length text)) + (eq ?\n (aref text (1- (length text))))) + (substring text 0 (1- (length text))) + text)) + (evil-set-marker ?\] (1- (point))) + (back-to-indentation) + (evil-normal-state))) + +(evil-define-operator evil-change + (beg end type register yank-handler delete-func) + "Change text from BEG to END with TYPE. +Save in REGISTER or the kill-ring with YANK-HANDLER. +DELETE-FUNC is a function for deleting text, default `evil-delete'. +If TYPE is `line', insertion starts on an empty line. +If TYPE is `block', the inserted text in inserted at each line +of the block." + (interactive "<R><x><y>") + (let ((delete-func (or delete-func #'evil-delete)) + (nlines (1+ (evil-count-lines beg end))) + (opoint (save-excursion + (goto-char beg) + (line-beginning-position)))) + (unless (eq evil-want-fine-undo t) + (evil-start-undo-step)) + (funcall delete-func beg end type register yank-handler) + (cond + ((eq type 'line) + (if (= opoint (point)) + (evil-open-above 1) + (evil-open-below 1))) + ((eq type 'block) + (evil-insert 1 nlines)) + (t + (evil-insert 1))))) + +(evil-define-operator evil-change-line (beg end type register yank-handler) + "Change to end of line, or change whole line if characterwise visual mode." + :motion evil-end-of-line-or-visual-line + (interactive "<R><x><y>") + (if (and (evil-visual-state-p) (eq 'inclusive type)) + (cl-destructuring-bind (beg* end* &rest) (evil-line-expand beg end) + (evil-change-whole-line beg* end* register yank-handler)) + (evil-change beg end type register yank-handler #'evil-delete-line))) + +(evil-define-operator evil-change-whole-line + (beg end register yank-handler) + "Change whole line." + :motion evil-line-or-visual-line + :type line + (interactive "<r><x>") + (evil-change beg end 'line register yank-handler #'evil-delete-whole-line)) + +(evil-define-command evil-copy (beg end address) + "Copy lines in BEG END below line given by ADDRESS." + :motion evil-line-or-visual-line + (interactive "<r><addr>") + (goto-char (point-min)) + (forward-line address) + (let* ((txt (buffer-substring-no-properties beg end)) + (len (length txt))) + ;; ensure text consists of complete lines + (when (or (zerop len) (/= (aref txt (1- len)) ?\n)) + (setq txt (concat txt "\n"))) + (when (and (eobp) (not (bolp))) (newline)) ; incomplete last line + (insert txt) + (forward-line -1))) + +(evil-define-command evil-move (beg end address) + "Move lines in BEG END below line given by ADDRESS." + :motion evil-line-or-visual-line + (interactive "<r><addr>") + (goto-char (point-min)) + (forward-line address) + (let* ((m (set-marker (make-marker) (point))) + (txt (buffer-substring-no-properties beg end)) + (len (length txt))) + (delete-region beg end) + (goto-char m) + (set-marker m nil) + ;; ensure text consists of complete lines + (when (or (zerop len) (/= (aref txt (1- len)) ?\n)) + (setq txt (concat txt "\n"))) + (when (and (eobp) (not (bolp))) (newline)) ; incomplete last line + (when (evil-visual-state-p) + (move-marker evil-visual-mark (point))) + (insert txt) + (forward-line -1) + (when (evil-visual-state-p) + (move-marker evil-visual-point (point))))) + +(defun evil--check-undo-system () + (when (and (eq evil-undo-system 'undo-tree) + (not (bound-and-true-p undo-tree-mode))) + (user-error "Enable `global-undo-tree-mode' to use undo-tree commands. +Add (add-hook 'evil-local-mode-hook 'turn-on-undo-tree-mode) to your init file for undo in non-file buffers."))) + +(evil-define-command evil-undo (count) + "Undo COUNT changes in buffer using `evil-undo-function'." + :repeat abort + (interactive "*p") + (evil--check-undo-system) + (funcall evil-undo-function count)) + +(evil-define-command evil-redo (count) + "Undo COUNT changes in buffer using `evil-redo-function'." + :repeat abort + (interactive "*p") + (evil--check-undo-system) + (funcall evil-redo-function count)) + +(evil-define-operator evil-substitute (beg end type register) + "Change a character." + :motion evil-forward-char + (interactive "<R><x>") + (evil-change beg end type register)) + +(evil-define-operator evil-upcase (beg end type) + "Convert text to upper case." + (if (eq type 'block) + (evil-apply-on-block #'evil-upcase beg end nil) + (upcase-region beg end))) + +(evil-define-operator evil-downcase (beg end type) + "Convert text to lower case." + (if (eq type 'block) + (evil-apply-on-block #'evil-downcase beg end nil) + (downcase-region beg end))) + +(evil-define-operator evil-invert-case (beg end type) + "Invert case of text." + (let (char) + (if (eq type 'block) + (evil-apply-on-block #'evil-invert-case beg end nil) + (save-excursion + (goto-char beg) + (while (< beg end) + (setq char (following-char)) + (delete-char 1 nil) + (if (eq (upcase char) char) + (insert-char (downcase char) 1) + (insert-char (upcase char) 1)) + (setq beg (1+ beg))))))) + +(evil-define-operator evil-invert-char (beg end type) + "Invert case of character." + :motion evil-forward-char + (if (eq type 'block) + (evil-apply-on-block #'evil-invert-case beg end nil) + (evil-invert-case beg end) + (when evil-this-motion + (goto-char end) + (when (and evil-cross-lines + (not evil-move-beyond-eol) + (not (evil-visual-state-p)) + (not (evil-operator-state-p)) + (eolp) (not (eobp)) (not (bolp))) + (forward-char))))) + +(evil-define-operator evil-rot13 (beg end type) + "ROT13 encrypt text." + (if (eq type 'block) + (evil-apply-on-block #'evil-rot13 beg end nil) + (rot13-region beg end))) + +(evil-define-operator evil-join (beg end) + "Join the selected lines." + :motion evil-line + (let ((count (count-lines beg end))) + (when (> count 1) + (setq count (1- count))) + (goto-char beg) + (dotimes (_ count) + (join-line 1)))) + +(evil-define-operator evil-join-whitespace (beg end) + "Join the selected lines without changing whitespace. +\\<evil-normal-state-map>Like \\[evil-join], \ +but doesn't insert or remove any spaces." + :motion evil-line + (let ((count (count-lines beg end))) + (when (> count 1) + (setq count (1- count))) + (goto-char beg) + (dotimes (_ count) + (evil-move-end-of-line 1) + (unless (eobp) + (delete-char 1))))) + +(evil-define-operator evil-ex-join (beg end &optional count bang) + "Join the selected lines with optional COUNT and BANG." + (interactive "<r><a><!>") + (if (and count (not (string-match-p "^[1-9][0-9]*$" count))) + (user-error "Invalid count") + (let ((join-fn (if bang 'evil-join-whitespace 'evil-join))) + (cond + ((not count) + ;; without count - just join the given region + (funcall join-fn beg end)) + (t + ;; emulate vim's :join when count is given - start from the + ;; end of the region and join COUNT lines from there + (let* ((count-num (string-to-number count)) + (beg-adjusted (save-excursion + (goto-char end) + (forward-line -1) + (point))) + (end-adjusted (save-excursion + (goto-char end) + (point-at-bol count-num)))) + (funcall join-fn beg-adjusted end-adjusted))))))) + +(evil-define-operator evil-fill (beg end) + "Fill text." + :move-point nil + :type line + (save-excursion + (condition-case nil + (fill-region beg end) + (error nil)))) + +(evil-define-operator evil-fill-and-move (beg end) + "Fill text and move point to the end of the filled region." + :move-point nil + :type line + (let ((marker (make-marker))) + (move-marker marker (1- end)) + (condition-case nil + (progn + (fill-region beg end) + (goto-char marker) + (evil-first-non-blank)) + (error nil)))) + +(evil-define-operator evil-indent (beg end) + "Indent text." + :move-point nil + :type line + (if (and (= beg (line-beginning-position)) + (= end (line-beginning-position 2))) + ;; since some Emacs modes can only indent one line at a time, + ;; implement "==" as a call to `indent-according-to-mode' + (indent-according-to-mode) + (goto-char beg) + (indent-region beg end)) + ;; We also need to tabify or untabify the leading white characters + (when evil-indent-convert-tabs + (let* ((beg-line (line-number-at-pos beg)) + (end-line (line-number-at-pos end)) + (ln beg-line) + (convert-white (if indent-tabs-mode 'tabify 'untabify))) + (save-excursion + (while (<= ln end-line) + (goto-char (point-min)) + (forward-line (- ln 1)) + (back-to-indentation) + ;; Whether tab or space should be used is determined by indent-tabs-mode + (funcall convert-white (line-beginning-position) (point)) + (setq ln (1+ ln))))) + (back-to-indentation))) + +(evil-define-operator evil-indent-line (beg end) + "Indent the line." + :motion evil-line + (evil-indent beg end)) + +(evil-define-operator evil-shift-left (beg end &optional count preserve-empty) + "Shift text from BEG to END to the left. +The text is shifted to the nearest multiple of `evil-shift-width' +\(the rounding can be disabled by setting `evil-shift-round'). +If PRESERVE-EMPTY is non-nil, lines that contain only spaces are +indented, too, otherwise they are ignored. The relative column +of point is preserved if this function is not called +interactively. Otherwise, if the function is called as an +operator, point is moved to the first non-blank character. +See also `evil-shift-right'." + :type line + (interactive "<r><vc>") + (evil-shift-right beg end (- (or count 1)) preserve-empty)) + +(evil-define-operator evil-shift-right (beg end &optional count preserve-empty) + "Shift text from BEG to END to the right. +The text is shifted to the nearest multiple of `evil-shift-width' +\(the rounding can be disabled by setting `evil-shift-round'). +If PRESERVE-EMPTY is non-nil, lines that contain only spaces are +indented, too, otherwise they are ignored. The relative column +of point is preserved if this function is not called +interactively. Otherwise, if the function is called as an +operator, point is moved to the first non-blank character. +See also `evil-shift-left'." + :type line + (interactive "<r><vc>") + (setq count (or count 1)) + (let ((beg (set-marker (make-marker) beg)) + (end (set-marker (make-marker) end)) + (pnt-indent (current-column)) + first-shift) ; shift of first line + (save-excursion + (goto-char beg) + (while (< (point) end) + (let* ((indent (current-indentation)) + (new-indent + (max 0 + (if (not evil-shift-round) + (+ indent (* count evil-shift-width)) + (* (+ (/ indent evil-shift-width) + count + (cond + ((> count 0) 0) + ((zerop (mod indent evil-shift-width)) 0) + (t 1))) + evil-shift-width))))) + (unless first-shift + (setq first-shift (- new-indent indent))) + (when (or preserve-empty + (save-excursion + (skip-chars-forward " \t") + (not (eolp)))) + (indent-to new-indent 0)) + (delete-region (point) (progn (skip-chars-forward " \t") (point))) + (forward-line 1)))) + ;; in case we're in an empty buffer first-shift is still unchanged + (unless first-shift + (if (< count 0) + (setq first-shift 0) + (setq first-shift (* count evil-shift-width)) + (indent-to first-shift))) + ;; When called from insert state (C-t or C-d) the cursor should shift with the line, + ;; otherwise (normal state) it should end up on the first non-whitespace character + (if (evil-insert-state-p) + (move-to-column (max 0 (+ pnt-indent first-shift))) + (evil-first-non-blank)))) + +(evil-define-command evil-shift-right-line (count) + "Shift the current line COUNT times to the right. +The text is shifted to the nearest multiple of +`evil-shift-width'. Like `evil-shift-right' but always works on +the current line." + (interactive "<c>") + (evil-shift-right (line-beginning-position) (line-beginning-position 2) count t)) + +(evil-define-command evil-shift-left-line (count) + "Shift the current line COUNT times to the left. +The text is shifted to the nearest multiple of +`evil-shift-width'. Like `evil-shift-left' but always works on +the current line." + (interactive "<c>") + (evil-shift-left (line-beginning-position) (line-beginning-position 2) count t)) + +(evil-define-operator evil-align-left (beg end type &optional width) + "Right-align lines in the region at WIDTH columns. +The default for width is the value of `fill-column'." + :motion evil-line + :type line + (interactive "<R><a>") + (evil-justify-lines beg end 'left (if width + (string-to-number width) + 0))) + +(evil-define-operator evil-align-right (beg end type &optional width) + "Right-align lines in the region at WIDTH columns. +The default for width is the value of `fill-column'." + :motion evil-line + :type line + (interactive "<R><a>") + (evil-justify-lines beg end 'right (if width + (string-to-number width) + fill-column))) + +(evil-define-operator evil-align-center (beg end type &optional width) + "Centers lines in the region between WIDTH columns. +The default for width is the value of `fill-column'." + :motion evil-line + :type line + (interactive "<R><a>") + (evil-justify-lines beg end 'center (if width + (string-to-number width) + fill-column))) + +(evil-define-operator evil-replace (beg end type char) + "Replace text from BEG to END with CHAR." + :motion evil-forward-char + (interactive "<R>" + (unwind-protect + (let ((evil-force-cursor 'replace)) + (evil-refresh-cursor) + (list (evil-read-key))) + (evil-refresh-cursor))) + (when char + (if (eq type 'block) + (save-excursion + (evil-apply-on-rectangle + #'(lambda (begcol endcol char) + (let ((maxcol (evil-column (line-end-position)))) + (when (< begcol maxcol) + (setq endcol (min endcol maxcol)) + (let ((beg (evil-move-to-column begcol nil t)) + (end (evil-move-to-column endcol nil t))) + (delete-region beg end) + (insert (make-string (- endcol begcol) char)))))) + beg end char)) + (goto-char beg) + (cond + ((eq char ?\n) + (delete-region beg end) + (newline) + (when evil-auto-indent + (indent-according-to-mode))) + (t + (while (< (point) end) + (if (eq (char-after) ?\n) + (forward-char) + (delete-char 1) + (insert-char char 1))) + (goto-char (max beg (1- end)))))))) + +(evil-define-command evil-paste-before + (count &optional register yank-handler) + "Pastes the latest yanked text before the cursor position. +The return value is the yanked text." + :suppress-operator t + (interactive "*P<x>") + (setq count (prefix-numeric-value count)) + (if (evil-visual-state-p) + (evil-visual-paste count register) + (evil-with-undo + (let* ((text (if register + (evil-get-register register) + (current-kill 0))) + (yank-handler (or yank-handler + (when (stringp text) + (car-safe (get-text-property + 0 'yank-handler text))))) + (opoint (point))) + (when evil-paste-clear-minibuffer-first + (delete-minibuffer-contents) + (setq evil-paste-clear-minibuffer-first nil)) + (when text + (if (functionp yank-handler) + (let ((evil-paste-count count) + ;; for non-interactive use + (this-command #'evil-paste-before)) + (push-mark opoint t) + (insert-for-yank text)) + ;; no yank-handler, default + (when (vectorp text) + (setq text (evil-vector-to-string text))) + (set-text-properties 0 (length text) nil text) + (push-mark opoint t) + (dotimes (_ (or count 1)) + (insert-for-yank text)) + (setq evil-last-paste + (list #'evil-paste-before + count + opoint + opoint ; beg + (point))) ; end + (evil-set-marker ?\[ opoint) + (evil-set-marker ?\] (1- (point))) + (when (and evil-move-cursor-back + (> (length text) 0)) + (backward-char)))) + ;; no paste-pop after pasting from a register + (when register + (setq evil-last-paste nil)) + (and (> (length text) 0) text))))) + +(evil-define-command evil-paste-after + (count &optional register yank-handler) + "Pastes the latest yanked text behind point. +The return value is the yanked text." + :suppress-operator t + (interactive "*P<x>") + (setq count (prefix-numeric-value count)) + (if (evil-visual-state-p) + (evil-visual-paste count register) + (evil-with-undo + (let* ((text (if register + (evil-get-register register) + (current-kill 0))) + (yank-handler (or yank-handler + (when (stringp text) + (car-safe (get-text-property + 0 'yank-handler text))))) + (opoint (point))) + (when text + (if (functionp yank-handler) + (let ((evil-paste-count count) + ;; for non-interactive use + (this-command #'evil-paste-after)) + (insert-for-yank text)) + ;; no yank-handler, default + (when (vectorp text) + (setq text (evil-vector-to-string text))) + (set-text-properties 0 (length text) nil text) + (unless (eolp) (forward-char)) + (push-mark (point) t) + ;; TODO: Perhaps it is better to collect a list of all + ;; (point . mark) pairs to undo the yanking for COUNT > 1. + ;; The reason is that this yanking could very well use + ;; `yank-handler'. + (let ((beg (point))) + (dotimes (_ (or count 1)) + (insert-for-yank text)) + (setq evil-last-paste + (list #'evil-paste-after + count + opoint + beg ; beg + (point))) ; end + (evil-set-marker ?\[ beg) + (evil-set-marker ?\] (1- (point))) + (when (evil-normal-state-p) + (evil-move-cursor-back))))) + (when register + (setq evil-last-paste nil)) + (and (> (length text) 0) text))))) + +(evil-define-command evil-visual-paste (count &optional register) + "Paste over Visual selection." + :suppress-operator t + (interactive "*P<x>") + (setq count (prefix-numeric-value count)) + ;; evil-visual-paste is typically called from evil-paste-before or + ;; evil-paste-after, but we have to mark that the paste was from + ;; visual state + (setq this-command 'evil-visual-paste) + (let* ((text (if register + (evil-get-register register) + (current-kill 0))) + (yank-handler (car-safe (get-text-property + 0 'yank-handler text))) + paste-eob) + (evil-with-undo + (let ((kill-ring-yank-pointer (when kill-ring (list (current-kill 0))))) + (when (evil-visual-state-p) + (evil-visual-rotate 'upper-left) + ;; if we replace the last buffer line that does not end in a + ;; newline, we use `evil-paste-after' because `evil-delete' + ;; will move point to the line above + (when (and (= evil-visual-end (point-max)) + (/= (char-before (point-max)) ?\n)) + (setq paste-eob t)) + (evil-delete evil-visual-beginning + evil-visual-end + (evil-visual-type) + (unless evil-kill-on-visual-paste ?_)) + (when (and (eq yank-handler #'evil-yank-line-handler) + (not (eq (evil-visual-type) 'line)) + (not (= evil-visual-end (point-max)))) + (insert "\n")) + (evil-normal-state) + (when kill-ring (current-kill 1))) + ;; Effectively memoize `evil-get-register' because it can be + ;; side-effecting (e.g. for the `=' register)... + (cl-letf (((symbol-function 'evil-get-register) + (lambda (&rest _) text))) + (if paste-eob + (evil-paste-after count register) + (evil-paste-before count register)))) + (when evil-kill-on-visual-paste + (current-kill -1)) + ;; mark the last paste as visual-paste + (setq evil-last-paste + (list (nth 0 evil-last-paste) + (nth 1 evil-last-paste) + (nth 2 evil-last-paste) + (nth 3 evil-last-paste) + (nth 4 evil-last-paste) + t))))) + +(defun evil-paste-from-register (register) + "Paste from REGISTER." + (interactive + (let ((overlay (make-overlay (point) (point))) + (string "\"")) + (unwind-protect + (progn + ;; display " in the buffer while reading register + (put-text-property 0 1 'face 'minibuffer-prompt string) + (put-text-property 0 1 'cursor t string) + (overlay-put overlay 'after-string string) + (list (or evil-this-register (read-char)))) + (delete-overlay overlay)))) + (when (evil-paste-before nil register t) + ;; go to end of pasted text + (unless (eobp) + (forward-char)))) + +(defun evil-paste-last-insertion () + "Paste last insertion." + (interactive) + (evil-paste-from-register ?.)) + +(evil-define-command evil-use-register (register) + "Use REGISTER for the next command." + :keep-visual t + :repeat ignore + (interactive "<C>") + (setq evil-this-register register)) + +(defvar evil-macro-buffer nil + "The buffer that has been active on macro recording.") + +(evil-define-command evil-record-macro (register) + "Record a keyboard macro into REGISTER. +If REGISTER is :, /, or ?, the corresponding command line window +will be opened instead." + :keep-visual t + :suppress-operator t + (interactive + (list (unless (and evil-this-macro defining-kbd-macro) + (or evil-this-register (evil-read-key))))) + (cond + ((eq register ?\C-g) + (keyboard-quit)) + ((and evil-this-macro defining-kbd-macro) + (setq evil-macro-buffer nil) + (condition-case nil + (end-kbd-macro) + (error nil)) + (when last-kbd-macro + (when (member last-kbd-macro '("" [])) + (setq last-kbd-macro nil)) + (evil-set-register evil-this-macro last-kbd-macro)) + (setq evil-this-macro nil)) + ((eq register ?:) + (evil-command-window-ex)) + ((eq register ?/) + (evil-command-window-search-forward)) + ((eq register ??) + (evil-command-window-search-backward)) + ((or (and (>= register ?0) (<= register ?9)) + (and (>= register ?a) (<= register ?z)) + (and (>= register ?A) (<= register ?Z))) + (when defining-kbd-macro (end-kbd-macro)) + (setq evil-this-macro register) + (evil-set-register evil-this-macro nil) + (start-kbd-macro nil) + (setq evil-macro-buffer (current-buffer))) + (t (error "Invalid register")))) + +(evil-define-command evil-execute-macro (count macro) + "Execute keyboard macro MACRO, COUNT times. +When called with a non-numerical prefix \ +\(such as \\[universal-argument]), +COUNT is infinite. MACRO is read from a register +when called interactively." + :keep-visual t + :suppress-operator t + (interactive + (let (count macro register) + (setq count (if current-prefix-arg + (if (numberp current-prefix-arg) + current-prefix-arg + 0) 1) + register (or evil-this-register (read-char))) + (cond + ((or (and (eq register ?@) (eq evil-last-register ?:)) + (eq register ?:)) + (setq macro (lambda () (evil-ex-repeat nil)) + evil-last-register ?:)) + ((eq register ?@) + (unless evil-last-register + (user-error "No previously executed keyboard macro.")) + (setq macro (evil-get-register evil-last-register t))) + (t + (setq macro (evil-get-register register t) + evil-last-register register))) + (list count macro))) + (cond + ((functionp macro) + (evil-repeat-abort) + (dotimes (_ (or count 1)) + (funcall macro))) + ((or (and (not (stringp macro)) + (not (vectorp macro))) + (member macro '("" []))) + ;; allow references to currently empty registers + ;; when defining macro + (unless evil-this-macro + (user-error "No previous macro"))) + (t + (condition-case err + (evil-with-single-undo + (execute-kbd-macro macro count)) + ;; enter Normal state if the macro fails + (error + (evil-normal-state) + (evil-normalize-keymaps) + (signal (car err) (cdr err))))))) + +;;; Visual commands + +(evil-define-motion evil-visual-restore () + "Restore previous selection." + (let* ((point (point)) + (mark (or (mark t) point)) + (dir evil-visual-direction) + (type (evil-visual-type)) + range) + (unless (evil-visual-state-p) + (cond + ;; No previous selection. + ((or (null evil-visual-selection) + (null evil-visual-mark) + (null evil-visual-point))) + ;; If the type was one-to-one, it is preferable to infer + ;; point and mark from the selection's boundaries. The reason + ;; is that a destructive operation may displace the markers + ;; inside the selection. + ((evil-type-property type :one-to-one) + (setq range (evil-contract-range (evil-visual-range)) + mark (evil-range-beginning range) + point (evil-range-end range)) + (when (< dir 0) + (evil-swap mark point))) + ;; If the type wasn't one-to-one, we have to restore the + ;; selection on the basis of the previous point and mark. + (t + (setq mark evil-visual-mark + point evil-visual-point))) + (evil-visual-make-selection mark point type t)))) + +(evil-define-motion evil-visual-exchange-corners () + "Rearrange corners in Visual Block mode. + + M---+ +---M + | | <=> | | + +---P P---+ + +For example, if mark is in the upper left corner and point +in the lower right, this function puts mark in the upper right +corner and point in the lower left." + (cond + ((eq evil-visual-selection 'block) + (let* ((point (point)) + (mark (or (mark t) point)) + (point-col (evil-column point)) + (mark-col (evil-column mark)) + (mark (save-excursion + (goto-char mark) + (evil-move-to-column point-col) + (point))) + (point (save-excursion + (goto-char point) + (evil-move-to-column mark-col) + (point)))) + (evil-visual-refresh mark point))) + (t + (evil-exchange-point-and-mark) + (evil-visual-refresh)))) + +(evil-define-command evil-visual-rotate (corner &optional beg end type) + "In Visual Block selection, put point in CORNER. +Corner may be one of `upper-left', `upper-right', `lower-left' +and `lower-right': + + upper-left +---+ upper-right + | | + lower-left +---+ lower-right + +When called interactively, the selection is rotated blockwise." + :keep-visual t + (interactive + (let ((corners '(upper-left upper-right lower-right lower-left))) + (list (or (cadr (memq (evil-visual-block-corner) corners)) + 'upper-left)))) + (let* ((beg (or beg (point))) + (end (or end (mark t) beg)) + (type (or type evil-this-type)) + range) + (cond + ((memq type '(rectangle block)) + (setq range (evil-block-rotate beg end :corner corner) + beg (pop range) + end (pop range)) + (unless (eq corner (evil-visual-block-corner corner beg end)) + (evil-swap beg end)) + (goto-char beg) + (when (evil-visual-state-p) + (evil-move-mark end) + (evil-visual-refresh nil nil nil :corner corner))) + ((memq corner '(upper-right lower-right)) + (goto-char (max beg end)) + (when (evil-visual-state-p) + (evil-move-mark (min beg end)))) + (t + (goto-char (min beg end)) + (when (evil-visual-state-p) + (evil-move-mark (max beg end))))))) + +;;; Insertion commands + +(defun evil-insert (count &optional vcount skip-empty-lines) + "Switch to Insert state just before point. +The insertion will be repeated COUNT times and repeated once for +the next VCOUNT - 1 lines starting at the same column. +If SKIP-EMPTY-LINES is non-nil, the insertion will not be performed +on lines on which the insertion point would be after the end of the +lines. This is the default behaviour for Visual-state insertion." + (interactive + (list (prefix-numeric-value current-prefix-arg) + (and (evil-visual-state-p) + (memq (evil-visual-type) '(line block)) + (save-excursion + (let ((m (mark))) + ;; go to upper-left corner temporarily so + ;; `count-lines' yields accurate results + (evil-visual-rotate 'upper-left) + (prog1 (count-lines evil-visual-beginning evil-visual-end) + (set-mark m))))) + (evil-visual-state-p))) + (if (and (called-interactively-p 'any) + (evil-visual-state-p)) + (cond + ((eq (evil-visual-type) 'line) + (evil-visual-rotate 'upper-left) + (evil-insert-line count vcount)) + ((eq (evil-visual-type) 'block) + (let ((column (min (evil-column evil-visual-beginning) + (evil-column evil-visual-end)))) + (evil-visual-rotate 'upper-left) + (move-to-column column t) + (evil-insert count vcount skip-empty-lines))) + (t + (evil-visual-rotate 'upper-left) + (evil-insert count vcount skip-empty-lines))) + (setq evil-insert-count count + evil-insert-lines nil + evil-insert-vcount (and vcount + (> vcount 1) + (list (line-number-at-pos) + (current-column) + vcount)) + evil-insert-skip-empty-lines skip-empty-lines) + (evil-insert-state 1))) + +(defun evil-append (count &optional vcount skip-empty-lines) + "Switch to Insert state just after point. +The insertion will be repeated COUNT times and repeated once for +the next VCOUNT - 1 lines starting at the same column. If +SKIP-EMPTY-LINES is non-nil, the insertion will not be performed +on lines on which the insertion point would be after the end of +the lines." + (interactive + (list (prefix-numeric-value current-prefix-arg) + (and (evil-visual-state-p) + (memq (evil-visual-type) '(line block)) + (save-excursion + (let ((m (mark))) + ;; go to upper-left corner temporarily so + ;; `count-lines' yields accurate results + (evil-visual-rotate 'upper-left) + (prog1 (count-lines evil-visual-beginning evil-visual-end) + (set-mark m))))))) + (if (and (called-interactively-p 'any) + (evil-visual-state-p)) + (cond + ((or (eq (evil-visual-type) 'line) + (and (eq (evil-visual-type) 'block) + (memq last-command '(next-line previous-line)) + (numberp temporary-goal-column) + (= temporary-goal-column most-positive-fixnum))) + (evil-visual-rotate 'upper-left) + (evil-append-line count vcount)) + ((eq (evil-visual-type) 'block) + (let ((column (max (evil-column evil-visual-beginning) + (evil-column evil-visual-end)))) + (evil-visual-rotate 'upper-left) + (move-to-column column t) + (evil-insert count vcount skip-empty-lines))) + (t + (evil-visual-rotate 'lower-right) + (backward-char) + (evil-append count))) + (unless (eolp) (forward-char)) + (evil-insert count vcount skip-empty-lines) + (add-hook 'post-command-hook #'evil-maybe-remove-spaces))) + +(defun evil-insert-resume (count) + "Switch to Insert state at previous insertion point. +The insertion will be repeated COUNT times. If called from visual +state, only place point at the previous insertion position but do not +switch to insert state." + (interactive "p") + (evil-goto-mark ?^ t) + (unless (evil-visual-state-p) + (evil-insert count))) + +(defun evil-open-above (count) + "Insert a new line above point and switch to Insert state. +The insertion will be repeated COUNT times." + (interactive "p") + (unless (eq evil-want-fine-undo t) + (evil-start-undo-step)) + (evil-insert-newline-above) + (setq evil-insert-count count + evil-insert-lines t + evil-insert-vcount nil) + (evil-insert-state 1) + (when evil-auto-indent + (indent-according-to-mode))) + +(defun evil-open-below (count) + "Insert a new line below point and switch to Insert state. +The insertion will be repeated COUNT times." + (interactive "p") + (unless (eq evil-want-fine-undo t) + (evil-start-undo-step)) + (push (point) buffer-undo-list) + (evil-insert-newline-below) + (setq evil-insert-count count + evil-insert-lines t + evil-insert-vcount nil) + (evil-insert-state 1) + (when evil-auto-indent + (indent-according-to-mode))) + +(defun evil-insert-line (count &optional vcount) + "Switch to insert state at beginning of current line. +Point is placed at the first non-blank character on the current +line. The insertion will be repeated COUNT times. If VCOUNT is +non nil it should be number > 0. The insertion will be repeated +in the next VCOUNT - 1 lines below the current one." + (interactive "p") + (push (point) buffer-undo-list) + (if (and visual-line-mode + evil-respect-visual-line-mode) + (goto-char + (max (save-excursion + (back-to-indentation) + (point)) + (save-excursion + (beginning-of-visual-line) + (point)))) + (back-to-indentation)) + (setq evil-insert-count count + evil-insert-lines nil + evil-insert-vcount + (and vcount + (> vcount 1) + (list (line-number-at-pos) + #'evil-first-non-blank + vcount))) + (evil-insert-state 1)) + +(defun evil-append-line (count &optional vcount) + "Switch to Insert state at the end of the current line. +The insertion will be repeated COUNT times. If VCOUNT is non nil +it should be number > 0. The insertion will be repeated in the +next VCOUNT - 1 lines below the current one." + (interactive "p") + (if (and visual-line-mode + evil-respect-visual-line-mode) + (evil-end-of-visual-line) + (evil-move-end-of-line)) + (setq evil-insert-count count + evil-insert-lines nil + evil-insert-vcount + (and vcount + (> vcount 1) + (list (line-number-at-pos) + #'end-of-line + vcount))) + (evil-insert-state 1)) + +(evil-define-command evil-insert-digraph (count) + "Insert COUNT digraphs." + :repeat change + (interactive "p") + (let ((digraph (evil-read-digraph-char 0))) + (insert-char digraph count))) + +(evil-define-command evil-ex-show-digraphs () + "Shows a list of all available digraphs." + :repeat nil + (let ((columns 3)) + (evil-with-view-list + :name "evil-digraphs" + :mode-name "Evil Digraphs" + :format + (cl-loop repeat columns + vconcat [("Digraph" 8 nil) + ("Sequence" 16 nil)]) + :entries + (let* ((digraphs (mapcar #'(lambda (digraph) + (cons (cdr digraph) + (car digraph))) + (append evil-digraphs-table + evil-digraphs-table-user))) + (entries (cl-loop for digraph in digraphs + collect `(,(concat (char-to-string (nth 1 digraph)) + (char-to-string (nth 2 digraph))) + ,(char-to-string (nth 0 digraph))))) + (row) + (rows) + (clength (* columns 2))) + (cl-loop for e in entries + do + (push (nth 0 e) row) + (push (nth 1 e) row) + (when (eq (length row) clength) + (push `(nil ,(apply #'vector row)) rows) + (setq row nil))) + rows)))) + +(defun evil--self-insert-string (string) + "Insert STRING as if typed interactively." + (let ((chars (append string nil))) + (dolist (char chars) + (let ((last-command-event char)) + (self-insert-command 1))))) + +(defun evil-copy-from-above (arg) + "Copy characters from preceding non-blank line. +The copied text is inserted before point. +ARG is the number of lines to move backward. +See also \\<evil-insert-state-map>\\[evil-copy-from-below]." + (interactive + (cond + ;; if a prefix argument was given, repeat it for subsequent calls + ((and (null current-prefix-arg) + (eq last-command #'evil-copy-from-above)) + (setq current-prefix-arg last-prefix-arg) + (list (prefix-numeric-value current-prefix-arg))) + (t + (list (prefix-numeric-value current-prefix-arg))))) + (evil--self-insert-string (evil-copy-chars-from-line arg -1))) + +(defun evil-copy-from-below (arg) + "Copy characters from following non-blank line. +The copied text is inserted before point. +ARG is the number of lines to move forward. +See also \\<evil-insert-state-map>\\[evil-copy-from-above]." + (interactive + (cond + ((and (null current-prefix-arg) + (eq last-command #'evil-copy-from-below)) + (setq current-prefix-arg last-prefix-arg) + (list (prefix-numeric-value current-prefix-arg))) + (t + (list (prefix-numeric-value current-prefix-arg))))) + (evil--self-insert-string (evil-copy-chars-from-line arg 1))) + +;; adapted from `copy-from-above-command' in misc.el +(defun evil-copy-chars-from-line (n num &optional col) + "Return N characters from line NUM, starting at column COL. +NUM is relative to the current line and can be negative. +COL defaults to the current column." + (interactive "p") + (let ((col (or col (current-column))) prefix) + (save-excursion + (forward-line num) + (when (looking-at "[[:space:]]*$") + (if (< num 0) + (skip-chars-backward " \t\n") + (skip-chars-forward " \t\n"))) + (evil-move-beginning-of-line) + (move-to-column col) + ;; if the column winds up in middle of a tab, + ;; return the appropriate number of spaces + (when (< col (current-column)) + (if (eq (preceding-char) ?\t) + (let ((len (min n (- (current-column) col)))) + (setq prefix (make-string len ?\s) + n (- n len))) + ;; if in middle of a control char, return the whole char + (backward-char 1))) + (concat prefix + (buffer-substring (point) + (min (line-end-position) + (+ n (point)))))))) + +;; completion +(evil-define-command evil-complete-next (&optional arg) + "Complete to the nearest following word. +Search backward if a match isn't found. +Calls `evil-complete-next-func'." + :repeat change + (interactive "P") + (if (minibufferp) + (funcall evil-complete-next-minibuffer-func) + (funcall evil-complete-next-func arg))) + +(evil-define-command evil-complete-previous (&optional arg) + "Complete to the nearest preceding word. +Search forward if a match isn't found. +Calls `evil-complete-previous-func'." + :repeat change + (interactive "P") + (if (minibufferp) + (funcall evil-complete-previous-minibuffer-func) + (funcall evil-complete-previous-func arg))) + +(evil-define-command evil-complete-next-line (&optional arg) + "Complete a whole line. +Calls `evil-complete-next-line-func'." + :repeat change + (interactive "P") + (if (minibufferp) + (funcall evil-complete-next-minibuffer-func) + (funcall evil-complete-next-line-func arg))) + +(evil-define-command evil-complete-previous-line (&optional arg) + "Complete a whole line. +Calls `evil-complete-previous-line-func'." + :repeat change + (interactive "P") + (if (minibufferp) + (funcall evil-complete-previous-minibuffer-func) + (funcall evil-complete-previous-line-func arg))) + +;;; Search + +(defun evil-repeat-search (flag) + "Called to record a search command. +FLAG is either 'pre or 'post if the function is called before resp. +after executing the command." + (cond + ((and (evil-operator-state-p) (eq flag 'pre)) + (evil-repeat-record (this-command-keys)) + (evil-clear-command-keys)) + ((and (evil-operator-state-p) (eq flag 'post)) + ;; The value of (this-command-keys) at this point should be the + ;; key-sequence that called the last command that finished the + ;; search, usually RET. Therefore this key-sequence will be + ;; recorded in the post-command of the operator. Alternatively we + ;; could do it here. + (evil-repeat-record (if evil-regexp-search + (car-safe regexp-search-ring) + (car-safe search-ring)))) + (t (evil-repeat-motion flag)))) + +(evil-define-motion evil-search-forward () + (format "Search forward for user-entered text. +Searches for regular expression if `evil-regexp-search' is t.%s" + (if (and (fboundp 'isearch-forward) + (documentation 'isearch-forward)) + (format "\n\nBelow is the documentation string \ +for `isearch-forward',\nwhich lists available keys:\n\n%s" + (documentation 'isearch-forward)) "")) + :jump t + :type exclusive + :repeat evil-repeat-search + (evil-search-incrementally t evil-regexp-search)) + +(evil-define-motion evil-search-backward () + (format "Search backward for user-entered text. +Searches for regular expression if `evil-regexp-search' is t.%s" + (if (and (fboundp 'isearch-forward) + (documentation 'isearch-forward)) + (format "\n\nBelow is the documentation string \ +for `isearch-forward',\nwhich lists available keys:\n\n%s" + (documentation 'isearch-forward)) "")) + :jump t + :type exclusive + :repeat evil-repeat-search + (evil-search-incrementally nil evil-regexp-search)) + +(evil-define-motion evil-search-next (count) + "Repeat the last search." + :jump t + :type exclusive + (let ((orig (point)) + (search-string (if evil-regexp-search + (car-safe regexp-search-ring) + (car-safe search-ring)))) + (goto-char + ;; Wrap in `save-excursion' so that multiple searches have no visual effect. + (save-excursion + (evil-search search-string isearch-forward evil-regexp-search) + (when (and (> (point) orig) + (save-excursion + (evil-adjust-cursor) + (= (point) orig))) + ;; Point won't move after first attempt and `evil-adjust-cursor' takes + ;; effect, so start again. + (evil-search search-string isearch-forward evil-regexp-search)) + (point))) + (when (and count (> count 1)) + (dotimes (_ (1- count)) + (evil-search search-string isearch-forward evil-regexp-search))))) + +(evil-define-motion evil-search-previous (count) + "Repeat the last search in the opposite direction." + :jump t + :type exclusive + (dotimes (_ (or count 1)) + (evil-search (if evil-regexp-search + (car-safe regexp-search-ring) + (car-safe search-ring)) + (not isearch-forward) evil-regexp-search))) + +(evil-define-motion evil-search-word-backward (count &optional symbol) + "Search backward for symbol under point." + :jump t + :type exclusive + (interactive (list (prefix-numeric-value current-prefix-arg) + evil-symbol-word-search)) + (dotimes (_ (or count 1)) + (evil-search-word nil nil symbol))) + +(evil-define-motion evil-search-word-forward (count &optional symbol) + "Search forward for symbol under point." + :jump t + :type exclusive + (interactive (list (prefix-numeric-value current-prefix-arg) + evil-symbol-word-search)) + (dotimes (_ (or count 1)) + (evil-search-word t nil symbol))) + +(evil-define-motion evil-search-unbounded-word-backward (count &optional symbol) + "Search backward for symbol under point. +The search is unbounded, i.e., the pattern is not wrapped in +\\<...\\>." + :jump t + :type exclusive + (interactive (list (prefix-numeric-value current-prefix-arg) + evil-symbol-word-search)) + (dotimes (_ (or count 1)) + (evil-search-word nil t symbol))) + +(evil-define-motion evil-search-unbounded-word-forward (count &optional symbol) + "Search forward for symbol under point. +The search is unbounded, i.e., the pattern is not wrapped in +\\<...\\>." + :jump t + :type exclusive + (interactive (list (prefix-numeric-value current-prefix-arg) + evil-symbol-word-search)) + (dotimes (_ (or count 1)) + (evil-search-word t t symbol))) + +(defun evil-goto-definition-imenu (string _position) + "Find definition for STRING with imenu." + (require 'imenu nil t) + (let (ientry ipos) + (when (fboundp 'imenu--make-index-alist) + (ignore-errors (setq ientry (imenu--make-index-alist))) + (setq ientry (imenu--in-alist string ientry)) + (setq ipos (cdr ientry)) + (when (and (markerp ipos) + (eq (marker-buffer ipos) (current-buffer))) + (setq ipos (marker-position ipos)) + (when (numberp ipos) + (evil-search (format "\\_<%s\\_>" (regexp-quote string)) t t ipos) + t))))) + +(defun evil-goto-definition-semantic (_string position) + "Find definition for POSITION with semantic." + (and (fboundp 'semantic-ia-fast-jump) + (ignore-errors (semantic-ia-fast-jump position)))) + +(declare-function xref-backend-identifier-at-point "xref") + +(defun evil-goto-definition-xref (_string position) + "Find definition at POSITION with xref." + (when (fboundp 'xref-find-definitions) + (let ((identifier (save-excursion + (goto-char position) + (xref-backend-identifier-at-point (xref-find-backend))))) + (condition-case () + (progn + (xref-find-definitions identifier) + t) + (user-error nil))))) + +(defun evil-goto-definition-search (string _position) + "Find definition for STRING with evil-search." + (evil-search (format "\\_<%s\\_>" (regexp-quote string)) t t (point-min)) + t) + +(evil-define-motion evil-goto-definition () + "Go to definition or first occurrence of symbol under point. +See also `evil-goto-definition-functions'." + :jump t + :type exclusive + (let* ((match (evil--find-thing t 'symbol)) + (string (car match)) + (position (cdr match))) + (if (null string) + (user-error "No symbol under cursor") + (setq isearch-forward t) + (run-hook-with-args-until-success 'evil-goto-definition-functions + string position)))) + +;;; Folding +(defun evil-fold-action (list action) + "Perform fold ACTION for each matching major or minor mode in LIST. + +ACTION will be performed for the first matching handler in LIST. For more +information on its features and format, see the documentation for +`evil-fold-list'. + +If no matching ACTION is found in LIST, an error will signaled. + +Handler errors will be demoted, so a problem in one handler will (hopefully) +not interfere with another." + (if (null list) + (user-error + "Enable one of the following modes for folding to work: %s" + (mapconcat 'symbol-name (mapcar 'caar evil-fold-list) ", ")) + (let* ((modes (caar list))) + (if (evil--mode-p modes) + (let* ((actions (cdar list)) + (fn (plist-get actions action))) + (when fn + (with-demoted-errors (funcall fn)))) + (evil-fold-action (cdr list) action))))) + +(defun evil--mode-p (modes) + "Determines whether any symbol in MODES represents the current +buffer's major mode or any of its minors." + (unless (eq modes '()) + (let ((mode (car modes))) + (or (eq major-mode mode) + (and (boundp mode) (symbol-value mode)) + (evil--mode-p (cdr modes)))))) + +(evil-define-command evil-toggle-fold () + "Open or close a fold under point. +See also `evil-open-fold' and `evil-close-fold'." + (evil-fold-action evil-fold-list :toggle)) + +(evil-define-command evil-open-folds () + "Open all folds. +See also `evil-close-folds'." + (evil-fold-action evil-fold-list :open-all)) + +(evil-define-command evil-close-folds () + "Close all folds. +See also `evil-open-folds'." + (evil-fold-action evil-fold-list :close-all)) + +(evil-define-command evil-open-fold () + "Open fold at point. +See also `evil-close-fold'." + (evil-fold-action evil-fold-list :open)) + +(evil-define-command evil-open-fold-rec () + "Open fold at point recursively. +See also `evil-open-fold' and `evil-close-fold'." + (evil-fold-action evil-fold-list :open-rec)) + +(evil-define-command evil-close-fold () + "Close fold at point. +See also `evil-open-fold'." + (evil-fold-action evil-fold-list :close)) + +;;; Ex + +(evil-define-operator evil-write (beg end type file-or-append &optional bang) + "Save the current buffer, from BEG to END, to FILE-OR-APPEND. +If FILE-OR-APPEND is of the form \">> FILE\", append to FILE +instead of overwriting. The current buffer's filename is not +changed unless it has no associated file and no region is +specified. If the file already exists and the BANG argument is +non-nil, it is overwritten without confirmation." + :motion nil + :move-point nil + :type line + :repeat nil + (interactive "<R><fsh><!>") + (let* ((append-and-filename (evil-extract-append file-or-append)) + (append (car append-and-filename)) + (filename (cdr append-and-filename)) + (bufname (buffer-file-name (buffer-base-buffer)))) + (when (zerop (length filename)) + (setq filename bufname)) + (cond + ((zerop (length filename)) + (user-error "Please specify a file name for the buffer")) + ;; execute command on region + ((eq (aref filename 0) ?!) + (shell-command-on-region beg end (substring filename 1))) + ;; with region or append, always save to file without resetting + ;; modified flag + ((or append (and beg end)) + (write-region beg end filename append nil nil (not (or append bang)))) + ;; no current file + ((null bufname) + (write-file filename (not bang))) + ;; save current buffer to its file + ((string= filename bufname) + (if (not bang) (save-buffer) (write-file filename))) + ;; save to another file + (t + (write-region nil nil filename + nil (not bufname) nil + (not bang)))))) + +(evil-define-command evil-write-all (bang) + "Saves all buffers visiting a file. +If BANG is non nil then read-only buffers are saved, too, +otherwise they are skipped. " + :repeat nil + :move-point nil + (interactive "<!>") + (if bang + (save-some-buffers t) + ;; save only buffer that are not read-only and + ;; that are visiting a file + (save-some-buffers t + #'(lambda () + (and (not buffer-read-only) + (buffer-file-name)))))) + +(evil-define-command evil-save (filename &optional bang) + "Save the current buffer to FILENAME. +Changes the file name of the current buffer to FILENAME. If no +FILENAME is given, the current file name is used." + :repeat nil + :move-point nil + (interactive "<f><!>") + (when (zerop (length filename)) + (setq filename (buffer-file-name (buffer-base-buffer)))) + (write-file filename (not bang))) + +(evil-define-command evil-edit (file &optional bang) + "Open FILE. +If no FILE is specified, reload the current buffer from disk." + :repeat nil + (interactive "<f><!>") + (if file + (find-file file) + (revert-buffer bang (or bang (not (buffer-modified-p))) t))) + +(evil-define-command evil-read (count file) + "Inserts the contents of FILE below the current line or line COUNT." + :repeat nil + :move-point nil + (interactive "P<fsh>") + (when (and file (not (zerop (length file)))) + (when count (goto-char (point-min))) + (when (or (not (zerop (forward-line (or count 1)))) + (not (bolp))) + (insert "\n")) + (if (/= (aref file 0) ?!) + (let ((result (insert-file-contents file))) + (save-excursion + (forward-char (cadr result)) + (unless (bolp) (insert "\n")))) + (shell-command (substring file 1) t) + (save-excursion + (goto-char (mark)) + (unless (bolp) (insert "\n")))))) + +(evil-define-command evil-show-files () + "Shows the file-list. +The same as `buffer-menu', but shows only buffers visiting +files." + :repeat nil + (buffer-menu 1)) + +(evil-define-command evil-goto-error (count) + "Go to error number COUNT. + +If no COUNT supplied, move to the current error. + +Acts like `first-error' other than when given no counts, goes +to the current error instead of the first, like in Vim's :cc +command." + :repeat nil + (interactive "<c>") + (if count + (first-error (if (eql 0 count) 1 count)) + (next-error 0))) + +(evil-define-command evil-buffer (buffer) + "Switches to another buffer." + :repeat nil + (interactive "<b>") + (cond + ;; no buffer given, switch to "other" buffer + ((null buffer) (switch-to-buffer (other-buffer))) + ;; we are given the name of an existing buffer + ((get-buffer buffer) (switch-to-buffer buffer)) + ;; try to complete the buffer + ((let ((all-buffers (internal-complete-buffer buffer nil t))) + (when (= (length all-buffers) 1) + (switch-to-buffer (car all-buffers))))) + (t + (when (y-or-n-p + (format "No buffer with name \"%s\" exists. Create new buffer? " + buffer)) + (switch-to-buffer buffer))))) + +(evil-define-command evil-next-buffer (&optional count) + "Goes to the `count'-th next buffer in the buffer list." + :repeat nil + (interactive "p") + (dotimes (_ (or count 1)) + (next-buffer))) + +(evil-define-command evil-prev-buffer (&optional count) + "Goes to the `count'-th prev buffer in the buffer list." + :repeat nil + (interactive "p") + (dotimes (_ (or count 1)) + (previous-buffer))) + +(evil-define-command evil-delete-buffer (buffer &optional bang) + "Deletes a buffer. +All windows currently showing this buffer will be closed except +for the last window in each frame." + (interactive "<b><!>") + (with-current-buffer (or buffer (current-buffer)) + (when bang + (set-buffer-modified-p nil) + (dolist (process (process-list)) + (when (eq (process-buffer process) (current-buffer)) + (set-process-query-on-exit-flag process nil)))) + ;; get all windows that show this buffer + (let ((wins (get-buffer-window-list (current-buffer) nil t))) + ;; if the buffer which was initiated by emacsclient, + ;; call `server-edit' from server.el to avoid + ;; "Buffer still has clients" message + (if (and (fboundp 'server-edit) + (boundp 'server-buffer-clients) + server-buffer-clients) + (server-edit) + (kill-buffer nil)) + ;; close all windows that showed this buffer + (mapc #'(lambda (w) + (condition-case nil + (delete-window w) + (error nil))) + wins)))) + +(evil-define-command evil-quit (&optional force) + "Closes the current window, current frame, Emacs. +If the current frame belongs to some client the client connection +is closed." + :repeat nil + (interactive "<!>") + (condition-case nil + (delete-window) + (error + (if (and (boundp 'server-buffer-clients) + (fboundp 'server-edit) + (fboundp 'server-buffer-done) + server-buffer-clients) + (if force + (server-buffer-done (current-buffer)) + (server-edit)) + (condition-case nil + (delete-frame) + (error + (if force + (kill-emacs) + (save-buffers-kill-emacs)))))))) + +(evil-define-command evil-quit-all (&optional bang) + "Exits Emacs, asking for saving." + :repeat nil + (interactive "<!>") + (if (null bang) + (save-buffers-kill-terminal) + (let ((proc (frame-parameter (selected-frame) 'client))) + (if proc + (with-no-warnings + (server-delete-client proc)) + (dolist (process (process-list)) + (set-process-query-on-exit-flag process nil)) + (kill-emacs))))) + +(evil-define-command evil-quit-all-with-error-code (&optional force) + "Exits Emacs without saving, returning an non-zero error code. +The FORCE argument is only there for compatibility and is ignored. +This function fails with an error if Emacs is run in server mode." + :repeat nil + (interactive "<!>") + (if (and (boundp 'server-buffer-clients) + (fboundp 'server-edit) + (fboundp 'server-buffer-done) + server-buffer-clients) + (user-error "Cannot exit client process with error code.") + (kill-emacs 1))) + +(evil-define-command evil-save-and-quit () + "Save all buffers and exit Emacs." + (save-buffers-kill-terminal t)) + +(evil-define-command evil-save-and-close (file &optional bang) + "Saves the current buffer and closes the window." + :repeat nil + (interactive "<f><!>") + (evil-write nil nil nil file bang) + (evil-quit)) + +(evil-define-command evil-save-modified-and-close (file &optional bang) + "Saves the current buffer and closes the window." + :repeat nil + (interactive "<f><!>") + (when (buffer-modified-p) + (evil-write nil nil nil file bang)) + (evil-quit)) + +(evil-define-operator evil-shell-command + (beg end type command &optional previous) + "Execute a shell command. +If BEG, END and TYPE is specified, COMMAND is executed on the region, +which is replaced with the command's output. Otherwise, the +output is displayed in its own buffer. If PREVIOUS is non-nil, +the previous shell command is executed instead." + (interactive "<R><sh><!>") + (if (not (evil-ex-p)) + (let ((evil-ex-initial-input + (if (and beg + (not (evil-visual-state-p)) + (not current-prefix-arg)) + (let ((range (evil-range beg end type))) + (evil-contract-range range) + ;; TODO: this is not exactly the same as Vim, which + ;; uses .,+count as range. However, this is easier + ;; to achieve with the current implementation and + ;; the very inconvenient range interface. + ;; + ;; TODO: the range interface really needs some + ;; rework! + (format + "%d,%d!" + (line-number-at-pos (evil-range-beginning range)) + (line-number-at-pos (evil-range-end range)))) + "!"))) + (call-interactively 'evil-ex)) + (when command + (setq command (evil-ex-replace-special-filenames command))) + (if (zerop (length command)) + (when previous (setq command evil-previous-shell-command)) + (setq evil-previous-shell-command command)) + (cond + ((zerop (length command)) + (if previous (user-error "No previous shell command") + (user-error "No shell command"))) + (evil-ex-range + (if (not evil-display-shell-error-in-message) + (shell-command-on-region beg end command nil t) + (let ((output-buffer (generate-new-buffer " *temp*")) + (error-buffer (generate-new-buffer " *temp*"))) + (unwind-protect + (if (zerop (shell-command-on-region beg end + command + output-buffer nil + error-buffer)) + (progn + (delete-region beg end) + (insert-buffer-substring output-buffer) + (goto-char beg) + (evil-first-non-blank)) + (display-message-or-buffer error-buffer)) + (kill-buffer output-buffer) + (kill-buffer error-buffer))))) + (t + (shell-command command))))) + +(evil-define-command evil-make (arg) + "Call a build command in the current directory. +If ARG is nil this function calls `recompile', otherwise it calls +`compile' passing ARG as build command." + (interactive "<sh>") + (if (and (fboundp 'recompile) + (not arg)) + (recompile) + (compile arg))) + +;; TODO: escape special characters (currently only \n) ... perhaps +;; there is some Emacs function doing this? +(evil-define-command evil-show-registers (registers) + "Shows the contents of REGISTERS, or all registers, if none supplied." + :repeat nil + (interactive "<a>") + (let* ((all-registers (evil-register-list)) + (reg-chars (string-to-list registers)) + (display-regs (if reg-chars + (cl-remove-if-not (lambda (r) (memq (car r) reg-chars)) + all-registers) + all-registers))) + (evil-with-view-list + :name "evil-registers" + :mode-name "Evil Registers" + :format + [("Register" 10 nil) + ("Value" 1000 nil)] + :entries + (cl-loop for (key . val) in display-regs + collect `(nil [,(char-to-string key) + ,(cond ((stringp val) + (replace-regexp-in-string "\n" "^J" val)) + ((vectorp val) + (key-description val)) + (t ""))]))))) + +(evil-define-command evil-show-marks (mrks) + "Shows all marks. +If MRKS is non-nil it should be a string and only registers +corresponding to the characters of this string are shown." + :repeat nil + (interactive "<a>") + ;; To get markers and positions, we can't rely on 'global-mark-ring' + ;; provided by Emacs (although it will be much simpler and faster), + ;; because 'global-mark-ring' does not store mark characters, but + ;; only buffer name and position. Instead, 'evil-markers-alist' is + ;; used; this is list maintained by Evil for each buffer. + (let ((all-markers + ;; get global and local marks + (append (cl-remove-if (lambda (m) + (or (evil-global-marker-p (car m)) + (not (markerp (cdr m))))) + evil-markers-alist) + (cl-remove-if (lambda (m) + (or (not (evil-global-marker-p (car m))) + (not (markerp (cdr m))))) + (default-value 'evil-markers-alist))))) + (when mrks + (setq mrks (string-to-list mrks)) + (setq all-markers (cl-delete-if (lambda (m) + (not (member (car m) mrks))) + all-markers))) + ;; map marks to list of 4-tuples (char row col file) + (setq all-markers + (mapcar (lambda (m) + (with-current-buffer (marker-buffer (cdr m)) + (save-excursion + (goto-char (cdr m)) + (list (car m) + (line-number-at-pos (point)) + (current-column) + (buffer-name))))) + all-markers)) + (evil-with-view-list + :name "evil-marks" + :mode-name "Evil Marks" + :format [("Mark" 8 nil) + ("Line" 8 nil) + ("Column" 8 nil) + ("Buffer" 1000 nil)] + :entries (cl-loop for m in (sort all-markers (lambda (a b) (< (car a) (car b)))) + collect `(nil [,(char-to-string (nth 0 m)) + ,(number-to-string (nth 1 m)) + ,(number-to-string (nth 2 m)) + (,(nth 3 m))])) + :select-action #'evil--show-marks-select-action))) + +(defun evil--show-marks-select-action (entry) + (kill-buffer) + (switch-to-buffer (car (elt entry 3))) + (evil-goto-mark (string-to-char (elt entry 0)))) + +(defun evil--parse-delmarks (to-be-parsed &optional parsed) + "Where TO-BE-PARSED can contain ranges in the form `x-y'. +PARSED is a list of characters whose marks should be deleted. +Like vim, on invalid input, preceeding valid input is still parsed." + (cl-destructuring-bind (&optional a b c &rest) to-be-parsed + (cond + ((null to-be-parsed) parsed) + ;; single mark... + ((and (not (eq ?- b)) (or (<= ?a a ?z) (<= ?A a ?Z) (<= ?0 a ?9) + (memq a '(?\" ?^ ?. ?\[ ?\] ?< ?>)))) + (evil--parse-delmarks (cdr to-be-parsed) (cons a parsed))) + ;; range of marks... + ((and (eq ?- b) c (or (<= ?a a c ?z) (<= ?A a c ?Z) (<= ?0 a c ?9))) + (evil--parse-delmarks (nthcdr 3 to-be-parsed) + (append parsed (number-sequence a c)))) + (t (progn (message "Invalid input: %s" (apply #'string (remove nil to-be-parsed))) + parsed))))) + +(evil-define-command evil-delete-marks (marks &optional force) + "MARKS is a string denoting all marks to be deleted. Mark names are +either single characters or a range of characters in the form `x-y'. +If FORCE is non-nil and MARKS is blank, all local marks except 0-9 are removed." + (interactive "<a><!>") + (let ((mark-chars (remove ?\s (append marks nil)))) + (cond + ((and force mark-chars) (message "Invalid input")) + (mark-chars + (let* ((delmarks (evil--parse-delmarks mark-chars)) + (delmarkp (lambda (m) (member (car m) delmarks)))) + ;; delete all parsed marks... + (setq evil-markers-alist + (cl-remove-if delmarkp evil-markers-alist)) + ;; ensure all parsed marks are deleted globally... + (set-default 'evil-markers-alist + (cl-remove-if delmarkp (default-value 'evil-markers-alist))))) + ;; delete local marks except 0-9... + (force (setq evil-markers-alist + (cl-remove-if-not (lambda (m) (<= ?0 (car m) ?9)) + evil-markers-alist)))))) + +(eval-when-compile (require 'ffap)) +(evil-define-command evil-find-file-at-point-with-line () + "Opens the file at point and goes to line-number." + (require 'ffap) + (let ((fname (with-no-warnings (ffap-file-at-point)))) + (if fname + (let ((line + (save-excursion + (goto-char (cadr ffap-string-at-point-region)) + (and (re-search-backward ":\\([0-9]+\\)\\=" + (line-beginning-position) t) + (string-to-number (match-string 1)))))) + (with-no-warnings (ffap-other-window fname)) + (when line + (goto-char (point-min)) + (forward-line (1- line)))) + (user-error "File does not exist.")))) + +(evil-define-command evil-find-file-at-point-visual () + "Find the filename selected by the visual region. + Returns an error message if the file does not exist." + (require 'ffap) + (let ((region (buffer-substring (region-beginning) (region-end)))) + (if (file-exists-p region) + (find-file-at-point region) + (user-error (format "Can't find file \"%s\" in path" region))))) + +(evil-ex-define-argument-type state + "Defines an argument type which can take state names." + :collection + (lambda (arg predicate flag) + (let ((completions + (append '("nil") + (mapcar #'(lambda (state) + (format "%s" (car state))) + evil-state-properties)))) + (when arg + (cond + ((eq flag nil) + (try-completion arg completions predicate)) + ((eq flag t) + (all-completions arg completions predicate)) + ((eq flag 'lambda) + (test-completion arg completions predicate)) + ((eq (car-safe flag) 'boundaries) + (cons 'boundaries + (completion-boundaries arg + completions + predicate + (cdr flag))))))))) + +(evil-define-interactive-code "<state>" + "A valid evil state." + :ex-arg state + (list (when (and (evil-ex-p) evil-ex-argument) + (intern evil-ex-argument)))) + +;; TODO: should we merge this command with `evil-set-initial-state'? +(evil-define-command evil-ex-set-initial-state (state) + "Set the initial state for the current major mode to STATE. +This is the state the buffer comes up in. See `evil-set-initial-state'." + :repeat nil + (interactive "<state>") + (if (not (or (assq state evil-state-properties) + (null state))) + (user-error "State %s cannot be set as initial Evil state" state) + (let ((current-initial-state (evil-initial-state major-mode))) + (unless (eq current-initial-state state) + ;; only if we selected a new mode + (when (y-or-n-p (format "Major-mode `%s' has initial mode `%s'. \ +Change to `%s'? " + major-mode + (or current-initial-state "DEFAULT") + (or state "DEFAULT"))) + (evil-set-initial-state major-mode state) + (when (y-or-n-p "Save setting in customization file? ") + (dolist (s (list current-initial-state state)) + (when s + (let ((var (intern (format "evil-%s-state-modes" s)))) + (customize-save-variable var (symbol-value var))))))))))) + +(evil-define-command evil-force-normal-state () + "Switch to normal state without recording current command." + :repeat abort + :suppress-operator t + (evil-normal-state)) + +(evil-define-motion evil-ex-search-next (count) + "Goes to the next occurrence." + :jump t + :type exclusive + (evil-ex-search count)) + +(evil-define-motion evil-ex-search-previous (count) + "Goes the the previous occurrence." + :jump t + :type exclusive + (let ((evil-ex-search-direction + (if (eq evil-ex-search-direction 'backward) 'forward 'backward))) + (evil-ex-search count))) + +(defun evil-repeat-ex-search (flag) + "Called to record a search command. +FLAG is either 'pre or 'post if the function is called before +resp. after executing the command." + (cond + ((and (evil-operator-state-p) (eq flag 'pre)) + (evil-repeat-record (this-command-keys)) + (evil-clear-command-keys)) + ((and (evil-operator-state-p) (eq flag 'post)) + ;; The value of (this-command-keys) at this point should be the + ;; key-sequence that called the last command that finished the + ;; search, usually RET. Therefore this key-sequence will be + ;; recorded in the post-command of the operator. Alternatively we + ;; could do it here. + (evil-repeat-record (evil-ex-pattern-regex evil-ex-search-pattern))) + (t (evil-repeat-motion flag)))) + +(evil-define-motion evil-ex-search-forward (count) + "Starts a forward search." + :jump t + :type exclusive + :repeat evil-repeat-ex-search + (evil-ex-start-search 'forward count)) + +(evil-define-motion evil-ex-search-backward (count) + "Starts a forward search." + :jump t + :repeat evil-repeat-ex-search + (evil-ex-start-search 'backward count)) + +(evil-define-motion evil-ex-search-word-forward (count &optional symbol) + "Search for the next occurrence of word under the cursor." + :jump t + :type exclusive + (interactive (list (prefix-numeric-value current-prefix-arg) + evil-symbol-word-search)) + (evil-ex-start-word-search nil 'forward count symbol)) + +(evil-define-motion evil-ex-search-word-backward (count &optional symbol) + "Search for the next occurrence of word under the cursor." + :jump t + :type exclusive + (interactive (list (prefix-numeric-value current-prefix-arg) + evil-symbol-word-search)) + (evil-ex-start-word-search nil 'backward count symbol)) + +(evil-define-motion evil-ex-search-unbounded-word-forward (count &optional symbol) + "Search for the next occurrence of word under the cursor." + :jump t + :type exclusive + (interactive (list (prefix-numeric-value current-prefix-arg) + evil-symbol-word-search)) + (evil-ex-start-word-search t 'forward count symbol)) + +(evil-define-motion evil-ex-search-unbounded-word-backward (count &optional symbol) + "Search for the next occurrence of word under the cursor." + :jump t + :type exclusive + (interactive (list (prefix-numeric-value current-prefix-arg) + evil-symbol-word-search)) + (evil-ex-start-word-search t 'backward count symbol)) + +(defun evil-revert-reveal (open-spots) + "Unconditionally close overlays in OPEN-SPOTS in current window. +Modified version of `reveal-close-old-overlays' from +reveal.el. OPEN-SPOTS is a local version of `reveal-open-spots'." + (dolist (spot open-spots) + (let ((window (car spot)) + (ol (cdr spot))) + (unless (eq window (selected-window)) + (error "evil-revert-reveal: slot with wrong window")) + (let* ((inv (overlay-get ol 'reveal-invisible)) + (open (or (overlay-get ol 'reveal-toggle-invisible) + (get inv 'reveal-toggle-invisible) + (overlay-get ol 'isearch-open-invisible-temporary)))) + (if (and (overlay-start ol) ;Check it's still live. + open) + (condition-case err + (funcall open ol t) + (error (message "!!Reveal-hide (funcall %s %s t): %s !!" + open ol err))) + (overlay-put ol 'invisible inv)) + ;; Remove the overlay from the list of open spots. + (overlay-put ol 'reveal-invisible nil))))) + +(evil-define-operator evil-ex-substitute + (beg end pattern replacement flags) + "The Ex substitute command. +\[BEG,END]substitute/PATTERN/REPLACEMENT/FLAGS" + :repeat nil + :jump t + :move-point nil + :motion evil-line + (interactive "<r><s/>") + (evil-ex-nohighlight) + (unless pattern + (user-error "No pattern given")) + (setq replacement (or replacement "")) + (setq evil-ex-last-was-search nil) + (let* ((flags (append flags nil)) + (count-only (memq ?n flags)) + (confirm (and (memq ?c flags) (not count-only))) + (case-fold-search (evil-ex-pattern-ignore-case pattern)) + (case-replace case-fold-search) + (evil-ex-substitute-regex (evil-ex-pattern-regex pattern)) + (evil-ex-substitute-nreplaced 0) + (evil-ex-substitute-last-point (point)) + (whole-line (evil-ex-pattern-whole-line pattern)) + (evil-ex-substitute-overlay (make-overlay (point) (point))) + (orig-point-marker (move-marker (make-marker) (point))) + (end-marker (move-marker (make-marker) end)) + (use-reveal confirm) + reveal-open-spots + zero-length-match + match-contains-newline + transient-mark-mode) + (setq evil-ex-substitute-pattern pattern + evil-ex-substitute-replacement replacement + evil-ex-substitute-flags flags + isearch-string evil-ex-substitute-regex) + (isearch-update-ring evil-ex-substitute-regex t) + (unwind-protect + (progn + (evil-ex-hl-change 'evil-ex-substitute pattern) + (overlay-put evil-ex-substitute-overlay 'face 'isearch) + (overlay-put evil-ex-substitute-overlay 'priority 1001) + (goto-char beg) + (catch 'exit-search + (while (re-search-forward evil-ex-substitute-regex end-marker t) + (when (not (and query-replace-skip-read-only + (text-property-any (match-beginning 0) (match-end 0) 'read-only t))) + (let ((match-str (match-string 0)) + (match-beg (move-marker (make-marker) (match-beginning 0))) + (match-end (move-marker (make-marker) (match-end 0))) + (match-data (match-data))) + (goto-char match-beg) + (setq match-contains-newline + (string-match-p "\n" (buffer-substring-no-properties + match-beg match-end))) + (setq zero-length-match (= match-beg match-end)) + (when (and (string= "^" evil-ex-substitute-regex) + (= (point) end-marker)) + ;; The range (beg end) includes the final newline which means + ;; end-marker is on one line down. With the regex "^" the + ;; beginning of this last line will be matched which we don't + ;; want, so we abort here. + (throw 'exit-search t)) + (setq evil-ex-substitute-last-point match-beg) + (if confirm + (let ((prompt + (format "Replace %s with %s (y/n/a/q/l/^E/^Y)? " + match-str + (evil-match-substitute-replacement + evil-ex-substitute-replacement + (not case-replace)))) + (search-invisible t) + response) + (move-overlay evil-ex-substitute-overlay match-beg match-end) + ;; Simulate `reveal-mode'. `reveal-mode' uses + ;; `post-command-hook' but that won't work here. + (when use-reveal + (reveal-post-command)) + (catch 'exit-read-char + (while (setq response (read-char prompt)) + (when (member response '(?y ?a ?l)) + (unless count-only + (set-match-data match-data) + (evil-replace-match evil-ex-substitute-replacement + (not case-replace))) + (setq evil-ex-substitute-nreplaced + (1+ evil-ex-substitute-nreplaced)) + (evil-ex-hl-set-region 'evil-ex-substitute + (save-excursion + (forward-line) + (point)) + (evil-ex-hl-get-max + 'evil-ex-substitute))) + (cl-case response + ((?y ?n) (throw 'exit-read-char t)) + (?a (setq confirm nil) + (throw 'exit-read-char t)) + ((?q ?l ?\C-\[) (throw 'exit-search t)) + (?\C-e (evil-scroll-line-down 1)) + (?\C-y (evil-scroll-line-up 1)))))) + (setq evil-ex-substitute-nreplaced + (1+ evil-ex-substitute-nreplaced)) + (unless count-only + (set-match-data match-data) + (evil-replace-match evil-ex-substitute-replacement + (not case-replace)))) + (goto-char match-end) + (cond ((>= (point) end-marker) + ;; Don't want to perform multiple replacements at the end + ;; of the search region. + (throw 'exit-search t)) + ((and (not whole-line) + (not match-contains-newline)) + (forward-line) + ;; forward-line just moves to the end of the line on the + ;; last line of the buffer. + (when (or (eobp) + (> (point) end-marker)) + (throw 'exit-search t))) + ;; For zero-length matches check to see if point won't + ;; move next time. This is a problem when matching the + ;; regexp "$" because we can enter an infinite loop, + ;; repeatedly matching the same character + ((and zero-length-match + (let ((pnt (point))) + (save-excursion + (and + (re-search-forward + evil-ex-substitute-regex end-marker t) + (= pnt (point)))))) + (if (or (eobp) + (>= (point) end-marker)) + (throw 'exit-search t) + (forward-char))))))))) + (evil-ex-delete-hl 'evil-ex-substitute) + (delete-overlay evil-ex-substitute-overlay) + + (if count-only + (goto-char orig-point-marker) + (goto-char evil-ex-substitute-last-point)) + + (move-marker orig-point-marker nil) + (move-marker end-marker nil) + + (when use-reveal + (evil-revert-reveal reveal-open-spots))) + + (message "%s %d occurrence%s" + (if count-only "Found" "Replaced") + evil-ex-substitute-nreplaced + (if (/= evil-ex-substitute-nreplaced 1) "s" "")) + (evil-first-non-blank))) + +(evil-define-operator evil-ex-repeat-substitute + (beg end flags) + "Repeat last substitute command. +This is the same as :s//~/" + :repeat nil + :jump t + :move-point nil + :motion evil-line + (interactive "<r><a>") + (apply #'evil-ex-substitute beg end + (evil-ex-get-substitute-info (concat "//~/" flags)))) + +(evil-define-operator evil-ex-repeat-substitute-with-flags + (beg end flags) + "Repeat last substitute command with last flags. +This is the same as :s//~/&" + :repeat nil + :jump t + :move-point nil + :motion evil-line + (interactive "<r><a>") + (apply #'evil-ex-substitute beg end + (evil-ex-get-substitute-info (concat "//~/&" flags)))) + +(evil-define-operator evil-ex-repeat-substitute-with-search + (beg end flags) + "Repeat last substitute command with last search pattern. +This is the same as :s//~/r" + :repeat nil + :jump t + :move-point nil + :motion evil-line + (interactive "<r><a>") + (apply #'evil-ex-substitute beg end + (evil-ex-get-substitute-info (concat "//~/r" flags)))) + +(evil-define-operator evil-ex-repeat-substitute-with-search-and-flags + (beg end flags) + "Repeat last substitute command with last search pattern and last flags. +This is the same as :s//~/&r" + :repeat nil + :jump t + :move-point nil + :motion evil-line + (interactive "<r><a>") + (apply #'evil-ex-substitute beg end + (evil-ex-get-substitute-info (concat "//~/&r" flags)))) + +(evil-define-operator evil-ex-repeat-global-substitute () + "Repeat last substitute command on the whole buffer. +This is the same as :%s//~/&" + :repeat nil + :jump t + :move-point nil + :motion evil-line + (interactive) + (apply #'evil-ex-substitute (point-min) (point-max) + (evil-ex-get-substitute-info (concat "//~/&")))) + +(evil-define-operator evil-ex-global + (beg end pattern command &optional invert) + "The Ex global command. +\[BEG,END]global[!]/PATTERN/COMMAND" + :motion mark-whole-buffer + :move-point nil + (interactive "<r><g/><!>") + (unless pattern + (user-error "No pattern given")) + (unless command + (user-error "No command given")) + ;; TODO: `evil-ex-make-substitute-pattern' should be executed so + ;; :substitute can re-use :global's pattern depending on its `r' + ;; flag. This isn't supported currently but should be simple to add + (evil-with-single-undo + (let ((case-fold-search + (eq (evil-ex-regex-case pattern evil-ex-search-case) 'insensitive)) + (command-form (evil-ex-parse command)) + (transient-mark-mode transient-mark-mode) + (deactivate-mark deactivate-mark) + match markers) + (when (and pattern command) + (setq isearch-string pattern) + (isearch-update-ring pattern t) + (goto-char beg) + (evil-move-beginning-of-line) + (while (< (point) end) + (setq match (re-search-forward pattern (line-end-position) t)) + (when (or (and match (not invert)) + (and invert (not match))) + (push (move-marker (make-marker) + (or (and match (match-beginning 0)) + (line-beginning-position))) + markers)) + (forward-line)) + (setq markers (nreverse markers)) + (unwind-protect + (dolist (marker markers) + (goto-char marker) + (eval command-form)) + ;; ensure that all markers are deleted afterwards, + ;; even in the event of failure + (dolist (marker markers) + (set-marker marker nil))))))) + +(evil-define-operator evil-ex-global-inverted + (beg end pattern command &optional invert) + "The Ex vglobal command. +\[BEG,END]vglobal/PATTERN/COMMAND" + :motion mark-whole-buffer + :move-point nil + (interactive "<r><g/><!>") + (evil-ex-global beg end pattern command (not invert))) + +(evil-define-operator evil-ex-normal (beg end commands) + "The Ex normal command. +Execute the argument as normal command on each line in the +range. The given argument is passed straight to +`execute-kbd-macro'. The default is the current line." + :motion evil-line + (interactive "<r><a>") + (evil-with-single-undo + (let (markers evil-ex-current-buffer prefix-arg current-prefix-arg) + (goto-char beg) + (while + (and (< (point) end) + (progn + (push (move-marker (make-marker) (line-beginning-position)) + markers) + (and (= (forward-line) 0) (bolp))))) + (setq markers (nreverse markers)) + (deactivate-mark) + (evil-force-normal-state) + ;; replace ^[ by escape + (setq commands + (vconcat + (mapcar #'(lambda (ch) (if (equal ch ?) 'escape ch)) + (append commands nil)))) + (dolist (marker markers) + (goto-char marker) + (condition-case nil + (execute-kbd-macro commands) + (error nil)) + (evil-force-normal-state) + (set-marker marker nil))))) + +(evil-define-command evil-goto-char (position) + "Go to POSITION in the buffer. +Default position is the beginning of the buffer." + :jump t + (interactive "<N>Goto position: ") + (let ((position (evil-normalize-position + (or position (point-min))))) + (goto-char position))) + +(evil-define-operator evil-ex-line-number (beg end) + "Print the last line number." + :motion mark-whole-buffer + :move-point nil + (interactive "<r>") + (message "%d" (count-lines (point-min) end))) + +(evil-define-command evil-show-file-info () + "Shows basic file information." + (let* ((nlines (count-lines (point-min) (point-max))) + (curr (line-number-at-pos (point))) + (perc (if (> nlines 0) + (format "%d%%" (* (/ (float curr) (float nlines)) 100.0)) + "No lines in buffer")) + (file (buffer-file-name (buffer-base-buffer))) + (writable (and file (file-writable-p file))) + (readonly (if (and file (not writable)) "[readonly] " ""))) + (if file + (message "\"%s\" %d %slines --%s--" file nlines readonly perc) + (message "%d lines --%s--" nlines perc)))) + +(defvar sort-fold-case) +(evil-define-operator evil-ex-sort (beg end &optional options reverse) + "The Ex sort command. +\[BEG,END]sort[!] [i][u] +The following additional options are supported: + + * i ignore case + * u remove duplicate lines + +The 'bang' argument means to sort in reverse order." + :motion mark-whole-buffer + :move-point nil + (interactive "<r><a><!>") + (let ((beg (copy-marker beg)) + (end (copy-marker end)) + sort-fold-case uniq) + (dolist (opt (append options nil)) + (cond + ((eq opt ?i) (setq sort-fold-case t)) + ((eq opt ?u) (setq uniq t)) + (t (user-error "Unsupported sort option: %c" opt)))) + (sort-lines reverse beg end) + (when uniq + (let (line prev-line) + (goto-char beg) + (while (and (< (point) end) (not (eobp))) + (setq line (buffer-substring-no-properties + (line-beginning-position) + (line-end-position))) + (if (and (stringp prev-line) + (eq t (compare-strings line nil nil + prev-line nil nil + sort-fold-case))) + (delete-region (progn (forward-line 0) (point)) + (progn (forward-line 1) (point))) + (setq prev-line line) + (forward-line 1))))) + (goto-char beg) + (set-marker beg nil) + (set-marker end nil))) + +;;; Window navigation + +(defmacro evil-save-side-windows (&rest body) + "Toggle side windows, evaluate BODY, restore side windows." + (declare (indent defun) (debug (&rest form))) + (let ((sides (make-symbol "sidesvar"))) + `(let ((,sides (and (functionp 'window-toggle-side-windows) + (window-with-parameter 'window-side)))) + (when ,sides + (window-toggle-side-windows)) + (unwind-protect + (progn ,@body) + (when ,sides + (window-toggle-side-windows)))))) + +(defun evil-resize-window (new-size &optional horizontal) + "Set the current window's width or height to NEW-SIZE. +If HORIZONTAL is non-nil the width of the window is changed, +otherwise its height is changed." + (let ((count (- new-size (if horizontal (window-width) (window-height))))) + (enlarge-window count horizontal))) + +(defun evil-move-window (side) + "Move the `selected-window' to SIDE. +The state of the `selected-window' is saved along with the state +of the window tree consisting of all the other windows. Then, all +windows are deleted, the remaining window is split according to +SIDE, the state of the window at SIDE is replaced with the saved +state of the `selected-window', and, finally, the state of the +saved window tree is reconstructed on the opposite side. + +SIDE has the same meaning as in `split-window'. + +Note, this function only operates on the window tree rooted in +the frame's main window and effectively preserves any side +windows \(i.e. windows with a valid window-side window +parameter\)." + (evil-save-side-windows + (unless (one-window-p) + (save-excursion + (let ((w (window-state-get (selected-window)))) + (delete-window) + (let ((wtree (window-state-get))) + (delete-other-windows) + (let ((subwin (selected-window)) + ;; NOTE: SIDE is new in Emacs 24 + (newwin (split-window nil nil side))) + (window-state-put wtree subwin) + (window-state-put w newwin) + (select-window newwin))))) + (balance-windows)))) + +(defun evil-alternate-buffer (&optional window) + "Return the last buffer WINDOW has displayed other than the +current one (equivalent to Vim's alternate buffer). + +Returns the first item in `window-prev-buffers' that isn't +`window-buffer' of WINDOW." + ;; If the last buffer visited has been killed, then `window-prev-buffers' + ;; returns a list with `current-buffer' at the head, we account for this + ;; possibility. + (let* ((prev-buffers (window-prev-buffers)) + (head (car prev-buffers))) + (if (eq (car head) (window-buffer window)) + (cadr prev-buffers) + head))) + +(evil-define-command evil-switch-to-windows-last-buffer () + "Switch to current windows last open buffer." + :repeat nil + (let ((previous-place (evil-alternate-buffer))) + (when previous-place + (switch-to-buffer (car previous-place)) + (goto-char (car (last previous-place)))))) + +(evil-define-command evil-window-delete () + "Deletes the current window. +If `evil-auto-balance-windows' is non-nil then all children of +the deleted window's parent window are rebalanced." + (let ((p (window-parent))) + (delete-window) + (when evil-auto-balance-windows + ;; balance-windows raises an error if the parent does not have + ;; any further children (then rebalancing is not necessary anyway) + (condition-case nil + (balance-windows p) + (error))))) + +(evil-define-command evil-window-split (&optional count file) + "Splits the current window horizontally, COUNT lines height, +editing a certain FILE. The new window will be created below +when `evil-split-window-below' is non-nil. If COUNT and +`evil-auto-balance-windows' are both non-nil then all children +of the parent of the splitted window are rebalanced." + :repeat nil + (interactive "P<f>") + (split-window (selected-window) count + (if evil-split-window-below 'above 'below)) + (when (and (not count) evil-auto-balance-windows) + (balance-windows (window-parent))) + (when file + (evil-edit file))) + +(evil-define-command evil-window-vsplit (&optional count file) + "Splits the current window vertically, COUNT columns width, +editing a certain FILE. The new window will be created to the +right when `evil-vsplit-window-right' is non-nil. If COUNT and +`evil-auto-balance-windows'are both non-nil then all children +of the parent of the splitted window are rebalanced." + :repeat nil + (interactive "P<f>") + (split-window (selected-window) count + (if evil-vsplit-window-right 'left 'right)) + (when (and (not count) evil-auto-balance-windows) + (balance-windows (window-parent))) + (when file + (evil-edit file))) + +(evil-define-command evil-split-buffer (buffer) + "Splits window and switches to another buffer." + :repeat nil + (interactive "<b>") + (evil-window-split) + (evil-buffer buffer)) + +(evil-define-command evil-split-next-buffer (&optional count) + "Splits the window and goes to the COUNT-th next buffer in the buffer list." + :repeat nil + (interactive "p") + (evil-window-split) + (evil-next-buffer count)) + +(evil-define-command evil-split-prev-buffer (&optional count) + "Splits window and goes to the COUNT-th prev buffer in the buffer list." + :repeat nil + (interactive "p") + (evil-window-split) + (evil-prev-buffer count)) + +(evil-define-command evil-window-left (count) + "Move the cursor to new COUNT-th window left of the current one." + :repeat nil + (interactive "p") + (dotimes (_ count) + (windmove-left))) + +(evil-define-command evil-window-right (count) + "Move the cursor to new COUNT-th window right of the current one." + :repeat nil + (interactive "p") + (dotimes (_ count) + (windmove-right))) + +(evil-define-command evil-window-up (count) + "Move the cursor to new COUNT-th window above the current one." + :repeat nil + (interactive "p") + (dotimes (_ (or count 1)) + (windmove-up))) + +(evil-define-command evil-window-down (count) + "Move the cursor to new COUNT-th window below the current one." + :repeat nil + (interactive "p") + (dotimes (_ (or count 1)) + (windmove-down))) + +(evil-define-command evil-window-bottom-right () + "Move the cursor to bottom-right window." + :repeat nil + (let ((last-sibling (frame-root-window))) + (while (and last-sibling (not (window-live-p last-sibling))) + (setq last-sibling (window-last-child last-sibling))) + (when last-sibling + (select-window last-sibling)))) + +(evil-define-command evil-window-top-left () + "Move the cursor to top-left window." + :repeat nil + (let ((first-child (window-child (frame-root-window)))) + (while (and first-child (not (window-live-p first-child))) + (setq first-child (window-child first-child))) + (when first-child + (select-window + first-child)))) + +(evil-define-command evil-window-mru () + "Move the cursor to the previous (last accessed) buffer in another window. +More precisely, it selects the most recently used buffer that is +shown in some other window, preferably of the current frame, and +is different from the current one." + :repeat nil + (catch 'done + (dolist (buf (buffer-list (selected-frame))) + (let ((win (get-buffer-window buf))) + (when (and (not (eq buf (current-buffer))) + win + (not (eq win (selected-window)))) + (select-window win) + (throw 'done nil)))))) + +(evil-define-command evil-window-next (count) + "Move the cursor to the next window in the cyclic order. +With COUNT go to the count-th window in the order starting from +top-left." + :repeat nil + (interactive "<c>") + (if (not count) + (select-window (next-window)) + (evil-window-top-left) + (other-window (1- count)))) + +(evil-define-command evil-window-prev (count) + "Move the cursor to the previous window in the cyclic order. +With COUNT go to the count-th window in the order starting from +top-left." + :repeat nil + (interactive "<c>") + (if (not count) + (select-window (previous-window)) + (evil-window-top-left) + (other-window (1- count)))) + +(evil-define-command evil-window-new (count file) + "Splits the current window horizontally +and opens a new buffer or edits a certain FILE." + :repeat nil + (interactive "P<f>") + (let ((new-window (split-window (selected-window) count + (if evil-split-window-below 'below 'above)))) + (when (and (not count) evil-auto-balance-windows) + (balance-windows (window-parent))) + (if file + (evil-edit file) + (let ((buffer (generate-new-buffer "*new*"))) + (set-window-buffer new-window buffer) + (select-window new-window) + (with-current-buffer buffer + (funcall (default-value 'major-mode))))))) + +(evil-define-command evil-window-vnew (count file) + "Splits the current window vertically +and opens a new buffer name or edits a certain FILE." + :repeat nil + (interactive "P<f>") + (let ((new-window (split-window (selected-window) count + (if evil-vsplit-window-right 'right 'left)))) + (when (and (not count) evil-auto-balance-windows) + (balance-windows (window-parent))) + (if file + (evil-edit file) + (let ((buffer (generate-new-buffer "*new*"))) + (set-window-buffer new-window buffer) + (select-window new-window) + (with-current-buffer buffer + (funcall (default-value 'major-mode))))))) + +(evil-define-command evil-buffer-new (count file) + "Creates a new buffer replacing the current window, optionally + editing a certain FILE" + :repeat nil + (interactive "P<f>") + (if file + (evil-edit file) + (let ((buffer (generate-new-buffer "*new*"))) + (set-window-buffer nil buffer) + (with-current-buffer buffer + (funcall (default-value 'major-mode)))))) + +(evil-define-command evil-window-increase-height (count) + "Increase current window height by COUNT." + :repeat nil + (interactive "p") + (evil-resize-window (+ (window-height) count))) + +(evil-define-command evil-window-decrease-height (count) + "Decrease current window height by COUNT." + :repeat nil + (interactive "p") + (evil-resize-window (- (window-height) count))) + +(evil-define-command evil-window-increase-width (count) + "Increase current window width by COUNT." + :repeat nil + (interactive "p") + (evil-resize-window (+ (window-width) count) t)) + +(evil-define-command evil-window-decrease-width (count) + "Decrease current window width by COUNT." + :repeat nil + (interactive "p") + (evil-resize-window (- (window-width) count) t)) + +(evil-define-command evil-window-set-height (count) + "Sets the height of the current window to COUNT." + :repeat nil + (interactive "<c>") + (evil-resize-window (or count (frame-height)) nil)) + +(evil-define-command evil-window-set-width (count) + "Sets the width of the current window to COUNT." + :repeat nil + (interactive "<c>") + (evil-resize-window (or count (frame-width)) t)) + +(evil-define-command evil-ex-resize (arg) + "The ex :resize command. + +If ARG is a signed positive integer, increase the current window +height by ARG. + +If ARG is a signed negative integer, decrease the current window +height by ARG. + +If ARG is a positive integer without explicit sign, set the current +window height to ARG. + +If ARG is empty, maximize the current window height." + (interactive "<a>") + (if (or (not arg) (= 0 (length arg))) + (evil-window-set-height nil) + (let ((n (string-to-number arg))) + (if (> n 0) + (if (= ?+ (aref arg 0)) + (evil-window-increase-height n) + (evil-window-set-height n)) + (evil-window-decrease-height (- n)))))) + +(evil-define-command evil-window-rotate-upwards () + "Rotates the windows according to the current cyclic ordering." + :repeat nil + (evil-save-side-windows + (let ((wlist (window-list)) + (slist (mapcar #'window-state-get (window-list)))) + (setq slist (append (cdr slist) (list (car slist)))) + (while (and wlist slist) + (window-state-put (car slist) (car wlist)) + (setq wlist (cdr wlist) + slist (cdr slist))) + (select-window (car (last (window-list))))))) + +(evil-define-command evil-window-rotate-downwards () + "Rotates the windows according to the current cyclic ordering." + :repeat nil + (evil-save-side-windows + (let ((wlist (window-list)) + (slist (mapcar #'window-state-get (window-list)))) + (setq slist (append (last slist) slist)) + (while (and wlist slist) + (window-state-put (car slist) (car wlist)) + (setq wlist (cdr wlist) + slist (cdr slist))) + (select-window (cadr (window-list)))))) + +(evil-define-command evil-window-move-very-top () + "Closes the current window, splits the upper-left one horizontally +and redisplays the current buffer there." + :repeat nil + (evil-move-window 'above)) + +(evil-define-command evil-window-move-far-left () + "Closes the current window, splits the upper-left one vertically +and redisplays the current buffer there." + :repeat nil + (evil-move-window 'left)) + +(evil-define-command evil-window-move-far-right () + "Closes the current window, splits the lower-right one vertically +and redisplays the current buffer there." + :repeat nil + (evil-move-window 'right)) + +(evil-define-command evil-window-move-very-bottom () + "Closes the current window, splits the lower-right one horizontally +and redisplays the current buffer there." + :repeat nil + (evil-move-window 'below)) + +;;; Mouse handling + +;; Large parts of this code are taken from mouse.el which is +;; distributed with GNU Emacs +(defun evil-mouse-drag-region (start-event) + "Set the region to the text that the mouse is dragged over. +Highlight the drag area as you move the mouse. +This must be bound to a button-down mouse event. + +If the click is in the echo area, display the `*Messages*' buffer. + +START-EVENT should be the event that started the drag." + (interactive "e") + ;; Give temporary modes such as isearch a chance to turn off. + (run-hooks 'mouse-leave-buffer-hook) + (evil-mouse-drag-track start-event t)) +(evil-set-command-property 'evil-mouse-drag-region :keep-visual t) + +(defun evil-mouse-drag-track (start-event &optional + do-mouse-drag-region-post-process) + "Track mouse drags by highlighting area between point and cursor. +The region will be defined with mark and point. +DO-MOUSE-DRAG-REGION-POST-PROCESS should only be used by +`mouse-drag-region'." + (mouse-minibuffer-check start-event) + (setq mouse-selection-click-count-buffer (current-buffer)) + (deactivate-mark) + (let* ((scroll-margin 0) ; Avoid margin scrolling (Bug#9541). + (original-window (selected-window)) + ;; We've recorded what we needed from the current buffer and + ;; window, now let's jump to the place of the event, where things + ;; are happening. + (_ (mouse-set-point start-event)) + (echo-keystrokes 0) + (start-posn (event-start start-event)) + (start-point (posn-point start-posn)) + (start-window (posn-window start-posn)) + (start-window-start (window-start start-window)) + (start-hscroll (window-hscroll start-window)) + (bounds (window-edges start-window)) + (make-cursor-line-fully-visible nil) + (top (nth 1 bounds)) + (bottom (if (or (window-minibuffer-p start-window) + (not mode-line-format)) + (nth 3 bounds) + ;; Don't count the mode line. + (1- (nth 3 bounds)))) + (on-link (and mouse-1-click-follows-link + (or mouse-1-click-in-non-selected-windows + (eq start-window original-window)) + ;; Use start-point before the intangibility + ;; treatment, in case we click on a link inside an + ;; intangible text. + (mouse-on-link-p start-posn))) + (click-count (1- (event-click-count start-event))) + (remap-double-click (and on-link + (eq mouse-1-click-follows-link 'double) + (= click-count 1))) + ;; Suppress automatic hscrolling, because that is a nuisance + ;; when setting point near the right fringe (but see below). + (auto-hscroll-mode-saved auto-hscroll-mode) + (auto-hscroll-mode nil) + event end end-point) + + (setq mouse-selection-click-count click-count) + ;; In case the down click is in the middle of some intangible text, + ;; use the end of that text, and put it in START-POINT. + (if (< (point) start-point) + (goto-char start-point)) + (setq start-point (point)) + (if remap-double-click + (setq click-count 0)) + + (setq click-count (mod click-count 4)) + + ;; activate correct visual state + (let ((range (evil-mouse-start-end start-point start-point click-count))) + (set-mark (nth 0 range)) + (goto-char (nth 1 range))) + + (cond + ((= click-count 0) + (when (evil-visual-state-p) (evil-exit-visual-state))) + ((= click-count 1) + (evil-visual-char) + (evil-visual-post-command)) + ((= click-count 2) + (evil-visual-line) + (evil-visual-post-command)) + ((= click-count 3) + (evil-visual-block) + (evil-visual-post-command))) + + ;; Track the mouse until we get a non-movement event. + (track-mouse + (while (progn + (setq event (read-key)) + (or (mouse-movement-p event) + (memq (car-safe event) '(switch-frame select-window)))) + (unless (evil-visual-state-p) + (cond + ((= click-count 0) (evil-visual-char)) + ((= click-count 1) (evil-visual-char)) + ((= click-count 2) (evil-visual-line)) + ((= click-count 3) (evil-visual-block)))) + + (evil-visual-pre-command) + (unless (memq (car-safe event) '(switch-frame select-window)) + ;; Automatic hscrolling did not occur during the call to + ;; `read-event'; but if the user subsequently drags the + ;; mouse, go ahead and hscroll. + (let ((auto-hscroll-mode auto-hscroll-mode-saved)) + (redisplay)) + (setq end (event-end event) + end-point (posn-point end)) + (if (and (eq (posn-window end) start-window) + (integer-or-marker-p end-point)) + (evil-mouse--drag-set-mark-and-point start-point + end-point click-count) + (let ((mouse-row (cdr (cdr (mouse-position))))) + (cond + ((null mouse-row)) + ((< mouse-row top) + (mouse-scroll-subr start-window (- mouse-row top) + nil start-point)) + ((>= mouse-row bottom) + (mouse-scroll-subr start-window (1+ (- mouse-row bottom)) + nil start-point)))))) + (evil-visual-post-command))) + + ;; Handle the terminating event if possible. + (when (consp event) + ;; Ensure that point is on the end of the last event. + (when (and (setq end-point (posn-point (event-end event))) + (eq (posn-window end) start-window) + (integer-or-marker-p end-point) + (/= start-point end-point)) + (evil-mouse--drag-set-mark-and-point start-point + end-point click-count)) + + ;; Find its binding. + (let* ((fun (key-binding (vector (car event)))) + (do-multi-click (and (> (event-click-count event) 0) + (functionp fun) + (not (memq fun '(mouse-set-point + mouse-set-region)))))) + (if (and (or (/= (mark) (point)) + (= click-count 1) ; word selection + (and (memq (evil-visual-type) '(line block)))) + (not do-multi-click)) + + ;; If point has moved, finish the drag. + (let (last-command this-command) + (and mouse-drag-copy-region + do-mouse-drag-region-post-process + (let (deactivate-mark) + (evil-visual-expand-region) + (copy-region-as-kill (mark) (point)) + (evil-visual-contract-region)))) + + ;; If point hasn't moved, run the binding of the + ;; terminating up-event. + (if do-multi-click + (goto-char start-point) + (deactivate-mark)) + (when (and (functionp fun) + (= start-hscroll (window-hscroll start-window)) + ;; Don't run the up-event handler if the window + ;; start changed in a redisplay after the + ;; mouse-set-point for the down-mouse event at + ;; the beginning of this function. When the + ;; window start has changed, the up-mouse event + ;; contains a different position due to the new + ;; window contents, and point is set again. + (or end-point + (= (window-start start-window) + start-window-start))) + (when (and on-link + (= start-point (point)) + (evil-mouse--remap-link-click-p start-event event)) + ;; If we rebind to mouse-2, reselect previous selected + ;; window, so that the mouse-2 event runs in the same + ;; situation as if user had clicked it directly. Fixes + ;; the bug reported by juri@jurta.org on 2005-12-27. + (if (or (vectorp on-link) (stringp on-link)) + (setq event (aref on-link 0)) + (select-window original-window) + (setcar event 'mouse-2) + ;; If this mouse click has never been done by the + ;; user, it doesn't have the necessary property to be + ;; interpreted correctly. + (put 'mouse-2 'event-kind 'mouse-click))) + (push event unread-command-events))))))) + +;; This function is a plain copy of `mouse--drag-set-mark-and-point', +;; which is only available in Emacs 24 +(defun evil-mouse--drag-set-mark-and-point (start click click-count) + (let* ((range (evil-mouse-start-end start click click-count)) + (beg (nth 0 range)) + (end (nth 1 range))) + (cond ((eq (mark) beg) + (goto-char end)) + ((eq (mark) end) + (goto-char beg)) + ((< click (mark)) + (set-mark end) + (goto-char beg)) + (t + (set-mark beg) + (goto-char end))))) + +;; This function is a plain copy of `mouse--remap-link-click-p', +;; which is only available in Emacs 23 +(defun evil-mouse--remap-link-click-p (start-event end-event) + (or (and (eq mouse-1-click-follows-link 'double) + (= (event-click-count start-event) 2)) + (and + (not (eq mouse-1-click-follows-link 'double)) + (= (event-click-count start-event) 1) + (= (event-click-count end-event) 1) + (or (not (integerp mouse-1-click-follows-link)) + (let ((t0 (posn-timestamp (event-start start-event))) + (t1 (posn-timestamp (event-end end-event)))) + (and (integerp t0) (integerp t1) + (if (> mouse-1-click-follows-link 0) + (<= (- t1 t0) mouse-1-click-follows-link) + (< (- t0 t1) mouse-1-click-follows-link)))))))) + +(defun evil-mouse-start-end (start end mode) + "Return a list of region bounds based on START and END according to MODE. +If MODE is not 1 then set point to (min START END), mark to (max +START END). If MODE is 1 then set point to start of word at (min +START END), mark to end of word at (max START END)." + (evil-sort start end) + (setq mode (mod mode 4)) + (if (/= mode 1) (list start end) + (list + (save-excursion + (goto-char (min (point-max) (1+ start))) + (if (zerop (forward-thing evil-mouse-word -1)) + (let ((bpnt (point))) + (forward-thing evil-mouse-word +1) + (if (> (point) start) bpnt (point))) + (point-min))) + (save-excursion + (goto-char end) + (1- + (if (zerop (forward-thing evil-mouse-word +1)) + (let ((epnt (point))) + (forward-thing evil-mouse-word -1) + (if (<= (point) end) epnt (point))) + (point-max))))))) + +;;; State switching + +(evil-define-command evil-exit-emacs-state (&optional buffer message) + "Exit Emacs state. +Changes the state to the previous state, or to Normal state +if the previous state was Emacs state." + :keep-visual t + :suppress-operator t + (interactive '(nil t)) + (with-current-buffer (or buffer (current-buffer)) + (when (evil-emacs-state-p) + (evil-change-to-previous-state buffer message) + (when (evil-emacs-state-p) + (evil-normal-state (and message 1)))))) + +(evil-define-local-var evil--execute-normal-eol-pos nil + "Vim has special behaviour for executing in normal state at eol. +This var stores the eol position, so it can be restored when necessary.") + +(defun evil--restore-repeat-hooks () + "No insert-state repeat info is recorded after executing in normal state. +Restore the disabled repeat hooks on insert-state exit." + (evil-repeat-stop) + (add-hook 'pre-command-hook 'evil-repeat-pre-hook) + (add-hook 'post-command-hook 'evil-repeat-post-hook) + (remove-hook 'evil-insert-state-exit-hook 'evil--restore-repeat-hooks)) + +(defvar evil--execute-normal-return-state nil + "The state to return to after executing in normal state.") + +(defun evil-execute-in-normal-state () + "Execute the next command in Normal state." + (interactive) + (evil-delay '(not (memq this-command + '(nil + evil-execute-in-normal-state + evil-replace-state + evil-use-register + digit-argument + negative-argument + universal-argument + universal-argument-minus + universal-argument-more + universal-argument-other-key))) + `(progn + (with-current-buffer ,(current-buffer) + (when (and evil--execute-normal-eol-pos + (= (point) (1- evil--execute-normal-eol-pos)) + (not (memq this-command '(evil-insert + evil-goto-mark)))) + (forward-char)) + (unless (eq 'replace evil-state) + (evil-change-state ',evil-state)) + (when (eq 'insert evil-state) + (remove-hook 'pre-command-hook 'evil-repeat-pre-hook) + (remove-hook 'post-command-hook 'evil-repeat-post-hook) + (add-hook 'evil-insert-state-exit-hook 'evil--restore-repeat-hooks)) + (setq evil-move-cursor-back ',evil-move-cursor-back + evil-move-beyond-eol ',evil-move-beyond-eol))) + 'post-command-hook) + (setq evil-insert-count nil + evil--execute-normal-return-state evil-state + evil--execute-normal-eol-pos (when (eolp) (point)) + evil-move-cursor-back nil) + (evil-normal-state) + (setq evil-move-beyond-eol t) + (evil-echo "Switched to Normal state for the next command ...")) + +(defun evil-stop-execute-in-emacs-state () + (when (and (not (eq this-command #'evil-execute-in-emacs-state)) + (not (minibufferp))) + (remove-hook 'post-command-hook 'evil-stop-execute-in-emacs-state) + (when (buffer-live-p evil-execute-in-emacs-state-buffer) + (with-current-buffer evil-execute-in-emacs-state-buffer + (if (and (eq evil-previous-state 'visual) + (not (use-region-p))) + (progn + (evil-change-to-previous-state) + (evil-exit-visual-state)) + (evil-change-to-previous-state)))) + (setq evil-execute-in-emacs-state-buffer nil))) + +(evil-define-command evil-execute-in-emacs-state () + "Execute the next command in Emacs state." + (add-hook 'post-command-hook #'evil-stop-execute-in-emacs-state t) + (setq evil-execute-in-emacs-state-buffer (current-buffer)) + (cond + ((evil-visual-state-p) + (let ((mrk (mark)) + (pnt (point))) + (evil-emacs-state) + (set-mark mrk) + (goto-char pnt))) + (t + (evil-emacs-state))) + (evil-echo "Switched to Emacs state for the next command ...")) + +(defun evil-exit-visual-and-repeat (event) + "Exit insert state and repeat event. +This special command should be used if some command called from +visual state should actually be called in normal-state. The main +reason for doing this is that the repeat system should *not* +record the visual state information for some command. This +command should be bound to exactly the same event in visual state +as the original command is bound in normal state. EVENT is the +event that triggered the execution of this command." + (interactive "e") + (when (evil-visual-state-p) + (evil-exit-visual-state) + (push event unread-command-events))) +(evil-declare-ignore-repeat 'evil-exit-visual-and-repeat) + +(provide 'evil-commands) + +;;; evil-commands.el ends here diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-commands.elc b/.emacs.d/elpa/evil-20210527.2107/evil-commands.elc new file mode 100644 index 0000000..69d9eef Binary files /dev/null and b/.emacs.d/elpa/evil-20210527.2107/evil-commands.elc differ diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-common.el b/.emacs.d/elpa/evil-20210527.2107/evil-common.el new file mode 100644 index 0000000..cf48801 --- /dev/null +++ b/.emacs.d/elpa/evil-20210527.2107/evil-common.el @@ -0,0 +1,3981 @@ +;;; evil-common.el --- Common functions and utilities -*- lexical-binding: t -*- +;; Author: Vegard Øye <vegard_oye at hotmail.com> +;; Maintainer: Vegard Øye <vegard_oye at hotmail.com> + +;; Version: 1.14.0 + +;; +;; This file is NOT part of GNU Emacs. + +;;; License: + +;; This file is part of Evil. +;; +;; Evil is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; Evil is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with Evil. If not, see <http://www.gnu.org/licenses/>. + +(require 'evil-vars) +(require 'evil-digraphs) +(require 'rect) +(require 'thingatpt) +(require 'cl-lib) +(require 'calc) + +;;; Code: + +(declare-function evil-visual-state-p "evil-states") +(declare-function evil-visual-restore "evil-states") +(declare-function evil-motion-state "evil-states") +(declare-function evil-ex-p "evil-ex") +(declare-function evil-set-jump "evil-jumps") + +(condition-case nil + (require 'windmove) + (error + (message "evil: Could not load `windmove', \ +window commands not available.") + nil)) + +;;; Compatibility with different Emacs versions + +;; x-set-selection and x-get-selection have been deprecated since 25.1 +;; by gui-set-selection and gui-get-selection +(defalias 'evil-get-selection + (if (fboundp 'gui-get-selection) 'gui-get-selection 'x-get-selection)) +(defalias 'evil-set-selection + (if (fboundp 'gui-set-selection) 'gui-set-selection 'x-set-selection)) + +(defmacro evil-called-interactively-p () + "Wrapper for `called-interactively-p'. +In older versions of Emacs, `called-interactively-p' takes +no arguments. In Emacs 23.2 and newer, it takes one argument." + (called-interactively-p 'any)) +(make-obsolete 'evil-called-interactively-p + "please use (called-interactively-p 'any) instead." + "Git commit 222b791") + +;; macro helper +(eval-and-compile + (defun evil-unquote (exp) + "Return EXP unquoted." + (while (eq (car-safe exp) 'quote) + (setq exp (cadr exp))) + exp)) + +(defun evil-delay (condition form hook &optional append local name) + "Execute FORM when CONDITION becomes true, checking with HOOK. +NAME specifies the name of the entry added to HOOK. If APPEND is +non-nil, the entry is appended to the hook. If LOCAL is non-nil, +the buffer-local value of HOOK is modified." + (if (and (not (booleanp condition)) (eval condition)) + (eval form) + (let* ((name (or name (format "evil-delay-form-in-%s" hook))) + (fun (make-symbol name)) + (condition (or condition t))) + (fset fun `(lambda (&rest args) + (when ,condition + (remove-hook ',hook #',fun ',local) + ,form))) + (put fun 'permanent-local-hook t) + (add-hook hook fun append local)))) +(put 'evil-delay 'lisp-indent-function 2) + +;;; List functions + +(defmacro evil--add-to-alist (list-var &rest elements) + "Add the assocation of KEY and VAL to the value of LIST-VAR. +If the list already contains an entry for KEY, update that entry; +otherwise add at the end of the list. + +\(fn LIST-VAR KEY VAL &rest ELEMENTS)" + (when (eq (car-safe list-var) 'quote) + (setq list-var (cadr list-var))) + `(progn + ,@(if (version< emacs-version "26") + ;; TODO: Remove this path when support for Emacs 25 is dropped + (cl-loop for (key val) on elements by #'cddr + collect `(let* ((key ,key) + (val ,val) + (cell (assoc key ,list-var))) + (if cell + (setcdr cell val) + (push (cons key val) ,list-var)))) + (cl-loop for (key val) on elements by #'cddr + collect `(setf (alist-get ,key ,list-var nil nil #'equal) ,val))) + ,list-var)) + +(defun evil-add-to-alist (list-var key val &rest elements) + "Add the assocation of KEY and VAL to the value of LIST-VAR. +If the list already contains an entry for KEY, update that entry; +otherwise add at the end of the list." + (let ((tail (symbol-value list-var))) + (while (and tail (not (equal (car-safe (car-safe tail)) key))) + (setq tail (cdr tail))) + (if tail + (setcar tail (cons key val)) + (set list-var (append (symbol-value list-var) + (list (cons key val))))) + (if elements + (with-no-warnings + (apply #'evil-add-to-alist list-var elements)) + (symbol-value list-var)))) + +(make-obsolete 'evil-add-to-alist + "use `evil--add-to-alist' instead. You may need to recompile code with evil macros." + "1.13.1") + +;; custom version of `delete-if' +(defun evil-filter-list (predicate list &optional pointer) + "Delete by side-effect all items satisfying PREDICATE in LIST. +Stop when reaching POINTER. If the first item satisfies PREDICATE, +there is no way to remove it by side-effect; therefore, write +\(setq foo (evil-filter-list 'predicate foo)) to be sure of +changing the value of `foo'." + (let ((tail list) elt head) + (while (and tail (not (eq tail pointer))) + (setq elt (car tail)) + (cond + ((funcall predicate elt) + (setq tail (cdr tail)) + (if head + (setcdr head tail) + (setq list tail))) + (t + (setq head tail + tail (cdr tail))))) + list)) + +(defun evil-member-if (predicate list &optional pointer) + "Find the first item satisfying PREDICATE in LIST. +Stop when reaching POINTER, which should point at a link +in the list." + (let (elt) + (catch 'done + (while (and (consp list) (not (eq list pointer))) + (setq elt (car list)) + (if (funcall predicate elt) + (throw 'done elt) + (setq list (cdr list))))))) + +(defun evil-member-recursive-if (predicate tree) + "Find the first item satisfying PREDICATE in TREE." + (cond + ((funcall predicate tree) + tree) + ((listp tree) + (catch 'done + (dolist (elt tree) + (when (setq elt (evil-member-recursive-if predicate elt)) + (throw 'done elt))))))) + +(defun evil-concat-lists (&rest sequences) + "Concatenate lists, removing duplicates. +Elements are compared with `eq'." + (let (result) + (dolist (sequence sequences) + (dolist (elt sequence) + (push elt result))) + (nreverse (cl-remove-duplicates result :test #'eq)))) + +(defun evil-concat-alists (&rest sequences) + "Concatenate association lists, removing duplicates. +An alist is a list of cons cells (KEY . VALUE) where each key +may occur only once. Later values overwrite earlier values." + (let (result) + (dolist (sequence sequences) + (dolist (elt sequence) + (setq result (assq-delete-all (car-safe elt) result)) + (push elt result))) + (nreverse result))) + +(defun evil-concat-plists (&rest sequences) + "Concatenate property lists, removing duplicates. +A property list is a list (:KEYWORD1 VALUE1 :KEYWORD2 VALUE2...) +where each keyword may occur only once. Later values overwrite +earlier values." + (let (result) + (dolist (sequence sequences result) + (while sequence + (setq result + (plist-put result (pop sequence) (pop sequence))))))) + +(defun evil-concat-keymap-alists (&rest sequences) + "Concatenate keymap association lists, removing duplicates. +A keymap alist is a list of cons cells (VAR . MAP) where each keymap +may occur only once, but where the variables may be repeated +\(e.g., (VAR . MAP1) (VAR . MAP2) is allowed). The order matters, +with the highest priority keymaps being listed first." + (let (result) + (dolist (sequence sequences) + (dolist (elt sequence) + (unless (rassq (cdr-safe elt) result) + (push elt result)))) + (nreverse result))) + +(defun evil-plist-delete (prop plist) + "Delete by side effect the property PROP from PLIST. +If PROP is the first property in PLIST, there is no way +to remove it by side-effect; therefore, write +\(setq foo (evil-plist-delete :prop foo)) to be sure of +changing the value of `foo'." + (let ((tail plist) elt head) + (while tail + (setq elt (car tail)) + (cond + ((eq elt prop) + (setq tail (cdr (cdr tail))) + (if head + (setcdr (cdr head) tail) + (setq plist tail))) + (t + (setq head tail + tail (cdr (cdr tail)))))) + plist)) + +(defun evil-get-property (alist key &optional prop) + "Return property PROP for KEY in ALIST. +ALIST is an association list with entries of the form +\(KEY . PLIST), where PLIST is a property list. +If PROP is nil, return all properties for KEY. +If KEY is t, return an association list of keys +and their PROP values." + (cond + ((null prop) + (cdr (assq key alist))) + ((eq key t) + (let (result val) + (dolist (entry alist result) + (setq key (car entry) + val (cdr entry)) + (when (plist-member val prop) + (setq val (plist-get val prop)) + (push (cons key val) result))))) + (t + (plist-get (cdr (assq key alist)) prop)))) + +(defun evil-put-property (alist-var key prop val &rest properties) + "Set PROP to VAL for KEY in ALIST-VAR. +ALIST-VAR points to an association list with entries of the form +\(KEY . PLIST), where PLIST is a property list storing PROP and VAL." + (set alist-var + (let* ((alist (symbol-value alist-var)) + (plist (cdr (assq key alist)))) + (setq plist (plist-put plist prop val)) + (when properties + (setq plist (evil-concat-plists plist properties) + val (car (last properties)))) + (setq alist (assq-delete-all key alist)) + (push (cons key plist) alist))) + val) + +(defun evil-state-property (state prop &optional value) + "Return the value of property PROP for STATE. +PROP is a keyword as used by `evil-define-state'. +STATE is the state's symbolic name. +If VALUE is non-nil and the value is a variable, +return the value of that variable." + (let ((val (evil-get-property evil-state-properties state prop))) + (if (and value (symbolp val) (boundp val)) + (symbol-value val) + val))) + +(defmacro evil-swap (this that &rest vars) + "Swap the values of variables THIS and THAT. +If three or more arguments are given, the values are rotated. +E.g., (evil-swap A B C) sets A to B, B to C, and C to A." + `(progn + (setq ,this (prog1 ,that + (setq ,that ,this))) + ,@(when vars + `((evil-swap ,that ,@vars))))) + +(defmacro evil-sort (min max &rest vars) + "Place the smallest value in MIN and the largest in MAX. +If three or more arguments are given, place the smallest +value in the first argument and the largest in the last, +sorting in between." + (let ((sorted (make-symbol "sortvar"))) + `(let ((,sorted (sort (list ,min ,max ,@vars) '<))) + (setq ,min (pop ,sorted) + ,max (pop ,sorted) + ,@(apply #'append + (mapcar #'(lambda (var) + (list var `(pop ,sorted))) + vars)))))) + +(defun evil-vector-to-string (vector) + "Turns vector into a string, changing <escape> to '\\e'" + (mapconcat (lambda (c) + (if (equal c 'escape) + "\e" + (make-string 1 c))) + vector + "")) + +;;; Command properties + +(defmacro evil-define-command (command &rest body) + "Define a command COMMAND. + +\(fn COMMAND (ARGS...) DOC [[KEY VALUE]...] BODY...)" + (declare (indent defun) + (doc-string 3) + (debug (&define name + [&optional lambda-list] + [&optional stringp] + [&rest keywordp sexp] + [&optional ("interactive" [&rest form])] + def-body))) + (let ((interactive '(interactive)) + arg args doc doc-form key keys) + ;; collect arguments + (when (listp (car-safe body)) + (setq args (pop body))) + ;; collect docstring + (when (> (length body) 1) + (if (eq (car-safe (car-safe body)) 'format) + (setq doc-form (pop body)) + (when (stringp (car-safe body)) + (setq doc (pop body))))) + ;; collect keywords + (setq keys (plist-put keys :repeat t)) + (while (keywordp (car-safe body)) + (setq key (pop body) + arg (pop body)) + (unless nil ; TODO: add keyword check + (setq keys (plist-put keys key arg)))) + ;; collect `interactive' form + (when (and body (consp (car body)) + (eq (car (car body)) 'interactive)) + (let* ((iform (pop body)) + (result (apply #'evil-interactive-form (cdr iform))) + (form (car result)) + (attrs (cdr result))) + (setq interactive `(interactive ,form) + keys (evil-concat-plists keys attrs)))) + `(progn + ;; the compiler does not recognize `defun' inside `let' + ,(when (and command body) + `(defun ,command ,args + ,@(when doc `(,doc)) + ,interactive + (ignore ,@(cl-set-difference args '(&optional &rest))) + ,@body)) + ,(when (and command doc-form) + `(put ',command 'function-documentation ,doc-form)) + ;; set command properties for symbol or lambda function + (let ((func ',(if (and (null command) body) + `(lambda ,args + ,interactive + ,@body) + command))) + (apply #'evil-set-command-properties func ',keys) + func)))) + +;; If no Evil properties are defined for the command, several parts of +;; Evil apply certain default rules; e.g., the repeat system decides +;; whether the command is repeatable by monitoring buffer changes. +(defun evil-has-command-property-p (command property) + "Whether COMMAND has Evil PROPERTY. +See also `evil-has-command-properties-p'." + (plist-member (evil-get-command-properties command) property)) + +(defun evil-has-command-properties-p (command) + "Whether Evil properties are defined for COMMAND. +See also `evil-has-command-property-p'." + (and (evil-get-command-properties command) t)) + +(defun evil-get-command-property (command property &optional default) + "Return the value of Evil PROPERTY of COMMAND. +If the command does not have the property, return DEFAULT. +See also `evil-get-command-properties'." + (if (evil-has-command-property-p command property) + (evil-get-property evil-command-properties command property) + default)) + +(defun evil-get-command-properties (command) + "Return all Evil properties of COMMAND. +See also `evil-get-command-property'." + (evil-get-property evil-command-properties command)) + +(defun evil-set-command-property (command property value) + "Set PROPERTY to VALUE for COMMAND. +To set multiple properties at once, see +`evil-set-command-properties' and `evil-add-command-properties'." + (evil-put-property 'evil-command-properties command property value)) +(defalias 'evil-put-command-property 'evil-set-command-property) + +(defun evil-add-command-properties (command &rest properties) + "Add PROPERTIES to COMMAND. +PROPERTIES should be a property list. +To replace all properties at once, use `evil-set-command-properties'." + (apply #'evil-put-property + 'evil-command-properties command properties)) + +(defun evil-set-command-properties (command &rest properties) + "Replace all of COMMAND's properties with PROPERTIES. +PROPERTIES should be a property list. +This erases all previous properties; to only add properties, +use `evil-set-command-property'." + (setq evil-command-properties + (assq-delete-all command evil-command-properties)) + (when properties + (apply #'evil-add-command-properties command properties))) + +(defun evil-remove-command-properties (command &rest properties) + "Remove PROPERTIES from COMMAND. +PROPERTIES should be a list of properties (:PROP1 :PROP2 ...). +If PROPERTIES is the empty list, all properties are removed." + (let (plist) + (when properties + (setq plist (evil-get-command-properties command)) + (dolist (property properties) + (setq plist (evil-plist-delete property plist)))) + (apply #'evil-set-command-properties command plist))) + +(defun evil-yank-handler (&optional motion) + "Return the yank handler for MOTION. +MOTION defaults to the current motion." + (setq motion (or motion evil-this-motion)) + (evil-get-command-property motion :yank-handler)) + +(defun evil-declare-motion (command) + "Declare COMMAND to be a movement function. +This ensures that it behaves correctly in visual state." + (evil-add-command-properties command :keep-visual t :repeat 'motion)) + +(defun evil-declare-repeat (command) + "Declare COMMAND to be repeatable." + (evil-add-command-properties command :repeat t)) + +(defun evil-declare-not-repeat (command) + "Declare COMMAND to be nonrepeatable." + (evil-add-command-properties command :repeat nil)) + +(defun evil-declare-ignore-repeat (command) + "Declare COMMAND to be nonrepeatable." + (evil-add-command-properties command :repeat 'ignore)) + +(defun evil-declare-change-repeat (command) + "Declare COMMAND to be repeatable by buffer changes rather than +keystrokes." + (evil-add-command-properties command :repeat 'change)) + +(defun evil-declare-insert-at-point-repeat (command) + "Declare COMMAND to be repeatable by buffer changes." + (evil-add-command-properties command :repeat 'insert-at-point)) + +(defun evil-declare-abort-repeat (command) + "Declare COMMAND to be nonrepeatable." + (evil-add-command-properties command :repeat 'abort)) + +(defun evil-delimited-arguments (string &optional num) + "Parse STRING as a sequence of delimited arguments. +Returns a list of NUM strings, or as many arguments as +the string contains. The first non-blank character is +taken to be the delimiter. If some arguments are missing +from STRING, the resulting list is padded with nil values. +Two delimiters following directly after each other gives +an empty string." + (save-match-data + (let ((string (or string "")) + (count (or num -1)) (idx 0) + argument delim match result) + (when (string-match "^[[:space:]]*\\([^[:space:]]\\)" string) + (setq delim (match-string 1 string) + argument (format "%s\\(\\(?:[\\].\\|[^%s]\\)*\\)" + (regexp-quote delim) + delim)) + (while (and (/= count 0) (string-match argument string idx)) + (setq match (match-string 1 string) + idx (match-end 1) + count (1- count)) + (when (= count 0) + (unless (save-match-data + (string-match + (format "%s[[:space:]]*$" delim) string idx)) + (setq match (substring string (match-beginning 1))))) + (unless (and (zerop (length match)) + (zerop (length (substring string idx)))) + (push match result)))) + (when (and num (< (length result) num)) + (dotimes (_ (- num (length result))) + (push nil result))) + (nreverse result)))) + +(defun evil-concat-charsets (&rest sets) + "Concatenate character sets. +A character set is the part between [ and ] in a regular expression. +If any character set is complemented, the result is also complemented." + (let ((bracket "") (complement "") (hyphen "") result) + (save-match-data + (dolist (set sets) + (when (string-match-p "^\\^" set) + (setq set (substring set 1) + complement "^")) + (when (string-match-p "^]" set) + (setq set (substring set 1) + bracket "]")) + (when (string-match-p "^-" set) + (setq set (substring set 1) + hyphen "-")) + (setq result (concat result set))) + (format "%s%s%s%s" complement bracket hyphen result)))) + +;;; Key sequences + +(defun evil-keypress-parser (&optional input) + "Read from keyboard or INPUT and build a command description. +Returns (CMD COUNT), where COUNT is the numeric prefix argument. +Both COUNT and CMD may be nil." + (let (count negative) + (when input (setq unread-command-events (append input unread-command-events))) + (catch 'done + (while t + (let ((seq (read-key-sequence ""))) + (when seq + (let ((cmd (key-binding seq))) + (cond + ((null cmd) (throw 'done (list nil nil))) + ((arrayp cmd) ; keyboard macro, recursive call + (let ((cmd (evil-keypress-parser cmd))) + (throw 'done + (list (car cmd) + (if (or count (cadr cmd)) + (list (car cmd) (* (or count 1) + (or (cadr cmd) 1)))))))) + ((or (eq cmd #'digit-argument) + (and (eq cmd 'evil-digit-argument-or-evil-beginning-of-line) + count)) + (let* ((event (aref seq (- (length seq) 1))) + (char (or (when (characterp event) event) + (when (symbolp event) + (get event 'ascii-character)))) + (digit (if (or (characterp char) (integerp char)) + (- (logand char ?\177) ?0)))) + (setq count (+ (* 10 (or count 0)) digit)))) + ((eq cmd #'negative-argument) + (setq negative (not negative))) + (t + (throw 'done (list cmd + (and count + (* count + (if negative -1 1)))))))))))))) + +(defun evil-read-key (&optional prompt) + "Read a key from the keyboard. +Translates it according to the input method." + (let ((old-global-map (current-global-map)) + (new-global-map (make-sparse-keymap)) + (overriding-terminal-local-map nil) + (overriding-local-map evil-read-key-map) + seq char cmd) + (unwind-protect + (condition-case nil + (progn + (define-key new-global-map [menu-bar] + (lookup-key global-map [menu-bar])) + (define-key new-global-map [tab-bar] + (lookup-key global-map [tab-bar])) + (define-key new-global-map [tool-bar] + (lookup-key global-map [tool-bar])) + (setq new-global-map + (append new-global-map + (list (make-char-table 'display-table + 'self-insert-command)))) + (use-global-map new-global-map) + (setq seq (read-key-sequence prompt nil t) + char (aref seq 0) + cmd (key-binding seq)) + (while (arrayp cmd) + (setq char (aref cmd 0) + cmd (key-binding cmd))) + (cond + ((eq cmd 'self-insert-command) + char) + (cmd + (call-interactively cmd)) + (t + (user-error "No replacement character typed")))) + (quit + (when (fboundp 'evil-repeat-abort) + (evil-repeat-abort)) + (signal 'quit nil))) + (use-global-map old-global-map)))) + +(defun evil-read-quoted-char () + "Command that calls `read-quoted-char'. +This command can be used wherever `read-quoted-char' is required +as a command. Its main use is in the `evil-read-key-map'." + (interactive) + (read-quoted-char)) + +(defun evil-read-digraph-char (&optional hide-chars) + "Read two keys from keyboard forming a digraph. +This function creates an overlay at (point), hiding the next +HIDE-CHARS characters. HIDE-CHARS defaults to 1." + (interactive) + (let (char1 char2 string overlay) + (unwind-protect + (progn + (setq overlay (make-overlay (point) + (min (point-max) + (+ (or hide-chars 1) + (point))))) + (overlay-put overlay 'invisible t) + ;; create overlay prompt + (setq string "?") + (put-text-property 0 1 'face 'minibuffer-prompt string) + ;; put cursor at (i.e., right before) the prompt + (put-text-property 0 1 'cursor t string) + (overlay-put overlay 'after-string string) + (setq char1 (read-key)) + (setq string (string char1)) + (put-text-property 0 1 'face 'minibuffer-prompt string) + (put-text-property 0 1 'cursor t string) + (overlay-put overlay 'after-string string) + (setq char2 (read-key))) + (delete-overlay overlay)) + (or (evil-digraph (list char1 char2)) + ;; use the last character if undefined + char2))) + +(defun evil-read-motion (&optional motion count type modifier) + "Read a MOTION, motion COUNT and motion TYPE from the keyboard. +The type may be overridden with MODIFIER, which may be a type +or a Visual selection as defined by `evil-define-visual-selection'. +Return a list (MOTION COUNT [TYPE])." + (let (command prefix) + (setq evil-this-type-modified nil) + (unless motion + (while (progn + (setq command (evil-keypress-parser) + motion (pop command) + prefix (pop command)) + (when prefix + (if count + (setq count (string-to-number + (concat (number-to-string count) + (number-to-string prefix)))) + (setq count prefix))) + ;; if the command is a type modifier, read more + (when (rassq motion evil-visual-alist) + (setq modifier + (or modifier + (car (rassq motion evil-visual-alist)))))))) + (when modifier + (setq type (or type (evil-type motion 'exclusive))) + (cond + ((eq modifier 'char) + ;; TODO: this behavior could be less hard-coded + (if (eq type 'exclusive) + (setq type 'inclusive) + (setq type 'exclusive))) + (t + (setq type modifier))) + (setq evil-this-type-modified type)) + (list motion count type))) + +(defun evil-mouse-events-p (keys) + "Returns non-nil iff KEYS contains a mouse event." + (catch 'done + (dotimes (i (length keys)) + (when (or (and (fboundp 'mouse-event-p) + (mouse-event-p (aref keys i))) + (mouse-movement-p (aref keys i))) + (throw 'done t))) + nil)) + +(defun evil-extract-count (keys) + "Splits the key-sequence KEYS into prefix-argument and the rest. +Returns the list (PREFIX CMD SEQ REST), where PREFIX is the +prefix count, CMD the command to be executed, SEQ the subsequence +calling CMD, and REST is all remaining events in the +key-sequence. PREFIX and REST may be nil if they do not exist. +If a command is bound to some keyboard macro, it is expanded +recursively." + (catch 'done + (let* ((len (length keys)) + (beg 0) + (end 1) + (found-prefix nil)) + (while (and (<= end len)) + (let ((cmd (key-binding (substring keys beg end)))) + (cond + ((memq cmd '(undefined nil)) + (user-error "No command bound to %s" (substring keys beg end))) + ((arrayp cmd) ; keyboard macro, replace command with macro + (setq keys (vconcat (substring keys 0 beg) + cmd + (substring keys end)) + end (1+ beg) + len (length keys))) + ((functionp cmd) + (if (or (memq cmd '(digit-argument negative-argument)) + (and found-prefix + (evil-get-command-property + cmd :digit-argument-redirection))) + ;; skip those commands + (setq found-prefix t ; found at least one prefix argument + beg end + end (1+ end)) + ;; a real command, finish + (throw 'done + (list (unless (zerop beg) + (string-to-number + (concat (substring keys 0 beg)))) + cmd + (substring keys beg end) + (when (< end len) + (substring keys end)))))) + (t ; append a further event + (setq end (1+ end)))))) + (user-error "Key sequence contains no complete binding")))) + +(defmacro evil-redirect-digit-argument (map keys target) + "Bind a wrapper function calling TARGET or `digit-argument'. +MAP is a keymap for binding KEYS to the wrapper for TARGET. +The wrapper only calls `digit-argument' if a prefix-argument +has already been started; otherwise TARGET is called." + (let* ((target (eval target)) + (wrapper (intern (format "evil-digit-argument-or-%s" + target)))) + `(progn + (define-key ,map ,keys ',wrapper) + (evil-define-command ,wrapper () + :digit-argument-redirection ,target + :keep-visual t + :repeat nil + (interactive) + (cond + (current-prefix-arg + (setq this-command #'digit-argument) + (call-interactively #'digit-argument)) + (t + (let ((target (or (command-remapping #',target) + #',target))) + (setq this-command target) + (call-interactively target)))))))) + +(defun evil-extract-append (file-or-append) + "Return an (APPEND . FILENAME) pair based on FILE-OR-APPEND. +FILE-OR-APPEND should either be a filename or a \">> FILE\" +directive. APPEND will be t if FILE-OR-APPEND is an append +directive and nil otherwise. FILENAME will be the extracted +filename." + (if (and (stringp file-or-append) + (string-match "\\(>> *\\)" file-or-append)) + (cons t (substring file-or-append(match-end 1))) + (cons nil file-or-append))) + +(defun evil-set-keymap-prompt (map prompt) + "Set the prompt-string of MAP to PROMPT." + (delq (keymap-prompt map) map) + (when prompt + (setcdr map (cons prompt (cdr map))))) + +(defun evil-lookup-key (map key) + "Returns non-nil value if KEY is bound in MAP." + (let ((definition (lookup-key map key))) + (if (numberp definition) ; in-band error + nil + definition))) + +;;; Display + +(defun evil-set-cursor (specs) + "Change the cursor's apperance according to SPECS. +SPECS may be a cursor type as per `cursor-type', a color +string as passed to `set-cursor-color', a zero-argument +function for changing the cursor, or a list of the above." + (unless (and (not (functionp specs)) + (listp specs) + (null (cdr-safe (last specs)))) + (setq specs (list specs))) + (dolist (spec specs) + (cond + ((functionp spec) + (condition-case nil + (funcall spec) + (error nil))) + ((stringp spec) + (evil-set-cursor-color spec)) + (t + (setq cursor-type spec))))) + +(defun evil-set-cursor-color (color) + "Set the cursor color to COLOR." + (unless (equal (frame-parameter nil 'cursor-color) color) + ;; `set-cursor-color' forces a redisplay, so only + ;; call it when the color actually changes + (set-cursor-color color))) + +(defun evil-refresh-cursor (&optional state buffer) + "Refresh the cursor for STATE in BUFFER. +BUFFER defaults to the current buffer. If STATE is nil the +cursor type is either `evil-force-cursor' or the current state." + (when (and (boundp 'evil-local-mode) evil-local-mode) + (let* ((state (or state evil-force-cursor evil-state 'normal)) + (default (or evil-default-cursor t)) + (cursor (evil-state-property state :cursor t)) + (color (or (and (stringp cursor) cursor) + (and (listp cursor) + (evil-member-if #'stringp cursor)) + (frame-parameter nil 'cursor-color)))) + (with-current-buffer (or buffer (current-buffer)) + ;; if both STATE and `evil-default-cursor' + ;; specify a color, don't set it twice + (when (and color (listp default)) + (setq default (evil-filter-list #'stringp default))) + (evil-set-cursor default) + (evil-set-cursor cursor))))) + +(defmacro evil-save-cursor (&rest body) + "Save the current cursor; execute BODY; restore the cursor." + (declare (indent defun) + (debug t)) + `(let ((cursor cursor-type) + (color (frame-parameter (selected-frame) 'cursor-color)) + (inhibit-quit t)) + (unwind-protect + (progn ,@body) + (evil-set-cursor cursor) + (evil-set-cursor color)))) + +(defun evil-echo (string &rest args) + "Display an unlogged message in the echo area. +That is, the message is not logged in the *Messages* buffer. +\(To log the message, just use `message'.)" + (unless evil-no-display + (let (message-log-max) + (apply #'message string args)))) + +(defun evil-echo-area-save () + "Save the current echo area in `evil-echo-area-message'." + (setq evil-echo-area-message (current-message))) + +(defun evil-echo-area-restore () + "Restore the echo area from `evil-echo-area-message'. +Does not restore if `evil-write-echo-area' is non-nil." + (unless evil-write-echo-area + (if evil-echo-area-message + (message "%s" evil-echo-area-message) + (message nil))) + (setq evil-echo-area-message nil + evil-write-echo-area nil)) + +;; toggleable version of `with-temp-message' +(defmacro evil-save-echo-area (&rest body) + "Save the echo area; execute BODY; restore the echo area. +Intermittent messages are not logged in the *Messages* buffer." + (declare (indent defun) + (debug t)) + `(let ((inhibit-quit t) + evil-echo-area-message + evil-write-echo-area) + (unwind-protect + (progn + (evil-echo-area-save) + ,@body) + (evil-echo-area-restore)))) + +(defmacro evil-without-display (&rest body) + "Execute BODY without Evil displays. +Inhibits echo area messages, mode line updates and cursor changes." + (declare (indent defun) + (debug t)) + `(let ((evil-no-display t)) + ,@body)) + +(defvar evil-cached-header-line-height nil + "Cached height of the header line. +Used for fallback implementation on older Emacsen.") + +(defun evil-header-line-height () + "Return the height of the header line. +If there is no header line, return 0. +Used as a fallback implementation of `window-header-line-height' on +older Emacsen." + (let ((posn (posn-at-x-y 0 0))) + (or (when (eq (posn-area posn) 'header-line) + (cdr (posn-object-width-height posn))) + 0))) + +(defun evil-posn-x-y (position) + "Return the x and y coordinates in POSITION. +This function returns y offset from the top of the buffer area including +the header line. + +On Emacs 24 and later versions, the y-offset returned by +`posn-at-point' is relative to the text area excluding the header +line, while y offset taken by `posn-at-x-y' is relative to the buffer +area including the header line. This asymmetry is by design according +to GNU Emacs team. This function fixes the asymmetry between them. + +Learned from mozc.el." + (let ((xy (posn-x-y position))) + (when header-line-format + (setcdr xy (+ (cdr xy) + (or (and (fboundp 'window-header-line-height) + (window-header-line-height)) + evil-cached-header-line-height + (setq evil-cached-header-line-height (evil-header-line-height)))))) + xy)) + +(defun evil-count-lines (beg end) + "Return absolute line-number-difference betweeen `beg` and `end`. +This should give the same results no matter where on the line `beg` +and `end` are." + (if (= beg end) + 0 + (let* ((last (max beg end)) + (end-at-bol (save-excursion (goto-char last) + (bolp)))) + (if end-at-bol + (count-lines beg end) + (1- (count-lines beg end)))))) + +;;; Movement + +(defun evil-normalize-position (pos) + "Return POS if it does not exceed the buffer boundaries. +If POS is less than `point-min', return `point-min'. +Is POS is more than `point-max', return `point-max'. +If POS is a marker, return its position." + (cond + ((not (number-or-marker-p pos)) + pos) + ((< pos (point-min)) + (point-min)) + ((> pos (point-max)) + (point-max)) + ((markerp pos) + (marker-position pos)) + (t + pos))) + +(defmacro evil-save-goal-column (&rest body) + "Restores the goal column after execution of BODY. +See also `evil-save-column'." + (declare (indent defun) + (debug t)) + `(let ((goal-column goal-column) + (temporary-goal-column temporary-goal-column)) + ,@body)) + +(defmacro evil-save-column (&rest body) + "Restores the column after execution of BODY. +See also `evil-save-goal-column'." + (declare (indent defun) + (debug t)) + `(let ((col (current-column))) + (evil-save-goal-column + ,@body + (move-to-column col)))) + +(defun evil-narrow (beg end) + "Restrict the buffer to BEG and END. +BEG or END may be nil, specifying a one-sided restriction including +`point-min' or `point-max'. See also `evil-with-restriction.'" + (setq beg (or (evil-normalize-position beg) (point-min))) + (setq end (or (evil-normalize-position end) (point-max))) + (narrow-to-region beg end)) + +(defmacro evil-with-restriction (beg end &rest body) + "Execute BODY with the buffer narrowed to BEG and END. +BEG or END may be nil as passed to `evil-narrow'; this creates +a one-sided restriction." + (declare (indent 2) + (debug t)) + `(save-restriction + (let ((evil-restriction-stack + (cons (cons (point-min) (point-max)) evil-restriction-stack))) + (evil-narrow ,beg ,end) + ,@body))) + +(defmacro evil-without-restriction (&rest body) + "Execute BODY with the top-most narrowing removed. +This works only if the previous narrowing has been generated by +`evil-with-restriction'." + (declare (indent defun) + (debug t)) + `(save-restriction + (widen) + (narrow-to-region (car (car evil-restriction-stack)) + (cdr (car evil-restriction-stack))) + (let ((evil-restriction-stack (cdr evil-restriction-stack))) + ,@body))) + +(defmacro evil-narrow-to-field (&rest body) + "Narrow to the current field." + (declare (indent defun) + (debug t)) + `(evil-with-restriction (field-beginning) (field-end) + ,@body)) + +(defun evil-move-beginning-of-line (&optional arg) + "Move to the beginning of the line as displayed. +Like `move-beginning-of-line', but retains the goal column." + (evil-save-goal-column + (move-beginning-of-line arg) + (beginning-of-line))) + +(defun evil-move-end-of-line (&optional arg) + "Move to the end of the line as displayed. +Like `move-end-of-line', but retains the goal column." + (evil-save-goal-column + (move-end-of-line arg) + (end-of-line))) + +(defun evil-adjust-cursor (&optional _) + "Move point one character back if at the end of a non-empty line. +This behavior is controled by `evil-move-beyond-eol'." + (when (and (eolp) + (not evil-move-beyond-eol) + (not (bolp)) + (= (point) + (save-excursion + (evil-move-end-of-line) + (point)))) + (evil-move-cursor-back t))) + +(defun evil-move-cursor-back (&optional force) + "Move point one character back within the current line. +Contingent on the variable `evil-move-cursor-back' or the FORCE +argument. Honors field boundaries, i.e., constrains the movement +to the current field as recognized by `line-beginning-position'." + (when (or evil-move-cursor-back force) + (unless (or (= (point) (line-beginning-position)) + (and (boundp 'visual-line-mode) + visual-line-mode + (= (point) (save-excursion + (beginning-of-visual-line) + (point))))) + (backward-char)))) + +(defun evil-line-position (line &optional column) + "Return the position of LINE. +If COLUMN is specified, return its position on the line. +A negative number means the end of the line." + (save-excursion + (when (fboundp 'evil-goto-line) + (evil-goto-line line)) + (if (numberp column) + (if (< column 0) + (beginning-of-line 2) + (move-to-column column)) + (beginning-of-line)) + (point))) + +(defun evil-column (&optional pos) + "Return the horizontal position of POS. +POS defaults to point." + (save-excursion + (when pos + (goto-char pos)) + (current-column))) + +(defun evil-move-to-column (column &optional dir force) + "Move point to column COLUMN in the current line. +Places point at left of the tab character (at the right if DIR +is non-nil) and returns point." + (interactive "p") + (move-to-column column force) + (unless force + (when (or (not dir) (and (numberp dir) (< dir 1))) + (when (> (current-column) column) + (evil-move-cursor-back)))) + (point)) + +(defmacro evil-loop (spec &rest body) + "Loop with countdown variable. +Evaluate BODY with VAR counting down from COUNT to 0. +COUNT can be negative, in which case VAR counts up instead. +The return value is the value of VAR when the loop +terminates, which is 0 if the loop completes successfully. +RESULT specifies a variable for storing this value. + +\(fn (VAR COUNT [RESULT]) BODY...)" + (declare (indent defun) + (debug dolist)) + (let* ((i (make-symbol "loopvar")) + (var (pop spec)) + (count (pop spec)) + (result (pop spec))) + (setq var (or (unless (eq var result) var) i) + result (or result var)) + `(let ((,var ,count)) + (setq ,result ,var) + (while (/= ,var 0) + ,@body + (if (> ,var 0) + (setq ,var (1- ,var)) + (setq ,var (1+ ,var))) + (setq ,result ,var)) + ,var))) + +;;; Motions + +(defmacro evil-motion-loop (spec &rest body) + "Loop a certain number of times. +Evaluate BODY repeatedly COUNT times with VAR bound to 1 or -1, +depending on the sign of COUNT. RESULT, if specified, holds +the number of unsuccessful iterations, which is 0 if the loop +completes successfully. This is also the return value. + +Each iteration must move point; if point does not change, +the loop immediately quits. See also `evil-loop'. + +\(fn (VAR COUNT [RESULT]) BODY...)" + (declare (indent defun) + (debug ((symbolp form &optional symbolp) body))) + (let* ((var (or (pop spec) (make-symbol "unitvar"))) + (countval (or (pop spec) 0)) + (result (pop spec)) + (i (make-symbol "loopvar")) + (count (make-symbol "countvar")) + (done (make-symbol "donevar")) + (orig (make-symbol "origvar"))) + `(let* ((,count ,countval) + (,var (if (< ,count 0) -1 1))) + (catch ',done + (evil-loop (,i ,count ,result) + (let ((,orig (point))) + ,@body + (when (= (point) ,orig) + (throw ',done ,i)))))))) + +(defmacro evil-signal-without-movement (&rest body) + "Catches errors provided point moves within this scope." + (declare (indent defun) + (debug t)) + `(let ((p (point))) + (condition-case err + (progn ,@body) + (error + (when (= p (point)) + (signal (car err) (cdr err))))))) + +(defun evil-signal-at-bob-or-eob (&optional count) + "Signals error if `point' is at boundaries. +If `point' is at bob and COUNT is negative this function signal +'beginning-of-buffer. If `point' is at eob and COUNT is positive +this function singal 'end-of-buffer. This function should be used +in motions. COUNT defaults to 1." + (setq count (or count 1)) + (cond + ((< count 0) (evil-signal-at-bob)) + ((> count 0) (evil-signal-at-eob)))) + +(defun evil-signal-at-bob () + "Signals 'beginning-of-buffer if `point' is at bob. +This function should be used in backward motions. If `point' is at +bob so that no further backward motion is possible the error +'beginning-of-buffer is raised." + (when (bobp) (signal 'beginning-of-buffer nil))) + +(defun evil-signal-at-eob () + "Signals 'end-of-buffer if `point' is at eob. +This function should be used in forward motions. If `point' is close +to eob so that no further forward motion is possible the error +'end-of-buffer is raised. This is the case if `point' is at +`point-max' or if is one position before `point-max', +`evil-move-beyond-eol' is nil and `point' is not at the end +of a line. The latter is necessary because `point' cannot be +moved to `point-max' if `evil-move-beyond-eol' is nil and +the last line in the buffer is not empty." + (when (or (eobp) + (and (not (eolp)) + (not evil-move-beyond-eol) + (save-excursion (forward-char) (eobp)))) + (signal 'end-of-buffer nil))) + +(defmacro evil-with-hproject-point-on-window (&rest body) + "Project point after BODY to current window. +If point is on a position left or right of the current window +then it is moved to the left and right boundary of the window, +respectively. If `auto-hscroll-mode' is non-nil then the left and +right positions are increased or decreased, respectively, by +`horizontal-margin' so that no automatic scrolling occurs." + (declare (indent defun) + (debug t)) + (let ((diff (make-symbol "diff")) + (left (make-symbol "left")) + (right (make-symbol "right"))) + `(let ((,diff (if auto-hscroll-mode (1+ hscroll-margin) 0)) + auto-hscroll-mode) + ,@body + (let* ((,left (+ (window-hscroll) ,diff)) + (,right (+ (window-hscroll) (window-width) (- ,diff) -1))) + (move-to-column (min (max (current-column) ,left) ,right)))))) + +(defun evil-goto-min (&rest positions) + "Go to the smallest position in POSITIONS. +Non-numerical elements are ignored. +See also `evil-goto-max'." + (when (setq positions (evil-filter-list + #'(lambda (elt) + (not (number-or-marker-p elt))) + positions)) + (goto-char (apply #'min positions)))) + +(defun evil-goto-max (&rest positions) + "Go to the largest position in POSITIONS. +Non-numerical elements are ignored. +See also `evil-goto-min'." + (when (setq positions (evil-filter-list + #'(lambda (elt) + (not (number-or-marker-p elt))) + positions)) + (goto-char (apply #'max positions)))) + +(defun evil-forward-not-thing (thing &optional count) + "Move point to the end or beginning of the complement of THING." + (evil-motion-loop (dir (or count 1)) + (let (bnd) + (cond + ((> dir 0) + (while (and (setq bnd (bounds-of-thing-at-point thing)) + (< (point) (cdr bnd))) + (goto-char (cdr bnd))) + ;; no thing at (point) + (if (zerop (forward-thing thing)) + ;; now at the end of the next thing + (let ((bnd (bounds-of-thing-at-point thing))) + (if (or (< (car bnd) (point)) ; end of a thing + (= (car bnd) (cdr bnd))) ; zero width thing + (goto-char (car bnd)) + ;; beginning of yet another thing, go back + (forward-thing thing -1))) + (goto-char (point-max)))) + (t + (while (and (not (bobp)) + (or (backward-char) t) + (setq bnd (bounds-of-thing-at-point thing)) + (< (point) (cdr bnd))) + (goto-char (car bnd))) + ;; either bob or no thing at point + (goto-char + (if (and (not (bobp)) + (zerop (forward-thing thing -1)) + (setq bnd (bounds-of-thing-at-point thing))) + (cdr bnd) + (point-min)))))))) + +(defun evil-bounds-of-not-thing-at-point (thing &optional which) + "Returns the bounds of a complement of THING at point. +If there is a THING at point nil is returned. Otherwise if WHICH +is nil or 0 a cons cell (BEG . END) is returned. If WHICH is +negative the beginning is returned. If WHICH is positive the END +is returned." + (let ((pnt (point))) + (let ((beg (save-excursion + (and (zerop (forward-thing thing -1)) + (forward-thing thing)) + (if (> (point) pnt) (point-min) (point)))) + (end (save-excursion + (and (zerop (forward-thing thing)) + (forward-thing thing -1)) + (if (< (point) pnt) (point-max) (point))))) + (when (and (<= beg (point)) (<= (point) end) (< beg end)) + (cond + ((or (not which) (zerop which)) (cons beg end)) + ((< which 0) beg) + ((> which 0) end)))))) + +(defun evil-forward-nearest (count &rest forwards) + "Moves point forward to the first of several motions. +FORWARDS is a list of forward motion functions (i.e. each moves +point forward to the next end of a text object (if passed a +1) +or backward to the preceeding beginning of a text object (if +passed a -1)). This function calls each of these functions once +and moves point to the nearest of the resulting positions. If +COUNT is positive point is moved forward COUNT times, if negative +point is moved backward -COUNT times." + (evil-motion-loop (dir (or count 1)) + (let ((pnt (point)) + (nxt (if (> dir 0) (point-max) (point-min)))) + (dolist (fwd forwards) + (goto-char pnt) + (condition-case nil + (evil-with-restriction + (and (< dir 0) + (save-excursion + (goto-char nxt) + (line-beginning-position 0))) + (and (> dir 0) + (save-excursion + (goto-char nxt) + (line-end-position 2))) + (if (and (zerop (funcall fwd dir)) + (/= (point) pnt) + (or (and (> dir 0) (< (point) nxt)) + (and (< dir 0) (> (point) nxt)))) + (setq nxt (point)))) + (error))) + (goto-char nxt)))) + +(defun bounds-of-evil-string-at-point (&optional state) + "Return the bounds of a string at point. +If STATE is given it used a parsing state at point." + (save-excursion + (let ((state (or state (syntax-ppss)))) + (and (nth 3 state) + (cons (nth 8 state) + (and (parse-partial-sexp (point) + (point-max) + nil + nil + state + 'syntax-table) + (point))))))) +(put 'evil-string 'bounds-of-thing-at-point #'bounds-of-evil-string-at-point) + +(defun bounds-of-evil-comment-at-point () + "Return the bounds of a string at point." + (save-excursion + (let ((state (syntax-ppss))) + (and (nth 4 state) + (cons (nth 8 state) + (and (parse-partial-sexp (point) + (point-max) + nil + nil + state + 'syntax-table) + (point))))))) +(put 'evil-comment 'bounds-of-thing-at-point #'bounds-of-evil-comment-at-point) + +;; The purpose of this function is the provide line motions which +;; preserve the column. This is how `previous-line' and `next-line' +;; work, but unfortunately the behaviour is hard-coded: if and only if +;; the last command was `previous-line' or `next-line', the column is +;; preserved. Furthermore, in contrast to Vim, when we cannot go +;; further, those motions move point to the beginning resp. the end of +;; the line (we never want point to leave its column). The code here +;; comes from simple.el, and I hope it will work in future. +(defun evil-line-move (count &optional noerror) + "A wrapper for line motions which conserves the column. +Signals an error at buffer boundaries unless NOERROR is non-nil." + (cond + (noerror + (condition-case nil + (evil-line-move count) + (error nil))) + (t + (evil-signal-without-movement + (setq this-command (if (>= count 0) + #'next-line + #'previous-line)) + (let ((opoint (point))) + (condition-case err + (with-no-warnings + (funcall this-command (abs count))) + ((beginning-of-buffer end-of-buffer) + (let ((col (or goal-column + (if (consp temporary-goal-column) + (car temporary-goal-column) + temporary-goal-column)))) + (if line-move-visual + (vertical-motion (cons col 0)) + (line-move-finish col opoint (< count 0))) + ;; Maybe we should just `ding'? + (signal (car err) (cdr err)))))))))) + +(defun evil-forward-syntax (syntax &optional count) + "Move point to the end or beginning of a sequence of characters in +SYNTAX. +Stop on reaching a character not in SYNTAX." + (let ((notsyntax (if (= (aref syntax 0) ?^) + (substring syntax 1) + (concat "^" syntax)))) + (evil-motion-loop (dir (or count 1)) + (cond + ((< dir 0) + (skip-syntax-backward notsyntax) + (skip-syntax-backward syntax)) + (t + (skip-syntax-forward notsyntax) + (skip-syntax-forward syntax)))))) + +(defun evil-forward-chars (chars &optional count) + "Move point to the end or beginning of a sequence of CHARS. +CHARS is a character set as inside [...] in a regular expression." + (let ((notchars (if (= (aref chars 0) ?^) + (substring chars 1) + (concat "^" chars)))) + (evil-motion-loop (dir (or count 1)) + (cond + ((< dir 0) + (skip-chars-backward notchars) + (skip-chars-backward chars)) + (t + (skip-chars-forward notchars) + (skip-chars-forward chars)))))) + +(defun evil-up-block (beg end &optional count) + "Move point to the end or beginning of text enclosed by BEG and END. +BEG and END should be regular expressions matching the opening +and closing delimiters, respectively. If COUNT is greater than +zero point is moved forward otherwise it is moved +backwards. Whenever an opening delimiter is found the COUNT is +increased by one, if a closing delimiter is found the COUNT is +decreased by one. The motion stops when COUNT reaches zero. The +match-data reflects the last successful match (that caused COUNT +to reach zero). The behaviour of this functions is similar to +`up-list'." + (let* ((count (or count 1)) + (forwardp (> count 0)) + (dir (if forwardp +1 -1))) + (catch 'done + (while (not (zerop count)) + (let* ((pnt (point)) + (cl (save-excursion + (and (re-search-forward (if forwardp end beg) nil t dir) + (or (/= pnt (point)) + (progn + ;; zero size match, repeat search from + ;; the next position + (forward-char dir) + (re-search-forward (if forwardp end beg) nil t dir))) + (point)))) + (match (match-data t)) + (op (save-excursion + (and (not (equal beg end)) + (re-search-forward (if forwardp beg end) cl t dir) + (or (/= pnt (point)) + (progn + ;; zero size match, repeat search from + ;; the next position + (forward-char dir) + (re-search-forward (if forwardp beg end) cl t dir))) + (point))))) + (cond + ((not cl) + (goto-char (if forwardp (point-max) (point-min))) + (set-match-data nil) + (throw 'done count)) + (t + (if op + (progn + (setq count (if forwardp (1+ count) (1- count))) + (goto-char op)) + (setq count (if forwardp (1- count) (1+ count))) + (if (zerop count) (set-match-data match)) + (goto-char cl)))))) + 0))) + +(defun evil-up-paren (open close &optional count) + "Move point to the end or beginning of balanced parentheses. +OPEN and CLOSE should be characters identifying the opening and +closing parenthesis, respectively. If COUNT is greater than zero +point is moved forward otherwise it is moved backwards. Whenever +an opening delimiter is found the COUNT is increased by one, if a +closing delimiter is found the COUNT is decreased by one. The +motion stops when COUNT reaches zero. The match-data reflects the +last successful match (that caused COUNT to reach zero)." + ;; Always use the default `forward-sexp-function'. This is important + ;; for modes that use a custom one like `python-mode'. + ;; (addresses #364) + (let (forward-sexp-function) + (with-syntax-table (copy-syntax-table (syntax-table)) + (modify-syntax-entry open (format "(%c" close)) + (modify-syntax-entry close (format ")%c" open)) + (let ((rest (evil-motion-loop (dir count) + (let ((pnt (point))) + (condition-case nil + (cond + ((> dir 0) + (while (progn + (up-list dir) + (/= (char-before) close)))) + (t + (while (progn + (up-list dir) + (/= (char-after) open))))) + (error (goto-char pnt))))))) + (cond + ((= rest count) (set-match-data nil)) + ((> count 0) (set-match-data (list (1- (point)) (point)))) + (t (set-match-data (list (point) (1+ (point)))))) + rest)))) + +(defun evil-up-xml-tag (&optional count) + "Move point to the end or beginning of balanced xml tags. +OPEN and CLOSE should be characters identifying the opening and +closing parenthesis, respectively. If COUNT is greater than zero +point is moved forward otherwise it is moved backwards. Whenever +an opening delimiter is found the COUNT is increased by one, if a +closing delimiter is found the COUNT is decreased by one. The +motion stops when COUNT reaches zero. The match-data reflects the +last successful match (that caused COUNT to reach zero)." + (let* ((dir (if (> (or count 1) 0) +1 -1)) + (count (abs (or count 1))) + (op (if (> dir 0) 1 2)) + (cl (if (> dir 0) 2 1)) + (orig (point)) + pnt tags match) + (catch 'done + (while (> count 0) + ;; find the previous opening tag + (while + (and (setq match + (re-search-forward + "<\\([^/ >\n]+\\)\\(?:[^\"/>]\\|\"[^\"]*\"\\)*?>\\|</\\([^>]+?\\)>" + nil t dir)) + (cond + ((match-beginning op) + (push (match-string op) tags)) + ((null tags) nil) ; free closing tag + ((and (< dir 0) + (string= (car tags) (match-string cl))) + ;; in backward direction we only accept matching + ;; tags. If the current tag is a free opener + ;; without matching closing tag, the subsequents + ;; test will make us ignore this tag + (pop tags)) + ((and (> dir 0)) + ;; non matching openers are considered free openers + (while (and tags + (not (string= (car tags) + (match-string cl)))) + (pop tags)) + (pop tags))))) + (unless (setq match (and match (match-data t))) + (setq match nil) + (throw 'done count)) + ;; found closing tag, look for corresponding opening tag + (cond + ((> dir 0) + (setq pnt (match-end 0)) + (goto-char (match-beginning 0))) + (t + (setq pnt (match-beginning 0)) + (goto-char (match-end 0)))) + (let* ((tag (match-string cl)) + (refwd (concat "<\\(/\\)?" + (regexp-quote tag) + "\\(?:>\\|[ \n]\\(?:[^\"/>]\\|\"[^\"]*\"\\)*?>\\)")) + (cnt 1)) + (while (and (> cnt 0) (re-search-backward refwd nil t dir)) + (setq cnt (+ cnt (if (match-beginning 1) dir (- dir))))) + (if (zerop cnt) (setq count (1- count) tags nil)) + (goto-char pnt))) + (if (> count 0) + (set-match-data nil) + (set-match-data match) + (goto-char (if (> dir 0) (match-end 0) (match-beginning 0))))) + ;; if not found, set to point-max/point-min + (unless (zerop count) + (set-match-data nil) + (goto-char (if (> dir 0) (point-max) (point-min))) + (if (/= (point) orig) (setq count (1- count)))) + (* dir count))) + +(defun evil-forward-quote (quote &optional count) + "Move point to the end or beginning of a string. +QUOTE is the character delimiting the string. If COUNT is greater +than zero point is moved forward otherwise it is moved +backwards." + (let (reset-parser) + (with-syntax-table (copy-syntax-table (syntax-table)) + (unless (= (char-syntax quote) ?\") + (modify-syntax-entry quote "\"") + (setq reset-parser t)) + ;; global parser state is out of state, use local one + (let* ((pnt (point)) + (state (save-excursion + (beginning-of-defun) + (parse-partial-sexp (point) pnt nil nil (syntax-ppss)))) + (bnd (bounds-of-evil-string-at-point state))) + (when (and bnd (< (point) (cdr bnd))) + ;; currently within a string + (if (> count 0) + (progn + (goto-char (cdr bnd)) + (setq count (1- count))) + (goto-char (car bnd)) + (setq count (1+ count)))) + ;; forward motions work with local parser state + (cond + ((> count 0) + ;; no need to reset global parser state because we only use + ;; the local one + (setq reset-parser nil) + (catch 'done + (while (and (> count 0) (not (eobp))) + (setq state (parse-partial-sexp (point) (point-max) + nil + nil + state + 'syntax-table)) + (cond + ((nth 3 state) + (setq bnd (bounds-of-thing-at-point 'evil-string)) + (goto-char (cdr bnd)) + (setq count (1- count))) + ((eobp) (goto-char pnt) (throw 'done nil)))))) + ((< count 0) + ;; need to update global cache because of backward motion + (setq reset-parser (and reset-parser (point))) + (save-excursion + (beginning-of-defun) + (syntax-ppss-flush-cache (point))) + (catch 'done + (while (and (< count 0) (not (bobp))) + (setq pnt (point)) + (while (and (not (bobp)) + (or (eobp) (/= (char-after) quote))) + (backward-char)) + (cond + ((setq bnd (bounds-of-thing-at-point 'evil-string)) + (goto-char (car bnd)) + (setq count (1+ count))) + ((bobp) (goto-char pnt) (throw 'done nil)) + (t (backward-char)))))) + (t (setq reset-parser nil))))) + (when reset-parser + ;; reset global cache + (save-excursion + (goto-char reset-parser) + (beginning-of-defun) + (syntax-ppss-flush-cache (point)))) + count)) + +;;; Thing-at-point motion functions for Evil text objects and motions +(defun forward-evil-empty-line (&optional count) + "Move forward COUNT empty lines." + (setq count (or count 1)) + (cond + ((> count 0) + (while (and (> count 0) (not (eobp))) + (when (and (bolp) (eolp)) + (setq count (1- count))) + (forward-line 1))) + (t + (while (and (< count 0) (not (bobp)) + (zerop (forward-line -1))) + (when (and (bolp) (eolp)) + (setq count (1+ count)))))) + count) + +(defun forward-evil-space (&optional count) + "Move forward COUNT whitespace sequences [[:space:]]+." + (evil-forward-chars "[:space:]" count)) + +(defun forward-evil-word (&optional count) + "Move forward COUNT words. +Moves point COUNT words forward or (- COUNT) words backward if +COUNT is negative. Point is placed after the end of the word (if +forward) or at the first character of the word (if backward). A +word is a sequence of word characters matching +\[[:word:]] (recognized by `forward-word'), a sequence of +non-whitespace non-word characters '[^[:word:]\\n\\r\\t\\f ]', or +an empty line matching ^$." + (evil-forward-nearest + count + #'(lambda (&optional cnt) + (let ((word-separating-categories evil-cjk-word-separating-categories) + (word-combining-categories evil-cjk-word-combining-categories) + (pnt (point))) + (forward-word cnt) + (if (= pnt (point)) cnt 0))) + #'(lambda (&optional cnt) + (evil-forward-chars "^[:word:]\n\r\t\f " cnt)) + #'forward-evil-empty-line)) + +(defun forward-evil-WORD (&optional count) + "Move forward COUNT \"WORDS\". +Moves point COUNT WORDS forward or (- COUNT) WORDS backward if +COUNT is negative. Point is placed after the end of the WORD (if +forward) or at the first character of the WORD (if backward). A +WORD is a sequence of non-whitespace characters +'[^\\n\\r\\t\\f ]', or an empty line matching ^$." + (evil-forward-nearest count + #'(lambda (&optional cnt) + (evil-forward-chars "^\n\r\t\f " cnt)) + #'forward-evil-empty-line)) + +(defun forward-evil-symbol (&optional count) + "Move forward COUNT symbols. +Moves point COUNT symbols forward or (- COUNT) symbols backward +if COUNT is negative. Point is placed after the end of the +symbol (if forward) or at the first character of the symbol (if +backward). A symbol is either determined by `forward-symbol', or +is a sequence of characters not in the word, symbol or whitespace +syntax classes." + (evil-forward-nearest + count + #'(lambda (&optional cnt) + (evil-forward-syntax "^w_->" cnt)) + #'(lambda (&optional cnt) + (let ((pnt (point))) + (forward-symbol cnt) + (if (= pnt (point)) cnt 0))) + #'forward-evil-empty-line)) + +(defun forward-evil-defun (&optional count) + "Move forward COUNT defuns. +Moves point COUNT defuns forward or (- COUNT) defuns backward +if COUNT is negative. A defun is defined by +`beginning-of-defun' and `end-of-defun' functions." + (evil-motion-loop (dir (or count 1)) + (if (> dir 0) (end-of-defun) (beginning-of-defun)))) + +(defun forward-evil-sentence (&optional count) + "Move forward COUNT sentences. +Moves point COUNT sentences forward or (- COUNT) sentences +backward if COUNT is negative. This function is the same as +`forward-sentence' but returns the number of sentences that could +NOT be moved over." + (evil-motion-loop (dir (or count 1)) + (condition-case nil + (forward-sentence dir) + (error)))) + +(defun forward-evil-paragraph (&optional count) + "Move forward COUNT paragraphs. +Moves point COUNT paragraphs forward or (- COUNT) paragraphs backward +if COUNT is negative. A paragraph is defined by +`start-of-paragraph-text' and `forward-paragraph' functions." + (evil-motion-loop (dir (or count 1)) + (cond + ((> dir 0) (forward-paragraph)) + ((not (bobp)) (start-of-paragraph-text) (beginning-of-line))))) + +(defvar evil-forward-quote-char ?\" + "The character to be used by `forward-evil-quote'.") + +(defun forward-evil-quote (&optional count) + "Move forward COUNT strings. +The quotation character is specified by the global variable +`evil-forward-quote-char'. This character is passed to +`evil-forward-quote'." + (evil-forward-quote evil-forward-quote-char count)) + +(defun forward-evil-quote-simple (&optional count) + "Move forward COUNT strings. +The quotation character is specified by the global variable +`evil-forward-quote-char'. This functions uses Vim's rules +parsing from the beginning of the current line for quotation +characters. It should only be used when looking for strings +within comments and buffer *must* be narrowed to the comment." + (let ((dir (if (> (or count 1) 0) 1 -1)) + (ch evil-forward-quote-char) + (pnt (point)) + (cnt 0)) + (beginning-of-line) + ;; count number of quotes before pnt + (while (< (point) pnt) + (when (= (char-after) ch) + (setq cnt (1+ cnt))) + (forward-char)) + (setq cnt (- (* 2 (abs count)) (mod cnt 2))) + (cond + ((> dir 0) + (while (and (not (eolp)) (not (zerop cnt))) + (when (= (char-after) ch) (setq cnt (1- cnt))) + (forward-char)) + (when (not (zerop cnt)) (goto-char (point-max)))) + (t + (while (and (not (bolp)) (not (zerop cnt))) + (when (= (char-before) ch) (setq cnt (1- cnt))) + (forward-char -1)) + (when (not (zerop cnt)) (goto-char (point-min))))) + (/ cnt 2))) + +;;; Motion functions +(defun evil-forward-beginning (thing &optional count) + "Move forward to beginning of THING. +The motion is repeated COUNT times." + (setq count (or count 1)) + (if (< count 0) + (forward-thing thing count) + (let ((bnd (bounds-of-thing-at-point thing)) + rest) + (when (and bnd (< (point) (cdr bnd))) + (goto-char (cdr bnd))) + (condition-case nil + (when (zerop (setq rest (forward-thing thing count))) + (when (and (bounds-of-thing-at-point thing) + (not (bobp)) + ;; handle final empty line + (not (and (bolp) (eobp)))) + (forward-char -1)) + (beginning-of-thing thing)) + (error)) + rest))) + +(defun evil-backward-beginning (thing &optional count) + "Move backward to beginning of THING. +The motion is repeated COUNT times. This is the same as calling +`evil-backward-beginning' with -COUNT." + (evil-forward-beginning thing (- (or count 1)))) + +(defun evil-forward-end (thing &optional count) + "Move forward to end of THING. +The motion is repeated COUNT times." + (setq count (or count 1)) + (cond + ((> count 0) + (unless (eobp) (forward-char)) + (prog1 (forward-thing thing count) + (unless (bobp) (forward-char -1)))) + (t + (let ((bnd (bounds-of-thing-at-point thing)) + rest) + (when (and bnd (< (point) (cdr bnd) )) + (goto-char (car bnd))) + (condition-case nil + (when (zerop (setq rest (forward-thing thing count))) + (end-of-thing thing) + (forward-char -1)) + (error)) + rest)))) + +(defun evil-backward-end (thing &optional count) + "Move backward to end of THING. +The motion is repeated COUNT times. This is the same as calling +`evil-backward-end' with -COUNT." + (evil-forward-end thing (- (or count 1)))) + +(defun evil-forward-word (&optional count) + "Move by words. +Moves point COUNT words forward or (- COUNT) words backward if +COUNT is negative. This function is the same as `forward-word' +but returns the number of words by which point could *not* be +moved." + (setq count (or count 1)) + (let* ((dir (if (>= count 0) +1 -1)) + (count (abs count))) + (while (and (> count 0) + (forward-word dir)) + (setq count (1- count))) + count)) + +(defun evil-in-comment-p (&optional pos) + "Checks if POS is within a comment according to current syntax. +If POS is nil, (point) is used. The return value is the beginning +position of the comment." + (setq pos (or pos (point))) + (let ((chkpos + (cond + ((eobp) pos) + ((= (char-syntax (char-after)) ?<) (1+ pos)) + ((and (not (zerop (logand (car (syntax-after (point))) + (lsh 1 16)))) + (not (zerop (logand (or (car (syntax-after (1+ (point)))) 0) + (lsh 1 17))))) + (+ pos 2)) + ((and (not (zerop (logand (car (syntax-after (point))) + (lsh 1 17)))) + (not (zerop (logand (or (car (syntax-after (1- (point)))) 0) + (lsh 1 16))))) + (1+ pos)) + (t pos)))) + (let ((syn (save-excursion (syntax-ppss chkpos)))) + (and (nth 4 syn) (nth 8 syn))))) + +(defun evil-looking-at-start-comment (&optional move) + "Returns t if point is at the start of a comment. +point must be on one of the opening characters of a block comment +according to the current syntax table. Futhermore these +characters must been parsed as opening characters, i.e. they +won't be considered as comment starters inside a string or +possibly another comment. Point is moved to the first character +of the comment opener if MOVE is non-nil." + (cond + ;; one character opener + ((= (char-syntax (char-after)) ?<) + (equal (point) (evil-in-comment-p (1+ (point))))) + ;; two character opener on first char + ((and (not (zerop (logand (car (syntax-after (point))) + (lsh 1 16)))) + (not (zerop (logand (or (car (syntax-after (1+ (point)))) 0) + (lsh 1 17))))) + (equal (point) (evil-in-comment-p (+ 2 (point))))) + ;; two character opener on second char + ((and (not (zerop (logand (car (syntax-after (point))) + (lsh 1 17)))) + (not (zerop (logand (or (car (syntax-after (1- (point)))) 0) + (lsh 1 16))))) + (and (equal (1- (point)) (evil-in-comment-p (1+ (point)))) + (prog1 t (when move (backward-char))))))) + +(defun evil-looking-at-end-comment (&optional move) + "Returns t if point is at the end of a comment. +point must be on one of the opening characters of a block comment +according to the current syntax table. Futhermore these +characters must been parsed as opening characters, i.e. they +won't be considered as comment starters inside a string or +possibly another comment. Point is moved right after the comment +closer if MOVE is non-nil." + (cond + ;; one char closer + ((= (char-syntax (char-after)) ?>) + (and (evil-in-comment-p) ; in comment + (not (evil-in-comment-p (1+ (point)))) + (prog1 t (when move (forward-char))))) + ;; two char closer on first char + ((and (not (zerop (logand (car (syntax-after (point))) + (lsh 1 18)))) + (not (zerop (logand (or (car (syntax-after (1+ (point)))) 0) + (lsh 1 19))))) + (and (evil-in-comment-p) + (not (evil-in-comment-p (+ (point) 2))) + (prog1 t (when move (forward-char 2))))) + ;; two char closer on second char + ((and (not (zerop (logand (car (syntax-after (point))) + (lsh 1 19)))) + (not (zerop (logand (or (car (syntax-after (1- (point)))) 0) + (lsh 1 18))))) + (and (evil-in-comment-p) + (not (evil-in-comment-p (1+ (point)))) + (prog1 t (when move (forward-char))))))) + +(defun evil-insert-newline-above () + "Inserts a new line above point and places point in that line +with regard to indentation." + (evil-narrow-to-field + (evil-move-beginning-of-line) + (insert (if use-hard-newlines hard-newline "\n")) + (forward-line -1) + (back-to-indentation))) + +(defun evil-insert-newline-below () + "Inserts a new line below point and places point in that line +with regard to indentation." + (evil-narrow-to-field + (evil-move-end-of-line) + (insert (if use-hard-newlines hard-newline "\n")) + (back-to-indentation))) + +;;; Markers + +(defun evil-global-marker-p (char) + "Whether CHAR denotes a global marker." + (or (and (>= char ?A) (<= char ?Z)) + (assq char (default-value 'evil-markers-alist)))) + +(defun evil-set-marker (char &optional pos advance) + "Set the marker denoted by CHAR to position POS. +POS defaults to the current position of point. +If ADVANCE is t, the marker advances when inserting text at it; +otherwise, it stays behind." + (interactive (list (read-char))) + (catch 'done + (let ((marker (evil-get-marker char t)) alist) + (unless (markerp marker) + (cond + ((and marker (symbolp marker) (boundp marker)) + (set marker (or (symbol-value marker) (make-marker))) + (setq marker (symbol-value marker))) + ((eq marker 'evil-jump-backward-swap) + (evil-set-jump) + (throw 'done nil)) + ((functionp marker) + (user-error "Cannot set special marker `%c'" char)) + ((evil-global-marker-p char) + (setq alist (default-value 'evil-markers-alist) + marker (make-marker)) + (evil--add-to-alist 'alist char marker) + (setq-default evil-markers-alist alist)) + (t + (setq marker (make-marker)) + (evil--add-to-alist 'evil-markers-alist char marker)))) + (add-hook 'kill-buffer-hook #'evil-swap-out-markers nil t) + (set-marker-insertion-type marker advance) + (set-marker marker (or pos (point)))))) + +(defun evil-get-marker (char &optional raw) + "Return the marker denoted by CHAR. +This is either a marker object as returned by `make-marker', +a number, a cons cell (FILE . POS) with FILE being a string +and POS a number, or nil. If RAW is non-nil, then the +return value may also be a variable, a movement function, +or a marker object pointing nowhere." + (let ((marker (if (evil-global-marker-p char) + (cdr-safe (assq char (default-value + 'evil-markers-alist))) + (cdr-safe (assq char evil-markers-alist))))) + (save-excursion + (if raw + marker + (when (and (symbolp marker) (boundp marker)) + (setq marker (symbol-value marker))) + (when (functionp marker) + (save-window-excursion + (funcall marker) + (setq marker (move-marker (make-marker) (point))))) + (when (markerp marker) + (if (eq (marker-buffer marker) (current-buffer)) + (setq marker (marker-position marker)) + (setq marker (and (marker-buffer marker) marker)))) + (when (or (numberp marker) + (markerp marker) + (and (consp marker) + (stringp (car marker)) + (numberp (cdr marker)))) + marker))))) + +(defun evil-swap-out-markers () + "Turn markers into file references when the buffer is killed." + (and buffer-file-name + (dolist (entry evil-markers-alist) + (and (markerp (cdr entry)) + (eq (marker-buffer (cdr entry)) (current-buffer)) + (setcdr entry (cons buffer-file-name + (marker-position (cdr entry)))))))) +(put 'evil-swap-out-markers 'permanent-local-hook t) + +(defun evil--eval-expr (input) + "Eval INPUT and return stringified result, if of a suitable type. +If INPUT starts with a number, +, -, or . use `calc-eval' instead." + (let* ((first-char (car (remove ?\s (string-to-list input)))) + (calcable-p (and first-char (or (<= ?0 first-char ?9) + (memq first-char '(?- ?+ ?.))))) + (result (if calcable-p + (let ((calc-multiplication-has-precedence nil)) + (calc-eval input)) + (eval (car (read-from-string input)))))) + (cond + (calcable-p result) + ((or (stringp result) + (numberp result) + (symbolp result)) + (format "%s" result)) + ((sequencep result) + (mapconcat (lambda (x) (format "%s" x)) result "\n")) + (t (user-error "Using %s as a string" (type-of result)))))) + +(defun evil-get-register (register &optional noerror) + "Return contents of REGISTER. +Signal an error if empty, unless NOERROR is non-nil. + +The following special registers are supported. + \" the unnamed register + * the clipboard contents + + the clipboard contents + <C-w> the word at point (ex mode only) + <C-a> the WORD at point (ex mode only) + <C-o> the symbol at point (ex mode only) + <C-f> the current file at point (ex mode only) + % the current file name (read only) + # the alternate file name (read only) + / the last search pattern (read only) + : the last command line (read only) + . the last inserted text (read only) + - the last small (less than a line) delete + _ the black hole register + = the expression register (read only)" + (condition-case err + (when (characterp register) + (or (cond + ((eq register ?\") + (current-kill 0)) + ((<= ?1 register ?9) + (let ((reg (- register ?1))) + (and (< reg (length kill-ring)) + (current-kill reg t)))) + ((memq register '(?* ?+)) + ;; the following code is modified from + ;; `x-selection-value-internal' + (let ((what (if (eq register ?*) 'PRIMARY 'CLIPBOARD)) + (request-type (or (and (boundp 'x-select-request-type) + x-select-request-type) + '(UTF8_STRING COMPOUND_TEXT STRING))) + text) + (unless (consp request-type) + (setq request-type (list request-type))) + (while (and request-type (not text)) + (condition-case nil + (setq text (evil-get-selection what (pop request-type))) + (error nil))) + (when text + (remove-text-properties 0 (length text) '(foreign-selection nil) text)) + text)) + ((eq register ?\C-W) + (unless (evil-ex-p) + (user-error "Register <C-w> only available in ex state")) + (with-current-buffer evil-ex-current-buffer + (thing-at-point 'evil-word))) + ((eq register ?\C-A) + (unless (evil-ex-p) + (user-error "Register <C-a> only available in ex state")) + (with-current-buffer evil-ex-current-buffer + (thing-at-point 'evil-WORD))) + ((eq register ?\C-O) + (unless (evil-ex-p) + (user-error "Register <C-o> only available in ex state")) + (with-current-buffer evil-ex-current-buffer + (thing-at-point 'evil-symbol))) + ((eq register ?\C-F) + (unless (evil-ex-p) + (user-error "Register <C-f> only available in ex state")) + (with-current-buffer evil-ex-current-buffer + (thing-at-point 'filename))) + ((eq register ?%) + (or (buffer-file-name (and (evil-ex-p) + (minibufferp) + evil-ex-current-buffer)) + (user-error "No file name"))) + ((= register ?#) + (or (with-current-buffer (other-buffer) (buffer-file-name)) + (user-error "No file name"))) + ((eq register ?/) + (or (car-safe + (or (and (boundp 'evil-search-module) + (eq evil-search-module 'evil-search) + evil-ex-search-history) + (and isearch-regexp regexp-search-ring) + search-ring)) + (user-error "No previous regular expression"))) + ((eq register ?:) + (or (car-safe evil-ex-history) + (user-error "No previous command line"))) + ((eq register ?.) + evil-last-insertion) + ((eq register ?-) + evil-last-small-deletion) + ((eq register ?=) + (let ((enable-recursive-minibuffers t)) + (setq evil-last-=-register-input + (minibuffer-with-setup-hook + (lambda () (when evil-last-=-register-input + (add-hook 'pre-command-hook #'evil-ex-remove-default))) + (read-from-minibuffer + "=" + (and evil-last-=-register-input + (propertize evil-last-=-register-input 'face 'shadow)) + evil-eval-map + nil + 'evil-eval-history + evil-last-=-register-input + t))) + (evil--eval-expr evil-last-=-register-input))) + ((eq register ?_) ; the black hole register + "") + (t + (setq register (downcase register)) + (get-register register))) + (user-error "Register `%c' is empty" register))) + (error (unless noerror (signal (car err) (cdr err)))))) + +(defun evil-append-register (register text) + "Append TEXT to the contents of register REGISTER." + (let ((content (get-register register))) + (cond + ((not content) + (set-register register text)) + ((or (text-property-not-all 0 (length content) + 'yank-handler nil + content) + (text-property-not-all 0 (length text) + 'yank-handler nil + text)) + ;; some non-trivial yank-handler -> always switch to line handler + ;; ensure complete lines + (when (and (> (length content) 0) + (/= (aref content (1- (length content))) ?\n)) + (setq content (concat content "\n"))) + (when (and (> (length text) 0) + (/= (aref text (1- (length text))) ?\n)) + (setq text (concat text "\n"))) + (setq text (concat content text)) + (remove-list-of-text-properties 0 (length text) '(yank-handler) text) + (setq text (propertize text 'yank-handler '(evil-yank-line-handler))) + (set-register register text)) + (t + (set-register register (concat content text)))))) + +(defun evil-set-register (register text) + "Set the contents of register REGISTER to TEXT. +If REGISTER is an upcase character then text is appended to that +register instead of replacing its content." + (cond + ((not (characterp register)) + (user-error "Invalid register")) + ;; don't allow modification of read-only registers + ((member register '(?: ?. ?%)) + (user-error "Can't modify read-only register")) + ((eq register ?\") + (kill-new text)) + ((and (<= ?1 register) (<= register ?9)) + (if (null kill-ring) + (kill-new text) + (let ((kill-ring-yank-pointer kill-ring-yank-pointer) + interprogram-paste-function + interprogram-cut-function) + (current-kill (- register ?1)) + (setcar kill-ring-yank-pointer text)))) + ((eq register ?*) + (evil-set-selection 'PRIMARY text)) + ((eq register ?+) + (evil-set-selection 'CLIPBOARD text)) + ((eq register ?-) + (setq evil-last-small-deletion text)) + ((eq register ?_) ; the black hole register + nil) + ((and (<= ?A register) (<= register ?Z)) + (evil-append-register (downcase register) text)) + (t + (set-register register text)))) + +(defun evil-register-list () + "Returns an alist of all registers, but only those named +with number or character. Registers with symbol or string in names are ignored +to keep Vim compatibility with register jumps." + (sort (append (mapcar #'(lambda (reg) + (cons reg (evil-get-register reg t))) + '(?\" ?* ?+ ?% ?# ?/ ?: ?. ?- + ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9)) + (list (cons ?= evil-last-=-register-input)) + (cl-remove-if-not (lambda (reg) (number-or-marker-p (car reg))) register-alist) + nil) + #'(lambda (reg1 reg2) (< (car reg1) (car reg2))))) + +(defsubst evil-kbd-macro-suppress-motion-error () + "Returns non-nil if a motion error should be suppressed. +Whether the motion error should be suppressed depends on the +variable `evil-kbd-macro-suppress-motion-error'." + (or (and defining-kbd-macro + (memq evil-kbd-macro-suppress-motion-error '(t record))) + (and executing-kbd-macro + (memq evil-kbd-macro-suppress-motion-error '(t replay))))) + +;;; Region + +;; `set-mark' does too much at once +(defun evil-move-mark (pos) + "Set buffer's mark to POS. +If POS is nil, delete the mark." + (when pos + (setq pos (evil-normalize-position pos))) + (set-marker (mark-marker) pos)) + +(defun evil-save-transient-mark-mode () + "Save Transient Mark mode and make it buffer-local. +Any changes to Transient Mark mode are now local to the current +buffer, until `evil-restore-transient-mark-mode' is called. + +Variables pertaining to Transient Mark mode are listed in +`evil-transient-vars', and their values are stored in +`evil-transient-vals'." + (dolist (var evil-transient-vars) + (when (and (boundp var) + (not (assq var evil-transient-vals))) + (push (list var (symbol-value var) + (local-variable-p var)) + evil-transient-vals) + (make-variable-buffer-local var) + (put var 'permanent-local t)))) + +(defun evil-restore-transient-mark-mode () + "Restore Transient Mark mode. +This presupposes that `evil-save-transient-mark-mode' has been +called earlier. If Transient Mark mode was disabled before but +enabled in the meantime, this function disables it; if it was +enabled before but disabled in the meantime, this function +enables it. + +The earlier settings of Transient Mark mode are stored in +`evil-transient-vals'." + (let (entry local var val) + (while (setq entry (pop evil-transient-vals)) + (setq var (pop entry) + val (pop entry) + local (pop entry)) + (unless local + (kill-local-variable var)) + (unless (equal (symbol-value var) val) + (if (fboundp var) + (funcall var (if val 1 -1)) + (setq var val)))))) + +(defun evil-save-mark () + "Save the current mark, including whether it is transient. +See also `evil-restore-mark'." + (unless evil-visual-previous-mark + (setq evil-visual-previous-mark (mark t)) + (evil-save-transient-mark-mode))) + +(defun evil-restore-mark () + "Restore the mark, including whether it was transient. +See also `evil-save-mark'." + (when evil-visual-previous-mark + (evil-restore-transient-mark-mode) + (evil-move-mark evil-visual-previous-mark) + (setq evil-visual-previous-mark nil))) + +;; In theory, an active region implies Transient Mark mode, and +;; disabling Transient Mark mode implies deactivating the region. +;; In practice, Emacs never clears `mark-active' except in Transient +;; Mark mode, so we define our own toggle functions to make things +;; more predictable. +(defun evil-transient-mark (&optional arg) + "Toggle Transient Mark mode. +Ensure that the region is properly deactivated. +Enable with positive ARG, disable with negative ARG." + (unless (numberp arg) + (setq arg (if transient-mark-mode -1 1))) + (cond + ((< arg 1) + (evil-active-region -1) + ;; Transient Mark mode cannot be disabled + ;; while CUA mode is enabled + (when (fboundp 'cua-mode) + (cua-mode -1)) + (when transient-mark-mode + (transient-mark-mode -1))) + (t + (unless transient-mark-mode + (evil-active-region -1) + (transient-mark-mode 1))))) + +(defun evil-active-region (&optional arg) + "Toggle active region. +Ensure that Transient Mark mode is properly enabled. +Enable with positive ARG, disable with negative ARG." + (unless (numberp arg) + (setq arg (if (region-active-p) -1 1))) + (cond + ((and (< arg 1)) + (when (or transient-mark-mode mark-active) + (setq mark-active nil + deactivate-mark nil) + (when (boundp 'cua--explicit-region-start) + (setq cua--explicit-region-start nil)) + (run-hooks 'deactivate-mark-hook))) + (t + (evil-transient-mark 1) + (when deactivate-mark + (setq deactivate-mark nil)) + (unless (mark t) + (evil-move-mark (point))) + (unless (region-active-p) + (set-mark (mark t))) + (when (boundp 'cua--explicit-region-start) + (setq cua--explicit-region-start t))))) + +(defmacro evil-with-transient-mark-mode (&rest body) + "Execute BODY with Transient Mark mode. +Then restore Transient Mark mode to its previous setting." + (declare (indent defun) + (debug t)) + `(let ((inhibit-quit t) + evil-transient-vals) + (unwind-protect + (progn + (evil-save-transient-mark-mode) + (evil-transient-mark 1) + ,@body) + (evil-restore-transient-mark-mode)))) + +(defmacro evil-with-active-region (beg end &rest body) + "Execute BODY with an active region from BEG to END." + (declare (indent 2) + (debug t)) + `(let ((beg ,beg) (end ,end) + evil-transient-vals) + (evil-with-transient-mark-mode + (save-excursion + (evil-active-region 1) + (evil-move-mark beg) + (goto-char end) + ,@body)))) + +(defun evil-exchange-point-and-mark () + "Exchange point and mark without activating the region." + (let* ((point (point)) + (mark (or (mark t) point))) + (set-marker (mark-marker) point) + (goto-char mark))) + +(defun evil-apply-on-block (func beg end pass-columns &rest args) + "Call FUNC for each line of a block selection. +The selection is specified by the region BEG and END. FUNC must +take at least two arguments, the beginning and end of each +line. If PASS-COLUMNS is non-nil, these values are the columns, +otherwise tey are buffer positions. Extra arguments to FUNC may +be passed via ARGS." + (let ((eol-col (and (memq last-command '(next-line previous-line)) + (numberp temporary-goal-column) + temporary-goal-column)) + startcol startpt endcol endpt) + (save-excursion + (goto-char beg) + (setq startcol (current-column)) + (beginning-of-line) + (setq startpt (point)) + (goto-char end) + (setq endcol (current-column)) + (forward-line 1) + (setq endpt (point-marker)) + ;; ensure the start column is the left one. + (evil-sort startcol endcol) + ;; maybe find maximal column + (when eol-col + (setq eol-col 0) + (goto-char startpt) + (while (< (point) endpt) + (setq eol-col (max eol-col + (evil-column (line-end-position)))) + (forward-line 1)) + (setq endcol (max endcol + (min eol-col + (1+ (min (1- most-positive-fixnum) + (truncate temporary-goal-column))))))) + ;; start looping over lines + (goto-char startpt) + (while (< (point) endpt) + (if pass-columns + (apply func startcol endcol args) + (apply func + (save-excursion (evil-move-to-column startcol)) + (save-excursion (evil-move-to-column endcol t)) + args)) + (forward-line 1))))) + +(defun evil-apply-on-rectangle (function start end &rest args) + "Like `apply-on-rectangle' but maybe extends to eol. +If `temporary-goal-column' is set to a big number, then the +region of each line is extended to the end of each line. The end +column is set to the maximal column in all covered lines." + (apply #'evil-apply-on-block function start end t args)) + +;;; Insertion + +(defun evil-concat-ranges (ranges) + "Concatenate RANGES. +RANGES must be a list of ranges. They must be ordered so that +successive ranges share their boundaries. The return value is a +single range of disjoint union of the ranges or nil if the +disjoint union is not a single range." + (let ((range (car-safe ranges)) (ranges (cdr ranges)) r) + (while (and range (setq r (car-safe ranges))) + (setq range + (cond ((and (= (cdr r) (car range))) (cons (car r) (cdr range))) + ((and (= (cdr range) (car r))) (cons (car range) (cdr r))))) + (setq ranges (cdr ranges))) + range)) + +(defun evil-track-last-insertion (beg end len) + "Track the last insertion range and its text. +The insertion range is stored as a pair of buffer positions in +`evil-current-insertion'. If a subsequent change is compatible, +then the current range is modified, otherwise it is replaced by a +new range. Compatible changes are changes that do not create a +disjoin range." + ;; deletion + (when (> len 0) + (if (and evil-current-insertion + (>= beg (car evil-current-insertion)) + (<= (+ beg len) (cdr evil-current-insertion))) + (setcdr evil-current-insertion + (- (cdr evil-current-insertion) len)) + (setq evil-current-insertion nil))) + ;; insertion + (if (and evil-current-insertion + (>= beg (car evil-current-insertion)) + (<= beg (cdr evil-current-insertion))) + (setcdr evil-current-insertion + (+ (- end beg) + (cdr evil-current-insertion))) + (setq evil-current-insertion (cons beg end)))) +(put 'evil-track-last-insertion 'permanent-local-hook t) + +(defun evil-start-track-last-insertion () + "Start tracking the last insertion." + (setq evil-current-insertion nil) + (add-hook 'after-change-functions #'evil-track-last-insertion nil t)) + +(defun evil-stop-track-last-insertion () + "Stop tracking the last insertion. +The tracked insertion is set to `evil-last-insertion'." + (setq evil-last-insertion + (and evil-current-insertion + ;; Check whether the insertion range is a valid buffer + ;; range. If a buffer modification is done from within + ;; another change hook or modification-hook (yasnippet + ;; does this using overlay modification-hooks), then the + ;; insertion information may be invalid. There is no way + ;; to detect this situation, but at least we should + ;; ensure that no error occurs (see bug #272). + (>= (car evil-current-insertion) (point-min)) + (<= (cdr evil-current-insertion) (point-max)) + (buffer-substring-no-properties (car evil-current-insertion) + (cdr evil-current-insertion)))) + (remove-hook 'after-change-functions #'evil-track-last-insertion t)) + +;;; Paste + +(defun evil-yank-characters (beg end &optional register yank-handler) + "Saves the characters defined by the region BEG and END in the kill-ring." + (let ((text (filter-buffer-substring beg end))) + (when yank-handler + (setq text (propertize text 'yank-handler (list yank-handler)))) + (when register + (evil-set-register register text)) + (when evil-was-yanked-without-register + (evil-set-register ?0 text)) ; "0 register contains last yanked text + (unless (eq register ?_) + (kill-new text)))) + +(defun evil-yank-lines (beg end &optional register yank-handler) + "Saves the lines in the region BEG and END into the kill-ring." + (let* ((text (filter-buffer-substring beg end)) + (yank-handler (list (or yank-handler + #'evil-yank-line-handler) + nil + t))) + ;; Ensure the text ends with a newline. This is required + ;; if the deleted lines were the last lines in the buffer. + (when (or (zerop (length text)) + (/= (aref text (1- (length text))) ?\n)) + (setq text (concat text "\n"))) + (setq text (propertize text 'yank-handler yank-handler)) + (when register + (evil-set-register register text)) + (when evil-was-yanked-without-register + (evil-set-register ?0 text)) ; "0 register contains last yanked text + (unless (eq register ?_) + (kill-new text)))) + +(defun evil-yank-rectangle (beg end &optional register yank-handler) + "Saves the rectangle defined by region BEG and END into the kill-ring." + (let ((lines (list nil))) + (evil-apply-on-rectangle #'extract-rectangle-line beg end lines) + ;; We remove spaces from the beginning and the end of the next. + ;; Spaces are inserted explicitly in the yank-handler in order to + ;; NOT insert lines full of spaces. + (setq lines (nreverse (cdr lines))) + ;; `text' is used as default insert text when pasting this rectangle + ;; in another program, e.g., using the X clipboard. + (let* ((yank-handler (list (or yank-handler + #'evil-yank-block-handler) + lines + t + 'evil-delete-yanked-rectangle)) + (text (propertize (mapconcat #'identity lines "\n") + 'yank-handler yank-handler))) + (when register + (evil-set-register register text)) + (when evil-was-yanked-without-register + (evil-set-register ?0 text)) ; "0 register contains last yanked text + (unless (eq register ?_) + (kill-new text))))) + +(defun evil-remove-yank-excluded-properties (text) + "Removes `yank-excluded-properties' from TEXT." + (if (eq yank-excluded-properties t) + (set-text-properties 0 (length text) nil text) + (remove-list-of-text-properties 0 (length text) + yank-excluded-properties text))) + +(defun evil-yank-line-handler (text) + "Inserts the current text linewise." + (let ((text (apply #'concat (make-list (or evil-paste-count 1) text))) + (opoint (point))) + (evil-remove-yank-excluded-properties text) + (cond + ((eq this-command 'evil-paste-before) + (evil-move-beginning-of-line) + (evil-move-mark (point)) + (insert text) + (setq evil-last-paste + (list 'evil-paste-before + evil-paste-count + opoint + (mark t) + (point))) + (evil-set-marker ?\[ (mark)) + (evil-set-marker ?\] (1- (point))) + (evil-exchange-point-and-mark) + (back-to-indentation)) + ((eq this-command 'evil-paste-after) + (evil-move-end-of-line) + (evil-move-mark (point)) + (insert "\n") + (insert text) + (evil-set-marker ?\[ (1+ (mark))) + (evil-set-marker ?\] (1- (point))) + (delete-char -1) ; delete the last newline + (setq evil-last-paste + (list 'evil-paste-after + evil-paste-count + opoint + (mark t) + (point))) + (evil-move-mark (1+ (mark t))) + (evil-exchange-point-and-mark) + (back-to-indentation)) + (t + (insert text))))) + +(defun evil-yank-block-handler (lines) + "Inserts the current text as block." + (let ((count (or evil-paste-count 1)) + (col (if (eq this-command 'evil-paste-after) + (1+ (current-column)) + (current-column))) + (current-line (line-number-at-pos (point))) + (opoint (point)) + epoint) + (dolist (line lines) + ;; concat multiple copies according to count + (setq line (apply #'concat (make-list count line))) + ;; strip whitespaces at beginning and end + (string-match "^ *\\(.*?\\) *$" line) + (let ((text (match-string 1 line)) + (begextra (match-beginning 1)) + (endextra (- (match-end 0) (match-end 1)))) + ;; maybe we have to insert a new line at eob + (while (< (line-number-at-pos (point)) + current-line) + (goto-char (point-max)) + (insert "\n")) + (setq current-line (1+ current-line)) + ;; insert text unless we insert an empty line behind eol + (unless (and (< (evil-column (line-end-position)) col) + (zerop (length text))) + ;; if we paste behind eol, it may be sufficient to insert tabs + (if (< (evil-column (line-end-position)) col) + (move-to-column (+ col begextra) t) + (move-to-column col t) + (insert (make-string begextra ?\s))) + (evil-remove-yank-excluded-properties text) + (insert text) + (unless (eolp) + ;; text follows, so we have to insert spaces + (insert (make-string endextra ?\s))) + (setq epoint (point))) + (forward-line 1))) + (setq evil-last-paste + (list this-command + evil-paste-count + opoint + (length lines) ; number of rows + (* count (length (car lines))))) ; number of colums + (evil-set-marker ?\[ opoint) + (evil-set-marker ?\] (1- epoint)) + (goto-char opoint) + (when (and (eq this-command 'evil-paste-after) + (not (eolp))) + (forward-char)))) + +(defun evil-delete-yanked-rectangle (nrows ncols) + "Special function to delete the block yanked by a previous paste command. +Supplied as the `undo' element of a yank handler." + (let ((opoint (point)) + (col (if (eq last-command 'evil-paste-after) + (1+ (current-column)) + (current-column)))) + (dotimes (_ nrows) + (delete-region (save-excursion + (move-to-column col) + (point)) + (save-excursion + (move-to-column (+ col ncols)) + (point))) + (unless (eobp) (forward-line))) + (goto-char opoint))) + +;; TODO: if undoing is disabled in the current buffer, paste-pop won't +;; work. Although this is probably not a big problem, because usually +;; buffers where `evil-paste-pop' may be useful have undoing enabled. +;; A solution would be to temporarily enable undo when pasting and +;; store the undo information in a special variable that does not +;; interfere with `buffer-undo-list'. +(defun evil-paste-pop (count) + "Replace the just-yanked stretch of killed text with a different stretch. +This command is allowed only immediatly after a `yank', +`evil-paste-before', `evil-paste-after' or `evil-paste-pop'. +This command uses the same paste command as before, i.e., when +used after `evil-paste-after' the new text is also yanked using +`evil-paste-after', used with the same paste-count argument. + +The COUNT argument inserts the COUNTth previous kill. If COUNT +is negative this is a more recent kill." + (interactive "p") + (unless (memq last-command + '(evil-paste-after + evil-paste-before + evil-visual-paste)) + (user-error "Previous command was not an evil-paste: %s" last-command)) + (unless evil-last-paste + (user-error "Previous paste command used a register")) + (evil-undo-pop) + (goto-char (nth 2 evil-last-paste)) + (setq this-command (nth 0 evil-last-paste)) + ;; use temporary kill-ring, so the paste cannot modify it + (let ((kill-ring (list (current-kill + (if (and (> count 0) (nth 5 evil-last-paste)) + ;; if was visual paste then skip the + ;; text that has been replaced + (1+ count) + count)))) + (kill-ring-yank-pointer kill-ring)) + (when (eq last-command 'evil-visual-paste) + (let ((evil-no-display t)) + (evil-visual-restore))) + (funcall (nth 0 evil-last-paste) (nth 1 evil-last-paste)) + ;; if this was a visual paste, then mark the last paste as NOT + ;; being the first visual paste + (when (eq last-command 'evil-visual-paste) + (setcdr (nthcdr 4 evil-last-paste) nil)))) + +(defun evil-paste-pop-next (count) + "Same as `evil-paste-pop' but with negative argument." + (interactive "p") + (evil-paste-pop (- count))) + +;;; Interactive forms + +(defun evil-match-interactive-code (interactive &optional pos) + "Match an interactive code at position POS in string INTERACTIVE. +Returns the first matching entry in `evil-interactive-alist', or nil." + (let ((length (length interactive)) + (pos (or pos 0))) + (catch 'done + (dolist (entry evil-interactive-alist) + (let* ((string (car entry)) + (end (+ (length string) pos))) + (when (and (<= end length) + (string= string + (substring interactive pos end))) + (throw 'done entry))))))) + +(defun evil-concatenate-interactive-forms (&rest forms) + "Concatenate interactive list expressions FORMS. +Returns a single expression where successive expressions +are joined, if possible." + (let (result) + (when forms + (while (cdr forms) + (cond + ((null (car forms)) + (pop forms)) + ((and (eq (car (car forms)) 'list) + (eq (car (cadr forms)) 'list)) + (setq forms (cons (append (car forms) + (cdr (cadr forms))) + (cdr (cdr forms))))) + (t + (push (pop forms) result)))) + (when (car forms) + (push (pop forms) result)) + (setq result (nreverse result)) + (cond + ((null result)) + ((null (cdr result)) + (car result)) + (t + `(append ,@result)))))) + +(defun evil-interactive-string (string) + "Evaluate the interactive string STRING. +The string may contain extended interactive syntax. +The return value is a cons cell (FORM . PROPERTIES), +where FORM is a single list-expression to be passed to +a standard `interactive' statement, and PROPERTIES is a +list of command properties as passed to `evil-define-command'." + (let ((length (length string)) + (pos 0) + code expr forms match plist prompt properties) + (while (< pos length) + (if (eq (aref string pos) ?\n) + (setq pos (1+ pos)) + (setq match (evil-match-interactive-code string pos)) + (if (null match) + (user-error "Unknown interactive code: `%s'" + (substring string pos)) + (setq code (car match) + expr (car (cdr match)) + plist (cdr (cdr match)) + pos (+ pos (length code))) + (when (functionp expr) + (setq prompt + (substring string pos + (or (string-match "\n" string pos) + length)) + pos (+ pos (length prompt)) + expr `(funcall ,expr ,prompt))) + (setq forms (append forms (list expr)) + properties (append properties plist))))) + (cons `(append ,@forms) properties))) + +(defun evil-interactive-form (&rest args) + "Evaluate interactive forms ARGS. +The return value is a cons cell (FORM . PROPERTIES), +where FORM is a single list-expression to be passed to +a standard `interactive' statement, and PROPERTIES is a +list of command properties as passed to `evil-define-command'." + (let (forms properties) + (dolist (arg args) + (if (not (stringp arg)) + (setq forms (append forms (list arg))) + (setq arg (evil-interactive-string arg) + forms (append forms (cdr (car arg))) + properties (append properties (cdr arg))))) + (cons (apply #'evil-concatenate-interactive-forms forms) + properties))) + +;;; Types + +(defun evil-type (object &optional default) + "Return the type of OBJECT, or DEFAULT if none." + (let (type) + (cond + ((overlayp object) + (setq type (overlay-get object :type))) + ((evil-range-p object) + (setq type (nth 2 object))) + ((listp object) + (setq type (plist-get object :type))) + ((commandp object) + (setq type (evil-get-command-property object :type))) + ((symbolp object) + (setq type (get object 'type)))) + (setq type (or type default)) + (and (evil-type-p type) type))) + +(defun evil-set-type (object type) + "Set the type of OBJECT to TYPE. +For example, (evil-set-type 'next-line 'line) +will make `line' the type of the `next-line' command." + (cond + ((overlayp object) + (overlay-put object :type type)) + ((evil-range-p object) + (evil-set-range-type object type)) + ((listp object) + (plist-put object :type type)) + ((commandp object) + (evil-set-command-property object :type type)) + ((symbolp object) + (put object 'type type))) + object) + +(defun evil-type-property (type prop) + "Return property PROP for TYPE." + (evil-get-property evil-type-properties type prop)) + +(defun evil-type-p (sym) + "Whether SYM is the name of a type." + (assq sym evil-type-properties)) + +(defun evil-expand (beg end type &rest properties) + "Expand BEG and END as TYPE with PROPERTIES. +Returns a list (BEG END TYPE PROPERTIES ...), where the tail +may contain a property list." + (apply #'evil-transform + ;; don't expand if already expanded + (unless (plist-get properties :expanded) :expand) + beg end type properties)) + +(defun evil-contract (beg end type &rest properties) + "Contract BEG and END as TYPE with PROPERTIES. +Returns a list (BEG END TYPE PROPERTIES ...), where the tail +may contain a property list." + (apply #'evil-transform :contract beg end type properties)) + +(defun evil-normalize (beg end type &rest properties) + "Normalize BEG and END as TYPE with PROPERTIES. +Returns a list (BEG END TYPE PROPERTIES ...), where the tail +may contain a property list." + (apply #'evil-transform :normalize beg end type properties)) + +(defun evil-transform (transform beg end type &rest properties) + "Apply TRANSFORM on BEG and END with PROPERTIES. +Returns a list (BEG END TYPE PROPERTIES ...), where the tail +may contain a property list. If TRANSFORM is undefined, +return positions unchanged." + (let* ((type (or type (evil-type properties))) + (transform (when (and type transform) + (evil-type-property type transform)))) + (if transform + (apply transform beg end properties) + (apply #'evil-range beg end type properties)))) + +(defun evil-describe (beg end type &rest properties) + "Return description of BEG and END with PROPERTIES. +If no description is available, return the empty string." + (let* ((type (or type (evil-type properties))) + (properties (plist-put properties :type type)) + (describe (evil-type-property type :string))) + (or (when describe + (apply describe beg end properties)) + ""))) + +;;; Ranges + +(defun evil-range (beg end &optional type &rest properties) + "Return a list (BEG END [TYPE] PROPERTIES...). +BEG and END are buffer positions (numbers or markers), +TYPE is a type as per `evil-type-p', and PROPERTIES is +a property list." + (let ((beg (evil-normalize-position beg)) + (end (evil-normalize-position end))) + (when (and (numberp beg) (numberp end)) + (append (list (min beg end) (max beg end)) + (when (evil-type-p type) + (list type)) + properties)))) + +(defun evil-range-p (object) + "Whether OBJECT is a range." + (and (listp object) + (>= (length object) 2) + (numberp (nth 0 object)) + (numberp (nth 1 object)))) + +(defun evil-range-beginning (range) + "Return beginning of RANGE." + (when (evil-range-p range) + (let ((beg (evil-normalize-position (nth 0 range))) + (end (evil-normalize-position (nth 1 range)))) + (min beg end)))) + +(defun evil-range-end (range) + "Return end of RANGE." + (when (evil-range-p range) + (let ((beg (evil-normalize-position (nth 0 range))) + (end (evil-normalize-position (nth 1 range)))) + (max beg end)))) + +(defun evil-range-properties (range) + "Return properties of RANGE." + (when (evil-range-p range) + (if (evil-type range) + (nthcdr 3 range) + (nthcdr 2 range)))) + +(defun evil-copy-range (range) + "Return a copy of RANGE." + (copy-sequence range)) + +(defun evil-set-range (range &optional beg end type &rest properties) + "Set RANGE to have beginning BEG and end END. +The TYPE and additional PROPERTIES may also be specified. +If an argument is nil, it's not used; the previous value is retained. +See also `evil-set-range-beginning', `evil-set-range-end', +`evil-set-range-type' and `evil-set-range-properties'." + (when (evil-range-p range) + (let ((beg (or (evil-normalize-position beg) + (evil-range-beginning range))) + (end (or (evil-normalize-position end) + (evil-range-end range))) + (type (or type (evil-type range))) + (plist (evil-range-properties range))) + (evil-sort beg end) + (setq plist (evil-concat-plists plist properties)) + (evil-set-range-beginning range beg) + (evil-set-range-end range end) + (evil-set-range-type range type) + (evil-set-range-properties range plist) + range))) + +(defun evil-set-range-beginning (range beg &optional copy) + "Set RANGE's beginning to BEG. +If COPY is non-nil, return a copy of RANGE." + (when copy + (setq range (evil-copy-range range))) + (setcar range beg) + range) + +(defun evil-set-range-end (range end &optional copy) + "Set RANGE's end to END. +If COPY is non-nil, return a copy of RANGE." + (when copy + (setq range (evil-copy-range range))) + (setcar (cdr range) end) + range) + +(defun evil-set-range-type (range type &optional copy) + "Set RANGE's type to TYPE. +If COPY is non-nil, return a copy of RANGE." + (when copy + (setq range (evil-copy-range range))) + (if type + (setcdr (cdr range) + (cons type (evil-range-properties range))) + (setcdr (cdr range) (evil-range-properties range))) + range) + +(defun evil-set-range-properties (range properties &optional copy) + "Set RANGE's properties to PROPERTIES. +If COPY is non-nil, return a copy of RANGE." + (when copy + (setq range (evil-copy-range range))) + (if (evil-type range) + (setcdr (cdr (cdr range)) properties) + (setcdr (cdr range) properties)) + range) + +(defun evil-range-union (range1 range2 &optional type) + "Return the union of the ranges RANGE1 and RANGE2. +If the ranges have conflicting types, use RANGE1's type. +This can be overridden with TYPE." + (when (and (evil-range-p range1) + (evil-range-p range2)) + (evil-range (min (evil-range-beginning range1) + (evil-range-beginning range2)) + (max (evil-range-end range1) + (evil-range-end range2)) + (or type + (evil-type range1) + (evil-type range2))))) + +(defun evil-subrange-p (range1 range2) + "Whether RANGE1 is contained within RANGE2." + (and (evil-range-p range1) + (evil-range-p range2) + (<= (evil-range-beginning range2) + (evil-range-beginning range1)) + (>= (evil-range-end range2) + (evil-range-end range1)))) + +(defun evil-select-inner-object (thing beg end type &optional count line) + "Return an inner text object range of COUNT objects. +If COUNT is positive, return objects following point; if COUNT is +negative, return objects preceding point. If one is unspecified, +the other is used with a negative argument. THING is a symbol +understood by thing-at-point. BEG, END and TYPE specify the +current selection. If LINE is non-nil, the text object should be +linewise, otherwise it is character wise." + (let* ((count (or count 1)) + (bnd (or (let ((b (bounds-of-thing-at-point thing))) + (and b (< (point) (cdr b)) b)) + (evil-bounds-of-not-thing-at-point thing)))) + ;; check if current object is selected + (when (or (not beg) (not end) + (> beg (car bnd)) + (< end (cdr bnd)) + (and (eq type 'inclusive) + (= (1+ beg) end))) ; empty region does not count + (when (or (not beg) (< (car bnd) beg)) (setq beg (car bnd))) + (when (or (not end) (> (cdr bnd) end)) (setq end (cdr bnd))) + (setq count (if (> count 0) (1- count) (1+ count)))) + (goto-char (if (< count 0) beg end)) + (evil-forward-nearest count + #'(lambda (cnt) (forward-thing thing cnt)) + #'(lambda (cnt) (evil-forward-not-thing thing cnt))) + (evil-range (if (>= count 0) beg (point)) + (if (< count 0) end (point)) + (if line 'line type) + :expanded t))) + +(defun evil-select-an-object (thing beg end type count &optional line) + "Return an outer text object range of COUNT objects. +If COUNT is positive, return objects following point; if COUNT is +negative, return objects preceding point. If one is unspecified, +the other is used with a negative argument. THING is a symbol +understood by thing-at-point. BEG, END and TYPE specify the +current selection. If LINE is non-nil, the text object should be +linewise, otherwise it is character wise." + (let* ((dir (if (> (or count 1) 0) +1 -1)) + (count (abs (or count 1))) + (objbnd (let ((b (bounds-of-thing-at-point thing))) + (and b (< (point) (cdr b)) b))) + (bnd (or objbnd (evil-bounds-of-not-thing-at-point thing))) + addcurrent other) + ;; check if current object is not selected + (when (or (not beg) (not end) + (> beg (car bnd)) + (< end (cdr bnd)) + (and (eq type 'inclusive) + (= (1+ beg) end))) ; empty region does not count + ;; if not, enlarge selection + (when (or (not beg) (< (car bnd) beg)) (setq beg (car bnd))) + (when (or (not end) (> (cdr bnd) end)) (setq end (cdr bnd))) + (if objbnd (setq addcurrent t))) + ;; make other and (point) reflect the selection + (cond + ((> dir 0) (goto-char end) (setq other beg)) + (t (goto-char beg) (setq other end))) + (cond + ;; do nothing more than only current is selected + ((not (and (= beg (car bnd)) (= end (cdr bnd))))) + ;; current match is thing, add whitespace + (objbnd + (let ((wsend (evil-with-restriction + ;; restrict to current line if we do non-line selection + (and (not line) (line-beginning-position)) + (and (not line) (line-end-position)) + (evil-bounds-of-not-thing-at-point thing dir)))) + (cond + (wsend + ;; add whitespace at end + (goto-char wsend) + (setq addcurrent t)) + (t + ;; no whitespace at end, try beginning + (save-excursion + (goto-char other) + (setq wsend + (evil-with-restriction + ;; restrict to current line if we do non-line selection + (and (not line) (line-beginning-position)) + (and (not line) (line-end-position)) + (evil-bounds-of-not-thing-at-point thing (- dir)))) + (when wsend (setq other wsend addcurrent t))))))) + ;; current match is whitespace, add thing + (t + (forward-thing thing dir) + (setq addcurrent t))) + ;; possibly count current object as selection + (if addcurrent (setq count (1- count))) + ;; move + (dotimes (_ count) + (let ((wsend (evil-bounds-of-not-thing-at-point thing dir))) + (if (and wsend (/= wsend (point))) + ;; start with whitespace + (forward-thing thing dir) + ;; start with thing + (forward-thing thing dir) + (setq wsend (evil-bounds-of-not-thing-at-point thing dir)) + (when wsend (goto-char wsend))))) + ;; return range + (evil-range (if (> dir 0) other (point)) + (if (< dir 0) other (point)) + (if line 'line type) + :expanded t))) + +(defun evil--get-block-range (op cl selection-type) + "Return the exclusive range of a visual selection. +OP and CL are pairs of buffer positions for the opening and +closing delimiter of a range. SELECTION-TYPE is the desired type +of selection. It is a symbol that determines which parts of the +block are selected. If it is 'inclusive or t the returned range +is \(cons (car OP) (cdr CL)). If it is 'exclusive or nil the +returned range is (cons (cdr OP) (car CL)). If it is +'exclusive-line the returned range will skip whitespace at the +end of the line of OP and at the beginning of the line of CL." + (cond + ((memq selection-type '(inclusive t)) (cons (car op) (cdr cl))) + ((memq selection-type '(exclusive nil)) (cons (cdr op) (car cl))) + ((eq selection-type 'exclusive-line) + (let ((beg (cdr op)) + (end (car cl))) + (save-excursion + (goto-char beg) + (when (and (eolp) (not (eobp))) + (setq beg (line-beginning-position 2))) + (goto-char end) + (skip-chars-backward " \t") + (when (bolp) + (setq end (point)) + (goto-char beg) + (when (and (not (bolp)) (< beg end)) + (setq end (1- end))))) + (cons beg end))) + (t + (user-error "Unknown selection-type %s" selection-type)))) + +(defun evil-select-block (thing beg end type count + &optional + selection-type + countcurrent + fixedscan) + "Return a range (BEG END) of COUNT delimited text objects. +BEG END TYPE are the currently selected (visual) range. The +delimited object must be given by THING-up function (see +`evil-up-block'). + +SELECTION-TYPE is symbol that determines which parts of the block +are selected. If it is 'inclusive or t OPEN and CLOSE are +included in the range. If it is 'exclusive or nil the delimiters +are not contained. If it is 'exclusive-line the delimiters are +not included as well as adjacent whitespace until the beginning +of the next line or the end of the previous line. If the +resulting selection consists of complete lines only and visual +state is not active, the returned selection is linewise. + +If COUNTCURRENT is non-nil an objected is counted if the current +selection matches that object exactly. + +Usually scanning for the surrounding block starts at (1+ beg) +and (1- end). If this might fail due to the behavior of THING +then FIXEDSCAN can be set to t. In this case the scan starts at +BEG and END. One example where this might fail is if BEG and END +are the delimiters of a string or comment." + (save-excursion + (save-match-data + (let* ((orig-beg beg) + (orig-end end) + (beg (or beg (point))) + (end (or end (point))) + (count (abs (or count 1))) + op cl op-end cl-end) + ;; We always assume at least one selected character. + (if (= beg end) (setq end (1+ end))) + ;; We scan twice: starting at (1+ beg) forward and at (1- end) + ;; backward. The resulting selection is the smaller one. + (goto-char (if fixedscan beg (1+ beg))) + (when (and (zerop (funcall thing +1)) (match-beginning 0)) + (setq cl (cons (match-beginning 0) (match-end 0))) + (goto-char (car cl)) + (when (and (zerop (funcall thing -1)) (match-beginning 0)) + (setq op (cons (match-beginning 0) (match-end 0))))) + ;; start scanning from end + (goto-char (if fixedscan end (1- end))) + (when (and (zerop (funcall thing -1)) (match-beginning 0)) + (setq op-end (cons (match-beginning 0) (match-end 0))) + (goto-char (cdr op-end)) + (when (and (zerop (funcall thing +1)) (match-beginning 0)) + (setq cl-end (cons (match-beginning 0) (match-end 0))))) + ;; Bug #607: use the tightest selection that contains the + ;; original selection. If non selection contains the original, + ;; use the larger one. + (cond + ((and (not op) (not cl-end)) + (error "No surrounding delimiters found")) + ((or (not op) ; first not found + (and cl-end ; second found + (>= (car op-end) (car op)) ; second smaller + (<= (cdr cl-end) (cdr cl)) + (<= (car op-end) beg) ; second contains orig + (>= (cdr cl-end) end))) + (setq op op-end cl cl-end))) + (setq op-end op cl-end cl) ; store copy + ;; if the current selection contains the surrounding + ;; delimiters, they do not count as new selection + (let ((cnt (if (and orig-beg orig-end (not countcurrent)) + (let ((sel (evil--get-block-range op cl selection-type))) + (if (and (<= orig-beg (car sel)) + (>= orig-end (cdr sel))) + count + (1- count))) + (1- count)))) + ;; starting from the innermost surrounding delimiters + ;; increase selection + (when (> cnt 0) + (setq op (progn + (goto-char (car op-end)) + (funcall thing (- cnt)) + (if (match-beginning 0) + (cons (match-beginning 0) (match-end 0)) + op)) + cl (progn + (goto-char (cdr cl-end)) + (funcall thing cnt) + (if (match-beginning 0) + (cons (match-beginning 0) (match-end 0)) + cl))))) + (let ((sel (evil--get-block-range op cl selection-type))) + (setq op (car sel) + cl (cdr sel))) + (cond + ((and (equal op orig-beg) (equal cl orig-end) + (or (not countcurrent) + (and countcurrent (/= count 1)))) + (error "No surrounding delimiters found")) + ((save-excursion + (and (not (evil-visual-state-p)) + (eq type 'inclusive) + (progn (goto-char op) (bolp)) + (progn (goto-char cl) (bolp)))) + (evil-range op cl 'line :expanded t)) + (t + (evil-range op cl type :expanded t))))))) + +(defun evil-select-paren (open close beg end type count &optional inclusive) + "Return a range (BEG END) of COUNT delimited text objects. +OPEN and CLOSE specify the opening and closing delimiter, +respectively. BEG END TYPE are the currently selected (visual) +range. If INCLUSIVE is non-nil, OPEN and CLOSE are included in +the range; otherwise they are excluded. + +The types of OPEN and CLOSE specify which kind of THING is used +for parsing with `evil-select-block'. If OPEN and CLOSE are +characters `evil-up-paren' is used. Otherwise OPEN and CLOSE +must be regular expressions and `evil-up-block' is used. + +If the selection is exclusive, whitespace at the end or at the +beginning of the selection until the end-of-line or beginning-of-line +is ignored." + ;; we need special linewise exclusive selection + (unless inclusive (setq inclusive 'exclusive-line)) + (cond + ((and (characterp open) (characterp close)) + (let ((thing #'(lambda (&optional cnt) + (evil-up-paren open close cnt))) + (bnd (or (bounds-of-thing-at-point 'evil-string) + (bounds-of-thing-at-point 'evil-comment) + ;; If point is at the opening quote of a string, + ;; this must be handled as if point is within the + ;; string, i.e. the selection must be extended + ;; around the string. Otherwise + ;; `evil-select-block' might do the wrong thing + ;; because it accidentally moves point inside the + ;; string (for inclusive selection) when looking + ;; for the current surrounding block. (re #364) + (and (= (point) (or beg (point))) + (save-excursion + (goto-char (1+ (or beg (point)))) + (or (bounds-of-thing-at-point 'evil-string) + (bounds-of-thing-at-point 'evil-comment))))))) + (if (not bnd) + (evil-select-block thing beg end type count inclusive) + (or (evil-with-restriction (car bnd) (cdr bnd) + (condition-case nil + (evil-select-block thing beg end type count inclusive) + (error nil))) + (save-excursion + (setq beg (or beg (point)) + end (or end (point))) + (goto-char (car bnd)) + (let ((extbeg (min beg (car bnd))) + (extend (max end (cdr bnd)))) + (evil-select-block thing + extbeg extend + type + count + inclusive + (or (< extbeg beg) (> extend end)) + t))))))) + (t + (evil-select-block #'(lambda (&optional cnt) + (evil-up-block open close cnt)) + beg end type count inclusive)))) + +(defun evil-select-quote-thing (thing beg end _type count &optional inclusive) + "Selection THING as if it described a quoted object. +THING is typically either 'evil-quote or 'evil-chars. This +function is called from `evil-select-quote'." + (save-excursion + (let* ((count (or count 1)) + (dir (if (> count 0) 1 -1)) + (bnd (let ((b (bounds-of-thing-at-point thing))) + (and b (< (point) (cdr b)) b))) + addcurrent + wsboth) + (if inclusive (setq inclusive t) + (when (= (abs count) 2) + (setq count dir) + (setq inclusive 'quote-only)) + ;; never extend with exclusive selection + (setq beg nil end nil)) + ;; check if the previously selected range does not contain a + ;; string + (unless (and beg end + (save-excursion + (goto-char (if (> dir 0) beg end)) + (forward-thing thing dir) + (and (<= beg (point)) (< (point) end)))) + ;; if so forget the range + (setq beg nil end nil)) + ;; check if there is a current object, if not fetch one + (when (not bnd) + (unless (and (zerop (forward-thing thing dir)) + (setq bnd (bounds-of-thing-at-point thing))) + (error "No quoted string found")) + (if (> dir 0) + (setq end (point)) + (setq beg (point))) + (setq addcurrent t)) + ;; check if current object is not selected + (when (or (not beg) (not end) (> beg (car bnd)) (< end (cdr bnd))) + ;; if not, enlarge selection + (when (or (not beg) (< (car bnd) beg)) (setq beg (car bnd))) + (when (or (not end) (> (cdr bnd) end)) (setq end (cdr bnd))) + (setq addcurrent t wsboth t)) + ;; maybe count current element + (when addcurrent + (setq count (if (> dir 0) (1- count) (1+ count)))) + ;; enlarge selection + (goto-char (if (> dir 0) end beg)) + (when (and (not addcurrent) + (= count (forward-thing thing count))) + (error "No quoted string found")) + (if (> dir 0) (setq end (point)) (setq beg (point))) + ;; add whitespace + (cond + ((not inclusive) (setq beg (1+ beg) end (1- end))) + ((not (eq inclusive 'quote-only)) + ;; try to add whitespace in forward direction + (goto-char (if (> dir 0) end beg)) + (if (setq bnd (bounds-of-thing-at-point 'evil-space)) + (if (> dir 0) (setq end (cdr bnd)) (setq beg (car bnd))) + ;; if not found try backward direction + (goto-char (if (> dir 0) beg end)) + (if (and wsboth (setq bnd (bounds-of-thing-at-point 'evil-space))) + (if (> dir 0) (setq beg (car bnd)) (setq end (cdr bnd))))))) + (evil-range beg end + ;; HACK: fixes #583 + ;; When not in visual state, an empty range is + ;; possible. However, this cannot be achieved with + ;; inclusive ranges, hence we use exclusive ranges + ;; in this case. In visual state the range must be + ;; inclusive because otherwise the selection would + ;; be wrong. + (if (evil-visual-state-p) 'inclusive 'exclusive) + :expanded t)))) + +(defun evil-select-quote (quote beg end type count &optional inclusive) + "Return a range (BEG END) of COUNT quoted text objects. +QUOTE specifies the quotation delimiter. BEG END TYPE are the +currently selected (visual) range. + +If INCLUSIVE is nil the previous selection is ignore. If there is +quoted string at point this object will be selected, otherwise +the following (if (> COUNT 0)) or preceeding object (if (< COUNT +0)) is selected. If (/= (abs COUNT) 2) the delimiting quotes are not +contained in the range, otherwise they are contained in the range. + +If INCLUSIVE is non-nil the selection depends on the previous +selection. If the currently selection contains at least one +character that is contained in a quoted string then the selection +is extended, otherwise it is thrown away. If there is a +non-selected object at point then this object is added to the +selection. Otherwise the selection is extended to the +following (if (> COUNT 0)) or preceeding object (if (< COUNT +0)). Any whitespace following (or preceeding if (< COUNT 0)) the +new selection is added to the selection. If no such whitespace +exists and the selection contains only one quoted string then the +preceeding (or following) whitespace is added to the range. " + (let ((evil-forward-quote-char quote)) + (or (let ((bnd (or (bounds-of-thing-at-point 'evil-comment) + (bounds-of-thing-at-point 'evil-string)))) + (when (and bnd (< (point) (cdr bnd)) + (/= (char-after (car bnd)) quote) + (/= (char-before (cdr bnd)) quote)) + (evil-with-restriction (car bnd) (cdr bnd) + (condition-case nil + (evil-select-quote-thing 'evil-quote-simple + beg end type + count + inclusive) + (error nil))))) + (let ((evil-forward-quote-char quote)) + (evil-select-quote-thing 'evil-quote + beg end type + count + inclusive))))) + +(defun evil-select-xml-tag (beg end type &optional count inclusive) + "Return a range (BEG END) of COUNT matching XML tags. +If INCLUSIVE is non-nil, the tags themselves are included +from the range." + (cond + ((and (not inclusive) (= (abs (or count 1)) 1)) + (let ((rng (evil-select-block #'evil-up-xml-tag beg end type count nil t))) + (if (or (and beg (= beg (evil-range-beginning rng)) + end (= end (evil-range-end rng))) + (= (evil-range-beginning rng) (evil-range-end rng))) + (evil-select-block #'evil-up-xml-tag beg end type count t) + rng))) + (t + (evil-select-block #'evil-up-xml-tag beg end type count inclusive)))) + +(defun evil-expand-range (range &optional copy) + "Expand RANGE according to its type. +Return a new range if COPY is non-nil." + (when copy + (setq range (evil-copy-range range))) + (unless (plist-get (evil-range-properties range) :expanded) + (setq range (evil-transform-range :expand range))) + range) + +(defun evil-contract-range (range &optional copy) + "Contract RANGE according to its type. +Return a new range if COPY is non-nil." + (evil-transform-range :contract range copy)) + +(defun evil-normalize-range (range &optional copy) + "Normalize RANGE according to its type. +Return a new range if COPY is non-nil." + (evil-transform-range :normalize range copy)) + +(defun evil-transform-range (transform range &optional copy) + "Apply TRANSFORM to RANGE according to its type. +Return a new range if COPY is non-nil." + (when copy + (setq range (evil-copy-range range))) + (when (evil-type range) + (apply #'evil-set-range range + (apply #'evil-transform transform range))) + range) + +(defun evil-describe-range (range) + "Return description of RANGE. +If no description is available, return the empty string." + (apply #'evil-describe range)) + +;;; Undo + +(defun evil-start-undo-step (&optional continue) + "Start a undo step. +All following buffer modifications are grouped together as a +single action. If CONTINUE is non-nil, preceding modifications +are included. The step is terminated with `evil-end-undo-step'." + (when (and (listp buffer-undo-list) + (not evil-in-single-undo)) + (if evil-undo-list-pointer + (evil-refresh-undo-step) + (unless (or continue (null (car-safe buffer-undo-list))) + (undo-boundary)) + (setq evil-undo-list-pointer (or buffer-undo-list t))))) + +(defun evil-end-undo-step (&optional continue) + "End a undo step started with `evil-start-undo-step'. +Adds an undo boundary unless CONTINUE is specified." + (when (and (listp buffer-undo-list) + evil-undo-list-pointer + (not evil-in-single-undo)) + (evil-refresh-undo-step) + (unless (or continue (null (car-safe buffer-undo-list))) + (undo-boundary)) + (setq evil-undo-list-pointer nil))) + +(defun evil-refresh-undo-step () + "Refresh `buffer-undo-list' entries for current undo step. +Undo boundaries until `evil-undo-list-pointer' are removed to +make the entries undoable as a single action. See +`evil-start-undo-step'." + (when evil-undo-list-pointer + (setq buffer-undo-list + (evil-filter-list #'null buffer-undo-list evil-undo-list-pointer)) + (setq evil-undo-list-pointer (or buffer-undo-list t)))) + +(defmacro evil-with-undo (&rest body) + "Execute BODY with enabled undo. +If undo is disabled in the current buffer, the undo information +is stored in `evil-temporary-undo' instead of `buffer-undo-list'." + (declare (indent defun) + (debug t)) + `(unwind-protect + (let (buffer-undo-list) + (unwind-protect + (progn ,@body) + (setq evil-temporary-undo buffer-undo-list) + ;; ensure evil-temporary-undo starts with exactly one undo + ;; boundary marker, i.e. nil + (unless (null (car-safe evil-temporary-undo)) + (push nil evil-temporary-undo)))) + (unless (eq buffer-undo-list t) + ;; undo is enabled, so update the global buffer undo list + (setq buffer-undo-list + ;; prepend new undos (if there are any) + (if (cdr evil-temporary-undo) + (nconc evil-temporary-undo buffer-undo-list) + buffer-undo-list) + evil-temporary-undo nil)))) + +(defmacro evil-with-single-undo (&rest body) + "Execute BODY as a single undo step." + (declare (indent defun) + (debug t)) + `(let (evil-undo-list-pointer) + (evil-with-undo + (unwind-protect + (progn + (evil-start-undo-step) + (let ((evil-in-single-undo t)) + ,@body)) + (evil-end-undo-step))))) + +(defun evil-undo-pop () + "Undo the last buffer change. +Removes the last undo information from `buffer-undo-list'. +If undo is disabled in the current buffer, use the information +in `evil-temporary-undo' instead." + (let ((paste-undo (list nil))) + (let ((undo-list (if (eq buffer-undo-list t) + evil-temporary-undo + buffer-undo-list))) + (when (or (not undo-list) (car undo-list)) + (user-error "Can't undo previous change")) + (while (and undo-list (null (car undo-list))) + (pop undo-list)) ; remove nil + (while (and undo-list (car undo-list)) + (push (pop undo-list) paste-undo)) + (let ((buffer-undo-list (nreverse paste-undo))) + (evil-save-echo-area + (undo))) + (if (eq buffer-undo-list t) + (setq evil-temporary-undo nil) + (setq buffer-undo-list undo-list))))) + +;;; Search +(defun evil-transform-regexp (regexp replacements-alist) + (replace-regexp-in-string + "\\\\+[^\\\\]" + #'(lambda (txt) + (let* ((b (match-beginning 0)) + (e (match-end 0)) + (ch (aref txt (1- e))) + (repl (assoc ch replacements-alist))) + (if (and repl (zerop (mod (length txt) 2))) + (concat (substring txt b (- e 2)) + (cdr repl)) + txt))) + regexp nil t)) + +(defun evil-transform-magic (str magic quote transform &optional _start) + "Transforms STR with magic characters. +MAGIC is a regexp that matches all potential magic +characters. Each occurence of CHAR as magic character within str +is replaced by the result of calling the associated TRANSFORM +function. TRANSFORM is a function taking two arguments, the +character to be transformed and the rest of string after the +character. The function should return a triple (REPLACEMENT REST +. STOP) where REPLACEMENT is the replacement and REST is the rest +of the string that has not been transformed. If STOP is non-nil +then the substitution stops immediately. The replacement starts +at position START, everything before that position is returned +literally. The result is a pair (RESULT . REST). RESULT is a +list containing the transformed parts in order. If two +subsequents parts are both strings, they are concatenated. REST +is the untransformed rest string (usually \"\" but may be more if +TRANSFORM stopped the substitution). Which characters are +considered as magic characters (i.e. the transformation happens +if the character is NOT preceeded by a backslash) is determined +by `evil-magic'. The special tokens \\v, \\V, \\m and \\M have +always a special meaning (like in Vim) and should not be +contained in TRANSFORMS, otherwise their meaning is overwritten. + +The parameter QUOTE is a quoting function applied to literal +transformations, usually `regexp-quote' or `replace-quote'." + (save-match-data + (let ((regexp (concat "\\(?:\\`\\|[^\\]\\)\\(\\\\\\(?:\\(" magic "\\)\\|\\(.\\)\\)\\|\\(" magic "\\)\\)")) + (magic-chars (evil-get-magic evil-magic)) + (evil-magic evil-magic) + (quote (or quote #'identity)) + result stop) + (while (and (not stop) str (string-match regexp str)) + (unless (zerop (match-beginning 1)) + (push (substring str 0 (match-beginning 1)) result)) + (let ((char (or (match-string 2 str) + (match-string 3 str) + (match-string 4 str))) + (rest (substring str (match-end 0)))) + (cond + ((match-beginning 4) + ;; magic character without backslash + (if (string-match magic-chars char) + ;; magic, do transform + (let ((trans (funcall transform (aref char 0) rest))) + (push (car trans) result) + (setq str (cadr trans) stop (nthcdr 2 trans))) + ;; non-magic, literal transformation + (push (funcall quote char) result) + (setq str rest))) + ((match-beginning 2) + ;; magic character with backslash + (if (not (string-match magic-chars char)) + ;; non-magic, do transform + (let ((trans (funcall transform (aref char 0) rest))) + (push (car trans) result) + (setq str (cadr trans) stop (nthcdr 2 trans))) + ;; magic, literal transformation + (push (funcall quote char) result) + (setq str rest))) + ((memq (aref char 0) '(?m ?M ?v ?V)) + (setq evil-magic (cdr (assq (aref char 0) + '((?m . t) + (?M . nil) + (?v . very-magic) + (?V . very-nomagic))))) + (setq magic-chars (evil-get-magic evil-magic)) + (setq str rest)) + (t + ;; non-magic char with backslash, literal transformation + (push (funcall quote char) result) + (setq str rest))))) + (cond + ((and str (not stop)) + (push str result) + (setq str "")) + ((not str) + (setq str ""))) + ;; concatenate subsequent strings + ;; note that result is in reverse order + (let (repl) + (while result + (cond + ((and (stringp (car result)) + (zerop (length (car result)))) + (pop result)) + ((and (stringp (car result)) + (stringp (cadr result))) + (setq result (cons (concat (cadr result) + (car result)) + (nthcdr 2 result)))) + (t + (push (pop result) repl)))) + (cons repl str))))) + +(defconst evil-vim-regexp-replacements + '((?n . "\n") (?r . "\r") + (?t . "\t") (?b . "\b") + (?s . "[[:space:]]") (?S . "[^[:space:]]") + (?d . "[[:digit:]]") (?D . "[^[:digit:]]") + (?x . "[[:xdigit:]]") (?X . "[^[:xdigit:]]") + (?o . "[0-7]") (?O . "[^0-7]") + (?a . "[[:alpha:]]") (?A . "[^[:alpha:]]") + (?l . "[a-z]") (?L . "[^a-z]") + (?u . "[A-Z]") (?U . "[^A-Z]") + (?y . "\\s") (?Y . "\\S") + (?\( . "\\(") (?\) . "\\)") + (?{ . "\\{") (?} . "\\}") + (?\[ . "[") (?\] . "]") + (?< . "\\<") (?> . "\\>") + (?_ . "\\_") + (?* . "*") (?+ . "+") + (?? . "?") (?= . "?") + (?. . ".") + (?` . "`") (?^ . "^") + (?$ . "$") (?| . "\\|"))) + +(defconst evil-regexp-magic "[][(){}<>_dDsSxXoOaAlLuUwWyY.*+?=^$`|nrtb]") + +(defun evil-transform-vim-style-regexp (regexp) + "Transforms vim-style backslash codes to Emacs regexp. +This includes the backslash codes \\d, \\D, \\s, \\S, \\x, \\X, +\\o, \\O, \\a, \\A, \\l, \\L, \\u, \\U and \\w, \\W. The new +codes \\y and \\Y can be used instead of the Emacs code \\s and +\\S which have a different meaning in Vim-style." + (car + (car + (evil-transform-magic + regexp evil-regexp-magic #'regexp-quote + #'(lambda (char rest) + (let ((repl (assoc char evil-vim-regexp-replacements))) + (if repl + (list (cdr repl) rest) + (list (concat "\\" (char-to-string char)) rest)))))))) + +;;; Substitute + +(defun evil-downcase-first (str) + "Return STR with the first letter downcased." + (if (zerop (length str)) + str + (concat (downcase (substring str 0 1)) + (substring str 1)))) + +(defun evil-upcase-first (str) + "Return STR with the first letter upcased." + (if (zerop (length str)) + str + (concat (upcase (substring str 0 1)) + (substring str 1)))) + +(defun evil-get-magic (magic) + "Returns a regexp matching the magic characters according to MAGIC. +Depending on the value of MAGIC the following characters are +considered magic. + t [][{}*+?.&~$^ + nil [][{}*+?$^ + 'very-magic not 0-9A-Za-z_ + 'very-nomagic empty." + (cond + ((eq magic t) "[][}{*+?.&~$^]") + ((eq magic 'very-magic) "[^0-9A-Za-z_]") + ((eq magic 'very-nomagic) "\\\\") + (t "[][}{*+?$^]"))) + +;; TODO: support magic characters in patterns +(defconst evil-replacement-magic "[eElLuU0-9&#,rnbt=]" + "All magic characters in a replacement string") + +(defun evil-compile-subreplacement (to &optional start) + "Convert a regexp replacement TO to Lisp from START until \\e or \\E. +Returns a pair (RESULT . REST). RESULT is a list suitable for +`perform-replace' if necessary, the original string if not. +REST is the unparsed remainder of TO." + (let ((result + (evil-transform-magic + to evil-replacement-magic #'replace-quote + #'(lambda (char rest) + (cond + ((eq char ?#) + (list '(number-to-string replace-count) rest)) + ((eq char ?r) (list "\r" rest)) + ((eq char ?n) (list "\n" rest)) + ((eq char ?b) (list "\b" rest)) + ((eq char ?t) (list "\t" rest)) + ((memq char '(?e ?E)) + `("" ,rest . t)) + ((memq char '(?l ?L ?u ?U)) + (let ((result (evil-compile-subreplacement rest)) + (func (cdr (assoc char + '((?l . evil-downcase-first) + (?L . downcase) + (?u . evil-upcase-first) + (?U . upcase)))))) + (list `(,func + (replace-quote + (evil-match-substitute-replacement + ,(car result) + (not case-replace)))) + (cdr result)))) + ((eq char ?=) + (when (or (zerop (length rest)) + (not (eq (aref rest 0) ?@))) + (user-error "Expected @ after \\=")) + (when (< (length rest) 2) + (user-error "Expected register after \\=@")) + (list (evil-get-register (aref rest 1)) + (substring rest 2))) + ((eq char ?,) + (let* ((obj (read-from-string rest)) + (result `(replace-quote ,(car obj))) + (end + ;; swallow a space after a symbol + (if (and (or (symbolp (car obj)) + ;; swallow a space after 'foo, + ;; but not after (quote foo) + (and (eq (car-safe (car obj)) 'quote) + (not (= ?\( (aref rest 0))))) + (eq (string-match " " rest (cdr obj)) + (cdr obj))) + (1+ (cdr obj)) + (cdr obj)))) + (list result (substring rest end)))) + ((eq char ?0) + (list "\\&" rest)) + (t + (list (concat "\\" (char-to-string char)) rest)))) + start))) + (let ((rest (cdr result)) + (result (car result))) + (replace-match-string-symbols result) + (cons (if (cdr result) + (cons 'concat result) + (or (car result) "")) + rest)))) + +(defun evil-compile-replacement (to) + "Maybe convert a regexp replacement TO to Lisp. +Returns a list suitable for `perform-replace' if necessary, the +original string if not. Currently the following magic characters +in replacements are supported: 0-9&#lLuUrnbt, +The magic character , (comma) start an Emacs-lisp expression." + (when (stringp to) + (save-match-data + (cons 'replace-eval-replacement + (car (evil-compile-subreplacement to)))))) + +(defun evil-replace-match (replacement &optional fixedcase string) + "Replace text match by last search with REPLACEMENT. +If REPLACEMENT is an expression it will be evaluated to compute +the replacement text, otherwise the function behaves as +`replace-match'." + (if (stringp replacement) + (replace-match replacement fixedcase nil string) + (replace-match (funcall (car replacement) + (cdr replacement) + 0) + fixedcase nil string))) + +(defun evil-match-substitute-replacement (replacement &optional fixedcase string) + "Return REPLACEMENT as it will be inserted by `evil-replace-match'." + (if (stringp replacement) + (match-substitute-replacement replacement fixedcase nil string) + (match-substitute-replacement (funcall (car replacement) + (cdr replacement) + 0) + fixedcase nil string))) + +;;; Alignment + +(defun evil-justify-lines (beg end justify position) + "Justifes all lines in a range. +BEG and END specify the range of those lines to be +justified. JUSTIFY is either 'left, 'right or 'center according +to the justification type. POSITION is the maximal text width for +right and center justification or the column at which the lines +should be left-aligned for left justification." + (let ((fill-column position) + adaptive-fill-mode fill-prefix) + (evil-with-restriction + (save-excursion + (goto-char beg) + (line-beginning-position)) + (save-excursion + (goto-char end) + (if (bolp) + (line-end-position 0) + (line-end-position))) + (goto-char (point-min)) + (while (progn + (if (eq justify 'left) + (indent-line-to position) + (when (re-search-forward "^[[:space:]]*" nil t) + (delete-region (match-beginning 0) + (match-end 0))) + (justify-current-line justify nil t)) + (and (zerop (forward-line)) (bolp)))) + (goto-char (point-min)) + (back-to-indentation)))) + +;;; View helper + +(defvar-local evil-list-view-select-action nil) +(put 'evil-list-view-select-action 'permanent-local t) + +(define-derived-mode evil-list-view-mode tabulated-list-mode + "Evil List View" + (tabulated-list-init-header) + (tabulated-list-print)) + +(defun evil-list-view-goto-entry () + (interactive) + (when (and evil-list-view-select-action + (not (eobp))) + (let* ((line (line-number-at-pos (point))) + (entry (elt tabulated-list-entries (1- line)))) + (funcall evil-list-view-select-action (nth 1 entry))))) + +(defun evil-list-view-quit () + (interactive) + (quit-window 'kill)) + +(define-key evil-list-view-mode-map (kbd "q") #'evil-list-view-quit) +(define-key evil-list-view-mode-map [follow-link] nil) ;; allows mouse-1 to be activated +(define-key evil-list-view-mode-map [mouse-1] #'evil-list-view-goto-entry) +(define-key evil-list-view-mode-map [return] #'evil-list-view-goto-entry) + +(defmacro evil-with-view-list (&rest properties) + "Opens new list view buffer. + +PROPERTIES is a property-list which supports the following properties: + +:name (required) The name of the buffer. +:mode-name (required) The name for the mode line. +:format (required) The value for `tabulated-list-format'. +:entries (required) The value for `tabulated-list-entries'. +:select-action (optional) A function for row selection. + It takes in a single parameter, which is the selected row's + vector value that is passed into `:entries'. +" + (declare (indent defun) (debug t)) + `(let ((bufname (concat "*" ,(plist-get properties :name) "*")) + (inhibit-read-only t)) + (and (get-buffer bufname) + (kill-buffer bufname)) + (let ((buf (get-buffer-create bufname))) + (with-current-buffer buf + (setq tabulated-list-format ,(plist-get properties :format)) + (setq tabulated-list-entries ,(plist-get properties :entries)) + (setq evil-list-view-select-action ,(plist-get properties :select-action)) + (evil-list-view-mode) + (setq mode-name ,(plist-get properties :mode-name)) + (evil-motion-state)) + (switch-to-buffer-other-window buf)))) + +(provide 'evil-common) + +;;; evil-common.el ends here diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-common.elc b/.emacs.d/elpa/evil-20210527.2107/evil-common.elc new file mode 100644 index 0000000..e895d62 Binary files /dev/null and b/.emacs.d/elpa/evil-20210527.2107/evil-common.elc differ diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-core.el b/.emacs.d/elpa/evil-20210527.2107/evil-core.el new file mode 100644 index 0000000..2b8025e --- /dev/null +++ b/.emacs.d/elpa/evil-20210527.2107/evil-core.el @@ -0,0 +1,1393 @@ +;;; evil-core.el --- Core functionality -*- lexical-binding: t -*- +;; Author: Vegard Øye <vegard_oye at hotmail.com> +;; Maintainer: Vegard Øye <vegard_oye at hotmail.com> + +;; Version: 1.14.0 + +;; +;; This file is NOT part of GNU Emacs. + +;;; License: + +;; This file is part of Evil. +;; +;; Evil is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; Evil is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with Evil. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: + +;; Evil is defined as a globalized minor mode, enabled with the toggle +;; function `evil-mode'. This in turn enables `evil-local-mode' in +;; every buffer, which sets up the buffer's state. +;; +;; Each state has its own keymaps, and these keymaps have status as +;; "emulation keymaps" with priority over regular keymaps. Emacs +;; maintains the following keymap hierarchy (highest priority first): +;; +;; * Overriding keymaps/overlay keymaps... +;; * Emulation mode keymaps... +;; - Evil keymaps... +;; * Minor mode keymaps... +;; * Local keymap (`local-set-key') +;; * Global keymap (`global-set-key') +;; +;; Within this hierarchy, Evil arranges the keymaps for the current +;; state as shown below: +;; +;; * Intercept keymaps... +;; * Local state keymap +;; * Minor-mode keymaps... +;; * Auxiliary keymaps... +;; * Overriding keymaps... +;; * Global state keymap +;; * Keymaps for other states... +;; +;; These keymaps are listed in `evil-mode-map-alist', which is listed +;; in `emulation-mode-map-alist'. +;; +;; Most of the key bindings for a state are stored in its global +;; keymap, which has a name such as `evil-normal-state-map'. (See the +;; file evil-maps.el, which contains all the default key bindings.) A +;; state also has a local keymap (`evil-normal-state-local-map'), +;; which may contain user customizations for the current buffer. +;; Furthermore, any Emacs mode may be assigned state bindings of its +;; own by passing the mode's keymap to the function `evil-define-key' +;; or `evil-define-minor-mode-key'. The former uses a specific map to +;; define the key in while the latter associates the key with a +;; particular mode. These mode-specific bindings are ultimately stored +;; in so-called auxiliary and minor-mode keymaps respectively, which +;; are sandwiched between the local keymap and the global keymap. +;; Finally, the state may also activate the keymaps of other states +;; (e.g., Normal state inherits bindings from Motion state). +;; +;; For integration purposes, a regular Emacs keymap may be "elevated" +;; to emulation status by passing it to `evil-make-intercept-map' or +;; `evil-make-overriding-map'. An "intercept" keymap has priority over +;; all other Evil keymaps. (Evil uses this facility when debugging and +;; for handling the "ESC" key in the terminal.) More common is the +;; "overriding" keymap, which only has priority over the global state +;; keymap. (This is useful for adapting key-heavy modes such as Dired, +;; where all but a few keys should be left as-is and should not be +;; shadowed by Evil's default bindings.) +;; +;; States are defined with the macro `evil-define-state', which +;; creates a command for switching to the state. This command, +;; for example `evil-normal-state' for Normal state, performs +;; the following tasks: +;; +;; * Setting `evil-state' to the new state. +;; * Refreshing the keymaps in `evil-mode-map-alist'. +;; * Updating the mode line. +;; - Normal state depends on `evil-normal-state-tag'. +;; * Adjusting the cursor's appearance. +;; - Normal state depends on `evil-normal-state-cursor'. +;; * Displaying a message in the echo area. +;; - Normal state depends on `evil-normal-state-message'. +;; * Running hooks. +;; - Normal state runs `evil-normal-state-entry-hook' when +;; entering, and `evil-normal-state-exit-hook' when exiting. +;; +;; The various properties of a state can be accessed through their +;; respective variables, or by passing a keyword and the state's name +;; to the `evil-state-property' function. Evil defines the states +;; Normal state ("normal"), Insert state ("insert"), Visual state +;; ("visual"), Replace state ("replace"), Operator-Pending state +;; ("operator"), Motion state ("motion") and Emacs state ("emacs"). + +(require 'evil-common) + +;;; Code: + +(declare-function evil-emacs-state-p "evil-states") +(declare-function evil-ex-p "evil-ex") +(defvar evil-mode-buffers) + +(define-minor-mode evil-local-mode + "Minor mode for setting up Evil in a single buffer." + :init-value nil + (cond + ((evil-disabled-buffer-p) + ;; Don't leave the mode variable on in buffers where evil disabled, because + ;; functions that check this variable will get an incorrect result (e.g., + ;; evil-refresh-cursor). + (setq evil-local-mode nil)) + (evil-local-mode + (setq emulation-mode-map-alists + (evil-concat-lists '(evil-mode-map-alist) + emulation-mode-map-alists)) + (evil-initialize-local-keymaps) + ;; restore the proper value of `major-mode' in Fundamental buffers + (when (eq major-mode 'turn-on-evil-mode) + (setq major-mode 'fundamental-mode)) + (when (minibufferp) + (setq-local evil-default-state 'insert) + (setq-local evil-echo-state nil)) + ;; The initial state is usually setup by `evil-initialize' when + ;; the major-mode in a buffer changes. This preliminary + ;; initialization is only for the case when `evil-local-mode' is + ;; called directly for the first time in a buffer. + (unless evil-state (evil-initialize-state)) + (add-hook 'input-method-activate-hook 'evil-activate-input-method t t) + (add-hook 'input-method-deactivate-hook 'evil-deactivate-input-method t t) + (add-hook 'activate-mark-hook 'evil-visual-activate-hook nil t) + (add-hook 'pre-command-hook 'evil-repeat-pre-hook) + (add-hook 'post-command-hook 'evil-repeat-post-hook)) + (t + (evil-refresh-mode-line) + (remove-hook 'activate-mark-hook 'evil-visual-activate-hook t) + (remove-hook 'input-method-activate-hook 'evil-activate-input-method t) + (remove-hook 'input-method-deactivate-hook 'evil-deactivate-input-method t) + (evil-change-state nil)))) + +;; Make the variable permanent local. This is particular useful in +;; conjunction with nXhtml/mumamo because mumamo does not touch these +;; variables. +(put 'evil-local-mode 'permanent-local t) + +(defun turn-on-evil-mode (&optional arg) + "Turn on Evil in the current buffer." + (interactive) + (evil-local-mode (or arg 1))) + +(defun turn-off-evil-mode (&optional arg) + "Turn off Evil in the current buffer." + (interactive) + (evil-local-mode (or arg -1))) + +;; The function `evil-initialize' should only be used to initialize +;; `evil-local-mode' from the globalized minor-mode `evil-mode'. It is +;; called whenever evil is enabled in a buffer for the first time or +;; when evil is active and the major-mode of the buffer changes. In +;; addition to enabling `evil-local-mode' it also sets the initial +;; evil-state according to the major-mode. +(defun evil-initialize () + "Enable Evil in the current buffer, if appropriate. +To enable Evil globally, do (evil-mode 1)." + (unless (and (minibufferp) (not evil-want-minibuffer)) + (evil-local-mode 1) + (evil-initialize-state))) + +;;;###autoload (autoload 'evil-mode "evil" nil t) +(define-globalized-minor-mode evil-mode + evil-local-mode evil-initialize) + +;; No hooks are run in Fundamental buffers, so other measures are +;; necessary to initialize Evil in these buffers. When Evil is +;; enabled globally, the default value of `major-mode' is set to +;; `turn-on-evil-mode', so that Evil is enabled in Fundamental +;; buffers as well. Then, the buffer-local value of `major-mode' is +;; changed back to `fundamental-mode'. (Since the `evil-mode' function +;; is created by a macro, we use `defadvice' to augment it.) +(defadvice evil-mode (after start-evil activate) + "Enable Evil in Fundamental mode." + (if evil-mode + (progn + (when (eq (default-value 'major-mode) 'fundamental-mode) + ;; changed back by `evil-local-mode' + (setq-default major-mode 'turn-on-evil-mode)) + (ad-enable-regexp "^evil") + (ad-activate-regexp "^evil") + (with-no-warnings (evil-esc-mode 1))) + (when (eq (default-value 'major-mode) 'turn-on-evil-mode) + (setq-default major-mode 'fundamental-mode)) + (ad-disable-regexp "^evil") + (ad-update-regexp "^evil") + (with-no-warnings (evil-esc-mode -1)))) + +(defun evil-change-state (state &optional message) + "Change the state to STATE. +If STATE is nil, disable all states." + (let ((func (evil-state-property (or state evil-state) :toggle))) + (when (and (functionp func) + (or message (not (eq state evil-state)))) + (funcall func (if state (and message 1) -1))))) + +(defmacro evil-save-state (&rest body) + "Save the current state; execute BODY; restore the state." + (declare (indent defun) + (debug t)) + `(let* ((evil-state evil-state) + (evil-previous-state evil-previous-state) + (evil-previous-state-alist (copy-tree evil-previous-state-alist)) + (evil-next-state evil-next-state) + (old-state evil-state) + (inhibit-quit t) + (buf (current-buffer))) + (unwind-protect + (progn ,@body) + (when (buffer-live-p buf) + (with-current-buffer buf + (evil-change-state old-state)))))) + +(defmacro evil-with-state (state &rest body) + "Change to STATE and execute BODY without refreshing the display. +Restore the previous state afterwards." + (declare (indent defun) + (debug t)) + `(evil-without-display + (evil-save-state + (evil-change-state ',state) + ,@body))) + +(defun evil-initializing-p (&optional buffer) + "Whether Evil is in the process of being initialized." + (memq (or buffer (current-buffer)) evil-mode-buffers)) + +(defun evil-initialize-state (&optional state buffer) + "Set up the initial state for BUFFER. +BUFFER defaults to the current buffer. +Uses STATE if specified, or calls `evil-initial-state-for-buffer'. +See also `evil-set-initial-state'." + (with-current-buffer (or buffer (current-buffer)) + (if state (evil-change-state state) + (evil-change-to-initial-state buffer)))) +(put 'evil-initialize-state 'permanent-local-hook t) + +(defun evil-initial-state-for-buffer-name (&optional name default) + "Return the initial Evil state to use for a buffer with name NAME. +Matches the name against the regular expressions in +`evil-buffer-regexps'. If none matches, returns DEFAULT." + (let ((name (if (stringp name) name (buffer-name name))) + regexp state) + (when (stringp name) + (catch 'done + (dolist (entry evil-buffer-regexps default) + (setq regexp (car entry) + state (cdr entry)) + (when (string-match regexp name) + (throw 'done state))))))) + +(defun evil-disabled-buffer-p (&optional buffer) + "Whether Evil should be disabled in BUFFER." + (null (evil-initial-state-for-buffer-name buffer 'undefined))) + +(defun evil-initial-state-for-buffer (&optional buffer default) + "Return the initial Evil state to use for BUFFER. +BUFFER defaults to the current buffer. Returns DEFAULT +if no initial state is associated with BUFFER. +See also `evil-initial-state'." + (with-current-buffer (or buffer (current-buffer)) + (or (evil-initial-state-for-buffer-name (buffer-name)) + (catch 'done + (dolist (mode minor-mode-map-alist) + (setq mode (car-safe mode)) + (when (and (boundp mode) (symbol-value mode)) + (when (setq mode (evil-initial-state mode)) + (throw 'done mode))))) + (evil-initial-state major-mode nil t) + default))) + +(defun evil-initial-state (mode &optional default follow-parent checked-modes) + "Return the Evil state to use for MODE or its alias. +Returns DEFAULT if no initial state is associated with MODE. +The initial state for a mode can be set with +`evil-set-initial-state'. + +If FOLLOW-PARENT is non-nil, also check parent modes of MODE and +its alias. CHECKED-MODES is used internally and should not be set +initially." + (cond + ((and mode (symbolp mode) (memq mode checked-modes)) + (error "Circular reference detected in ancestors of %s\n%s" + major-mode checked-modes)) + ((and mode (symbolp mode)) + (let ((mode-alias (let ((func (symbol-function mode))) + (when (symbolp func) + func))) + state modes) + (or + (catch 'done + (dolist (entry (evil-state-property t :modes) default) + (setq state (car entry) + modes (symbol-value (cdr entry))) + (when (or (memq mode modes) + (and mode-alias + (memq mode-alias modes))) + (throw 'done state)))) + (when follow-parent + (evil-initial-state (get mode 'derived-mode-parent) + nil t (cons mode checked-modes))) + (when follow-parent + (evil-initial-state (get mode-alias 'derived-mode-parent) + nil t (cons mode-alias checked-modes)))))))) + +(defun evil-set-initial-state (mode state) + "Set the initial state for major mode MODE to STATE. +This is the state the buffer comes up in." + (dolist (modes (evil-state-property t :modes)) + (setq modes (cdr-safe modes)) + (set modes (delq mode (symbol-value modes)))) + (when state + (add-to-list (evil-state-property state :modes) mode))) + +(evil-define-command evil-change-to-initial-state + (&optional buffer message) + "Change the state of BUFFER to its initial state. +This is the state the buffer came up in. If Evil is not activated +then this function does nothing." + :keep-visual t + :suppress-operator t + (with-current-buffer (or buffer (current-buffer)) + (when evil-local-mode + (evil-change-state (evil-initial-state-for-buffer + buffer (or evil-default-state 'normal)) + message)))) + +(evil-define-command evil-change-to-previous-state + (&optional buffer message) + "Change the state of BUFFER to its previous state." + :keep-visual t + :repeat abort + :suppress-operator t + (with-current-buffer (or buffer (current-buffer)) + (let ((prev-state evil-previous-state) + (prev-prev-state (cdr-safe (assoc evil-previous-state + evil-previous-state-alist)))) + (evil-change-state nil) + (when prev-prev-state + (setq evil-previous-state prev-prev-state)) + (evil-change-state (or prev-state evil-default-state 'normal) + message)))) + +;; When a buffer is created in a low-level way, it is invisible to +;; Evil (as well as other globalized minor modes) because no hooks are +;; run. This is appropriate since many buffers are used for throwaway +;; purposes. Passing the buffer to `set-window-buffer' indicates +;; otherwise, though, so advise this function to initialize Evil. +(defadvice set-window-buffer (before evil) + "Initialize Evil in the displayed buffer." + (when evil-mode + (when (get-buffer (ad-get-arg 1)) + (with-current-buffer (ad-get-arg 1) + (unless evil-local-mode + (evil-local-mode 1)))))) + +;; Refresh cursor color. +;; Cursor color can only be set for each frame but not for each buffer. +(add-hook 'window-configuration-change-hook 'evil-refresh-cursor) +(defadvice select-window (after evil activate) + (evil-refresh-cursor)) + +(defun evil-generate-mode-line-tag (&optional state) + "Generate the evil mode-line tag for STATE." + (let ((tag (evil-state-property state :tag t))) + (when (functionp tag) + (setq tag (funcall tag))) + ;; prepare mode-line: add tooltip + (if (stringp tag) + (propertize tag + 'help-echo (evil-state-property state :name) + 'mouse-face 'mode-line-highlight) + tag))) + +(defun evil-refresh-mode-line (&optional state) + "Refresh mode line tag." + (when (listp mode-line-format) + (setq evil-mode-line-tag (evil-generate-mode-line-tag state)) + ;; refresh mode line data structure + ;; first remove evil from mode-line + (setq mode-line-format (delq 'evil-mode-line-tag mode-line-format)) + (let ((mlpos mode-line-format) + pred which where) + ;; determine before/after which symbol the tag should be placed + (cond + ((eq evil-mode-line-format 'before) + (setq where 'after which 'mode-line-position)) + ((eq evil-mode-line-format 'after) + (setq where 'after which 'mode-line-modes)) + ((consp evil-mode-line-format) + (setq where (car evil-mode-line-format) + which (cdr evil-mode-line-format)))) + ;; find the cons-cell of the symbol before/after which the tag + ;; should be placed + (while (and mlpos + (let ((sym (or (car-safe (car mlpos)) (car mlpos)))) + (not (eq which sym)))) + (setq pred mlpos + mlpos (cdr mlpos))) + ;; put evil tag at the right position in the mode line + (cond + ((not mlpos)) ;; position not found, so do not add the tag + ((eq where 'before) + (if pred + (setcdr pred (cons 'evil-mode-line-tag mlpos)) + (setq mode-line-format + (cons 'evil-mode-line-tag mode-line-format)))) + ((eq where 'after) + (setcdr mlpos (cons 'evil-mode-line-tag (cdr mlpos))))) + (force-mode-line-update)))) + +;; input methods should be disabled in non-insertion states +(defun evil-activate-input-method () + "Enable input method in states with :input-method non-nil." + (let (input-method-activate-hook + input-method-deactivate-hook) + (when (and evil-local-mode evil-state) + (setq evil-input-method current-input-method) + (unless (evil-state-property evil-state :input-method) + (deactivate-input-method))))) +(put 'evil-activate-input-method 'permanent-local-hook t) + +(defun evil-deactivate-input-method () + "Disable input method in all states." + (let (input-method-activate-hook + input-method-deactivate-hook) + (when (and evil-local-mode evil-state) + (setq evil-input-method nil)))) +(put 'evil-deactivate-input-method 'permanent-local-hook t) + +(defmacro evil-without-input-method-hooks (&rest body) + "Execute body with evil's activate/deactivate-input-method hooks deactivated. + +This allows input methods to be used in normal-state." + `(unwind-protect + (progn + (remove-hook 'input-method-activate-hook 'evil-activate-input-method t) + (remove-hook 'input-method-deactivate-hook + 'evil-deactivate-input-method t) + ,@body) + (progn + (add-hook 'input-method-activate-hook 'evil-activate-input-method nil t) + (add-hook 'input-method-deactivate-hook + 'evil-deactivate-input-method nil t)))) + +(defadvice toggle-input-method (around evil) + "Refresh `evil-input-method'." + (cond + ((not evil-local-mode) + ad-do-it) + ((evil-state-property evil-state :input-method) + ad-do-it) + (t + (let ((current-input-method evil-input-method)) + ad-do-it)))) + +;; Local keymaps are implemented using buffer-local variables. +;; However, unless a buffer-local value already exists, +;; `define-key' acts on the variable's default (global) value. +;; So we need to initialize the variable whenever we enter a +;; new buffer or when the buffer-local values are reset. +(defun evil-initialize-local-keymaps () + "Initialize a buffer-local value for local keymaps as necessary. +The initial value is that of `make-sparse-keymap'." + (dolist (entry evil-local-keymaps-alist) + (let ((map (cdr entry))) + (unless (and (keymapp (symbol-value map)) + (local-variable-p map)) + (set map (make-sparse-keymap)))))) + +(defun evil-make-overriding-map (keymap &optional state copy) + "Give KEYMAP precedence over the global keymap of STATE. +The keymap will have lower precedence than custom STATE bindings. +If STATE is nil, give it precedence over all states. +If COPY is t, create a copy of KEYMAP and give that +higher precedence. See also `evil-make-intercept-map'." + (let ((key [override-state])) + (if (not copy) + (define-key keymap key (or state 'all)) + (unless (keymapp copy) + (setq copy (assq-delete-all 'menu-bar (copy-keymap keymap)))) + (define-key copy key (or state 'all)) + (define-key keymap key copy)))) + +(defun evil-make-intercept-map (keymap &optional state aux) + "Give KEYMAP precedence over all Evil keymaps in STATE. +If STATE is nil, give it precedence over all states. If AUX is non-nil, make the +auxiliary keymap corresponding to KEYMAP in STATE an intercept keymap instead of +KEYMAP itself. See also `evil-make-overriding-map'." + (let ((key [intercept-state]) + (keymap (if aux + (evil-get-auxiliary-keymap keymap state t t) + keymap))) + (define-key keymap key (or state 'all)))) + +(defmacro evil-define-keymap (keymap doc &rest body) + "Define a keymap KEYMAP listed in `evil-mode-map-alist'. +That means it will have precedence over regular keymaps. + +DOC is the documentation for the variable. BODY, if specified, +is executed after toggling the mode. Optional keyword arguments +may be specified before the body code: + +:mode VAR Mode variable. If unspecified, the variable + is based on the keymap name. +:local BOOLEAN Whether the keymap should be buffer-local, that is, + reinitialized for each buffer. +:func BOOLEAN Create a toggle function even if BODY is empty. + +\(fn KEYMAP DOC [[KEY VAL]...] BODY...)" + (declare (indent defun) + (doc-string 2) + (debug (&define name + [&optional stringp] + [&rest [keywordp sexp]] + def-body))) + (let ((func t) + arg intercept key local mode overriding) + (while (keywordp (car-safe body)) + (setq key (pop body) + arg (pop body)) + (cond + ((eq key :mode) + (setq mode arg)) + ((eq key :local) + (setq local arg)) + ((eq key :func) + (setq func arg)) + ((eq key :intercept) + (setq intercept arg)) + ((eq key :overriding) + (setq overriding arg)))) + (setq mode (or mode + (intern (replace-regexp-in-string + "\\(?:-\\(?:mode-\\)?\\(?:key\\)?map\\)?$" + "-mode" + (symbol-name keymap))))) + `(progn + (defvar ,keymap ,(unless local '(make-sparse-keymap))) + (unless (get ',keymap 'variable-documentation) + (put ',keymap 'variable-documentation ,doc)) + (defvar ,mode nil) + (unless (get ',mode 'variable-documentation) + (put ',mode 'variable-documentation ,doc)) + (make-variable-buffer-local ',mode) + (put ',mode 'permanent-local t) + (when ,intercept + (evil-make-intercept-map ,keymap)) + (when ,overriding + (evil-make-overriding-map ,keymap)) + ,@(if local + `((make-variable-buffer-local ',keymap) + (put ',keymap 'permanent-local t) + (evil--add-to-alist 'evil-local-keymaps-alist + ',mode ',keymap)) + `((evil--add-to-alist 'evil-global-keymaps-alist + ',mode ',keymap) + (evil--add-to-alist 'evil-mode-map-alist + ',mode ,keymap))) + ,(when (or body func) + `(defun ,mode (&optional arg) + ,@(when doc `(,doc)) + (interactive) + (cond + ((numberp arg) + (setq ,mode (> arg 0))) + (t + (setq ,mode (not ,mode)))) + ,@body)) + ',keymap))) + +;; The ESC -> escape translation code has been provided by Stefan +;; Monnier in the discussion of GNU Emacs bug #13793. +(defun evil-esc-mode (&optional arg) + "Toggle interception of \\e (escape). +Enable with positive ARG and disable with negative ARG. + +When enabled, `evil-esc-mode' modifies the entry of \\e in +`input-decode-map'. If such an event arrives, it is translated to +a plain 'escape event if no further event occurs within +`evil-esc-delay' seconds. Otherwise no translation happens and +the ESC prefix map (i.e. the map originally bound to \\e in +`input-decode-map`) is returned." + (cond + ((or (null arg) (eq arg 0)) + (evil-esc-mode (if evil-esc-mode -1 +1))) + ((> arg 0) + (unless evil-esc-mode + (setq evil-esc-mode t) + (add-hook 'after-make-frame-functions #'evil-init-esc) + (mapc #'evil-init-esc (frame-list)))) + ((< arg 0) + (when evil-esc-mode + (remove-hook 'after-make-frame-functions #'evil-init-esc) + (mapc #'evil-deinit-esc (frame-list)) + (setq evil-esc-mode nil))))) + +(defun evil-init-esc (frame) + "Update `input-decode-map' in terminal." + (with-selected-frame frame + (let ((term (frame-terminal frame))) + (when (and + (or (eq evil-intercept-esc 'always) + (and evil-intercept-esc + (eq (terminal-live-p term) t))) ; only patch tty + (not (terminal-parameter term 'evil-esc-map))) + (let ((evil-esc-map (lookup-key input-decode-map [?\e]))) + (set-terminal-parameter term 'evil-esc-map evil-esc-map) + (define-key input-decode-map [?\e] + `(menu-item "" ,evil-esc-map :filter ,#'evil-esc))))))) + +(defun evil-deinit-esc (frame) + "Restore `input-decode-map' in terminal." + (with-selected-frame frame + (let ((term (frame-terminal frame))) + (when (terminal-live-p term) + (let ((evil-esc-map (terminal-parameter term 'evil-esc-map))) + (when evil-esc-map + (define-key input-decode-map [?\e] evil-esc-map) + (set-terminal-parameter term 'evil-esc-map nil))))))) + +(defun evil-esc (map) + "Translate \\e to 'escape if no further event arrives. +This function is used to translate a \\e event either to 'escape +or to the standard ESC prefix translation map. If \\e arrives, +this function waits for `evil-esc-delay' seconds for another +event. If no other event arrives, the event is translated to +'escape, otherwise it is translated to the standard ESC prefix +map stored in `input-decode-map'. If `evil-inhibit-esc' is +non-nil or if evil is in emacs state, the event is always +translated to the ESC prefix. + +The translation to 'escape happens only if the current command +has indeed been triggered by \\e. In other words, this will only +happen when the keymap is accessed from `read-key-sequence'. In +particular, if it is access from `define-key' the returned +mapping will always be the ESC prefix map." + (if (and (not evil-inhibit-esc) + (or evil-local-mode (evil-ex-p) + (active-minibuffer-window)) + (not (evil-emacs-state-p)) + (let ((keys (this-single-command-keys))) + (and (> (length keys) 0) + (= (aref keys (1- (length keys))) ?\e))) + (sit-for evil-esc-delay)) + (prog1 [escape] + (when defining-kbd-macro + (end-kbd-macro) + (setq last-kbd-macro (vconcat last-kbd-macro [escape])) + (start-kbd-macro t t))) + map)) + +(defun evil-state-p (sym) + "Whether SYM is the name of a state." + (assq sym evil-state-properties)) + +(defun evil-state-keymaps (state &rest excluded) + "Return a keymap alist of keymaps activated by STATE. +If STATE references other states in its :enable property, +these states are recursively processed and added to the list. +\(The EXCLUDED argument is an internal safeguard against +infinite recursion, keeping track of processed states.)" + (let* ((state (or state evil-state)) + (enable (evil-state-property state :enable)) + (map (cons + (evil-state-property state :mode) + (evil-state-property state :keymap t))) + (local-map (cons + (evil-state-property state :local) + (evil-state-property state :local-keymap t))) + (minor-mode-maps (evil-state-minor-mode-keymaps state)) + (aux-maps (evil-state-auxiliary-keymaps state)) + (overriding-maps + (evil-state-overriding-keymaps state)) + (intercept-maps + (evil-state-intercept-keymaps state)) + (result `(,intercept-maps)) + (remove-duplicates (null excluded))) + (unless (memq state enable) + (setq enable (cons state enable))) + ;; process STATE's :enable property + (dolist (entry enable) + (cond + ((memq entry excluded)) + ;; the keymaps for STATE + ((eq entry state) + (setq result `(,@result + (,local-map) + ,minor-mode-maps + ,aux-maps + ,overriding-maps + (,map))) + (push state excluded)) + ;; the keymaps for another state: call `evil-state-keymaps' + ;; recursively, but keep track of processed states + ((evil-state-p entry) + (setq result `(,@result + ,(apply #'evil-state-keymaps entry excluded)))) + ;; a single keymap + ((or (keymapp entry) + (and (keymapp (symbol-value entry)) + (setq entry (symbol-value entry))) + (setq entry (evil-keymap-for-mode entry))) + (setq result `(,@result + ((,(evil-mode-for-keymap entry t) . + ,entry))))))) + ;; postpone the expensive filtering of duplicates to the top level + (if remove-duplicates + (apply #'evil-concat-keymap-alists result) + (apply #'append result)))) + +(defun evil-normalize-keymaps (&optional state) + "Create a buffer-local value for `evil-mode-map-alist'. +This is a keymap alist, determined by the current state +\(or by STATE if specified)." + (let ((state (or state evil-state)) + (excluded '(nil t)) + map mode temp) + ;; initialize buffer-local keymaps as necessary + (evil-initialize-local-keymaps) + ;; deactivate keymaps of previous state + (dolist (entry evil-mode-map-alist) + (setq mode (car-safe entry) + map (cdr-safe entry)) + ;; don't deactivate overriding keymaps; + ;; they are toggled by their associated mode + (if (or (memq mode excluded) + (evil-intercept-keymap-p map) + (evil-overriding-keymap-p map) + (evil-auxiliary-keymap-p map) + (evil-minor-mode-keymap-p map)) + (push mode excluded) + (when (and (fboundp mode) (symbol-value mode)) + (funcall mode -1)) + (set mode nil))) + (setq evil-mode-map-alist nil) + ;; activate keymaps of current state + (when state + (setq temp (evil-state-keymaps state)) + (dolist (entry temp) + (setq mode (car entry) + map (cdr entry)) + (unless (or (and (boundp mode) (symbol-value mode)) + ;; the minor-mode keymaps include modes that are not + ;; necessarily active + (evil-minor-mode-keymap-p map)) + (when (fboundp mode) + (funcall mode 1)) + (set mode t)) + ;; refresh the keymap in case it has changed + ;; (e.g., `evil-operator-shortcut-map' is + ;; reset on toggling) + (if (or (memq mode excluded) + (evil-intercept-keymap-p map) + (evil-overriding-keymap-p map) + (evil-auxiliary-keymap-p map) + (evil-minor-mode-keymap-p map)) + (push mode excluded) + (setcdr entry (or (evil-keymap-for-mode mode) map)))) + ;; update `evil-mode-map-alist' + (setq evil-mode-map-alist temp)))) + +(defun evil-mode-for-keymap (keymap &optional default) + "Return the minor mode associated with KEYMAP. +Returns DEFAULT if no mode is found. +See also `evil-keymap-for-mode'." + (let ((map (if (keymapp keymap) keymap (symbol-value keymap))) + (var (when (symbolp keymap) keymap))) + ;; Check Evil variables first for speed purposes. + ;; If all else fails, check `minor-mode-map-alist'. + (or (when var + (or (car (rassq var evil-global-keymaps-alist)) + (car (rassq var evil-local-keymaps-alist)))) + (car (rassq map (mapcar #'(lambda (e) + ;; from (MODE-VAR . MAP-VAR) + ;; to (MODE-VAR . MAP) + (cons (car-safe e) + (symbol-value (cdr-safe e)))) + (append evil-global-keymaps-alist + evil-local-keymaps-alist)))) + (car (rassq map minor-mode-map-alist)) + default))) + +(defun evil-keymap-for-mode (mode &optional variable) + "Return the keymap associated with MODE. +Return the keymap variable if VARIABLE is non-nil. +See also `evil-mode-for-keymap'." + (let* ((var (or (cdr (assq mode evil-global-keymaps-alist)) + (cdr (assq mode evil-local-keymaps-alist)))) + (map (or (symbol-value var) + (cdr (assq mode minor-mode-map-alist))))) + (if variable var map))) + +(defun evil-state-auxiliary-keymaps (state) + "Return a keymap alist of auxiliary keymaps for STATE." + (let ((state (or state evil-state)) + aux result) + (dolist (map (current-active-maps) result) + (when (setq aux (evil-get-auxiliary-keymap map state)) + (push (cons (evil-mode-for-keymap map t) aux) result))) + (nreverse result))) + +(defun evil-state-minor-mode-keymaps (state) + "Return a keymap alist of minor-mode keymaps for STATE." + (let* ((state (or state evil-state)) + (state-entry (assq state evil-minor-mode-keymaps-alist))) + (when state-entry + (cdr state-entry)))) + +(defun evil-state-overriding-keymaps (&optional state) + "Return a keymap alist of overriding keymaps for STATE." + (let* ((state (or state evil-state)) + result) + (dolist (map (current-active-maps)) + (when (setq map (evil-overriding-keymap-p map state)) + (push (cons (evil-mode-for-keymap map t) map) result))) + (nreverse result))) + +(defun evil-state-intercept-keymaps (&optional state) + "Return a keymap alist of intercept keymaps for STATE." + (let* ((state (or state evil-state)) + result) + (dolist (map (current-active-maps)) + (when (setq map (or (evil-intercept-keymap-p map state) + (evil-intercept-keymap-p + (evil-get-auxiliary-keymap map state) state))) + (push (cons (evil-mode-for-keymap map t) map) result))) + (setq result (nreverse result)) + result)) + +(defun evil-set-auxiliary-keymap (map state &optional aux) + "Set the auxiliary keymap for MAP in STATE to AUX. +If AUX is nil, create a new auxiliary keymap." + (unless (keymapp aux) + (setq aux (make-sparse-keymap))) + (unless (evil-auxiliary-keymap-p aux) + (evil-set-keymap-prompt + aux (format "Auxiliary keymap for %s" + (or (evil-state-property state :name) + (format "%s state" state))))) + (define-key map + (vconcat (list (intern (format "%s-state" state)))) aux) + aux) +(put 'evil-set-auxiliary-keymap 'lisp-indent-function 'defun) + +(defun evil-get-auxiliary-keymap (map state &optional create ignore-parent) + "Get the auxiliary keymap for MAP in STATE. +If CREATE is non-nil, create an auxiliary keymap +if MAP does not have one. If CREATE and +IGNORE-PARENT are non-nil then a new auxiliary +keymap is created even if the parent of MAP has +one already." + (when state + (let* ((key (vconcat (list (intern (format "%s-state" state))))) + (parent-aux (when (and ignore-parent + (keymap-parent map) + state) + (lookup-key (keymap-parent map) key))) + (aux (if state (lookup-key map key) map))) + (cond + ((and ignore-parent + (equal parent-aux aux) + create) + (evil-set-auxiliary-keymap map state)) + ((evil-auxiliary-keymap-p aux) + aux) + (create + (evil-set-auxiliary-keymap map state)))))) + +(defun evil-get-minor-mode-keymap (state mode) + "Get the auxiliary keymap for MODE in STATE, creating one if it +does not already exist." + (let ((state-entry (assq state evil-minor-mode-keymaps-alist))) + (if (and state-entry + (assq mode state-entry)) + (cdr (assq mode state-entry)) + (let ((map (make-sparse-keymap))) + (evil-set-keymap-prompt + map (format "Minor-mode keymap for %s in %s" + (symbol-name mode) + (or (evil-state-property state :name) + (format "%s state" state)))) + (if state-entry + (setcdr state-entry + (append (list (cons mode map)) (cdr state-entry))) + (push (cons state (list (cons mode map))) + evil-minor-mode-keymaps-alist)) + map)))) + +(defun evil-auxiliary-keymap-p (map) + "Whether MAP is an auxiliary keymap." + (and (keymapp map) + (string-match-p "Auxiliary keymap" + (or (keymap-prompt map) "")) t)) + +(defun evil-minor-mode-keymap-p (map) + "Whether MAP is a minor-mode keymap." + (and (keymapp map) + (string-match-p "Minor-mode keymap" + (or (keymap-prompt map) "")) t)) + +(defun evil-intercept-keymap-p (map &optional state) + "Whether MAP is an intercept keymap for STATE. +If STATE is nil, it means any state." + (let ((entry (and (keymapp map) + (lookup-key map [intercept-state])))) + (cond + ((null entry) + nil) + ((null state) + map) + ((eq entry state) + map) + ((eq entry 'all) + map)))) + +(defun evil-overriding-keymap-p (map &optional state) + "Whether MAP is an overriding keymap for STATE. +If STATE is nil, it means any state." + (let ((entry (and (keymapp map) + (lookup-key map [override-state])))) + (cond + ((null entry) + nil) + ((keymapp entry) + (evil-overriding-keymap-p entry state)) + ((null state) + map) + ((eq entry state) + map) + ((eq entry 'all) + map)))) + +(defun evil-intercept-keymap-state (map) + "Return the state for the intercept keymap MAP. +A return value of t means all states." + (let ((state (lookup-key map [intercept-state] map))) + (cond + ((keymapp state) + (evil-intercept-keymap-state state)) + ((eq state 'all) + t) + (t + state)))) + +(defun evil-overriding-keymap-state (map) + "Return the state for the overriding keymap MAP. +A return value of t means all states." + (let ((state (lookup-key map [override-state] map))) + (cond + ((keymapp state) + (evil-overriding-keymap-state state)) + ((eq state 'all) + t) + (t + state)))) + +(defun evil-send-leader () + "Put symbol leader in `unread-command-events' to trigger any +<leader> bindings." + (interactive) + (setq prefix-arg current-prefix-arg) + (push '(t . leader) unread-command-events)) + +(defun evil-send-localleader () + "Put symbol localleader in `unread-command-events' to trigger any +<localleader> bindings." + (interactive) + (setq prefix-arg current-prefix-arg) + (push '(t . localleader) unread-command-events)) + +(defun evil-set-leader (state key &optional localleader) + "Set KEY to trigger leader bindings in STATE. +KEY should be in the form produced by `kbd'. STATE is one of +`normal', `insert', `visual', `replace', `operator', `motion', +`emacs', a list of one or more of these, or `nil', which means +all of the above. If LOCALLEADER is non-nil, set the local leader +instead." + (let* ((all-states '(normal insert visual replace operator motion emacs)) + (states (cond ((listp state) state) + ((member state all-states) (list state)) + ((null state) all-states) + ;; Maybe throw error here + (t (list state)))) + (binding (if localleader 'evil-send-localleader 'evil-send-leader))) + (dolist (state states) + (evil-global-set-key state key binding)))) + +(defmacro evil-define-key (state keymap key def &rest bindings) + "Create a STATE binding from KEY to DEF for KEYMAP. +STATE is one of `normal', `insert', `visual', `replace', +`operator', `motion', `emacs', or a list of one or more of +these. Omitting a state by using `nil' corresponds to a standard +Emacs binding using `define-key'. The remaining arguments are +like those of `define-key'. For example: + + (evil-define-key 'normal foo-map \"a\" 'bar) + +This creates a binding from `a' to `bar' in normal state, which +is active whenever `foo-map' is active. Using nil for the state, +the following lead to identical bindings: + + (evil-define-key nil foo-map \"a\" 'bar) + (define-key foo-map \"a\" 'bar) + +It is possible to specify multiple states and/or bindings at +once: + + (evil-define-key '(normal visual) foo-map + \"a\" 'bar + \"b\" 'foo) + +If `foo-map' has not been initialized yet, this macro adds an +entry to `after-load-functions', delaying execution as necessary. + +KEYMAP may also be a quoted symbol. If the symbol is `global', the +global evil keymap corresponding to the state(s) is used, meaning +the following lead to identical bindings: + + (evil-define-key 'normal 'global \"a\" 'bar) + (evil-global-set-key 'normal \"a\" 'bar) + +The symbol `local' may also be used, which corresponds to using +`evil-local-set-key'. If a quoted symbol is used that is not +`global' or `local', it is assumed to be the name of a minor +mode, in which case `evil-define-minor-mode-key' is used." + (declare (indent defun)) + (cond ((member keymap '('global 'local)) + `(evil-define-key* ,state ,keymap ,key ,def ,@bindings)) + ((and (consp keymap) (eq (car keymap) 'quote)) + `(evil-define-minor-mode-key ,state ,keymap ,key ,def ,@bindings)) + (t + `(evil-delay ',(if (symbolp keymap) + `(and (boundp ',keymap) (keymapp ,keymap)) + `(keymapp ,keymap)) + '(condition-case-unless-debug err + (evil-define-key* ,state ,keymap ,key ,def ,@bindings) + (error + (message "error in evil-define-key: %s" + (error-message-string err)))) + 'after-load-functions t nil + (format "evil-define-key-in-%s" + ',(if (symbolp keymap) keymap 'keymap)))))) +(defalias 'evil-declare-key 'evil-define-key) + +(defun evil-define-key* (state keymap key def &rest bindings) + "Create a STATE binding from KEY to DEF for KEYMAP. +STATE is one of normal, insert, visual, replace, operator, +motion, emacs, or a list of one or more of these. Omitting a +state by using nil corresponds to a standard Emacs binding using +`define-key' The remaining arguments are like those of +`define-key'. For example: + + (evil-define-key* 'normal foo-map \"a\" 'bar) + +This creates a binding from \"a\" to bar in Normal state, which +is active whenever foo-map is active. Using nil for the state, +the following are equivalent: + + (evil-define-key* nil foo-map \"a\" 'bar) + + (define-key foo-map \"a\" 'bar) + + It is possible to specify multiple states and/or bindings at + once: + + (evil-define-key* '(normal visual) foo-map + \"a\" 'bar + \"b\" 'foo) + +KEYMAP may also be a quoted symbol. If the symbol is global, the +global evil keymap corresponding to the state(s) is used, meaning +the following are equivalent: + + (evil-define-key* 'normal 'global \"a\" 'bar) + + (evil-global-set-key 'normal \"a\" 'bar) + +The symbol local may also be used, which corresponds to using +`evil-local-set-key'. + +The use is nearly identical to `evil-define-key' with the +exception that this is a function and not a macro (and so will +not be expanded when compiled which can have unintended +consequences). `evil-define-key*' also does not defer any +bindings like `evil-define-key' does using `evil-delay'. This +allows errors in the bindings to be caught immediately, and makes +its behavior more predictable." + (declare (indent defun)) + (let ((maps + (if state + (mapcar + (lambda (st) + (cond ((eq keymap 'global) + (evil-state-property st :keymap t)) + ((eq keymap 'local) + (evil-state-property st :local-keymap t)) + (t + (evil-get-auxiliary-keymap keymap st t t)))) + (if (listp state) state (list state))) + (list + (cond ((eq keymap 'global) + global-map) + ((eq keymap 'local) + ;; see `local-set-key' + (or (current-local-map) + (let ((map (make-sparse-keymap))) + (use-local-map map) + map))) + (t + keymap)))))) + (while key + (dolist (map maps) + (define-key map key def)) + (setq key (pop bindings) + def (pop bindings))) + ;; ensure the prompt string comes first + (dolist (map maps) + (evil-set-keymap-prompt map (keymap-prompt map))))) + +(defun evil-define-minor-mode-key (state mode key def &rest bindings) + "Similar to `evil-define-key' but the bindings are associated +with the minor-mode symbol MODE instead of a particular map. +Associating bindings with a mode symbol instead of a map allows +evil to use Emacs' built-in mechanisms to enable the bindings +automatically when MODE is active without relying on calling +`evil-normalize-keymaps'. Another less significant difference is +that the bindings can be created immediately, because this +function only uses the symbol MODE and does not rely on its +value. + +See `evil-define-key' for the usage of STATE, KEY, DEF and +BINDINGS." + (declare (indent defun)) + (let ((maps (mapcar + (lambda (st) + (evil-get-minor-mode-keymap st mode)) + (if (listp state) state (list state))))) + (while key + (dolist (map maps) + (define-key map key def)) + (setq key (pop bindings) + def (pop bindings))))) + +(defmacro evil-add-hjkl-bindings (keymap &optional state &rest bindings) + "Add \"h\", \"j\", \"k\", \"l\" bindings to KEYMAP in STATE. +Add additional BINDINGS if specified." + (declare (indent defun)) + `(evil-define-key ,state ,keymap + "h" (lookup-key evil-motion-state-map "h") + "j" (lookup-key evil-motion-state-map "j") + "k" (lookup-key evil-motion-state-map "k") + "l" (lookup-key evil-motion-state-map "l") + ":" (lookup-key evil-motion-state-map ":") + ,@bindings)) + +;; may be useful for programmatic purposes +(defun evil-global-set-key (state key def) + "Bind KEY to DEF in STATE." + (define-key (evil-state-property state :keymap t) key def)) + +(defun evil-local-set-key (state key def) + "Bind KEY to DEF in STATE in the current buffer." + (define-key (evil-state-property state :local-keymap t) key def)) + +;; Advise these functions as they may activate an overriding keymap or +;; a keymap with state bindings; if so, refresh `evil-mode-map-alist'. +(defadvice use-global-map (after evil activate) + "Refresh Evil keymaps." + (evil-normalize-keymaps)) + +(defadvice use-local-map (after evil activate) + "Refresh Evil keymaps." + (evil-normalize-keymaps)) + +(defmacro evil-define-state (state doc &rest body) + "Define an Evil state STATE. +DOC is a general description and shows up in all docstrings; +the first line of the string should be the full name of the state. + +BODY is executed each time the state is enabled or disabled. + +Optional keyword arguments: +- `:tag' - the mode line indicator, e.g. \"<T>\". +- `:message' - string shown in the echo area when the state is + activated. +- `:cursor' - default cursor specification. +- `:enable' - list of other state keymaps to enable when in this + state. +- `:entry-hook' - list of functions to run when entering this state. +- `:exit-hook' - list of functions to run when exiting this state. +- `:suppress-keymap' - if non-nil, effectively disables bindings to + `self-insert-command' by making `evil-suppress-map' the parent of + the global state keymap. + +The global keymap of this state will be `evil-test-state-map', +the local keymap will be `evil-test-state-local-map', and so on. + +\(fn STATE DOC [[KEY VAL]...] BODY...)" + (declare (indent defun) + (doc-string 2) + (debug (&define name + [&optional stringp] + [&rest [keywordp sexp]] + def-body))) + (let* ((name (and (string-match "^\\(.+\\)\\(\\(?:.\\|\n\\)*\\)" doc) + (match-string 1 doc))) + (doc (match-string 2 doc)) + (name (and (string-match "^\\(.+?\\)\\.?$" name) + (match-string 1 name))) + (doc (if (or (null doc) (string= doc "")) "" + (format "\n%s" doc))) + (toggle (intern (format "evil-%s-state" state))) + (mode (intern (format "%s-minor-mode" toggle))) + (keymap (intern (format "%s-map" toggle))) + (local (intern (format "%s-local-minor-mode" toggle))) + (local-keymap (intern (format "%s-local-map" toggle))) + (tag (intern (format "%s-tag" toggle))) + (message (intern (format "%s-message" toggle))) + (cursor (intern (format "%s-cursor" toggle))) + (entry-hook (intern (format "%s-entry-hook" toggle))) + (exit-hook (intern (format "%s-exit-hook" toggle))) + (modes (intern (format "%s-modes" toggle))) + (predicate (intern (format "%s-p" toggle))) + arg cursor-value enable entry-hook-value exit-hook-value + input-method key message-value suppress-keymap tag-value) + ;; collect keywords + (while (keywordp (car-safe body)) + (setq key (pop body) + arg (pop body)) + (cond + ((eq key :tag) + (setq tag-value arg)) + ((eq key :message) + (setq message-value arg)) + ((eq key :cursor) + (setq cursor-value arg)) + ((eq key :entry-hook) + (setq entry-hook-value arg) + (unless (listp entry-hook-value) + (setq entry-hook-value (list entry-hook-value)))) + ((eq key :exit-hook) + (setq exit-hook-value arg) + (unless (listp exit-hook-value) + (setq exit-hook-value (list exit-hook-value)))) + ((eq key :enable) + (setq enable arg)) + ((eq key :input-method) + (setq input-method arg)) + ((eq key :suppress-keymap) + (setq suppress-keymap arg)))) + + ;; macro expansion + `(progn + ;; Save the state's properties in `evil-state-properties' for + ;; runtime lookup. Among other things, this information is used + ;; to determine what keymaps should be activated by the state + ;; (and, when processing :enable, what keymaps are activated by + ;; other states). We cannot know this at compile time because + ;; it depends on the current buffer and its active keymaps + ;; (to which we may have assigned state bindings), as well as + ;; states whose definitions may not have been processed yet. + (evil-put-property + 'evil-state-properties ',state + :name ',name + :toggle ',toggle + :mode (defvar ,mode nil + ,(format "Non-nil if %s is enabled. +Use the command `%s' to change this variable." name toggle)) + :keymap (defvar ,keymap (make-sparse-keymap) + ,(format "Keymap for %s." name)) + :local (defvar ,local nil + ,(format "Non-nil if %s is enabled. +Use the command `%s' to change this variable." name toggle)) + :local-keymap (defvar ,local-keymap nil + ,(format "Buffer-local keymap for %s." name)) + :tag (defvar ,tag ,tag-value + ,(format "Mode line tag for %s." name)) + :message (defvar ,message ,message-value + ,(format "Echo area message for %s." name)) + :cursor (defvar ,cursor ',cursor-value + ,(format "Cursor for %s. +May be a cursor type as per `cursor-type', a color string as passed +to `set-cursor-color', a zero-argument function for changing the +cursor, or a list of the above." name)) + :entry-hook (defvar ,entry-hook nil + ,(format "Hooks to run when entering %s." name)) + :exit-hook (defvar ,exit-hook nil + ,(format "Hooks to run when exiting %s." name)) + :modes (defvar ,modes nil + ,(format "Modes that should come up in %s." name)) + :input-method ',input-method + :predicate ',predicate + :enable ',enable) + + ,@(when suppress-keymap + `((set-keymap-parent ,keymap evil-suppress-map))) + + (dolist (func ',entry-hook-value) + (add-hook ',entry-hook func)) + + (dolist (func ',exit-hook-value) + (add-hook ',exit-hook func)) + + (defun ,predicate (&optional state) + ,(format "Whether the current state is %s. +\(That is, whether `evil-state' is `%s'.)" name state) + (and evil-local-mode + (eq (or state evil-state) ',state))) + + ;; define state function + (defun ,toggle (&optional arg) + ,(format "Enable %s. Disable with negative ARG. +If ARG is nil, don't display a message in the echo area.%s" name doc) + (interactive) + (cond + ((and (numberp arg) (< arg 1)) + (setq evil-previous-state evil-state + evil-state nil) + (let ((evil-state ',state)) + (run-hooks ',exit-hook) + (setq evil-state nil) + (evil-normalize-keymaps) + ,@body)) + (t + (unless evil-local-mode + (evil-local-mode 1)) + (let ((evil-next-state ',state) + input-method-activate-hook + input-method-deactivate-hook) + (evil-change-state nil) + (setq evil-state ',state) + (evil--add-to-alist 'evil-previous-state-alist + ',state evil-previous-state) + (let ((evil-state ',state)) + (evil-normalize-keymaps) + (if ',input-method + (activate-input-method evil-input-method) + ;; BUG #475: Deactivate the current input method only + ;; if there is a function to deactivate it, otherwise + ;; an error would be raised. This strange situation + ;; should not arise in general and there should + ;; probably be a better way to handle this situation. + (if deactivate-current-input-method-function + (deactivate-input-method))) + (unless evil-no-display + (evil-refresh-cursor ',state) + (evil-refresh-mode-line ',state) + (when (called-interactively-p 'any) + (redisplay))) + ,@body + (run-hooks ',entry-hook) + (when (and evil-echo-state + arg (not evil-no-display) ,message) + (if (functionp ,message) + (funcall ,message) + (evil-echo "%s" ,message)))))))) + + (evil-set-command-property ',toggle :keep-visual t) + (evil-set-command-property ',toggle :suppress-operator t) + + (evil-define-keymap ,keymap nil + :mode ,mode + :func nil) + + (evil-define-keymap ,local-keymap nil + :mode ,local + :local t + :func nil) + + ',state))) + +(provide 'evil-core) + +;;; evil-core.el ends here diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-core.elc b/.emacs.d/elpa/evil-20210527.2107/evil-core.elc new file mode 100644 index 0000000..e33f762 Binary files /dev/null and b/.emacs.d/elpa/evil-20210527.2107/evil-core.elc differ diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-development.el b/.emacs.d/elpa/evil-20210527.2107/evil-development.el new file mode 100644 index 0000000..1930be7 --- /dev/null +++ b/.emacs.d/elpa/evil-20210527.2107/evil-development.el @@ -0,0 +1,50 @@ +;;; evil-development.el --- Useful features for Evil developers -*- lexical-binding: t -*- + +;; Author: Justin Burkett <justin at burkett dot cc> + +;; Version: 1.14.0 + +;; +;; This file is NOT part of GNU Emacs. + +;;; License: + +;; This file is part of Evil. +;; +;; Evil is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; Evil is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with Evil. If not, see <http://www.gnu.org/licenses/>. + +;;; Code: + +;;; Teach imenu about evil macros + +(with-eval-after-load 'lisp-mode + (when (boundp 'lisp-imenu-generic-expression) + (dolist (macro '("interactive-code" + "type" + "text-object" + "motion" + "command" + "operator")) + (let ((macro-name (format "evil-%s" macro))) + (unless (assoc macro-name lisp-imenu-generic-expression) + (push (list + macro-name + (format "^\\s-*(evil-define-%s\\s-+\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)" + macro) + 1) + lisp-imenu-generic-expression)))))) + +(provide 'evil-development) + +;;; evil-development.el ends here diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-development.elc b/.emacs.d/elpa/evil-20210527.2107/evil-development.elc new file mode 100644 index 0000000..5eb9ff3 Binary files /dev/null and b/.emacs.d/elpa/evil-20210527.2107/evil-development.elc differ diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-digraphs.el b/.emacs.d/elpa/evil-20210527.2107/evil-digraphs.el new file mode 100644 index 0000000..745814e --- /dev/null +++ b/.emacs.d/elpa/evil-20210527.2107/evil-digraphs.el @@ -0,0 +1,1729 @@ +;;; evil-digraphs.el --- Digraphs -*- lexical-binding: t -*- + +;; Author: Vegard Øye <vegard_oye at hotmail.com> +;; Maintainer: Vegard Øye <vegard_oye at hotmail.com> + +;; Version: 1.14.0 + +;; +;; This file is NOT part of GNU Emacs. + +;;; License: + +;; This file is part of Evil. +;; +;; Evil is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; Evil is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with Evil. If not, see <http://www.gnu.org/licenses/>. + +(require 'evil-vars) + +;;; Code: + +(defgroup evil-digraphs nil + "Digraph support based on RFC 1345." + :group 'evil + :prefix "evil-digraph-") + +(defcustom evil-digraphs-table-user nil + "List of user-defined digraphs. +Entries have the form ((?CHAR1 ?CHAR2) . ?DIGRAPH). That is, +a cons cell of the digraph and its character replacement, +where the digraph is a list of two characters. +See also `evil-digraphs-table'." + :type '(alist :key-type (list character character) + :value-type character) + :require 'evil-digraphs + :group 'evil-digraphs) + +(defconst evil-digraphs-table + '(((?N ?U) . ?\x00) + ((?S ?H) . ?\x01) + ((?S ?X) . ?\x02) + ((?E ?X) . ?\x03) + ((?E ?T) . ?\x04) + ((?E ?Q) . ?\x05) + ((?A ?K) . ?\x06) + ((?B ?L) . ?\x07) + ((?B ?S) . ?\x08) + ((?H ?T) . ?\x09) + ((?L ?F) . ?\x0a) + ((?V ?T) . ?\x0b) + ((?F ?F) . ?\x0c) + ((?C ?R) . ?\x0d) + ((?S ?O) . ?\x0e) + ((?S ?I) . ?\x0f) + ((?D ?L) . ?\x10) + ((?D ?1) . ?\x11) + ((?D ?2) . ?\x12) + ((?D ?3) . ?\x13) + ((?D ?4) . ?\x14) + ((?N ?K) . ?\x15) + ((?S ?Y) . ?\x16) + ((?E ?B) . ?\x17) + ((?C ?N) . ?\x18) + ((?E ?M) . ?\x19) + ((?S ?B) . ?\x1a) + ((?E ?C) . ?\x1b) + ((?F ?S) . ?\x1c) + ((?G ?S) . ?\x1d) + ((?R ?S) . ?\x1e) + ((?U ?S) . ?\x1f) + ((?S ?P) . ?\x20) + ((?N ?b) . ?\x23) + ((?D ?O) . ?\x24) + ((?A ?t) . ?\x40) + ((?< ?\() . ?\x5b) + ((?/ ?/) . ?\x5c) + ((?\) ?>) . ?\x5d) + ((?' ?>) . ?\x5e) + ((?' ?!) . ?\x60) + ((?\( ?!) . ?\x7b) + ((?! ?!) . ?\x7c) + ((?! ?\)) . ?\x7d) + ((?' ??) . ?\x7e) + ((?D ?T) . ?\x7f) + ((?P ?A) . ?\x80) + ((?H ?O) . ?\x81) + ((?B ?H) . ?\x82) + ((?N ?H) . ?\x83) + ((?I ?N) . ?\x84) + ((?N ?L) . ?\x85) + ((?S ?A) . ?\x86) + ((?E ?S) . ?\x87) + ((?H ?S) . ?\x88) + ((?H ?J) . ?\x89) + ((?V ?S) . ?\x8a) + ((?P ?D) . ?\x8b) + ((?P ?U) . ?\x8c) + ((?R ?I) . ?\x8d) + ((?S ?2) . ?\x8e) + ((?S ?3) . ?\x8f) + ((?D ?C) . ?\x90) + ((?P ?1) . ?\x91) + ((?P ?2) . ?\x92) + ((?T ?S) . ?\x93) + ((?C ?C) . ?\x94) + ((?M ?W) . ?\x95) + ((?S ?G) . ?\x96) + ((?E ?G) . ?\x97) + ((?S ?S) . ?\x98) + ((?G ?C) . ?\x99) + ((?S ?C) . ?\x9a) + ((?C ?I) . ?\x9b) + ((?S ?T) . ?\x9c) + ((?O ?C) . ?\x9d) + ((?P ?M) . ?\x9e) + ((?A ?C) . ?\x9f) + ((?N ?S) . ?\xa0) + ((?! ?I) . ?\xa1) + ((?C ?t) . ?\xa2) + ((?P ?d) . ?\xa3) + ((?C ?u) . ?\xa4) + ((?Y ?e) . ?\xa5) + ((?B ?B) . ?\xa6) + ((?S ?E) . ?\xa7) + ((?' ?:) . ?\xa8) + ((?C ?o) . ?\xa9) + ((?- ?a) . ?\xaa) + ((?< ?<) . ?\xab) + ((?N ?O) . ?\xac) + ((?- ?-) . ?\xad) + ((?R ?g) . ?\xae) + ((?' ?m) . ?\xaf) + ((?D ?G) . ?\xb0) + ((?+ ?-) . ?\xb1) + ((?2 ?S) . ?\xb2) + ((?3 ?S) . ?\xb3) + ((?' ?') . ?\xb4) + ((?M ?y) . ?\xb5) + ((?P ?I) . ?\xb6) + ((?. ?M) . ?\xb7) + ((?' ?,) . ?\xb8) + ((?1 ?S) . ?\xb9) + ((?- ?o) . ?\xba) + ((?> ?>) . ?\xbb) + ((?1 ?4) . ?\xbc) + ((?1 ?2) . ?\xbd) + ((?3 ?4) . ?\xbe) + ((?? ?I) . ?\xbf) + ((?A ?!) . ?\xc0) + ((?A ?') . ?\xc1) + ((?A ?>) . ?\xc2) + ((?A ??) . ?\xc3) + ((?A ?:) . ?\xc4) + ((?A ?A) . ?\xc5) + ((?A ?E) . ?\xc6) + ((?C ?,) . ?\xc7) + ((?E ?!) . ?\xc8) + ((?E ?') . ?\xc9) + ((?E ?>) . ?\xca) + ((?E ?:) . ?\xcb) + ((?I ?!) . ?\xcc) + ((?I ?') . ?\xcd) + ((?I ?>) . ?\xce) + ((?I ?:) . ?\xcf) + ((?D ?-) . ?\xd0) + ((?N ??) . ?\xd1) + ((?O ?!) . ?\xd2) + ((?O ?') . ?\xd3) + ((?O ?>) . ?\xd4) + ((?O ??) . ?\xd5) + ((?O ?:) . ?\xd6) + ((?* ?X) . ?\xd7) + ((?O ?/) . ?\xd8) + ((?U ?!) . ?\xd9) + ((?U ?') . ?\xda) + ((?U ?>) . ?\xdb) + ((?U ?:) . ?\xdc) + ((?Y ?') . ?\xdd) + ((?T ?H) . ?\xde) + ((?s ?s) . ?\xdf) + ((?a ?!) . ?\xe0) + ((?a ?') . ?\xe1) + ((?a ?>) . ?\xe2) + ((?a ??) . ?\xe3) + ((?a ?:) . ?\xe4) + ((?a ?a) . ?\xe5) + ((?a ?e) . ?\xe6) + ((?c ?,) . ?\xe7) + ((?e ?!) . ?\xe8) + ((?e ?') . ?\xe9) + ((?e ?>) . ?\xea) + ((?e ?:) . ?\xeb) + ((?i ?!) . ?\xec) + ((?i ?') . ?\xed) + ((?i ?>) . ?\xee) + ((?i ?:) . ?\xef) + ((?d ?-) . ?\xf0) + ((?n ??) . ?\xf1) + ((?o ?!) . ?\xf2) + ((?o ?') . ?\xf3) + ((?o ?>) . ?\xf4) + ((?o ??) . ?\xf5) + ((?o ?:) . ?\xf6) + ((?- ?:) . ?\xf7) + ((?o ?/) . ?\xf8) + ((?u ?!) . ?\xf9) + ((?u ?') . ?\xfa) + ((?u ?>) . ?\xfb) + ((?u ?:) . ?\xfc) + ((?y ?') . ?\xfd) + ((?t ?h) . ?\xfe) + ((?y ?:) . ?\xff) + ((?A ?-) . ?\x0100) + ((?a ?-) . ?\x0101) + ((?A ?\() . ?\x0102) + ((?a ?\() . ?\x0103) + ((?A ?\;) . ?\x0104) + ((?a ?\;) . ?\x0105) + ((?C ?') . ?\x0106) + ((?c ?') . ?\x0107) + ((?C ?>) . ?\x0108) + ((?c ?>) . ?\x0109) + ((?C ?.) . ?\x010a) + ((?c ?.) . ?\x010b) + ((?C ?<) . ?\x010c) + ((?c ?<) . ?\x010d) + ((?D ?<) . ?\x010e) + ((?d ?<) . ?\x010f) + ((?D ?/) . ?\x0110) + ((?d ?/) . ?\x0111) + ((?E ?-) . ?\x0112) + ((?e ?-) . ?\x0113) + ((?E ?\() . ?\x0114) + ((?e ?\() . ?\x0115) + ((?E ?.) . ?\x0116) + ((?e ?.) . ?\x0117) + ((?E ?\;) . ?\x0118) + ((?e ?\;) . ?\x0119) + ((?E ?<) . ?\x011a) + ((?e ?<) . ?\x011b) + ((?G ?>) . ?\x011c) + ((?g ?>) . ?\x011d) + ((?G ?\() . ?\x011e) + ((?g ?\() . ?\x011f) + ((?G ?.) . ?\x0120) + ((?g ?.) . ?\x0121) + ((?G ?,) . ?\x0122) + ((?g ?,) . ?\x0123) + ((?H ?>) . ?\x0124) + ((?h ?>) . ?\x0125) + ((?H ?/) . ?\x0126) + ((?h ?/) . ?\x0127) + ((?I ??) . ?\x0128) + ((?i ??) . ?\x0129) + ((?I ?-) . ?\x012a) + ((?i ?-) . ?\x012b) + ((?I ?\() . ?\x012c) + ((?i ?\() . ?\x012d) + ((?I ?\;) . ?\x012e) + ((?i ?\;) . ?\x012f) + ((?I ?.) . ?\x0130) + ((?i ?.) . ?\x0131) + ((?I ?J) . ?\x0132) + ((?i ?j) . ?\x0133) + ((?J ?>) . ?\x0134) + ((?j ?>) . ?\x0135) + ((?K ?,) . ?\x0136) + ((?k ?,) . ?\x0137) + ((?k ?k) . ?\x0138) + ((?L ?') . ?\x0139) + ((?l ?') . ?\x013a) + ((?L ?,) . ?\x013b) + ((?l ?,) . ?\x013c) + ((?L ?<) . ?\x013d) + ((?l ?<) . ?\x013e) + ((?L ?.) . ?\x013f) + ((?l ?.) . ?\x0140) + ((?L ?/) . ?\x0141) + ((?l ?/) . ?\x0142) + ((?N ?') . ?\x0143) + ((?n ?') . ?\x0144) + ((?N ?,) . ?\x0145) + ((?n ?,) . ?\x0146) + ((?N ?<) . ?\x0147) + ((?n ?<) . ?\x0148) + ((?' ?n) . ?\x0149) + ((?N ?G) . ?\x014a) + ((?n ?g) . ?\x014b) + ((?O ?-) . ?\x014c) + ((?o ?-) . ?\x014d) + ((?O ?\() . ?\x014e) + ((?o ?\() . ?\x014f) + ((?O ?\") . ?\x0150) + ((?o ?\") . ?\x0151) + ((?O ?E) . ?\x0152) + ((?o ?e) . ?\x0153) + ((?R ?') . ?\x0154) + ((?r ?') . ?\x0155) + ((?R ?,) . ?\x0156) + ((?r ?,) . ?\x0157) + ((?R ?<) . ?\x0158) + ((?r ?<) . ?\x0159) + ((?S ?') . ?\x015a) + ((?s ?') . ?\x015b) + ((?S ?>) . ?\x015c) + ((?s ?>) . ?\x015d) + ((?S ?,) . ?\x015e) + ((?s ?,) . ?\x015f) + ((?S ?<) . ?\x0160) + ((?s ?<) . ?\x0161) + ((?T ?,) . ?\x0162) + ((?t ?,) . ?\x0163) + ((?T ?<) . ?\x0164) + ((?t ?<) . ?\x0165) + ((?T ?/) . ?\x0166) + ((?t ?/) . ?\x0167) + ((?U ??) . ?\x0168) + ((?u ??) . ?\x0169) + ((?U ?-) . ?\x016a) + ((?u ?-) . ?\x016b) + ((?U ?\() . ?\x016c) + ((?u ?\() . ?\x016d) + ((?U ?0) . ?\x016e) + ((?u ?0) . ?\x016f) + ((?U ?\") . ?\x0170) + ((?u ?\") . ?\x0171) + ((?U ?\;) . ?\x0172) + ((?u ?\;) . ?\x0173) + ((?W ?>) . ?\x0174) + ((?w ?>) . ?\x0175) + ((?Y ?>) . ?\x0176) + ((?y ?>) . ?\x0177) + ((?Y ?:) . ?\x0178) + ((?Z ?') . ?\x0179) + ((?z ?') . ?\x017a) + ((?Z ?.) . ?\x017b) + ((?z ?.) . ?\x017c) + ((?Z ?<) . ?\x017d) + ((?z ?<) . ?\x017e) + ((?O ?9) . ?\x01a0) + ((?o ?9) . ?\x01a1) + ((?O ?I) . ?\x01a2) + ((?o ?i) . ?\x01a3) + ((?y ?r) . ?\x01a6) + ((?U ?9) . ?\x01af) + ((?u ?9) . ?\x01b0) + ((?Z ?/) . ?\x01b5) + ((?z ?/) . ?\x01b6) + ((?E ?D) . ?\x01b7) + ((?A ?<) . ?\x01cd) + ((?a ?<) . ?\x01ce) + ((?I ?<) . ?\x01cf) + ((?i ?<) . ?\x01d0) + ((?O ?<) . ?\x01d1) + ((?o ?<) . ?\x01d2) + ((?U ?<) . ?\x01d3) + ((?u ?<) . ?\x01d4) + ((?A ?1) . ?\x01de) + ((?a ?1) . ?\x01df) + ((?A ?7) . ?\x01e0) + ((?a ?7) . ?\x01e1) + ((?A ?3) . ?\x01e2) + ((?a ?3) . ?\x01e3) + ((?G ?/) . ?\x01e4) + ((?g ?/) . ?\x01e5) + ((?G ?<) . ?\x01e6) + ((?g ?<) . ?\x01e7) + ((?K ?<) . ?\x01e8) + ((?k ?<) . ?\x01e9) + ((?O ?\;) . ?\x01ea) + ((?o ?\;) . ?\x01eb) + ((?O ?1) . ?\x01ec) + ((?o ?1) . ?\x01ed) + ((?E ?Z) . ?\x01ee) + ((?e ?z) . ?\x01ef) + ((?j ?<) . ?\x01f0) + ((?G ?') . ?\x01f4) + ((?g ?') . ?\x01f5) + ((?\; ?S) . ?\x02bf) + ((?' ?<) . ?\x02c7) + ((?' ?\() . ?\x02d8) + ((?' ?.) . ?\x02d9) + ((?' ?0) . ?\x02da) + ((?' ?\;) . ?\x02db) + ((?' ?\") . ?\x02dd) + ((?A ?%) . ?\x0386) + ((?E ?%) . ?\x0388) + ((?Y ?%) . ?\x0389) + ((?I ?%) . ?\x038a) + ((?O ?%) . ?\x038c) + ((?U ?%) . ?\x038e) + ((?W ?%) . ?\x038f) + ((?i ?3) . ?\x0390) + ((?A ?*) . ?\x0391) + ((?B ?*) . ?\x0392) + ((?G ?*) . ?\x0393) + ((?D ?*) . ?\x0394) + ((?E ?*) . ?\x0395) + ((?Z ?*) . ?\x0396) + ((?Y ?*) . ?\x0397) + ((?H ?*) . ?\x0398) + ((?I ?*) . ?\x0399) + ((?K ?*) . ?\x039a) + ((?L ?*) . ?\x039b) + ((?M ?*) . ?\x039c) + ((?N ?*) . ?\x039d) + ((?C ?*) . ?\x039e) + ((?O ?*) . ?\x039f) + ((?P ?*) . ?\x03a0) + ((?R ?*) . ?\x03a1) + ((?S ?*) . ?\x03a3) + ((?T ?*) . ?\x03a4) + ((?U ?*) . ?\x03a5) + ((?F ?*) . ?\x03a6) + ((?X ?*) . ?\x03a7) + ((?Q ?*) . ?\x03a8) + ((?W ?*) . ?\x03a9) + ((?J ?*) . ?\x03aa) + ((?V ?*) . ?\x03ab) + ((?a ?%) . ?\x03ac) + ((?e ?%) . ?\x03ad) + ((?y ?%) . ?\x03ae) + ((?i ?%) . ?\x03af) + ((?u ?3) . ?\x03b0) + ((?a ?*) . ?\x03b1) + ((?b ?*) . ?\x03b2) + ((?g ?*) . ?\x03b3) + ((?d ?*) . ?\x03b4) + ((?e ?*) . ?\x03b5) + ((?z ?*) . ?\x03b6) + ((?y ?*) . ?\x03b7) + ((?h ?*) . ?\x03b8) + ((?i ?*) . ?\x03b9) + ((?k ?*) . ?\x03ba) + ((?l ?*) . ?\x03bb) + ((?m ?*) . ?\x03bc) + ((?n ?*) . ?\x03bd) + ((?c ?*) . ?\x03be) + ((?o ?*) . ?\x03bf) + ((?p ?*) . ?\x03c0) + ((?r ?*) . ?\x03c1) + ((?* ?s) . ?\x03c2) + ((?s ?*) . ?\x03c3) + ((?t ?*) . ?\x03c4) + ((?u ?*) . ?\x03c5) + ((?f ?*) . ?\x03c6) + ((?x ?*) . ?\x03c7) + ((?q ?*) . ?\x03c8) + ((?w ?*) . ?\x03c9) + ((?j ?*) . ?\x03ca) + ((?v ?*) . ?\x03cb) + ((?o ?%) . ?\x03cc) + ((?u ?%) . ?\x03cd) + ((?w ?%) . ?\x03ce) + ((?' ?G) . ?\x03d8) + ((?, ?G) . ?\x03d9) + ((?T ?3) . ?\x03da) + ((?t ?3) . ?\x03db) + ((?M ?3) . ?\x03dc) + ((?m ?3) . ?\x03dd) + ((?K ?3) . ?\x03de) + ((?k ?3) . ?\x03df) + ((?P ?3) . ?\x03e0) + ((?p ?3) . ?\x03e1) + ((?' ?%) . ?\x03f4) + ((?j ?3) . ?\x03f5) + ((?I ?O) . ?\x0401) + ((?D ?%) . ?\x0402) + ((?G ?%) . ?\x0403) + ((?I ?E) . ?\x0404) + ((?D ?S) . ?\x0405) + ((?I ?I) . ?\x0406) + ((?Y ?I) . ?\x0407) + ((?J ?%) . ?\x0408) + ((?L ?J) . ?\x0409) + ((?N ?J) . ?\x040a) + ((?T ?s) . ?\x040b) + ((?K ?J) . ?\x040c) + ((?V ?%) . ?\x040e) + ((?D ?Z) . ?\x040f) + ((?A ?=) . ?\x0410) + ((?B ?=) . ?\x0411) + ((?V ?=) . ?\x0412) + ((?G ?=) . ?\x0413) + ((?D ?=) . ?\x0414) + ((?E ?=) . ?\x0415) + ((?Z ?%) . ?\x0416) + ((?Z ?=) . ?\x0417) + ((?I ?=) . ?\x0418) + ((?J ?=) . ?\x0419) + ((?K ?=) . ?\x041a) + ((?L ?=) . ?\x041b) + ((?M ?=) . ?\x041c) + ((?N ?=) . ?\x041d) + ((?O ?=) . ?\x041e) + ((?P ?=) . ?\x041f) + ((?R ?=) . ?\x0420) + ((?S ?=) . ?\x0421) + ((?T ?=) . ?\x0422) + ((?U ?=) . ?\x0423) + ((?F ?=) . ?\x0424) + ((?H ?=) . ?\x0425) + ((?C ?=) . ?\x0426) + ((?C ?%) . ?\x0427) + ((?S ?%) . ?\x0428) + ((?S ?c) . ?\x0429) + ((?= ?\") . ?\x042a) + ((?Y ?=) . ?\x042b) + ((?% ?\") . ?\x042c) + ((?J ?E) . ?\x042d) + ((?J ?U) . ?\x042e) + ((?J ?A) . ?\x042f) + ((?a ?=) . ?\x0430) + ((?b ?=) . ?\x0431) + ((?v ?=) . ?\x0432) + ((?g ?=) . ?\x0433) + ((?d ?=) . ?\x0434) + ((?e ?=) . ?\x0435) + ((?z ?%) . ?\x0436) + ((?z ?=) . ?\x0437) + ((?i ?=) . ?\x0438) + ((?j ?=) . ?\x0439) + ((?k ?=) . ?\x043a) + ((?l ?=) . ?\x043b) + ((?m ?=) . ?\x043c) + ((?n ?=) . ?\x043d) + ((?o ?=) . ?\x043e) + ((?p ?=) . ?\x043f) + ((?r ?=) . ?\x0440) + ((?s ?=) . ?\x0441) + ((?t ?=) . ?\x0442) + ((?u ?=) . ?\x0443) + ((?f ?=) . ?\x0444) + ((?h ?=) . ?\x0445) + ((?c ?=) . ?\x0446) + ((?c ?%) . ?\x0447) + ((?s ?%) . ?\x0448) + ((?s ?c) . ?\x0449) + ((?= ?') . ?\x044a) + ((?y ?=) . ?\x044b) + ((?% ?') . ?\x044c) + ((?j ?e) . ?\x044d) + ((?j ?u) . ?\x044e) + ((?j ?a) . ?\x044f) + ((?i ?o) . ?\x0451) + ((?d ?%) . ?\x0452) + ((?g ?%) . ?\x0453) + ((?i ?e) . ?\x0454) + ((?d ?s) . ?\x0455) + ((?i ?i) . ?\x0456) + ((?y ?i) . ?\x0457) + ((?j ?%) . ?\x0458) + ((?l ?j) . ?\x0459) + ((?n ?j) . ?\x045a) + ((?t ?s) . ?\x045b) + ((?k ?j) . ?\x045c) + ((?v ?%) . ?\x045e) + ((?d ?z) . ?\x045f) + ((?Y ?3) . ?\x0462) + ((?y ?3) . ?\x0463) + ((?O ?3) . ?\x046a) + ((?o ?3) . ?\x046b) + ((?F ?3) . ?\x0472) + ((?f ?3) . ?\x0473) + ((?V ?3) . ?\x0474) + ((?v ?3) . ?\x0475) + ((?C ?3) . ?\x0480) + ((?c ?3) . ?\x0481) + ((?G ?3) . ?\x0490) + ((?g ?3) . ?\x0491) + ((?A ?+) . ?\x05d0) + ((?B ?+) . ?\x05d1) + ((?G ?+) . ?\x05d2) + ((?D ?+) . ?\x05d3) + ((?H ?+) . ?\x05d4) + ((?W ?+) . ?\x05d5) + ((?Z ?+) . ?\x05d6) + ((?X ?+) . ?\x05d7) + ((?T ?j) . ?\x05d8) + ((?J ?+) . ?\x05d9) + ((?K ?%) . ?\x05da) + ((?K ?+) . ?\x05db) + ((?L ?+) . ?\x05dc) + ((?M ?%) . ?\x05dd) + ((?M ?+) . ?\x05de) + ((?N ?%) . ?\x05df) + ((?N ?+) . ?\x05e0) + ((?S ?+) . ?\x05e1) + ((?E ?+) . ?\x05e2) + ((?P ?%) . ?\x05e3) + ((?P ?+) . ?\x05e4) + ((?Z ?j) . ?\x05e5) + ((?Z ?J) . ?\x05e6) + ((?Q ?+) . ?\x05e7) + ((?R ?+) . ?\x05e8) + ((?S ?h) . ?\x05e9) + ((?T ?+) . ?\x05ea) + ((?, ?+) . ?\x060c) + ((?\; ?+) . ?\x061b) + ((?? ?+) . ?\x061f) + ((?H ?') . ?\x0621) + ((?a ?M) . ?\x0622) + ((?a ?H) . ?\x0623) + ((?w ?H) . ?\x0624) + ((?a ?h) . ?\x0625) + ((?y ?H) . ?\x0626) + ((?a ?+) . ?\x0627) + ((?b ?+) . ?\x0628) + ((?t ?m) . ?\x0629) + ((?t ?+) . ?\x062a) + ((?t ?k) . ?\x062b) + ((?g ?+) . ?\x062c) + ((?h ?k) . ?\x062d) + ((?x ?+) . ?\x062e) + ((?d ?+) . ?\x062f) + ((?d ?k) . ?\x0630) + ((?r ?+) . ?\x0631) + ((?z ?+) . ?\x0632) + ((?s ?+) . ?\x0633) + ((?s ?n) . ?\x0634) + ((?c ?+) . ?\x0635) + ((?d ?d) . ?\x0636) + ((?t ?j) . ?\x0637) + ((?z ?H) . ?\x0638) + ((?e ?+) . ?\x0639) + ((?i ?+) . ?\x063a) + ((?+ ?+) . ?\x0640) + ((?f ?+) . ?\x0641) + ((?q ?+) . ?\x0642) + ((?k ?+) . ?\x0643) + ((?l ?+) . ?\x0644) + ((?m ?+) . ?\x0645) + ((?n ?+) . ?\x0646) + ((?h ?+) . ?\x0647) + ((?w ?+) . ?\x0648) + ((?j ?+) . ?\x0649) + ((?y ?+) . ?\x064a) + ((?: ?+) . ?\x064b) + ((?\" ?+) . ?\x064c) + ((?= ?+) . ?\x064d) + ((?/ ?+) . ?\x064e) + ((?' ?+) . ?\x064f) + ((?1 ?+) . ?\x0650) + ((?3 ?+) . ?\x0651) + ((?0 ?+) . ?\x0652) + ((?a ?S) . ?\x0670) + ((?p ?+) . ?\x067e) + ((?v ?+) . ?\x06a4) + ((?g ?f) . ?\x06af) + ((?0 ?a) . ?\x06f0) + ((?1 ?a) . ?\x06f1) + ((?2 ?a) . ?\x06f2) + ((?3 ?a) . ?\x06f3) + ((?4 ?a) . ?\x06f4) + ((?5 ?a) . ?\x06f5) + ((?6 ?a) . ?\x06f6) + ((?7 ?a) . ?\x06f7) + ((?8 ?a) . ?\x06f8) + ((?9 ?a) . ?\x06f9) + ((?B ?.) . ?\x1e02) + ((?b ?.) . ?\x1e03) + ((?B ?_) . ?\x1e06) + ((?b ?_) . ?\x1e07) + ((?D ?.) . ?\x1e0a) + ((?d ?.) . ?\x1e0b) + ((?D ?_) . ?\x1e0e) + ((?d ?_) . ?\x1e0f) + ((?D ?,) . ?\x1e10) + ((?d ?,) . ?\x1e11) + ((?F ?.) . ?\x1e1e) + ((?f ?.) . ?\x1e1f) + ((?G ?-) . ?\x1e20) + ((?g ?-) . ?\x1e21) + ((?H ?.) . ?\x1e22) + ((?h ?.) . ?\x1e23) + ((?H ?:) . ?\x1e26) + ((?h ?:) . ?\x1e27) + ((?H ?,) . ?\x1e28) + ((?h ?,) . ?\x1e29) + ((?K ?') . ?\x1e30) + ((?k ?') . ?\x1e31) + ((?K ?_) . ?\x1e34) + ((?k ?_) . ?\x1e35) + ((?L ?_) . ?\x1e3a) + ((?l ?_) . ?\x1e3b) + ((?M ?') . ?\x1e3e) + ((?m ?') . ?\x1e3f) + ((?M ?.) . ?\x1e40) + ((?m ?.) . ?\x1e41) + ((?N ?.) . ?\x1e44) + ((?n ?.) . ?\x1e45) + ((?N ?_) . ?\x1e48) + ((?n ?_) . ?\x1e49) + ((?P ?') . ?\x1e54) + ((?p ?') . ?\x1e55) + ((?P ?.) . ?\x1e56) + ((?p ?.) . ?\x1e57) + ((?R ?.) . ?\x1e58) + ((?r ?.) . ?\x1e59) + ((?R ?_) . ?\x1e5e) + ((?r ?_) . ?\x1e5f) + ((?S ?.) . ?\x1e60) + ((?s ?.) . ?\x1e61) + ((?T ?.) . ?\x1e6a) + ((?t ?.) . ?\x1e6b) + ((?T ?_) . ?\x1e6e) + ((?t ?_) . ?\x1e6f) + ((?V ??) . ?\x1e7c) + ((?v ??) . ?\x1e7d) + ((?W ?!) . ?\x1e80) + ((?w ?!) . ?\x1e81) + ((?W ?') . ?\x1e82) + ((?w ?') . ?\x1e83) + ((?W ?:) . ?\x1e84) + ((?w ?:) . ?\x1e85) + ((?W ?.) . ?\x1e86) + ((?w ?.) . ?\x1e87) + ((?X ?.) . ?\x1e8a) + ((?x ?.) . ?\x1e8b) + ((?X ?:) . ?\x1e8c) + ((?x ?:) . ?\x1e8d) + ((?Y ?.) . ?\x1e8e) + ((?y ?.) . ?\x1e8f) + ((?Z ?>) . ?\x1e90) + ((?z ?>) . ?\x1e91) + ((?Z ?_) . ?\x1e94) + ((?z ?_) . ?\x1e95) + ((?h ?_) . ?\x1e96) + ((?t ?:) . ?\x1e97) + ((?w ?0) . ?\x1e98) + ((?y ?0) . ?\x1e99) + ((?A ?2) . ?\x1ea2) + ((?a ?2) . ?\x1ea3) + ((?E ?2) . ?\x1eba) + ((?e ?2) . ?\x1ebb) + ((?E ??) . ?\x1ebc) + ((?e ??) . ?\x1ebd) + ((?I ?2) . ?\x1ec8) + ((?i ?2) . ?\x1ec9) + ((?O ?2) . ?\x1ece) + ((?o ?2) . ?\x1ecf) + ((?U ?2) . ?\x1ee6) + ((?u ?2) . ?\x1ee7) + ((?Y ?!) . ?\x1ef2) + ((?y ?!) . ?\x1ef3) + ((?Y ?2) . ?\x1ef6) + ((?y ?2) . ?\x1ef7) + ((?Y ??) . ?\x1ef8) + ((?y ??) . ?\x1ef9) + ((?\; ?') . ?\x1f00) + ((?, ?') . ?\x1f01) + ((?\; ?!) . ?\x1f02) + ((?, ?!) . ?\x1f03) + ((?? ?\;) . ?\x1f04) + ((?? ?,) . ?\x1f05) + ((?! ?:) . ?\x1f06) + ((?? ?:) . ?\x1f07) + ((?1 ?N) . ?\x2002) + ((?1 ?M) . ?\x2003) + ((?3 ?M) . ?\x2004) + ((?4 ?M) . ?\x2005) + ((?6 ?M) . ?\x2006) + ((?1 ?T) . ?\x2009) + ((?1 ?H) . ?\x200a) + ((?- ?1) . ?\x2010) + ((?- ?N) . ?\x2013) + ((?- ?M) . ?\x2014) + ((?- ?3) . ?\x2015) + ((?! ?2) . ?\x2016) + ((?= ?2) . ?\x2017) + ((?' ?6) . ?\x2018) + ((?' ?9) . ?\x2019) + ((?. ?9) . ?\x201a) + ((?9 ?') . ?\x201b) + ((?\" ?6) . ?\x201c) + ((?\" ?9) . ?\x201d) + ((?: ?9) . ?\x201e) + ((?9 ?\") . ?\x201f) + ((?/ ?-) . ?\x2020) + ((?/ ?=) . ?\x2021) + ((?. ?.) . ?\x2025) + ((?% ?0) . ?\x2030) + ((?1 ?') . ?\x2032) + ((?2 ?') . ?\x2033) + ((?3 ?') . ?\x2034) + ((?1 ?\") . ?\x2035) + ((?2 ?\") . ?\x2036) + ((?3 ?\") . ?\x2037) + ((?C ?a) . ?\x2038) + ((?< ?1) . ?\x2039) + ((?> ?1) . ?\x203a) + ((?: ?X) . ?\x203b) + ((?' ?-) . ?\x203e) + ((?/ ?f) . ?\x2044) + ((?0 ?S) . ?\x2070) + ((?4 ?S) . ?\x2074) + ((?5 ?S) . ?\x2075) + ((?6 ?S) . ?\x2076) + ((?7 ?S) . ?\x2077) + ((?8 ?S) . ?\x2078) + ((?9 ?S) . ?\x2079) + ((?+ ?S) . ?\x207a) + ((?- ?S) . ?\x207b) + ((?= ?S) . ?\x207c) + ((?\( ?S) . ?\x207d) + ((?\) ?S) . ?\x207e) + ((?n ?S) . ?\x207f) + ((?0 ?s) . ?\x2080) + ((?1 ?s) . ?\x2081) + ((?2 ?s) . ?\x2082) + ((?3 ?s) . ?\x2083) + ((?4 ?s) . ?\x2084) + ((?5 ?s) . ?\x2085) + ((?6 ?s) . ?\x2086) + ((?7 ?s) . ?\x2087) + ((?8 ?s) . ?\x2088) + ((?9 ?s) . ?\x2089) + ((?+ ?s) . ?\x208a) + ((?- ?s) . ?\x208b) + ((?= ?s) . ?\x208c) + ((?\( ?s) . ?\x208d) + ((?\) ?s) . ?\x208e) + ((?L ?i) . ?\x20a4) + ((?P ?t) . ?\x20a7) + ((?W ?=) . ?\x20a9) + ((?= ?e) . ?\x20ac) + ((?E ?u) . ?\x20ac) + ((?o ?C) . ?\x2103) + ((?c ?o) . ?\x2105) + ((?o ?F) . ?\x2109) + ((?N ?0) . ?\x2116) + ((?P ?O) . ?\x2117) + ((?R ?x) . ?\x211e) + ((?S ?M) . ?\x2120) + ((?T ?M) . ?\x2122) + ((?O ?m) . ?\x2126) + ((?A ?O) . ?\x212b) + ((?1 ?3) . ?\x2153) + ((?2 ?3) . ?\x2154) + ((?1 ?5) . ?\x2155) + ((?2 ?5) . ?\x2156) + ((?3 ?5) . ?\x2157) + ((?4 ?5) . ?\x2158) + ((?1 ?6) . ?\x2159) + ((?5 ?6) . ?\x215a) + ((?1 ?8) . ?\x215b) + ((?3 ?8) . ?\x215c) + ((?5 ?8) . ?\x215d) + ((?7 ?8) . ?\x215e) + ((?1 ?R) . ?\x2160) + ((?2 ?R) . ?\x2161) + ((?3 ?R) . ?\x2162) + ((?4 ?R) . ?\x2163) + ((?5 ?R) . ?\x2164) + ((?6 ?R) . ?\x2165) + ((?7 ?R) . ?\x2166) + ((?8 ?R) . ?\x2167) + ((?9 ?R) . ?\x2168) + ((?a ?R) . ?\x2169) + ((?b ?R) . ?\x216a) + ((?c ?R) . ?\x216b) + ((?1 ?r) . ?\x2170) + ((?2 ?r) . ?\x2171) + ((?3 ?r) . ?\x2172) + ((?4 ?r) . ?\x2173) + ((?5 ?r) . ?\x2174) + ((?6 ?r) . ?\x2175) + ((?7 ?r) . ?\x2176) + ((?8 ?r) . ?\x2177) + ((?9 ?r) . ?\x2178) + ((?a ?r) . ?\x2179) + ((?b ?r) . ?\x217a) + ((?c ?r) . ?\x217b) + ((?< ?-) . ?\x2190) + ((?- ?!) . ?\x2191) + ((?- ?>) . ?\x2192) + ((?- ?v) . ?\x2193) + ((?< ?>) . ?\x2194) + ((?U ?D) . ?\x2195) + ((?< ?=) . ?\x21d0) + ((?= ?>) . ?\x21d2) + ((?= ?=) . ?\x21d4) + ((?F ?A) . ?\x2200) + ((?d ?P) . ?\x2202) + ((?T ?E) . ?\x2203) + ((?/ ?0) . ?\x2205) + ((?D ?E) . ?\x2206) + ((?N ?B) . ?\x2207) + ((?\( ?-) . ?\x2208) + ((?- ?\)) . ?\x220b) + ((?* ?P) . ?\x220f) + ((?+ ?Z) . ?\x2211) + ((?- ?2) . ?\x2212) + ((?- ?+) . ?\x2213) + ((?* ?-) . ?\x2217) + ((?O ?b) . ?\x2218) + ((?S ?b) . ?\x2219) + ((?R ?T) . ?\x221a) + ((?0 ?\() . ?\x221d) + ((?0 ?0) . ?\x221e) + ((?- ?L) . ?\x221f) + ((?- ?V) . ?\x2220) + ((?P ?P) . ?\x2225) + ((?A ?N) . ?\x2227) + ((?O ?R) . ?\x2228) + ((?\( ?U) . ?\x2229) + ((?\) ?U) . ?\x222a) + ((?I ?n) . ?\x222b) + ((?D ?I) . ?\x222c) + ((?I ?o) . ?\x222e) + ((?. ?:) . ?\x2234) + ((?: ?.) . ?\x2235) + ((?: ?R) . ?\x2236) + ((?: ?:) . ?\x2237) + ((?? ?1) . ?\x223c) + ((?C ?G) . ?\x223e) + ((?? ?-) . ?\x2243) + ((?? ?=) . ?\x2245) + ((?? ?2) . ?\x2248) + ((?= ??) . ?\x224c) + ((?H ?I) . ?\x2253) + ((?! ?=) . ?\x2260) + ((?= ?3) . ?\x2261) + ((?= ?<) . ?\x2264) + ((?> ?=) . ?\x2265) + ((?< ?*) . ?\x226a) + ((?* ?>) . ?\x226b) + ((?! ?<) . ?\x226e) + ((?! ?>) . ?\x226f) + ((?\( ?C) . ?\x2282) + ((?\) ?C) . ?\x2283) + ((?\( ?_) . ?\x2286) + ((?\) ?_) . ?\x2287) + ((?0 ?.) . ?\x2299) + ((?0 ?2) . ?\x229a) + ((?- ?T) . ?\x22a5) + ((?. ?P) . ?\x22c5) + ((?: ?3) . ?\x22ee) + ((?. ?3) . ?\x22ef) + ((?E ?h) . ?\x2302) + ((?< ?7) . ?\x2308) + ((?> ?7) . ?\x2309) + ((?7 ?<) . ?\x230a) + ((?7 ?>) . ?\x230b) + ((?N ?I) . ?\x2310) + ((?\( ?A) . ?\x2312) + ((?T ?R) . ?\x2315) + ((?I ?u) . ?\x2320) + ((?I ?l) . ?\x2321) + ((?< ?/) . ?\x2329) + ((?/ ?>) . ?\x232a) + ((?V ?s) . ?\x2423) + ((?1 ?h) . ?\x2440) + ((?3 ?h) . ?\x2441) + ((?2 ?h) . ?\x2442) + ((?4 ?h) . ?\x2443) + ((?1 ?j) . ?\x2446) + ((?2 ?j) . ?\x2447) + ((?3 ?j) . ?\x2448) + ((?4 ?j) . ?\x2449) + ((?1 ?.) . ?\x2488) + ((?2 ?.) . ?\x2489) + ((?3 ?.) . ?\x248a) + ((?4 ?.) . ?\x248b) + ((?5 ?.) . ?\x248c) + ((?6 ?.) . ?\x248d) + ((?7 ?.) . ?\x248e) + ((?8 ?.) . ?\x248f) + ((?9 ?.) . ?\x2490) + ((?h ?h) . ?\x2500) + ((?H ?H) . ?\x2501) + ((?v ?v) . ?\x2502) + ((?V ?V) . ?\x2503) + ((?3 ?-) . ?\x2504) + ((?3 ?_) . ?\x2505) + ((?3 ?!) . ?\x2506) + ((?3 ?/) . ?\x2507) + ((?4 ?-) . ?\x2508) + ((?4 ?_) . ?\x2509) + ((?4 ?!) . ?\x250a) + ((?4 ?/) . ?\x250b) + ((?d ?r) . ?\x250c) + ((?d ?R) . ?\x250d) + ((?D ?r) . ?\x250e) + ((?D ?R) . ?\x250f) + ((?d ?l) . ?\x2510) + ((?d ?L) . ?\x2511) + ((?D ?l) . ?\x2512) + ((?L ?D) . ?\x2513) + ((?u ?r) . ?\x2514) + ((?u ?R) . ?\x2515) + ((?U ?r) . ?\x2516) + ((?U ?R) . ?\x2517) + ((?u ?l) . ?\x2518) + ((?u ?L) . ?\x2519) + ((?U ?l) . ?\x251a) + ((?U ?L) . ?\x251b) + ((?v ?r) . ?\x251c) + ((?v ?R) . ?\x251d) + ((?V ?r) . ?\x2520) + ((?V ?R) . ?\x2523) + ((?v ?l) . ?\x2524) + ((?v ?L) . ?\x2525) + ((?V ?l) . ?\x2528) + ((?V ?L) . ?\x252b) + ((?d ?h) . ?\x252c) + ((?d ?H) . ?\x252f) + ((?D ?h) . ?\x2530) + ((?D ?H) . ?\x2533) + ((?u ?h) . ?\x2534) + ((?u ?H) . ?\x2537) + ((?U ?h) . ?\x2538) + ((?U ?H) . ?\x253b) + ((?v ?h) . ?\x253c) + ((?v ?H) . ?\x253f) + ((?V ?h) . ?\x2542) + ((?V ?H) . ?\x254b) + ((?F ?D) . ?\x2571) + ((?B ?D) . ?\x2572) + ((?T ?B) . ?\x2580) + ((?L ?B) . ?\x2584) + ((?F ?B) . ?\x2588) + ((?l ?B) . ?\x258c) + ((?R ?B) . ?\x2590) + ((?. ?S) . ?\x2591) + ((?: ?S) . ?\x2592) + ((?? ?S) . ?\x2593) + ((?f ?S) . ?\x25a0) + ((?O ?S) . ?\x25a1) + ((?R ?O) . ?\x25a2) + ((?R ?r) . ?\x25a3) + ((?R ?F) . ?\x25a4) + ((?R ?Y) . ?\x25a5) + ((?R ?H) . ?\x25a6) + ((?R ?Z) . ?\x25a7) + ((?R ?K) . ?\x25a8) + ((?R ?X) . ?\x25a9) + ((?s ?B) . ?\x25aa) + ((?S ?R) . ?\x25ac) + ((?O ?r) . ?\x25ad) + ((?U ?T) . ?\x25b2) + ((?u ?T) . ?\x25b3) + ((?P ?R) . ?\x25b6) + ((?T ?r) . ?\x25b7) + ((?D ?t) . ?\x25bc) + ((?d ?T) . ?\x25bd) + ((?P ?L) . ?\x25c0) + ((?T ?l) . ?\x25c1) + ((?D ?b) . ?\x25c6) + ((?D ?w) . ?\x25c7) + ((?L ?Z) . ?\x25ca) + ((?0 ?m) . ?\x25cb) + ((?0 ?o) . ?\x25ce) + ((?0 ?M) . ?\x25cf) + ((?0 ?L) . ?\x25d0) + ((?0 ?R) . ?\x25d1) + ((?S ?n) . ?\x25d8) + ((?I ?c) . ?\x25d9) + ((?F ?d) . ?\x25e2) + ((?B ?d) . ?\x25e3) + ((?* ?2) . ?\x2605) + ((?* ?1) . ?\x2606) + ((?< ?H) . ?\x261c) + ((?> ?H) . ?\x261e) + ((?0 ?u) . ?\x263a) + ((?0 ?U) . ?\x263b) + ((?S ?U) . ?\x263c) + ((?F ?m) . ?\x2640) + ((?M ?l) . ?\x2642) + ((?c ?S) . ?\x2660) + ((?c ?H) . ?\x2661) + ((?c ?D) . ?\x2662) + ((?c ?C) . ?\x2663) + ((?M ?d) . ?\x2669) + ((?M ?8) . ?\x266a) + ((?M ?2) . ?\x266b) + ((?M ?b) . ?\x266d) + ((?M ?x) . ?\x266e) + ((?M ?X) . ?\x266f) + ((?O ?K) . ?\x2713) + ((?X ?X) . ?\x2717) + ((?- ?X) . ?\x2720) + ((?I ?S) . ?\x3000) + ((?, ?_) . ?\x3001) + ((?. ?_) . ?\x3002) + ((?+ ?\") . ?\x3003) + ((?+ ?_) . ?\x3004) + ((?* ?_) . ?\x3005) + ((?\; ?_) . ?\x3006) + ((?0 ?_) . ?\x3007) + ((?< ?+) . ?\x300a) + ((?> ?+) . ?\x300b) + ((?< ?') . ?\x300c) + ((?> ?') . ?\x300d) + ((?< ?\") . ?\x300e) + ((?> ?\") . ?\x300f) + ((?\( ?\") . ?\x3010) + ((?\) ?\") . ?\x3011) + ((?= ?T) . ?\x3012) + ((?= ?_) . ?\x3013) + ((?\( ?') . ?\x3014) + ((?\) ?') . ?\x3015) + ((?\( ?I) . ?\x3016) + ((?\) ?I) . ?\x3017) + ((?- ??) . ?\x301c) + ((?A ?5) . ?\x3041) + ((?a ?5) . ?\x3042) + ((?I ?5) . ?\x3043) + ((?i ?5) . ?\x3044) + ((?U ?5) . ?\x3045) + ((?u ?5) . ?\x3046) + ((?E ?5) . ?\x3047) + ((?e ?5) . ?\x3048) + ((?O ?5) . ?\x3049) + ((?o ?5) . ?\x304a) + ((?k ?a) . ?\x304b) + ((?g ?a) . ?\x304c) + ((?k ?i) . ?\x304d) + ((?g ?i) . ?\x304e) + ((?k ?u) . ?\x304f) + ((?g ?u) . ?\x3050) + ((?k ?e) . ?\x3051) + ((?g ?e) . ?\x3052) + ((?k ?o) . ?\x3053) + ((?g ?o) . ?\x3054) + ((?s ?a) . ?\x3055) + ((?z ?a) . ?\x3056) + ((?s ?i) . ?\x3057) + ((?z ?i) . ?\x3058) + ((?s ?u) . ?\x3059) + ((?z ?u) . ?\x305a) + ((?s ?e) . ?\x305b) + ((?z ?e) . ?\x305c) + ((?s ?o) . ?\x305d) + ((?z ?o) . ?\x305e) + ((?t ?a) . ?\x305f) + ((?d ?a) . ?\x3060) + ((?t ?i) . ?\x3061) + ((?d ?i) . ?\x3062) + ((?t ?U) . ?\x3063) + ((?t ?u) . ?\x3064) + ((?d ?u) . ?\x3065) + ((?t ?e) . ?\x3066) + ((?d ?e) . ?\x3067) + ((?t ?o) . ?\x3068) + ((?d ?o) . ?\x3069) + ((?n ?a) . ?\x306a) + ((?n ?i) . ?\x306b) + ((?n ?u) . ?\x306c) + ((?n ?e) . ?\x306d) + ((?n ?o) . ?\x306e) + ((?h ?a) . ?\x306f) + ((?b ?a) . ?\x3070) + ((?p ?a) . ?\x3071) + ((?h ?i) . ?\x3072) + ((?b ?i) . ?\x3073) + ((?p ?i) . ?\x3074) + ((?h ?u) . ?\x3075) + ((?b ?u) . ?\x3076) + ((?p ?u) . ?\x3077) + ((?h ?e) . ?\x3078) + ((?b ?e) . ?\x3079) + ((?p ?e) . ?\x307a) + ((?h ?o) . ?\x307b) + ((?b ?o) . ?\x307c) + ((?p ?o) . ?\x307d) + ((?m ?a) . ?\x307e) + ((?m ?i) . ?\x307f) + ((?m ?u) . ?\x3080) + ((?m ?e) . ?\x3081) + ((?m ?o) . ?\x3082) + ((?y ?A) . ?\x3083) + ((?y ?a) . ?\x3084) + ((?y ?U) . ?\x3085) + ((?y ?u) . ?\x3086) + ((?y ?O) . ?\x3087) + ((?y ?o) . ?\x3088) + ((?r ?a) . ?\x3089) + ((?r ?i) . ?\x308a) + ((?r ?u) . ?\x308b) + ((?r ?e) . ?\x308c) + ((?r ?o) . ?\x308d) + ((?w ?A) . ?\x308e) + ((?w ?a) . ?\x308f) + ((?w ?i) . ?\x3090) + ((?w ?e) . ?\x3091) + ((?w ?o) . ?\x3092) + ((?n ?5) . ?\x3093) + ((?v ?u) . ?\x3094) + ((?\" ?5) . ?\x309b) + ((?0 ?5) . ?\x309c) + ((?* ?5) . ?\x309d) + ((?+ ?5) . ?\x309e) + ((?a ?6) . ?\x30a1) + ((?A ?6) . ?\x30a2) + ((?i ?6) . ?\x30a3) + ((?I ?6) . ?\x30a4) + ((?u ?6) . ?\x30a5) + ((?U ?6) . ?\x30a6) + ((?e ?6) . ?\x30a7) + ((?E ?6) . ?\x30a8) + ((?o ?6) . ?\x30a9) + ((?O ?6) . ?\x30aa) + ((?K ?a) . ?\x30ab) + ((?G ?a) . ?\x30ac) + ((?K ?i) . ?\x30ad) + ((?G ?i) . ?\x30ae) + ((?K ?u) . ?\x30af) + ((?G ?u) . ?\x30b0) + ((?K ?e) . ?\x30b1) + ((?G ?e) . ?\x30b2) + ((?K ?o) . ?\x30b3) + ((?G ?o) . ?\x30b4) + ((?S ?a) . ?\x30b5) + ((?Z ?a) . ?\x30b6) + ((?S ?i) . ?\x30b7) + ((?Z ?i) . ?\x30b8) + ((?S ?u) . ?\x30b9) + ((?Z ?u) . ?\x30ba) + ((?S ?e) . ?\x30bb) + ((?Z ?e) . ?\x30bc) + ((?S ?o) . ?\x30bd) + ((?Z ?o) . ?\x30be) + ((?T ?a) . ?\x30bf) + ((?D ?a) . ?\x30c0) + ((?T ?i) . ?\x30c1) + ((?D ?i) . ?\x30c2) + ((?T ?U) . ?\x30c3) + ((?T ?u) . ?\x30c4) + ((?D ?u) . ?\x30c5) + ((?T ?e) . ?\x30c6) + ((?D ?e) . ?\x30c7) + ((?T ?o) . ?\x30c8) + ((?D ?o) . ?\x30c9) + ((?N ?a) . ?\x30ca) + ((?N ?i) . ?\x30cb) + ((?N ?u) . ?\x30cc) + ((?N ?e) . ?\x30cd) + ((?N ?o) . ?\x30ce) + ((?H ?a) . ?\x30cf) + ((?B ?a) . ?\x30d0) + ((?P ?a) . ?\x30d1) + ((?H ?i) . ?\x30d2) + ((?B ?i) . ?\x30d3) + ((?P ?i) . ?\x30d4) + ((?H ?u) . ?\x30d5) + ((?B ?u) . ?\x30d6) + ((?P ?u) . ?\x30d7) + ((?H ?e) . ?\x30d8) + ((?B ?e) . ?\x30d9) + ((?P ?e) . ?\x30da) + ((?H ?o) . ?\x30db) + ((?B ?o) . ?\x30dc) + ((?P ?o) . ?\x30dd) + ((?u ?R) . ?\x2515) + ((?U ?r) . ?\x2516) + ((?U ?R) . ?\x2517) + ((?u ?l) . ?\x2518) + ((?u ?L) . ?\x2519) + ((?U ?l) . ?\x251a) + ((?U ?L) . ?\x251b) + ((?v ?r) . ?\x251c) + ((?v ?R) . ?\x251d) + ((?V ?r) . ?\x2520) + ((?V ?R) . ?\x2523) + ((?v ?l) . ?\x2524) + ((?v ?L) . ?\x2525) + ((?V ?l) . ?\x2528) + ((?V ?L) . ?\x252b) + ((?d ?h) . ?\x252c) + ((?d ?H) . ?\x252f) + ((?D ?h) . ?\x2530) + ((?D ?H) . ?\x2533) + ((?u ?h) . ?\x2534) + ((?u ?H) . ?\x2537) + ((?U ?h) . ?\x2538) + ((?U ?H) . ?\x253b) + ((?v ?h) . ?\x253c) + ((?v ?H) . ?\x253f) + ((?V ?h) . ?\x2542) + ((?V ?H) . ?\x254b) + ((?F ?D) . ?\x2571) + ((?B ?D) . ?\x2572) + ((?T ?B) . ?\x2580) + ((?L ?B) . ?\x2584) + ((?F ?B) . ?\x2588) + ((?l ?B) . ?\x258c) + ((?R ?B) . ?\x2590) + ((?. ?S) . ?\x2591) + ((?: ?S) . ?\x2592) + ((?? ?S) . ?\x2593) + ((?f ?S) . ?\x25a0) + ((?O ?S) . ?\x25a1) + ((?R ?O) . ?\x25a2) + ((?R ?r) . ?\x25a3) + ((?R ?F) . ?\x25a4) + ((?R ?Y) . ?\x25a5) + ((?R ?H) . ?\x25a6) + ((?R ?Z) . ?\x25a7) + ((?R ?K) . ?\x25a8) + ((?R ?X) . ?\x25a9) + ((?s ?B) . ?\x25aa) + ((?S ?R) . ?\x25ac) + ((?O ?r) . ?\x25ad) + ((?U ?T) . ?\x25b2) + ((?u ?T) . ?\x25b3) + ((?P ?R) . ?\x25b6) + ((?T ?r) . ?\x25b7) + ((?D ?t) . ?\x25bc) + ((?d ?T) . ?\x25bd) + ((?P ?L) . ?\x25c0) + ((?T ?l) . ?\x25c1) + ((?D ?b) . ?\x25c6) + ((?D ?w) . ?\x25c7) + ((?L ?Z) . ?\x25ca) + ((?0 ?m) . ?\x25cb) + ((?0 ?o) . ?\x25ce) + ((?0 ?M) . ?\x25cf) + ((?0 ?L) . ?\x25d0) + ((?0 ?R) . ?\x25d1) + ((?S ?n) . ?\x25d8) + ((?I ?c) . ?\x25d9) + ((?F ?d) . ?\x25e2) + ((?B ?d) . ?\x25e3) + ((?* ?2) . ?\x2605) + ((?* ?1) . ?\x2606) + ((?< ?H) . ?\x261c) + ((?> ?H) . ?\x261e) + ((?0 ?u) . ?\x263a) + ((?0 ?U) . ?\x263b) + ((?S ?U) . ?\x263c) + ((?F ?m) . ?\x2640) + ((?M ?l) . ?\x2642) + ((?c ?S) . ?\x2660) + ((?c ?H) . ?\x2661) + ((?c ?D) . ?\x2662) + ((?c ?C) . ?\x2663) + ((?M ?d) . ?\x2669) + ((?M ?8) . ?\x266a) + ((?M ?2) . ?\x266b) + ((?M ?b) . ?\x266d) + ((?M ?x) . ?\x266e) + ((?M ?X) . ?\x266f) + ((?O ?K) . ?\x2713) + ((?X ?X) . ?\x2717) + ((?- ?X) . ?\x2720) + ((?I ?S) . ?\x3000) + ((?, ?_) . ?\x3001) + ((?. ?_) . ?\x3002) + ((?+ ?\") . ?\x3003) + ((?+ ?_) . ?\x3004) + ((?* ?_) . ?\x3005) + ((?\; ?_) . ?\x3006) + ((?0 ?_) . ?\x3007) + ((?< ?+) . ?\x300a) + ((?> ?+) . ?\x300b) + ((?< ?') . ?\x300c) + ((?> ?') . ?\x300d) + ((?< ?\") . ?\x300e) + ((?> ?\") . ?\x300f) + ((?\( ?\") . ?\x3010) + ((?\) ?\") . ?\x3011) + ((?= ?T) . ?\x3012) + ((?= ?_) . ?\x3013) + ((?\( ?') . ?\x3014) + ((?\) ?') . ?\x3015) + ((?\( ?I) . ?\x3016) + ((?\) ?I) . ?\x3017) + ((?- ??) . ?\x301c) + ((?A ?5) . ?\x3041) + ((?a ?5) . ?\x3042) + ((?I ?5) . ?\x3043) + ((?i ?5) . ?\x3044) + ((?U ?5) . ?\x3045) + ((?u ?5) . ?\x3046) + ((?E ?5) . ?\x3047) + ((?e ?5) . ?\x3048) + ((?O ?5) . ?\x3049) + ((?o ?5) . ?\x304a) + ((?k ?a) . ?\x304b) + ((?g ?a) . ?\x304c) + ((?k ?i) . ?\x304d) + ((?g ?i) . ?\x304e) + ((?k ?u) . ?\x304f) + ((?g ?u) . ?\x3050) + ((?k ?e) . ?\x3051) + ((?g ?e) . ?\x3052) + ((?k ?o) . ?\x3053) + ((?g ?o) . ?\x3054) + ((?s ?a) . ?\x3055) + ((?z ?a) . ?\x3056) + ((?s ?i) . ?\x3057) + ((?z ?i) . ?\x3058) + ((?s ?u) . ?\x3059) + ((?z ?u) . ?\x305a) + ((?s ?e) . ?\x305b) + ((?z ?e) . ?\x305c) + ((?s ?o) . ?\x305d) + ((?z ?o) . ?\x305e) + ((?t ?a) . ?\x305f) + ((?d ?a) . ?\x3060) + ((?t ?i) . ?\x3061) + ((?d ?i) . ?\x3062) + ((?t ?U) . ?\x3063) + ((?t ?u) . ?\x3064) + ((?d ?u) . ?\x3065) + ((?t ?e) . ?\x3066) + ((?d ?e) . ?\x3067) + ((?t ?o) . ?\x3068) + ((?d ?o) . ?\x3069) + ((?n ?a) . ?\x306a) + ((?n ?i) . ?\x306b) + ((?n ?u) . ?\x306c) + ((?n ?e) . ?\x306d) + ((?n ?o) . ?\x306e) + ((?h ?a) . ?\x306f) + ((?b ?a) . ?\x3070) + ((?p ?a) . ?\x3071) + ((?h ?i) . ?\x3072) + ((?b ?i) . ?\x3073) + ((?p ?i) . ?\x3074) + ((?h ?u) . ?\x3075) + ((?b ?u) . ?\x3076) + ((?p ?u) . ?\x3077) + ((?h ?e) . ?\x3078) + ((?b ?e) . ?\x3079) + ((?p ?e) . ?\x307a) + ((?h ?o) . ?\x307b) + ((?b ?o) . ?\x307c) + ((?p ?o) . ?\x307d) + ((?m ?a) . ?\x307e) + ((?m ?i) . ?\x307f) + ((?m ?u) . ?\x3080) + ((?m ?e) . ?\x3081) + ((?m ?o) . ?\x3082) + ((?y ?A) . ?\x3083) + ((?y ?a) . ?\x3084) + ((?y ?U) . ?\x3085) + ((?y ?u) . ?\x3086) + ((?y ?O) . ?\x3087) + ((?y ?o) . ?\x3088) + ((?r ?a) . ?\x3089) + ((?r ?i) . ?\x308a) + ((?r ?u) . ?\x308b) + ((?r ?e) . ?\x308c) + ((?r ?o) . ?\x308d) + ((?w ?A) . ?\x308e) + ((?w ?a) . ?\x308f) + ((?w ?i) . ?\x3090) + ((?w ?e) . ?\x3091) + ((?w ?o) . ?\x3092) + ((?n ?5) . ?\x3093) + ((?v ?u) . ?\x3094) + ((?\" ?5) . ?\x309b) + ((?0 ?5) . ?\x309c) + ((?* ?5) . ?\x309d) + ((?+ ?5) . ?\x309e) + ((?a ?6) . ?\x30a1) + ((?A ?6) . ?\x30a2) + ((?i ?6) . ?\x30a3) + ((?I ?6) . ?\x30a4) + ((?u ?6) . ?\x30a5) + ((?U ?6) . ?\x30a6) + ((?e ?6) . ?\x30a7) + ((?E ?6) . ?\x30a8) + ((?o ?6) . ?\x30a9) + ((?O ?6) . ?\x30aa) + ((?K ?a) . ?\x30ab) + ((?G ?a) . ?\x30ac) + ((?K ?i) . ?\x30ad) + ((?G ?i) . ?\x30ae) + ((?K ?u) . ?\x30af) + ((?G ?u) . ?\x30b0) + ((?K ?e) . ?\x30b1) + ((?G ?e) . ?\x30b2) + ((?K ?o) . ?\x30b3) + ((?G ?o) . ?\x30b4) + ((?S ?a) . ?\x30b5) + ((?Z ?a) . ?\x30b6) + ((?S ?i) . ?\x30b7) + ((?Z ?i) . ?\x30b8) + ((?S ?u) . ?\x30b9) + ((?Z ?u) . ?\x30ba) + ((?S ?e) . ?\x30bb) + ((?Z ?e) . ?\x30bc) + ((?S ?o) . ?\x30bd) + ((?Z ?o) . ?\x30be) + ((?T ?a) . ?\x30bf) + ((?D ?a) . ?\x30c0) + ((?T ?i) . ?\x30c1) + ((?D ?i) . ?\x30c2) + ((?T ?U) . ?\x30c3) + ((?T ?u) . ?\x30c4) + ((?D ?u) . ?\x30c5) + ((?T ?e) . ?\x30c6) + ((?D ?e) . ?\x30c7) + ((?T ?o) . ?\x30c8) + ((?D ?o) . ?\x30c9) + ((?N ?a) . ?\x30ca) + ((?N ?i) . ?\x30cb) + ((?N ?u) . ?\x30cc) + ((?N ?e) . ?\x30cd) + ((?N ?o) . ?\x30ce) + ((?H ?a) . ?\x30cf) + ((?B ?a) . ?\x30d0) + ((?P ?a) . ?\x30d1) + ((?H ?i) . ?\x30d2) + ((?B ?i) . ?\x30d3) + ((?P ?i) . ?\x30d4) + ((?H ?u) . ?\x30d5) + ((?B ?u) . ?\x30d6) + ((?P ?u) . ?\x30d7) + ((?H ?e) . ?\x30d8) + ((?B ?e) . ?\x30d9) + ((?P ?e) . ?\x30da) + ((?H ?o) . ?\x30db) + ((?B ?o) . ?\x30dc) + ((?P ?o) . ?\x30dd) + ((?M ?a) . ?\x30de) + ((?M ?i) . ?\x30df) + ((?M ?u) . ?\x30e0) + ((?M ?e) . ?\x30e1) + ((?M ?o) . ?\x30e2) + ((?Y ?A) . ?\x30e3) + ((?Y ?a) . ?\x30e4) + ((?Y ?U) . ?\x30e5) + ((?Y ?u) . ?\x30e6) + ((?Y ?O) . ?\x30e7) + ((?Y ?o) . ?\x30e8) + ((?R ?a) . ?\x30e9) + ((?R ?i) . ?\x30ea) + ((?R ?u) . ?\x30eb) + ((?R ?e) . ?\x30ec) + ((?R ?o) . ?\x30ed) + ((?W ?A) . ?\x30ee) + ((?W ?a) . ?\x30ef) + ((?W ?i) . ?\x30f0) + ((?W ?e) . ?\x30f1) + ((?W ?o) . ?\x30f2) + ((?N ?6) . ?\x30f3) + ((?V ?u) . ?\x30f4) + ((?K ?A) . ?\x30f5) + ((?K ?E) . ?\x30f6) + ((?V ?a) . ?\x30f7) + ((?V ?i) . ?\x30f8) + ((?V ?e) . ?\x30f9) + ((?V ?o) . ?\x30fa) + ((?. ?6) . ?\x30fb) + ((?- ?6) . ?\x30fc) + ((?* ?6) . ?\x30fd) + ((?+ ?6) . ?\x30fe) + ((?b ?4) . ?\x3105) + ((?p ?4) . ?\x3106) + ((?m ?4) . ?\x3107) + ((?f ?4) . ?\x3108) + ((?d ?4) . ?\x3109) + ((?t ?4) . ?\x310a) + ((?n ?4) . ?\x310b) + ((?l ?4) . ?\x310c) + ((?g ?4) . ?\x310d) + ((?k ?4) . ?\x310e) + ((?h ?4) . ?\x310f) + ((?j ?4) . ?\x3110) + ((?q ?4) . ?\x3111) + ((?x ?4) . ?\x3112) + ((?z ?h) . ?\x3113) + ((?c ?h) . ?\x3114) + ((?s ?h) . ?\x3115) + ((?r ?4) . ?\x3116) + ((?z ?4) . ?\x3117) + ((?c ?4) . ?\x3118) + ((?s ?4) . ?\x3119) + ((?a ?4) . ?\x311a) + ((?o ?4) . ?\x311b) + ((?e ?4) . ?\x311c) + ((?a ?i) . ?\x311e) + ((?e ?i) . ?\x311f) + ((?a ?u) . ?\x3120) + ((?o ?u) . ?\x3121) + ((?a ?n) . ?\x3122) + ((?e ?n) . ?\x3123) + ((?a ?N) . ?\x3124) + ((?e ?N) . ?\x3125) + ((?e ?r) . ?\x3126) + ((?i ?4) . ?\x3127) + ((?u ?4) . ?\x3128) + ((?i ?u) . ?\x3129) + ((?v ?4) . ?\x312a) + ((?n ?G) . ?\x312b) + ((?g ?n) . ?\x312c) + ((?1 ?c) . ?\x3220) + ((?2 ?c) . ?\x3221) + ((?3 ?c) . ?\x3222) + ((?4 ?c) . ?\x3223) + ((?5 ?c) . ?\x3224) + ((?6 ?c) . ?\x3225) + ((?7 ?c) . ?\x3226) + ((?8 ?c) . ?\x3227) + ((?9 ?c) . ?\x3228) + ((?\s ?\s) . ?\xe000) + ((?/ ?c) . ?\xe001) + ((?U ?A) . ?\xe002) + ((?U ?B) . ?\xe003) + ((?\" ?3) . ?\xe004) + ((?\" ?1) . ?\xe005) + ((?\" ?!) . ?\xe006) + ((?\" ?') . ?\xe007) + ((?\" ?>) . ?\xe008) + ((?\" ??) . ?\xe009) + ((?\" ?-) . ?\xe00a) + ((?\" ?\() . ?\xe00b) + ((?\" ?.) . ?\xe00c) + ((?\" ?:) . ?\xe00d) + ((?\" ?0) . ?\xe00e) + ((?\" ?\") . ?\xe00f) + ((?\" ?<) . ?\xe010) + ((?\" ?,) . ?\xe011) + ((?\" ?\;) . ?\xe012) + ((?\" ?_) . ?\xe013) + ((?\" ?=) . ?\xe014) + ((?\" ?/) . ?\xe015) + ((?\" ?i) . ?\xe016) + ((?\" ?d) . ?\xe017) + ((?\" ?p) . ?\xe018) + ((?\; ?\;) . ?\xe019) + ((?, ?,) . ?\xe01a) + ((?b ?3) . ?\xe01b) + ((?C ?i) . ?\xe01c) + ((?f ?\() . ?\xe01d) + ((?e ?d) . ?\xe01e) + ((?a ?m) . ?\xe01f) + ((?p ?m) . ?\xe020) + ((?F ?l) . ?\xe023) + ((?G ?F) . ?\xe024) + ((?> ?V) . ?\xe025) + ((?! ?*) . ?\xe026) + ((?? ?*) . ?\xe027) + ((?J ?<) . ?\xe028) + ((?f ?f) . ?\xfb00) + ((?f ?i) . ?\xfb01) + ((?f ?l) . ?\xfb02) + ((?f ?t) . ?\xfb05) + ((?s ?t) . ?\xfb06) + ((?~ ?!) . ?\x00a1) + ((?c ?|) . ?\x00a2) + ((?$ ?$) . ?\x00a3) + ((?o ?x) . ?\x00a4) + ((?Y ?-) . ?\x00a5) + ((?| ?|) . ?\x00a6) + ((?c ?O) . ?\x00a9) + ((?- ?,) . ?\x00ac) + ((?- ?=) . ?\x00af) + ((?~ ?o) . ?\x00b0) + ((?2 ?2) . ?\x00b2) + ((?3 ?3) . ?\x00b3) + ((?p ?p) . ?\x00b6) + ((?~ ?.) . ?\x00b7) + ((?1 ?1) . ?\x00b9) + ((?~ ??) . ?\x00bf) + ((?A ?`) . ?\x00c0) + ((?A ?^) . ?\x00c2) + ((?A ?~) . ?\x00c3) + ((?A ?\") . ?\x00c4) + ((?A ?@) . ?\x00c5) + ((?E ?`) . ?\x00c8) + ((?E ?^) . ?\x00ca) + ((?E ?\") . ?\x00cb) + ((?I ?`) . ?\x00cc) + ((?I ?^) . ?\x00ce) + ((?I ?\") . ?\x00cf) + ((?N ?~) . ?\x00d1) + ((?O ?`) . ?\x00d2) + ((?O ?^) . ?\x00d4) + ((?O ?~) . ?\x00d5) + ((?/ ?\\) . ?\x00d7) + ((?U ?`) . ?\x00d9) + ((?U ?^) . ?\x00db) + ((?I ?p) . ?\x00de) + ((?a ?`) . ?\x00e0) + ((?a ?^) . ?\x00e2) + ((?a ?~) . ?\x00e3) + ((?a ?\") . ?\x00e4) + ((?a ?@) . ?\x00e5) + ((?e ?`) . ?\x00e8) + ((?e ?^) . ?\x00ea) + ((?e ?\") . ?\x00eb) + ((?i ?`) . ?\x00ec) + ((?i ?^) . ?\x00ee) + ((?n ?~) . ?\x00f1) + ((?o ?`) . ?\x00f2) + ((?o ?^) . ?\x00f4) + ((?o ?~) . ?\x00f5) + ((?u ?`) . ?\x00f9) + ((?u ?^) . ?\x00fb) + ((?y ?\") . ?\x00ff)) + "Table of default digraphs. +This includes all digraphs defined in RFC 1345, +as well as miscellaneous digraphs for multi-byte characters. +See also `evil-digraphs-table-user'.") + +(defun evil-digraph (digraph) + "Convert DIGRAPH to character or list representation. +If DIGRAPH is a list (CHAR1 CHAR2), return the corresponding character; +if DIGRAPH is a character, return the corresponding list. +Searches in `evil-digraphs-table-user' and `evil-digraphs-table'." + (if (listp digraph) + (let* ((char1 (car digraph)) + (char2 (cadr digraph))) + (or (cdr (assoc (list char1 char2) evil-digraphs-table-user)) + (cdr (assoc (list char1 char2) evil-digraphs-table)) + (unless (eq char1 char2) + (or (cdr (assoc (list char2 char1) evil-digraphs-table-user)) + (cdr (assoc (list char2 char1) evil-digraphs-table)))))) + (or (car (rassoc digraph evil-digraphs-table-user)) + (car (rassoc digraph evil-digraphs-table))))) + +(provide 'evil-digraphs) + +;;; evil-digraphs.el ends here diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-digraphs.elc b/.emacs.d/elpa/evil-20210527.2107/evil-digraphs.elc new file mode 100644 index 0000000..af2cf9e Binary files /dev/null and b/.emacs.d/elpa/evil-20210527.2107/evil-digraphs.elc differ diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-ex.el b/.emacs.d/elpa/evil-20210527.2107/evil-ex.el new file mode 100644 index 0000000..a5aa342 --- /dev/null +++ b/.emacs.d/elpa/evil-20210527.2107/evil-ex.el @@ -0,0 +1,1185 @@ +;;; evil-ex.el --- Ex-mode -*- lexical-binding: nil -*- + +;; Author: Frank Fischer <frank fischer at mathematik.tu-chemnitz.de> +;; Maintainer: Vegard Øye <vegard_oye at hotmail.com> + +;; Version: 1.14.0 + +;; +;; This file is NOT part of GNU Emacs. + +;;; License: + +;; This file is part of Evil. +;; +;; Evil is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; Evil is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with Evil. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: + +;; Ex is implemented as an extensible minilanguage, whose grammar +;; is stored in `evil-ex-grammar'. Ex commands are defined with +;; `evil-ex-define-cmd', which creates a binding from a string +;; to an interactive function. It is also possible to define key +;; sequences which execute a command immediately when entered: +;; such shortcuts go in `evil-ex-map'. +;; +;; To provide buffer and filename completion, as well as interactive +;; feedback, Ex defines the concept of an argument handler, specified +;; with `evil-ex-define-argument-type'. In the case of the +;; substitution command (":s/foo/bar"), the handler incrementally +;; highlights matches in the buffer as the substitution is typed. + +(require 'evil-common) +(require 'evil-states) +(require 'shell) + +;;; Code: + +(defconst evil-ex-grammar + '((expression + (count command argument #'evil-ex-call-command) + ((\? range) command argument #'evil-ex-call-command) + (line #'evil-goto-line) + (sexp #'eval-expression)) + (count + number) + (command #'evil-ex-parse-command) + (binding + "[~&*@<>=:]+\\|[[:alpha:]_]+\\|!") + (emacs-binding + "[[:alpha:]-][[:alnum:][:punct:]-]+") + (bang + (\? (! space) "!" #'$1)) + (argument + ((\? space) (\? "\\(?:.\\|\n\\)+") #'$2)) + (range + ("%" #'(evil-ex-full-range)) + (line ";" line #'(let ((tmp1 $1)) + (save-excursion + (goto-line tmp1) + (evil-ex-range tmp1 $3)))) + (line "," line #'(evil-ex-range $1 $3)) + (line #'(evil-ex-range $1 nil)) + ("`" "[-a-zA-Z_<>']" ",`" "[-a-zA-Z_<>']" + #'(evil-ex-char-marker-range $2 $4))) + (line + (base (\? offset) search (\? offset) + #'(let ((tmp (evil-ex-line $1 $2))) + (save-excursion + (goto-line tmp) + (evil-ex-line $3 $4)))) + ((\? base) offset search (\? offset) + #'(let ((tmp (evil-ex-line $1 $2))) + (save-excursion + (goto-line tmp) + (evil-ex-line $3 $4)))) + (base (\? offset) #'evil-ex-line) + ((\? base) offset #'evil-ex-line)) + (base + number + marker + search + ("\\^" #'(evil-ex-first-line)) + ("\\$" #'(evil-ex-last-line)) + ("\\." #'(evil-ex-current-line))) + (offset + (+ signed-number #'+)) + (marker + ("'" "[-a-zA-Z_<>']" #'(evil-ex-marker $2))) + (search + forward + backward + next + prev + subst) + (forward + ("/" "\\(?:[\\].\\|[^/,; ]\\)+" (! "/") + #'(evil-ex-re-fwd $2)) + ("/" "\\(?:[\\].\\|[^/]\\)+" "/" + #'(evil-ex-re-fwd $2))) + (backward + ("\\?" "\\(?:[\\].\\|[^?,; ]\\)+" (! "\\?") + #'(evil-ex-re-bwd $2)) + ("\\?" "\\(?:[\\].\\|[^?]\\)+" "\\?" + #'(evil-ex-re-bwd $2))) + (next + "\\\\/" #'(evil-ex-prev-search)) + (prev + "\\\\\\?" #'(evil-ex-prev-search)) + (subst + "\\\\&" #'(evil-ex-prev-search)) + (signed-number + (sign (\? number) #'evil-ex-signed-number)) + (sign + "\\+\\|-" #'intern) + (number + "[0-9]+" #'string-to-number) + (space + "[ ]+") + (sexp + "(.*)" #'(car-safe (read-from-string $1)))) + "Grammar for Ex. +An association list of syntactic symbols and their definitions. +The first entry is the start symbol. A symbol's definition may +reference other symbols, but the grammar cannot contain +left recursion. See `evil-parser' for a detailed explanation +of the syntax.") + +(defvar evil-ex-echo-overlay nil + "Overlay used for displaying info messages during ex.") + +(defun evil-ex-p () + "Whether Ex is currently active." + (and evil-ex-current-buffer t)) + +(evil-define-command evil-ex (&optional initial-input) + "Enter an Ex command. +The ex command line is initialized with the value of +INITIAL-INPUT. If the command is called interactively the initial +input depends on the current state. If the current state is +normal state and no count argument is given then the initial +input is empty. If a prefix count is given the initial input is +.,.+count. If the current state is visual state then the initial +input is the visual region '<,'> or `<,`>. If the value of the +global variable `evil-ex-initial-input' is non-nil, its content +is appended to the line." + :keep-visual t + :repeat abort + (interactive + (list + (let ((s (concat + (cond + ((and (evil-visual-state-p) + evil-ex-visual-char-range + (memq (evil-visual-type) '(inclusive exclusive))) + "`<,`>") + ((evil-visual-state-p) + "'<,'>") + (current-prefix-arg + (let ((arg (prefix-numeric-value current-prefix-arg))) + (cond ((< arg 0) (setq arg (1+ arg))) + ((> arg 0) (setq arg (1- arg)))) + (if (= arg 0) "." + (format ".,.%+d" arg))))) + evil-ex-initial-input))) + (and (> (length s) 0) s)))) + (let ((evil-ex-current-buffer (current-buffer)) + (evil-ex-previous-command (unless initial-input + (car-safe evil-ex-history))) + evil-ex-argument-handler + evil-ex-info-string + result) + (minibuffer-with-setup-hook + (if initial-input #'evil-ex-setup-and-update #'evil-ex-setup) + (setq result + (read-from-minibuffer + ":" + (or initial-input + (and evil-ex-previous-command + (propertize evil-ex-previous-command 'face 'shadow))) + evil-ex-completion-map + nil + 'evil-ex-history + evil-ex-previous-command + t))) + (evil-ex-execute result))) + +(defun evil-ex-execute (result) + "Execute RESULT as an ex command on `evil-ex-current-buffer'." + ;; empty input means repeating the previous command + (when (zerop (length result)) + (setq result evil-ex-previous-command)) + ;; parse data + (evil-ex-update nil nil nil result) + ;; execute command + (unless (zerop (length result)) + (if evil-ex-expression + (eval evil-ex-expression) + (user-error "Ex: syntax error")))) + +(defun evil-ex-delete-backward-char () + "Close the minibuffer if it is empty. +Otherwise behaves like `delete-backward-char'." + (interactive) + (call-interactively + (if (zerop (length (minibuffer-contents))) + #'abort-recursive-edit + #'delete-backward-char))) + +(defun evil-ex-abort () + "Cancel ex state when another buffer is selected." + (unless (minibufferp) + (abort-recursive-edit))) + +(defun evil-ex-command-window-execute (config result) + (select-window (active-minibuffer-window) t) + (set-window-configuration config) + (delete-minibuffer-contents) + (insert result) + (exit-minibuffer)) + +(defun evil-ex-setup () + "Initialize Ex minibuffer. +This function registers several hooks that are used for the +interactive actions during ex state." + (add-hook 'post-command-hook #'evil-ex-abort) + (add-hook 'after-change-functions #'evil-ex-update nil t) + (add-hook 'minibuffer-exit-hook #'evil-ex-teardown nil t) + (when evil-ex-previous-command + (add-hook 'pre-command-hook #'evil-ex-remove-default)) + (remove-hook 'minibuffer-setup-hook #'evil-ex-setup) + (with-no-warnings + (make-variable-buffer-local 'completion-at-point-functions)) + (setq completion-at-point-functions + '(evil-ex-command-completion-at-point + evil-ex-argument-completion-at-point))) +(put 'evil-ex-setup 'permanent-local-hook t) + +(defun evil-ex-setup-and-update () + "Initialize Ex minibuffer with `evil-ex-setup', then call `evil-ex-update'." + (evil-ex-setup) + (evil-ex-update)) + +(defun evil-ex-teardown () + "Deinitialize Ex minibuffer. +Clean up everything set up by `evil-ex-setup'." + (remove-hook 'post-command-hook #'evil-ex-abort) + (remove-hook 'minibuffer-exit-hook #'evil-ex-teardown t) + (remove-hook 'after-change-functions #'evil-ex-update t) + (when evil-ex-argument-handler + (let ((runner (evil-ex-argument-handler-runner + evil-ex-argument-handler))) + (when runner + (funcall runner 'stop))))) +(put 'evil-ex-teardown 'permanent-local-hook t) + +(defvar evil-paste-clear-minibuffer-first nil + "`evil-paste-before' cannot have `delete-minibuffer-contents' called +before it fetches certain registers becuase this would trigger various ex-updates, +sometimes moving point, so `C-a' `C-w' etc. would miss their intended target.") + +(defun evil-ex-remove-default () + "Remove the default text shown in the ex minibuffer. +When ex starts, the previous command is shown enclosed in +parenthesis. This function removes this text when the first key +is pressed." + (when (and (not (eq this-command 'exit-minibuffer)) + (/= (minibuffer-prompt-end) (point-max))) + (if (eq this-command 'evil-ex-delete-backward-char) + (setq this-command 'ignore)) + (if (eq this-original-command 'evil-paste-from-register) + (setq evil-paste-clear-minibuffer-first t) + (delete-minibuffer-contents))) + (remove-hook 'pre-command-hook #'evil-ex-remove-default)) +(put 'evil-ex-remove-default 'permanent-local-hook t) + +(defun evil-ex-update (&optional beg end len string) + "Update Ex variables when the minibuffer changes. +This function is usually called from `after-change-functions' +hook. If BEG is non-nil (which is the case when called from +`after-change-functions'), then an error description is shown +in case of incomplete or unknown commands." + (let* ((prompt (minibuffer-prompt-end)) + (string (or string (buffer-substring prompt (point-max)))) + arg bang cmd count expr func handler range tree type) + (cond + ((and (eq this-command #'self-insert-command) + (commandp (setq cmd (lookup-key evil-ex-map string)))) + (setq evil-ex-expression `(call-interactively #',cmd)) + (when (minibufferp) + (exit-minibuffer))) + (t + (setq cmd nil) + ;; store the buffer position of each character + ;; as the `ex-index' text property + (dotimes (i (length string)) + (add-text-properties + i (1+ i) (list 'ex-index (+ i prompt)) string)) + (with-current-buffer evil-ex-current-buffer + (setq tree (evil-ex-parse string t) + expr (evil-ex-parse string)) + (when (eq (car-safe expr) 'evil-ex-call-command) + (setq count (eval (nth 1 expr)) + cmd (eval (nth 2 expr)) + arg (eval (nth 3 expr)) + range (cond + ((evil-range-p count) + count) + ((numberp count) + (evil-ex-range count count))) + bang (and (save-match-data (string-match ".!$" cmd)) t)))) + (setq evil-ex-tree tree + evil-ex-expression expr + evil-ex-range range + evil-ex-cmd cmd + evil-ex-bang bang + evil-ex-argument arg) + ;; test the current command + (when (and cmd (minibufferp)) + (setq func (evil-ex-completed-binding cmd t)) + (cond + ;; update argument-handler + (func + (when (setq type (evil-get-command-property + func :ex-arg)) + (setq handler (cdr-safe + (assoc type + evil-ex-argument-types)))) + (unless (eq handler evil-ex-argument-handler) + (let ((runner (and evil-ex-argument-handler + (evil-ex-argument-handler-runner + evil-ex-argument-handler)))) + (when runner (funcall runner 'stop))) + (setq evil-ex-argument-handler handler) + (let ((runner (and evil-ex-argument-handler + (evil-ex-argument-handler-runner + evil-ex-argument-handler)))) + (when runner (funcall runner 'start evil-ex-argument)))) + (let ((runner (and evil-ex-argument-handler + (evil-ex-argument-handler-runner + evil-ex-argument-handler)))) + (when runner (funcall runner 'update evil-ex-argument)))) + (beg + ;; show error message only when called from `after-change-functions' + (let ((n (length (all-completions cmd (evil-ex-completion-table))))) + (cond + ((> n 1) (evil-ex-echo "Incomplete command")) + ((= n 0) (evil-ex-echo "Unknown command"))))))))))) +(put 'evil-ex-update 'permanent-local-hook t) + +(defun evil-ex-echo (string &rest args) + "Display a message after the current Ex command." + (with-selected-window (minibuffer-window) + (with-current-buffer (window-buffer (minibuffer-window)) + (unless (or evil-no-display + (zerop (length string))) + (let ((string (format " [%s]" (apply #'format string args))) + (ov (or evil-ex-echo-overlay + (setq evil-ex-echo-overlay (make-overlay (point-min) (point-max) nil t t)))) + after-change-functions before-change-functions) + (put-text-property 0 (length string) 'face 'evil-ex-info string) + ;; The following 'trick' causes point to be shown before the + ;; message instead behind. It is shamelessly stolen from the + ;; implementation of `minibuffer-message`. + (put-text-property 0 1 'cursor t string) + (move-overlay ov (point-max) (point-max)) + (overlay-put ov 'after-string string) + (add-hook 'pre-command-hook #'evil--ex-remove-echo-overlay nil t)))))) + +(defun evil--ex-remove-echo-overlay () + "Remove echo overlay from ex minibuffer." + (when evil-ex-echo-overlay + (delete-overlay evil-ex-echo-overlay) + (setq evil-ex-echo-overlay nil)) + (remove-hook 'pre-command-hook 'evil--ex-remove-echo-overlay t)) + +(defun evil-ex-completion () + "Completes the current ex command or argument." + (interactive) + (let (after-change-functions) + (evil-ex-update) + (completion-at-point) + (remove-text-properties (minibuffer-prompt-end) (point-max) '(face nil evil)))) + +(defun evil-ex-command-completion-at-point () + (let ((beg (or (get-text-property 0 'ex-index evil-ex-cmd) + (point))) + (end (point))) + (list beg end (evil-ex-completion-table) :exclusive 'no))) + +(defun evil-ex-completion-table () + (cond + ((eq evil-ex-complete-emacs-commands nil) + #'evil-ex-command-collection) + ((eq evil-ex-complete-emacs-commands 'in-turn) + (completion-table-in-turn + #'evil-ex-command-collection + #'(lambda (str pred flag) + (completion-table-with-predicate + obarray #'commandp t str pred flag)))) + (t + #'(lambda (str pred flag) + (evil-completion-table-concat + #'evil-ex-command-collection + #'(lambda (str pred flag) + (completion-table-with-predicate + obarray #'commandp t str pred flag)) + str pred flag))))) + +(defun evil-completion-table-concat (table1 table2 string pred flag) + (cond + ((eq flag nil) + (let ((result1 (try-completion string table1 pred)) + (result2 (try-completion string table2 pred))) + (cond + ((null result1) result2) + ((null result2) result1) + ((and (eq result1 t) (eq result2 t)) t) + (t result1)))) + ((eq flag t) + (delete-dups + (append (all-completions string table1 pred) + (all-completions string table2 pred)))) + ((eq flag 'lambda) + (and (or (eq t (test-completion string table1 pred)) + (eq t (test-completion string table2 pred))) + t)) + ((eq (car-safe flag) 'boundaries) + (or (completion-boundaries string table1 pred (cdr flag)) + (completion-boundaries string table2 pred (cdr flag)))) + ((eq flag 'metadata) + '(metadata (display-sort-function . evil-ex-sort-completions))))) + +(defun evil-ex-sort-completions (completions) + (sort completions + #'(lambda (str1 str2) + (let ((p1 (eq 'evil-ex-commands (get-text-property 0 'face str1))) + (p2 (eq 'evil-ex-commands (get-text-property 0 'face str2)))) + (if (equal p1 p2) + (string< str1 str2) + p1))))) + +(defun evil-ex-command-collection (cmd predicate flag) + "Called to complete a command." + (let (commands) + ;; append ! to all commands that may take a bang argument + (dolist (cmd (mapcar #'car evil-ex-commands)) + (push cmd commands) + (if (evil-ex-command-force-p cmd) + (push (concat cmd "!") commands))) + (when (eq evil-ex-complete-emacs-commands t) + (setq commands + (mapcar #'(lambda (str) (propertize str 'face 'evil-ex-commands)) + commands))) + (cond + ((eq flag nil) (try-completion cmd commands predicate)) + ((eq flag t) (all-completions cmd commands predicate)) + ((eq flag 'lambda) (test-completion cmd commands)) + ((eq (car-safe flag) 'boundaries) + `(boundaries 0 . ,(length (cdr flag))))))) + +(defun evil-ex-argument-completion-at-point () + (let ((context (evil-ex-syntactic-context (1- (point))))) + (when (memq 'argument context) + ;; if it's an autoload, load the function; this allows external + ;; packages to register autoloaded ex commands which will be + ;; loaded when ex argument completion is triggered + (let ((binding-definition (symbol-function (evil-ex-binding evil-ex-cmd)))) + (when (autoloadp binding-definition) + (autoload-do-load binding-definition))) + + (let* ((beg (or (and evil-ex-argument + (get-text-property 0 'ex-index evil-ex-argument)) + (point))) + (end (1+ (or (and evil-ex-argument + (get-text-property (1- (length evil-ex-argument)) + 'ex-index + evil-ex-argument)) + (1- (point))))) + (binding (evil-ex-completed-binding evil-ex-cmd)) + (arg-type (evil-get-command-property binding :ex-arg)) + (arg-handler (assoc arg-type evil-ex-argument-types)) + (completer (and arg-handler + (evil-ex-argument-handler-completer + (cdr arg-handler))))) + (when completer + (if (eq (car completer) 'collection) + (list beg end (cdr completer)) + (save-restriction + (narrow-to-region beg (point-max)) + (funcall (cdr completer))))))))) + +(defun evil-ex-define-cmd (cmd function) + "Binds the function FUNCTION to the command CMD." + (save-match-data + (if (string-match "^[^][]*\\(\\[\\(.*\\)\\]\\)[^][]*$" cmd) + (let ((abbrev (replace-match "" nil t cmd 1)) + (full (replace-match "\\2" nil nil cmd 1))) + (evil--add-to-alist 'evil-ex-commands full function) + (evil--add-to-alist 'evil-ex-commands abbrev full)) + (evil--add-to-alist 'evil-ex-commands cmd function)))) + +(defun evil-ex-make-argument-handler (runner completer) + (list runner completer)) + +(defun evil-ex-argument-handler-runner (arg-handler) + (car arg-handler)) + +(defun evil-ex-argument-handler-completer (arg-handler) + (cadr arg-handler)) + +(defmacro evil-ex-define-argument-type (arg-type doc &rest body) + "Defines a new handler for argument-type ARG-TYPE. +DOC is the documentation string. It is followed by a list of +keywords and function: + +:collection COLLECTION + + A collection for completion as required by `all-completions'. + +:completion-at-point FUNC + + Function to be called to initialize a potential + completion. FUNC must match the requirements as described for + the variable `completion-at-point-functions'. When FUNC is + called the minibuffer content is narrowed to exactly match the + argument. + +:runner FUNC + + Function to be called when the type of the current argument + changes or when the content of this argument changes. This + function should take one obligatory argument FLAG followed by + an optional argument ARG. FLAG is one of three symbol 'start, + 'stop or 'update. When the argument type is recognized for the + first time and this handler is started the FLAG is 'start. If + the argument type changes to something else or ex state + finished the handler FLAG is 'stop. If the content of the + argument has changed FLAG is 'update. If FLAG is either 'start + or 'update then ARG is the current value of this argument. If + FLAG is 'stop then arg is nil." + (declare (indent defun) + (doc-string 2) + (debug (&define name + [&optional stringp] + [&rest [keywordp function-form]]))) + (unless (stringp doc) (push doc body)) + (let (runner completer) + (while (keywordp (car-safe body)) + (let ((key (pop body)) + (func (pop body))) + (cond + ((eq key :runner) + (setq runner func)) + ((eq key :collection) + (setq completer (cons 'collection func))) + ((eq key :completion-at-point) + (setq completer (cons 'completion-at-point func)))))) + `(eval-and-compile + (evil--add-to-alist + 'evil-ex-argument-types + ',arg-type + '(,runner ,completer))))) + +(evil-ex-define-argument-type file + "Handles a file argument." + :collection read-file-name-internal) + +(evil-ex-define-argument-type buffer + "Called to complete a buffer name argument." + :collection internal-complete-buffer) + +(declare-function shell-completion-vars "shell" ()) + +(defun evil-ex-init-shell-argument-completion (flag &optional arg) + "Prepares the current minibuffer for completion of shell commands. +This function must be called from the :runner function of some +argument handler that requires shell completion." + (when (and (eq flag 'start) + (not evil-ex-shell-argument-initialized)) + (set (make-local-variable 'evil-ex-shell-argument-initialized) t) + (cond + ;; Emacs 24 + ((fboundp 'comint-completion-at-point) + (shell-completion-vars)) + (t + (set (make-local-variable 'minibuffer-default-add-function) + 'minibuffer-default-add-shell-commands))) + (setq completion-at-point-functions + '(evil-ex-command-completion-at-point + evil-ex-argument-completion-at-point)))) + +(define-obsolete-function-alias + 'evil-ex-shell-command-completion-at-point + 'comint-completion-at-point "1.2.13") + +(evil-ex-define-argument-type shell + "Shell argument type, supports completion." + :completion-at-point comint-completion-at-point + :runner evil-ex-init-shell-argument-completion) + +(defun evil-ex-file-or-shell-command-completion-at-point () + (if (and (< (point-min) (point-max)) + (= (char-after (point-min)) ?!)) + (save-restriction + (narrow-to-region (1+ (point-min)) (point-max)) + (comint-completion-at-point)) + (list (point-min) (point-max) #'read-file-name-internal))) + +(evil-ex-define-argument-type file-or-shell + "File or shell argument type. +If the current argument starts with a ! the rest of the argument +is considered a shell command, otherwise a file-name. Completion +works accordingly." + :completion-at-point evil-ex-file-or-shell-command-completion-at-point + :runner evil-ex-init-shell-argument-completion) + +(defun evil-ex-binding (command &optional noerror) + "Returns the final binding of COMMAND." + (save-match-data + (let ((binding command)) + (when binding + (string-match "^\\(.+?\\)\\!?$" binding) + (setq binding (match-string 1 binding)) + (while (progn + (setq binding (cdr (assoc binding evil-ex-commands))) + (stringp binding))) + (unless binding + (setq binding (intern command))) + (if (commandp binding) + ;; check for remaps + (or (command-remapping binding) binding) + (unless noerror + (user-error "Unknown command: `%s'" command))))))) + +(defun evil-ex-completed-binding (command &optional noerror) + "Returns the final binding of the completion of COMMAND." + (let ((completion (try-completion command evil-ex-commands))) + (evil-ex-binding (if (eq completion t) command + (or completion command)) + noerror))) + +;;; TODO: extensions likes :p :~ <cfile> ... +(defun evil-ex-replace-special-filenames (file-name) + "Replace special symbols in FILE-NAME. +Replaces % by the current file-name, +Replaces # by the alternate file-name in FILE-NAME." + (let ((remote (file-remote-p file-name)) + (current-fname (buffer-file-name)) + (alternate-fname (and (other-buffer) + (buffer-file-name (other-buffer))))) + (setq file-name (or (file-remote-p file-name 'localname) file-name)) + (when current-fname + (setq current-fname (or (file-remote-p current-fname 'localname) + current-fname)) + (setq file-name + (replace-regexp-in-string "\\(^\\|[^\\\\]\\)\\(%\\)" + current-fname file-name + t t 2))) + (when alternate-fname + (setq alternate-fname (or (file-remote-p alternate-fname 'localname) + alternate-fname)) + (setq file-name + (replace-regexp-in-string "\\(^\\|[^\\\\]\\)\\(#\\)" + alternate-fname file-name + t t 2))) + (setq file-name + (replace-regexp-in-string "\\\\\\([#%]\\)" + "\\1" file-name t)) + (setq file-name (concat remote file-name))) + file-name) + +(defun evil-ex-file-arg () + "Returns the current Ex argument as a file name. +This function interprets special file names like # and %." + (unless (zerop (length evil-ex-argument)) + (evil-ex-replace-special-filenames evil-ex-argument))) + +(defun evil-ex-repeat (count) + "Repeats the last ex command." + (interactive "P") + (when count + (goto-char (point-min)) + (forward-line (1- count))) + (let ((evil-ex-current-buffer (current-buffer)) + (hist evil-ex-history)) + (while hist + (let ((evil-ex-last-cmd (pop hist))) + (when evil-ex-last-cmd + (evil-ex-update nil nil nil evil-ex-last-cmd) + (let ((binding (evil-ex-binding evil-ex-cmd))) + (unless (eq binding #'evil-ex-repeat) + (setq hist nil) + (if evil-ex-expression + (eval evil-ex-expression) + (user-error "Ex: syntax error"))))))))) + +(defun evil-ex-call-command (range command argument) + "Execute the given command COMMAND." + (let* ((count (when (numberp range) range)) + (range (when (evil-range-p range) range)) + (bang (and (save-match-data (string-match ".!$" command)) t)) + (evil-ex-point (point)) + (evil-ex-range + (or range (and count (evil-ex-range count count)))) + (evil-ex-command (evil-ex-completed-binding command)) + (evil-ex-bang (and bang t)) + (evil-ex-argument (copy-sequence argument)) + (evil-this-type (evil-type evil-ex-range)) + (current-prefix-arg count) + (prefix-arg current-prefix-arg)) + (when (stringp evil-ex-argument) + (set-text-properties + 0 (length evil-ex-argument) nil evil-ex-argument)) + (let ((buf (current-buffer))) + (unwind-protect + (cond + ((not evil-ex-range) + (setq this-command evil-ex-command) + (run-hooks 'pre-command-hook) + (call-interactively evil-ex-command) + (run-hooks 'post-command-hook)) + (t + ;; set visual selection to match the region if an explicit + ;; range has been specified + (let ((ex-range (evil-copy-range evil-ex-range)) + beg end) + (evil-expand-range ex-range) + (setq beg (evil-range-beginning ex-range) + end (evil-range-end ex-range)) + (evil-sort beg end) + (setq this-command evil-ex-command) + (run-hooks 'pre-command-hook) + (set-mark end) + (goto-char beg) + (activate-mark) + (call-interactively evil-ex-command) + (run-hooks 'post-command-hook)))) + (when (buffer-live-p buf) + (with-current-buffer buf + (deactivate-mark))))))) + +(defun evil-ex-line (base &optional offset) + "Return the line number of BASE plus OFFSET." + (+ (or base (line-number-at-pos)) + (or offset 0))) + +(defun evil-ex-first-line () + "Return the line number of the first line." + (line-number-at-pos (point-min))) + +(defun evil-ex-current-line () + "Return the line number of the current line." + (line-number-at-pos (point))) + +(defun evil-ex-last-line () + "Return the line number of the last line." + (save-excursion + (goto-char (point-max)) + (when (bolp) + (forward-line -1)) + (line-number-at-pos))) + +(defun evil-ex-range (beg-line &optional end-line) + "Returns the first and last position of the current range." + (evil-range + (evil-line-position beg-line) + (evil-line-position (or end-line beg-line) -1) + 'line + :expanded t)) + +(defun evil-ex-full-range () + "Return a range encompassing the whole buffer." + (evil-range (point-min) (point-max) 'line)) + +(defun evil-ex-marker (marker) + "Return MARKER's line number in the current buffer. +Signal an error if MARKER is in a different buffer." + (when (stringp marker) + (setq marker (aref marker 0))) + (setq marker (evil-get-marker marker)) + (if (numberp marker) + (line-number-at-pos marker) + (user-error "Ex does not support markers in other files"))) + +(defun evil-ex-char-marker-range (beg end) + (when (stringp beg) (setq beg (aref beg 0))) + (when (stringp end) (setq end (aref end 0))) + (setq beg (evil-get-marker beg) + end (evil-get-marker end)) + (if (and (numberp beg) (numberp end)) + (evil-expand-range + (evil-range beg end + (if (evil-visual-state-p) + (evil-visual-type) + 'inclusive))) + (user-error "Ex does not support markers in other files"))) + +(defun evil-ex-re-fwd (pattern) + "Search forward for PATTERN. +Returns the line number of the match." + (condition-case err + (save-match-data + (save-excursion + (set-text-properties 0 (length pattern) nil pattern) + (evil-move-end-of-line) + (and (re-search-forward pattern nil t) + (line-number-at-pos (1- (match-end 0)))))) + (invalid-regexp + (evil-ex-echo (cadr err)) + nil))) + +(defun evil-ex-re-bwd (pattern) + "Search backward for PATTERN. +Returns the line number of the match." + (condition-case err + (save-match-data + (save-excursion + (set-text-properties 0 (length pattern) nil pattern) + (evil-move-beginning-of-line) + (and (re-search-backward pattern nil t) + (line-number-at-pos (match-beginning 0))))) + (invalid-regexp + (evil-ex-echo (cadr err)) + nil))) + +(defun evil-ex-prev-search () + (error "Previous search not yet implemented")) + +(defun evil-ex-signed-number (sign &optional number) + "Return a signed number like -3 and +1. +NUMBER defaults to 1." + (funcall sign (or number 1))) + +;; function `evil-ex-eval' has been superseded by `evil-ex-parse' plus `eval' +(make-obsolete 'evil-ex-eval 'evil-ex-parse "1.2.14") + +(defun evil-ex-parse (string &optional syntax start) + "Parse STRING as an Ex expression and return an evaluation tree. +If SYNTAX is non-nil, return a syntax tree instead. +START is the start symbol, which defaults to `expression'." + (let* ((start (or start (car-safe (car-safe evil-ex-grammar)))) + (match (evil-parser + string start evil-ex-grammar t syntax))) + (car-safe match))) + +(defun evil-ex-parse-command (string) + "Parse STRING as an Ex binding." + (let ((result (evil-parser string 'binding evil-ex-grammar)) + bang command) + (when result + (setq command (car-safe result) + string (cdr-safe result)) + ;; check whether the parsed command is followed by a slash, dash + ;; or number and either the part before is NOT known to be a binding, + ;; or the complete string IS known to be a binding + (when (and (> (length string) 0) + (string-match-p "^[-/[:digit:]]" string) + (or (evil-ex-binding (concat command string) t) + (not (evil-ex-binding command t)))) + (setq result (evil-parser (concat command string) + 'emacs-binding + evil-ex-grammar) + command (car-safe result) + string (cdr-safe result))) + ;; parse a following "!" as bang only if + ;; the command has the property :ex-bang t + (when (evil-ex-command-force-p command) + (setq result (evil-parser string 'bang evil-ex-grammar) + bang (or (car-safe result) "") + string (cdr-safe result) + command (concat command bang))) + (cons command string)))) + +(defun evil-ex-command-force-p (command) + "Whether COMMAND accepts the bang argument." + (let ((binding (evil-ex-completed-binding command t))) + (when binding + (evil-get-command-property binding :ex-bang)))) + +(defun evil-flatten-syntax-tree (tree) + "Find all paths from the root of TREE to its leaves. +TREE is a syntax tree, i.e., all its leave nodes are strings. +The `nth' element in the result is the syntactic context +for the corresponding string index (counted from zero)." + (let* ((result nil) + (traverse nil) + (traverse + #'(lambda (tree path) + (if (stringp tree) + (dotimes (char (length tree)) + (push path result)) + (let ((path (cons (car tree) path))) + (dolist (subtree (cdr tree)) + (funcall traverse subtree path))))))) + (funcall traverse tree nil) + (nreverse result))) + +(defun evil-ex-syntactic-context (&optional pos) + "Return the syntactical context of the character at POS. +POS defaults to the current position of point." + (let* ((contexts (evil-flatten-syntax-tree evil-ex-tree)) + (length (length contexts)) + (pos (- (or pos (point)) (minibuffer-prompt-end)))) + (when (>= pos length) + (setq pos (1- length))) + (when (< pos 0) + (setq pos 0)) + (when contexts + (nth pos contexts)))) + +(defun evil-parser--dexp (obj) + "Parse a numerical dollar-sign symbol. +Given e.g. $4, return 4." + (when (symbolp obj) + (let ((str (symbol-name obj))) + (save-match-data + (when (string-match "\\$\\([0-9]+\\)" str) + (string-to-number (match-string 1 str))))))) + +(defun evil-parser--dval (obj result) + "Substitute all dollar-sign symbols in OBJ. +Each dollar-sign symbol is replaced with the corresponding +element in RESULT, so that $1 becomes the first element, etc. +The special value $0 is substituted with the whole list RESULT. +If RESULT is not a list, all dollar-sign symbols are substituted with +RESULT." + (if (listp obj) + (mapcar (lambda (obj) (evil-parser--dval obj result)) obj) + (let ((num (evil-parser--dexp obj))) + (if num + (if (not (listp result)) + result + (if (eq num 0) + `(list ,@result) + (nth (1- num) result))) + obj)))) + +(defun evil-parser (string symbol grammar &optional greedy syntax) + "Parse STRING as a SYMBOL in GRAMMAR. +If GREEDY is non-nil, the whole of STRING must match. +If the parse succeeds, the return value is a cons cell +\(RESULT . TAIL), where RESULT is a parse tree and TAIL is +the remainder of STRING. Otherwise, the return value is nil. + +GRAMMAR is an association list of symbols and their definitions. +A definition is either a list of production rules, which are +tried in succession, or a #'-quoted function, which is called +to parse the input. + +A production rule can be one of the following: + + nil matches the empty string. + A regular expression matches a substring. + A symbol matches a production for that symbol. + (X Y) matches X followed by Y. + (\\? X) matches zero or one of X. + (* X) matches zero or more of X. + (+ X) matches one or more of X. + (& X) matches X, but does not consume. + (! X) matches anything but X, but does not consume. + +Thus, a simple grammar may look like: + + ((plus \"\\\\+\") ; plus <- \"+\" + (minus \"-\") ; minus <- \"-\" + (operator plus minus)) ; operator <- plus / minus + +All input-consuming rules have a value. A regular expression evaluates +to the text matched, while a list evaluates to a list of values. +The value of a list may be overridden with a semantic action, which is +specified with a #'-quoted expression at the end: + + (X Y #'foo) + +The value of this rule is the result of calling foo with the values +of X and Y as arguments. Alternatively, the function call may be +specified explicitly: + + (X Y #'(foo $1 $2)) + +Here, $1 refers to X and $2 refers to Y. $0 refers to the whole list. +Dollar expressions can also be used directly: + + (X Y #'$1) + +This matches X followed by Y, but ignores the value of Y; +the value of the list is the same as the value of X. + +If the SYNTAX argument is non-nil, then all semantic actions +are ignored, and a syntax tree is constructed instead. The +syntax tree obeys the property that all the leave nodes are +parts of the input string. Thus, by traversing the syntax tree, +one can determine how each character was parsed. + +The following symbols have reserved meanings within a grammar: +`\\?', `*', `+', `&', `!', `function', `alt', `seq' and nil." + (let ((string (or string "")) + func pair result rules tail) + (cond + ;; epsilon + ((member symbol '("" nil)) + (setq pair (cons (if syntax "" nil) string))) + ;; token + ((stringp symbol) + (save-match-data + (when (or (eq (string-match symbol string) 0) + ;; ignore leading whitespace + (and (eq (string-match "^[ \f\t\n\r\v]+" string) 0) + (eq (match-end 0) + (string-match + symbol string (match-end 0))))) + (setq result (match-string 0 string) + tail (substring string (match-end 0)) + pair (cons result tail)) + (when (and syntax pair) + (setq result (substring string 0 + (- (length string) + (length tail)))) + (setcar pair result))))) + ;; symbol + ((symbolp symbol) + (let ((context symbol)) + (setq rules (cdr-safe (assq symbol grammar))) + (setq pair (evil-parser string `(alt ,@rules) + grammar greedy syntax)) + (when (and syntax pair) + (setq result (car pair)) + (if (and (listp result) (sequencep (car result))) + (setq result `(,symbol ,@result)) + (setq result `(,symbol ,result))) + (setcar pair result)))) + ;; function + ((eq (car-safe symbol) 'function) + (setq symbol (cadr symbol) + pair (funcall symbol string)) + (when (and syntax pair) + (setq tail (or (cdr pair) "") + result (substring string 0 + (- (length string) + (length tail)))) + (setcar pair result))) + ;; list + ((listp symbol) + (setq rules symbol + symbol (car-safe rules)) + (if (memq symbol '(& ! \? * + alt seq)) + (setq rules (cdr rules)) + (setq symbol 'seq)) + (when (and (memq symbol '(+ alt seq)) + (> (length rules) 1)) + (setq func (car (last rules))) + (if (eq (car-safe func) 'function) + (setq rules (delq func (copy-sequence rules)) + func (cadr func)) + (setq func nil))) + (cond + ;; positive lookahead + ((eq symbol '&) + (when (evil-parser string rules grammar greedy syntax) + (setq pair (evil-parser string nil grammar nil syntax)))) + ;; negative lookahead + ((eq symbol '!) + (unless (evil-parser string rules grammar greedy syntax) + (setq pair (evil-parser string nil grammar nil syntax)))) + ;; zero or one + ((eq symbol '\?) + (setq rules (if (> (length rules) 1) + `(alt ,rules nil) + `(alt ,@rules nil)) + pair (evil-parser string rules grammar greedy syntax))) + ;; zero or more + ((eq symbol '*) + (setq rules `(alt (+ ,@rules) nil) + pair (evil-parser string rules grammar greedy syntax))) + ;; one or more + ((eq symbol '+) + (let (current results) + (catch 'done + (while (setq current (evil-parser + string rules grammar nil syntax)) + (setq result (car-safe current) + tail (or (cdr-safe current) "") + results (append results (if syntax result + (cdr-safe result)))) + ;; stop if stuck + (if (equal string tail) + (throw 'done nil) + (setq string tail)))) + (when results + (setq func (or func 'list) + pair (cons results tail))))) + ;; alternatives + ((eq symbol 'alt) + (catch 'done + (dolist (rule rules) + (when (setq pair (evil-parser + string rule grammar greedy syntax)) + (throw 'done pair))))) + ;; sequence + (t + (setq func (or func 'list)) + (let ((last (car-safe (last rules))) + current results rule) + (catch 'done + (while rules + (setq rule (pop rules) + current (evil-parser string rule grammar + (when greedy + (null rules)) + syntax)) + (cond + ((null current) + (setq results nil) + (throw 'done nil)) + (t + (setq result (car-safe current) + tail (cdr-safe current)) + (unless (memq (car-safe rule) '(& !)) + (if (and syntax + (or (null result) + (and (listp result) + (listp rule) + ;; splice in single-element + ;; (\? ...) expressions + (not (and (eq (car-safe rule) '\?) + (eq (length rule) 2)))))) + (setq results (append results result)) + (setq results (append results (list result))))) + (setq string (or tail "")))))) + (when results + (setq pair (cons results tail)))))) + ;; semantic action + (when (and pair func (not syntax)) + (setq result (car pair)) + (cond + ((null func) + (setq result nil)) + ;; lambda function + ((eq (car-safe func) 'lambda) + (if (memq symbol '(+ seq)) + (setq result `(funcall ,func ,@result)) + (setq result `(funcall ,func ,result)))) + ;; string replacement + ((or (stringp func) (stringp (car-safe func))) + (let* ((symbol (or (car-safe (cdr-safe func)) + (and (boundp 'context) context) + (car-safe (car-safe grammar)))) + (string (if (stringp func) func (car-safe func)))) + (setq result (car-safe (evil-parser string symbol grammar + greedy syntax))))) + ;; dollar expression + ((evil-parser--dexp func) + (setq result (evil-parser--dval func result))) + ;; function call + ((listp func) + (setq result (evil-parser--dval func result))) + ;; symbol + (t + (if (memq symbol '(+ seq)) + (setq result `(,func ,@result)) + (setq result `(,func ,result))))) + (setcar pair result)))) + ;; weed out incomplete matches + (when pair + (if (not greedy) pair + (if (null (cdr pair)) pair + ;; ignore trailing whitespace + (when (save-match-data (string-match "^[ \f\t\n\r\v]*$" (cdr pair))) + (unless syntax (setcdr pair nil)) + pair)))))) + +(provide 'evil-ex) + +;;; evil-ex.el ends here diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-ex.elc b/.emacs.d/elpa/evil-20210527.2107/evil-ex.elc new file mode 100644 index 0000000..f76043b Binary files /dev/null and b/.emacs.d/elpa/evil-20210527.2107/evil-ex.elc differ diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-integration.el b/.emacs.d/elpa/evil-20210527.2107/evil-integration.el new file mode 100644 index 0000000..3c09fc1 --- /dev/null +++ b/.emacs.d/elpa/evil-20210527.2107/evil-integration.el @@ -0,0 +1,524 @@ +;;; evil-integration.el --- Integrate Evil with other modules -*- lexical-binding: t -*- + +;; Author: Vegard Øye <vegard_oye at hotmail.com> +;; Maintainer: Vegard Øye <vegard_oye at hotmail.com> + +;; Version: 1.14.0 + +;; +;; This file is NOT part of GNU Emacs. + +;;; License: + +;; This file is part of Evil. +;; +;; Evil is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; Evil is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with Evil. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: + +;; This provides evil integration for various emacs modes. +;; Additional keybindings (or default state) should go into evil-keybindings.el. + +;;; Code: + +(require 'evil-maps) +(require 'evil-core) +(require 'evil-macros) +(require 'evil-types) +(require 'evil-repeat) + +;;; Evilize some commands + +;; unbound keys should be ignored +(evil-declare-ignore-repeat 'undefined) + +(mapc #'(lambda (cmd) + (evil-set-command-property cmd :keep-visual t) + (evil-declare-not-repeat cmd)) + '(digit-argument + negative-argument + universal-argument + universal-argument-minus + universal-argument-more + universal-argument-other-key)) +(mapc #'evil-declare-not-repeat + '(what-cursor-position)) +(mapc #'evil-declare-change-repeat + '(dabbrev-expand + hippie-expand + quoted-insert)) +(mapc #'evil-declare-abort-repeat + '(balance-windows + eval-expression + execute-extended-command + exit-minibuffer + compile + delete-window + delete-other-windows + find-file-at-point + ffap-other-window + recompile + redo + save-buffer + split-window + split-window-horizontally + split-window-vertically + undo + undo-tree-redo + undo-tree-undo)) + +(evil-set-type #'previous-line 'line) +(evil-set-type #'next-line 'line) + +(dolist (cmd '(keyboard-quit keyboard-escape-quit)) + (evil-set-command-property cmd :suppress-operator t)) + +;;; Mouse +(evil-declare-insert-at-point-repeat 'mouse-yank-primary) +(evil-declare-insert-at-point-repeat 'mouse-yank-secondary) + +;;; key-binding + +;; Calling `keyboard-quit' should cancel repeat +(defadvice keyboard-quit (before evil activate) + (when (fboundp 'evil-repeat-abort) + (evil-repeat-abort))) + +(eval-after-load 'wdired + '(progn + (add-hook 'wdired-mode-hook #'evil-change-to-initial-state) + (defadvice wdired-change-to-dired-mode (after evil activate) + (evil-change-to-initial-state nil t)))) + +;;; Parentheses + +(defadvice show-paren-function (around evil disable) + "Match parentheses in Normal state." + (if (if (memq 'not evil-highlight-closing-paren-at-point-states) + (memq evil-state evil-highlight-closing-paren-at-point-states) + (not (memq evil-state evil-highlight-closing-paren-at-point-states))) + ad-do-it + (let ((pos (point)) syntax narrow) + (setq pos + (catch 'end + (dotimes (var (1+ (* 2 evil-show-paren-range))) + (if (zerop (mod var 2)) + (setq pos (+ pos var)) + (setq pos (- pos var))) + (setq syntax (syntax-class (syntax-after pos))) + (cond + ((eq syntax 4) + (setq narrow pos) + (throw 'end pos)) + ((eq syntax 5) + (throw 'end (1+ pos))))))) + (if pos + (save-excursion + (goto-char pos) + (save-restriction + (when narrow + (narrow-to-region narrow (point-max))) + ad-do-it)) + ;; prevent the preceding pair from being highlighted + (dolist (ov '(show-paren--overlay + show-paren--overlay-1 + show-paren-overlay + show-paren-overlay-1)) + (let ((ov (and (boundp ov) (symbol-value ov)))) + (when (overlayp ov) (delete-overlay ov)))))))) + +;;; Undo tree +(eval-after-load 'undo-tree + '(with-no-warnings + (defadvice undo-tree-visualize (after evil activate) + "Initialize Evil in the visualization buffer." + (when evil-local-mode + (evil-initialize-state))) + + (when (fboundp 'undo-tree-visualize) + (evil-ex-define-cmd "undol[ist]" 'undo-tree-visualize) + (evil-ex-define-cmd "ul" 'undo-tree-visualize)) + + (when (boundp 'undo-tree-visualizer-mode-map) + (define-key undo-tree-visualizer-mode-map + [remap evil-backward-char] 'undo-tree-visualize-switch-branch-left) + (define-key undo-tree-visualizer-mode-map + [remap evil-forward-char] 'undo-tree-visualize-switch-branch-right) + (define-key undo-tree-visualizer-mode-map + [remap evil-next-line] 'undo-tree-visualize-redo) + (define-key undo-tree-visualizer-mode-map + [remap evil-previous-line] 'undo-tree-visualize-undo) + (define-key undo-tree-visualizer-mode-map + [remap evil-ret] 'undo-tree-visualizer-set)) + + (when (boundp 'undo-tree-visualizer-selection-mode-map) + (define-key undo-tree-visualizer-selection-mode-map + [remap evil-backward-char] 'undo-tree-visualizer-select-left) + (define-key undo-tree-visualizer-selection-mode-map + [remap evil-forward-char] 'undo-tree-visualizer-select-right) + (define-key undo-tree-visualizer-selection-mode-map + [remap evil-next-line] 'undo-tree-visualizer-select-next) + (define-key undo-tree-visualizer-selection-mode-map + [remap evil-previous-line] 'undo-tree-visualizer-select-previous) + (define-key undo-tree-visualizer-selection-mode-map + [remap evil-ret] 'undo-tree-visualizer-set)))) + +;;; Auto-complete +(eval-after-load 'auto-complete + '(progn + (evil-add-command-properties 'auto-complete :repeat 'evil-ac-repeat) + (evil-add-command-properties 'ac-complete :repeat 'evil-ac-repeat) + (evil-add-command-properties 'ac-expand :repeat 'evil-ac-repeat) + (evil-add-command-properties 'ac-next :repeat 'ignore) + (evil-add-command-properties 'ac-previous :repeat 'ignore) + + (defvar evil-ac-prefix-len nil + "The length of the prefix of the current item to be completed.") + + (defvar ac-prefix) + (defun evil-ac-repeat (flag) + "Record the changes for auto-completion." + (cond + ((eq flag 'pre) + (setq evil-ac-prefix-len (length ac-prefix)) + (evil-repeat-start-record-changes)) + ((eq flag 'post) + ;; Add change to remove the prefix + (evil-repeat-record-change (- evil-ac-prefix-len) + "" + evil-ac-prefix-len) + ;; Add change to insert the full completed text + (evil-repeat-record-change + (- evil-ac-prefix-len) + (buffer-substring-no-properties (- evil-repeat-pos + evil-ac-prefix-len) + (point)) + 0) + ;; Finish repeation + (evil-repeat-finish-record-changes)))))) + +;;; Company +(eval-after-load 'company + '(progn + (mapc #'evil-declare-change-repeat + '(company-complete-mouse + company-complete-number + company-complete-selection + company-complete-common)) + + (mapc #'evil-declare-ignore-repeat + '(company-abort + company-select-next + company-select-previous + company-select-next-or-abort + company-select-previous-or-abort + company-select-mouse + company-show-doc-buffer + company-show-location + company-search-candidates + company-filter-candidates)))) + +;; Eval last sexp +(cond + ((version< emacs-version "25") + (defadvice preceding-sexp (around evil activate) + "In normal-state or motion-state, last sexp ends at point." + (if (and (not evil-move-beyond-eol) + (or (evil-normal-state-p) (evil-motion-state-p))) + (save-excursion + (unless (or (eobp) (eolp)) (forward-char)) + ad-do-it) + ad-do-it)) + + (defadvice pp-last-sexp (around evil activate) + "In normal-state or motion-state, last sexp ends at point." + (if (and (not evil-move-beyond-eol) + (or (evil-normal-state-p) (evil-motion-state-p))) + (save-excursion + (unless (or (eobp) (eolp)) (forward-char)) + ad-do-it) + ad-do-it))) + (t + (defun evil--preceding-sexp (command &rest args) + "In normal-state or motion-state, last sexp ends at point." + (if (and (not evil-move-beyond-eol) + (or (evil-normal-state-p) (evil-motion-state-p))) + (save-excursion + (unless (or (eobp) (eolp)) (forward-char)) + (apply command args)) + (apply command args))) + + (advice-add 'elisp--preceding-sexp :around 'evil--preceding-sexp '((name . evil))) + (advice-add 'pp-last-sexp :around 'evil--preceding-sexp '((name . evil))))) + +;; Show key +(defadvice quail-show-key (around evil activate) + "Temporarily go to Emacs state" + (evil-with-state emacs ad-do-it)) + +(defadvice describe-char (around evil activate) + "Temporarily go to Emacs state" + (evil-with-state emacs ad-do-it)) + +;; ace-jump-mode +(declare-function ace-jump-char-mode "ext:ace-jump-mode") +(declare-function ace-jump-word-mode "ext:ace-jump-mode") +(declare-function ace-jump-line-mode "ext:ace-jump-mode") +(defvar ace-jump-mode-scope) + +(defvar evil-ace-jump-active nil) + +(defmacro evil-enclose-ace-jump-for-motion (&rest body) + "Enclose ace-jump to make it suitable for motions. +This includes restricting `ace-jump-mode' to the current window +in visual and operator state, deactivating visual updates, saving +the mark and entering `recursive-edit'." + (declare (indent defun) + (debug t)) + `(let ((old-mark (mark)) + (ace-jump-mode-scope + (if (and (not (memq evil-state '(visual operator))) + (boundp 'ace-jump-mode-scope)) + ace-jump-mode-scope + 'window))) + (remove-hook 'pre-command-hook #'evil-visual-pre-command t) + (remove-hook 'post-command-hook #'evil-visual-post-command t) + (unwind-protect + (let ((evil-ace-jump-active 'prepare)) + (add-hook 'ace-jump-mode-end-hook + #'evil-ace-jump-exit-recursive-edit) + ,@body + (when evil-ace-jump-active + (setq evil-ace-jump-active t) + (recursive-edit))) + (remove-hook 'post-command-hook + #'evil-ace-jump-exit-recursive-edit) + (remove-hook 'ace-jump-mode-end-hook + #'evil-ace-jump-exit-recursive-edit) + (if (evil-visual-state-p) + (progn + (add-hook 'pre-command-hook #'evil-visual-pre-command nil t) + (add-hook 'post-command-hook #'evil-visual-post-command nil t) + (set-mark old-mark)) + (push-mark old-mark))))) + +(eval-after-load 'ace-jump-mode + `(defadvice ace-jump-done (after evil activate) + (when evil-ace-jump-active + (add-hook 'post-command-hook #'evil-ace-jump-exit-recursive-edit)))) + +(defun evil-ace-jump-exit-recursive-edit () + "Exit a recursive edit caused by an evil jump." + (cond + ((eq evil-ace-jump-active 'prepare) + (setq evil-ace-jump-active nil)) + (evil-ace-jump-active + (remove-hook 'post-command-hook #'evil-ace-jump-exit-recursive-edit) + (exit-recursive-edit)))) + +(evil-define-motion evil-ace-jump-char-mode (count) + "Jump visually directly to a char using ace-jump." + :type inclusive + (evil-without-repeat + (let ((pnt (point)) + (buf (current-buffer))) + (evil-enclose-ace-jump-for-motion + (call-interactively 'ace-jump-char-mode)) + ;; if we jump backwards, motion type is exclusive, analogously + ;; to `evil-find-char-backward' + (when (and (equal buf (current-buffer)) + (< (point) pnt)) + (setq evil-this-type + (cond + ((eq evil-this-type 'exclusive) 'inclusive) + ((eq evil-this-type 'inclusive) 'exclusive))))))) + +(evil-define-motion evil-ace-jump-char-to-mode (count) + "Jump visually to the char in front of a char using ace-jump." + :type inclusive + (evil-without-repeat + (let ((pnt (point)) + (buf (current-buffer))) + (evil-enclose-ace-jump-for-motion + (call-interactively 'ace-jump-char-mode)) + (if (and (equal buf (current-buffer)) + (< (point) pnt)) + (progn + (or (eobp) (forward-char)) + (setq evil-this-type + (cond + ((eq evil-this-type 'exclusive) 'inclusive) + ((eq evil-this-type 'inclusive) 'exclusive)))) + (backward-char))))) + +(evil-define-motion evil-ace-jump-line-mode (count) + "Jump visually to the beginning of a line using ace-jump." + :type line + :repeat abort + (evil-without-repeat + (evil-enclose-ace-jump-for-motion + (call-interactively 'ace-jump-line-mode)))) + +(evil-define-motion evil-ace-jump-word-mode (count) + "Jump visually to the beginning of a word using ace-jump." + :type exclusive + :repeat abort + (evil-without-repeat + (evil-enclose-ace-jump-for-motion + (call-interactively 'ace-jump-word-mode)))) + +(define-key evil-motion-state-map [remap ace-jump-char-mode] #'evil-ace-jump-char-mode) +(define-key evil-motion-state-map [remap ace-jump-line-mode] #'evil-ace-jump-line-mode) +(define-key evil-motion-state-map [remap ace-jump-word-mode] #'evil-ace-jump-word-mode) + +;;; avy +(declare-function avy-goto-word-or-subword-1 "ext:avy") +(declare-function avy-goto-line "ext:avy") +(declare-function avy-goto-char "ext:avy") +(declare-function avy-goto-char-2 "ext:avy") +(declare-function avy-goto-char-2-above "ext:avy") +(declare-function avy-goto-char-2-below "ext:avy") +(declare-function avy-goto-char-in-line "ext:avy") +(declare-function avy-goto-word-0 "ext:avy") +(declare-function avy-goto-word-1 "ext:avy") +(declare-function avy-goto-word-1-above "ext:avy") +(declare-function avy-goto-word-1-below "ext:avy") +(declare-function avy-goto-subword-0 "ext:avy") +(declare-function avy-goto-subword-1 "ext:avy") +(declare-function avy-goto-char-timer "ext:avy") +(defvar avy-all-windows) + +(defmacro evil-enclose-avy-for-motion (&rest body) + "Enclose avy to make it suitable for motions. +Based on `evil-enclose-ace-jump-for-motion'." + (declare (indent defun) + (debug t)) + `(let ((avy-all-windows + (if (and (not (memq evil-state '(visual operator))) + (boundp 'avy-all-windows)) + avy-all-windows + nil))) + ,@body)) + +(defmacro evil-define-avy-motion (command type) + (declare (indent defun) + (debug t)) + (let ((name (intern (format "evil-%s" command)))) + `(evil-define-motion ,name (count) + ,(format "Evil motion for `%s'." command) + :type ,type + :jump t + :repeat abort + (evil-without-repeat + (evil-enclose-avy-for-motion + (call-interactively ',command)))))) + +;; define evil-avy-* motion commands for avy-* commands +(evil-define-avy-motion avy-goto-char inclusive) +(evil-define-avy-motion avy-goto-char-2 inclusive) +(evil-define-avy-motion avy-goto-char-2-above inclusive) +(evil-define-avy-motion avy-goto-char-2-below inclusive) +(evil-define-avy-motion avy-goto-char-in-line inclusive) +(evil-define-avy-motion avy-goto-char-timer inclusive) +(evil-define-avy-motion avy-goto-line line) +(evil-define-avy-motion avy-goto-line-above line) +(evil-define-avy-motion avy-goto-line-below line) +(evil-define-avy-motion avy-goto-subword-0 exclusive) +(evil-define-avy-motion avy-goto-subword-1 exclusive) +(evil-define-avy-motion avy-goto-symbol-1 exclusive) +(evil-define-avy-motion avy-goto-symbol-1-above exclusive) +(evil-define-avy-motion avy-goto-symbol-1-below exclusive) +(evil-define-avy-motion avy-goto-word-0 exclusive) +(evil-define-avy-motion avy-goto-word-1 exclusive) +(evil-define-avy-motion avy-goto-word-1-above exclusive) +(evil-define-avy-motion avy-goto-word-1-below exclusive) +(evil-define-avy-motion avy-goto-word-or-subword-1 exclusive) + +;; remap avy-* commands to evil-avy-* commands +(dolist (command '(avy-goto-char + avy-goto-char-2 + avy-goto-char-2-above + avy-goto-char-2-below + avy-goto-char-in-line + avy-goto-char-timer + avy-goto-line + avy-goto-line-above + avy-goto-line-below + avy-goto-subword-0 + avy-goto-subword-1 + avy-goto-symbol-1 + avy-goto-symbol-1-above + avy-goto-symbol-1-below + avy-goto-word-0 + avy-goto-word-1 + avy-goto-word-1-above + avy-goto-word-1-below + avy-goto-word-or-subword-1)) + (define-key evil-motion-state-map + (vector 'remap command) (intern-soft (format "evil-%s" command)))) + +;;; nXhtml/mumamo +;; ensure that mumamo does not toggle evil through its globalized mode +(eval-after-load 'mumamo + '(with-no-warnings + (push 'evil-mode-cmhh mumamo-change-major-mode-no-nos))) + +;; visual-line-mode integration +(when evil-respect-visual-line-mode + (evil-define-command evil-digit-argument-or-evil-beginning-of-visual-line () + :digit-argument-redirection evil-beginning-of-visual-line + :keep-visual t + :repeat nil + (interactive) + (cond + (current-prefix-arg + (setq this-command #'digit-argument) + (call-interactively #'digit-argument)) + (t + (setq this-command 'evil-beginning-of-visual-line) + (call-interactively 'evil-beginning-of-visual-line)))) + + (evil-define-minor-mode-key 'motion 'visual-line-mode + "j" 'evil-next-visual-line + "gj" 'evil-next-line + "k" 'evil-previous-visual-line + "gk" 'evil-previous-line + "0" 'evil-digit-argument-or-evil-beginning-of-visual-line + "g0" 'evil-beginning-of-line + "$" 'evil-end-of-visual-line + "g$" 'evil-end-of-line + "V" 'evil-visual-screen-line)) + +;;; abbrev.el +(defun evil-maybe-expand-abbrev () + (when (and abbrev-mode evil-want-abbrev-expand-on-insert-exit) + (expand-abbrev))) + +(eval-after-load 'abbrev + '(add-hook 'evil-insert-state-exit-hook 'evil-maybe-expand-abbrev)) + +;;; ElDoc +(eval-after-load 'eldoc + '(when (fboundp 'eldoc-add-command-completions) + (eldoc-add-command-completions "evil-window-"))) + +;;; XRef +(eval-after-load 'xref + '(progn + (evil-set-command-property 'xref-find-definitions :jump t) + (evil-set-command-property 'xref-find-references :jump t))) + +(provide 'evil-integration) + +;;; evil-integration.el ends here diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-integration.elc b/.emacs.d/elpa/evil-20210527.2107/evil-integration.elc new file mode 100644 index 0000000..225dea8 Binary files /dev/null and b/.emacs.d/elpa/evil-20210527.2107/evil-integration.elc differ diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-jumps.el b/.emacs.d/elpa/evil-20210527.2107/evil-jumps.el new file mode 100644 index 0000000..a448ee8 --- /dev/null +++ b/.emacs.d/elpa/evil-20210527.2107/evil-jumps.el @@ -0,0 +1,353 @@ +;;; evil-jumps.el --- Jump list implementation -*- lexical-binding: t -*- + +;; Author: Bailey Ling <bling at live.ca> + +;; Version: 1.14.0 + +;; +;; This file is NOT part of GNU Emacs. + +;;; License: + +;; This file is part of Evil. +;; +;; Evil is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; Evil is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with Evil. If not, see <http://www.gnu.org/licenses/>. + +(require 'cl-lib) +(require 'evil-core) +(require 'evil-states) + +;;; Code: + +(defgroup evil-jumps nil + "Evil jump list configuration options." + :prefix "evil-jumps" + :group 'evil) + +(defcustom evil-jumps-cross-buffers t + "When non-nil, the jump commands can cross borders between buffers, otherwise the jump commands act only within the current buffer." + :type 'boolean + :group 'evil-jumps) + +(defcustom evil-jumps-max-length 100 + "The maximum number of jumps to keep track of." + :type 'integer + :group 'evil-jumps) + +(defcustom evil-jumps-pre-jump-hook nil + "Hooks to run just before jumping to a location in the jump list." + :type 'hook + :group 'evil-jumps) + +(defcustom evil-jumps-post-jump-hook nil + "Hooks to run just after jumping to a location in the jump list." + :type 'hook + :group 'evil-jumps) + +(defcustom evil-jumps-ignored-file-patterns '("COMMIT_EDITMSG$" "TAGS$") + "A list of pattern regexps to match on the file path to exclude from being included in the jump list." + :type '(repeat string) + :group 'evil-jumps) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defvar savehist-additional-variables) + +(defvar evil--jumps-jumping nil) + +(defvar evil--jumps-jumping-backward nil + "Set by `evil--jump-backward', used and cleared in the +`post-command-hook' by `evil--jump-handle-buffer-crossing'") + +(eval-when-compile (defvar evil--jumps-debug nil)) + +(defvar evil--jumps-buffer-targets "\\*\\(new\\|scratch\\)\\*" + "Regexp to match against `buffer-name' to determine whether it's a valid jump target.") + +(defvar evil--jumps-window-jumps (make-hash-table) + "Hashtable which stores all jumps on a per window basis.") + +(defvar evil-jumps-history nil + "History of `evil-mode' jumps that are persisted with `savehist'.") + +(cl-defstruct evil-jumps-struct + ring + (idx -1) + previous-pos) + +;; Is inlining this really worth it? +(defsubst evil--jumps-message (format &rest args) + (when (eval-when-compile evil--jumps-debug) + (with-current-buffer (get-buffer-create "*evil-jumps*") + (goto-char (point-max)) + (insert (apply #'format format args) "\n")))) + +(defun evil--jumps-get-current (&optional window) + (unless window + (setq window (frame-selected-window))) + (let* ((jump-struct (gethash window evil--jumps-window-jumps))) + (unless jump-struct + (setq jump-struct (make-evil-jumps-struct)) + (puthash window jump-struct evil--jumps-window-jumps)) + jump-struct)) + +(defun evil--jumps-get-jumps (struct) + (let ((ring (evil-jumps-struct-ring struct))) + (unless ring + (setq ring (make-ring evil-jumps-max-length)) + (setf (evil-jumps-struct-ring struct) ring)) + ring)) + +(defun evil--jumps-get-window-jump-list () + (let ((struct (evil--jumps-get-current))) + (evil--jumps-get-jumps struct))) + +(defun evil--jumps-savehist-load () + (add-to-list 'savehist-additional-variables 'evil-jumps-history) + (let ((ring (make-ring evil-jumps-max-length))) + (cl-loop for jump in (reverse evil-jumps-history) + do (ring-insert ring jump)) + (setf (evil-jumps-struct-ring (evil--jumps-get-current)) ring)) + (add-hook 'savehist-save-hook #'evil--jumps-savehist-sync) + (remove-hook 'savehist-mode-hook #'evil--jumps-savehist-load)) + +(defun evil--jumps-savehist-sync () + "Updates the printable value of window jumps for `savehist'." + (setq evil-jumps-history + (delq nil (mapcar #'(lambda (jump) + (let* ((mark (car jump)) + (pos (if (markerp mark) + (marker-position mark) + mark)) + (file-name (cadr jump))) + (when (and (not (file-remote-p file-name)) + (file-exists-p file-name) + pos) + (list pos file-name)))) + (ring-elements (evil--jumps-get-window-jump-list)))))) + +(defun evil--jumps-jump (idx shift) + (let ((target-list (evil--jumps-get-window-jump-list))) + (evil--jumps-message "jumping from %s by %s" idx shift) + (evil--jumps-message "target list = %s" target-list) + (setq idx (+ idx shift)) + (let* ((current-file-name (or (buffer-file-name) (buffer-name))) + (size (ring-length target-list))) + (unless evil-jumps-cross-buffers + ;; skip jump marks pointing to other buffers + (while (and (< idx size) (>= idx 0) + (not (string= current-file-name (cadr (ring-ref target-list idx))))) + (setq idx (+ idx shift)))) + (when (and (< idx size) (>= idx 0)) + ;; actual jump + (run-hooks 'evil-jumps-pre-jump-hook) + (let* ((place (ring-ref target-list idx)) + (pos (car place)) + (file-name (cadr place))) + (setq evil--jumps-jumping t) + (if (string-match-p evil--jumps-buffer-targets file-name) + (switch-to-buffer file-name) + (find-file file-name)) + (setq evil--jumps-jumping nil) + (goto-char pos) + (setf (evil-jumps-struct-idx (evil--jumps-get-current)) idx) + (run-hooks 'evil-jumps-post-jump-hook)))))) + +(defun evil--jumps-push () + "Pushes the current cursor/file position to the jump list." + (let ((target-list (evil--jumps-get-window-jump-list))) + (let ((file-name (buffer-file-name)) + (buffer-name (buffer-name)) + (current-pos (point-marker)) + (first-pos nil) + (first-file-name nil) + (excluded nil)) + (when (and (not file-name) + (string-match-p evil--jumps-buffer-targets buffer-name)) + (setq file-name buffer-name)) + (when file-name + (dolist (pattern evil-jumps-ignored-file-patterns) + (when (string-match-p pattern file-name) + (setq excluded t))) + (unless excluded + (unless (ring-empty-p target-list) + (setq first-pos (car (ring-ref target-list 0))) + (setq first-file-name (car (cdr (ring-ref target-list 0))))) + (unless (and (equal first-pos current-pos) + (equal first-file-name file-name)) + (evil--jumps-message "pushing %s on %s" current-pos file-name) + (ring-insert target-list `(,current-pos ,file-name)))))) + (evil--jumps-message "%s %s" + (selected-window) + (and (not (ring-empty-p target-list)) + (ring-ref target-list 0))))) + +(evil-define-command evil-show-jumps () + "Display the contents of the jump list." + :repeat nil + (evil-with-view-list + :name "evil-jumps" + :mode "Evil Jump List" + :format [("Jump" 5 nil) + ("Marker" 8 nil) + ("File/text" 1000 t)] + :entries (let* ((jumps (evil--jumps-savehist-sync)) + (count 0)) + (cl-loop for jump in jumps + collect `(nil [,(number-to-string (cl-incf count)) + ,(number-to-string (car jump)) + (,(cadr jump))]))) + :select-action #'evil--show-jumps-select-action)) + +(defun evil--show-jumps-select-action (jump) + (let ((position (string-to-number (elt jump 1))) + (file (car (elt jump 2)))) + (kill-buffer) + (switch-to-buffer (find-file file)) + (goto-char position))) + +(defun evil-set-jump (&optional pos) + "Set jump point at POS. +POS defaults to point." + (save-excursion + (when (markerp pos) + (set-buffer (marker-buffer pos))) + + (unless (or (region-active-p) (evil-visual-state-p)) + (push-mark pos t)) + + (unless evil--jumps-jumping + ;; clear out intermediary jumps when a new one is set + (let* ((struct (evil--jumps-get-current)) + (target-list (evil--jumps-get-jumps struct)) + (idx (evil-jumps-struct-idx struct))) + (cl-loop repeat idx + do (ring-remove target-list)) + (setf (evil-jumps-struct-idx struct) -1)) + (when pos + (goto-char pos)) + (evil--jumps-push)))) + +(defun evil--jump-backward (count) + (setq evil--jumps-jumping-backward t) + (let ((count (or count 1))) + (evil-motion-loop (nil count) + (let* ((struct (evil--jumps-get-current)) + (idx (evil-jumps-struct-idx struct))) + (evil--jumps-message "jumping back %s" idx) + (when (= idx -1) + (setq idx 0) + (setf (evil-jumps-struct-idx struct) 0) + (evil--jumps-push)) + (evil--jumps-jump idx 1))))) + +(defun evil--jump-forward (count) + (let ((count (or count 1))) + (evil-motion-loop (nil count) + (let* ((struct (evil--jumps-get-current)) + (idx (evil-jumps-struct-idx struct))) + (when (= idx -1) + (setq idx 0) + (setf (evil-jumps-struct-idx struct) 0) + (evil--jumps-push)) + (evil--jumps-jump idx -1))))) + +(defun evil--jumps-window-configuration-hook (&rest _args) + (let* ((window-list (window-list-1 nil nil t)) + (existing-window (selected-window)) + (new-window (previous-window))) + (when (and (not (eq existing-window new-window)) + (> (length window-list) 1)) + (let* ((target-jump-struct (evil--jumps-get-current new-window))) + (if (not (ring-empty-p (evil--jumps-get-jumps target-jump-struct))) + (evil--jumps-message "target window %s already has %s jumps" new-window + (ring-length (evil--jumps-get-jumps target-jump-struct))) + (evil--jumps-message "new target window detected; copying %s to %s" existing-window new-window) + (let* ((source-jump-struct (evil--jumps-get-current existing-window)) + (source-list (evil--jumps-get-jumps source-jump-struct))) + (when (= (ring-length (evil--jumps-get-jumps target-jump-struct)) 0) + (setf (evil-jumps-struct-previous-pos target-jump-struct) (evil-jumps-struct-previous-pos source-jump-struct)) + (setf (evil-jumps-struct-idx target-jump-struct) (evil-jumps-struct-idx source-jump-struct)) + (setf (evil-jumps-struct-ring target-jump-struct) (ring-copy source-list))))))) + ;; delete obsolete windows + (maphash (lambda (key _val) + (unless (member key window-list) + (evil--jumps-message "removing %s" key) + (remhash key evil--jumps-window-jumps))) + evil--jumps-window-jumps))) + +(defun evil--jump-hook (&optional command) + "`pre-command-hook' for evil-jumps. +Set jump point if COMMAND has a non-nil `:jump' property. Otherwise, +save the current position in case the command being executed will +change the current buffer." + (setq command (or command this-command)) + (if (evil-get-command-property command :jump) + (evil-set-jump) + (setf (evil-jumps-struct-previous-pos (evil--jumps-get-current)) + (point-marker)))) + +(defun evil--jump-handle-buffer-crossing () + (let ((jumping-backward evil--jumps-jumping-backward)) + (setq evil--jumps-jumping-backward nil) + (dolist (frame (frame-list)) + (dolist (window (window-list frame)) + (let* ((struct (evil--jumps-get-current window)) + (previous-pos (evil-jumps-struct-previous-pos struct))) + (when previous-pos + (setf (evil-jumps-struct-previous-pos struct) nil) + (if (and + ;; `evil-jump-backward' (and other backward jumping + ;; commands) needs to be handled specially. When + ;; jumping backward multiple times, calling + ;; `evil-set-jump' is always wrong: If you jump back + ;; twice and we call `evil-set-jump' after the second + ;; time, we clear the forward jump list and + ;; `evil--jump-forward' won't work. + + ;; The first time you jump backward, setting a jump + ;; point is sometimes correct. But we don't do it + ;; here because this function is called after + ;; `evil--jump-backward' has updated our position in + ;; the jump list so, again, `evil-set-jump' would + ;; break `evil--jump-forward'. + (not jumping-backward) + (let ((previous-buffer (marker-buffer previous-pos))) + (and previous-buffer + (not (eq previous-buffer (window-buffer window)))))) + (evil-set-jump previous-pos) + (set-marker previous-pos nil)))))))) + +(if (bound-and-true-p savehist-loaded) + (evil--jumps-savehist-load) + (add-hook 'savehist-mode-hook #'evil--jumps-savehist-load)) + +(defun evil--jumps-install-or-uninstall () + (if evil-local-mode + (progn + (add-hook 'pre-command-hook #'evil--jump-hook nil t) + (add-hook 'post-command-hook #'evil--jump-handle-buffer-crossing nil t) + (add-hook 'next-error-hook #'evil-set-jump nil t) + (add-hook 'window-configuration-change-hook #'evil--jumps-window-configuration-hook nil t)) + (remove-hook 'pre-command-hook #'evil--jump-hook t) + (remove-hook 'post-command-hook #'evil--jump-handle-buffer-crossing t) + (remove-hook 'next-error-hook #'evil-set-jump t) + (remove-hook 'window-configuration-change-hook #'evil--jumps-window-configuration-hook t) + (evil--jump-handle-buffer-crossing))) + +(add-hook 'evil-local-mode-hook #'evil--jumps-install-or-uninstall) + +(provide 'evil-jumps) + +;;; evil-jumps.el ends here diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-jumps.elc b/.emacs.d/elpa/evil-20210527.2107/evil-jumps.elc new file mode 100644 index 0000000..c5f0224 Binary files /dev/null and b/.emacs.d/elpa/evil-20210527.2107/evil-jumps.elc differ diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-keybindings.el b/.emacs.d/elpa/evil-20210527.2107/evil-keybindings.el new file mode 100644 index 0000000..084a06a --- /dev/null +++ b/.emacs.d/elpa/evil-20210527.2107/evil-keybindings.el @@ -0,0 +1,124 @@ +;;; evil-keybindings.el --- Add some Evil keybindings to other modules -*- lexical-binding: t -*- + +;; Author: Vegard Øye <vegard_oye at hotmail.com> +;; Maintainer: Vegard Øye <vegard_oye at hotmail.com> + +;; Version: 1.14.0 + +;; +;; This file is NOT part of GNU Emacs. + +;;; License: + +;; This file is part of Evil. +;; +;; Evil is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; Evil is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with Evil. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: + +;; This provides a set of keybindings for other emacs modes. This also includes +;; setting up the initial evil state of those other modes. + +;;; Code: + +(require 'evil-maps) +(require 'evil-core) +(require 'evil-macros) +(require 'evil-types) +(require 'evil-repeat) + +;; etags-select +;; FIXME: probably etags-select should be recomended in docs +(eval-after-load 'etags-select + '(progn + (define-key evil-motion-state-map "g]" 'etags-select-find-tag-at-point))) + +;;; Buffer-menu + +(evil-add-hjkl-bindings Buffer-menu-mode-map 'motion) + +;; dictionary.el + +(evil-add-hjkl-bindings dictionary-mode-map 'motion + "?" 'dictionary-help ; "h" + "C-o" 'dictionary-previous) ; "l" + +;;; Dired + +(eval-after-load 'dired + '(progn + ;; use the standard Dired bindings as a base + (defvar dired-mode-map) + (evil-make-overriding-map dired-mode-map 'normal) + (evil-add-hjkl-bindings dired-mode-map 'normal + "J" 'dired-goto-file ; "j" + "K" 'dired-do-kill-lines ; "k" + "r" 'dired-do-redisplay ; "l" + ;; ":d", ":v", ":s", ":e" + ";" (lookup-key dired-mode-map ":")))) + +;;; ERT + +(evil-add-hjkl-bindings ert-results-mode-map 'motion) + +;;; Info + +(evil-add-hjkl-bindings Info-mode-map 'motion + "0" 'evil-digit-argument-or-evil-beginning-of-line + (kbd "\M-h") 'Info-help ; "h" + "\C-t" 'Info-history-back ; "l" + "\C-o" 'Info-history-back + " " 'Info-scroll-up + "\C-]" 'Info-follow-nearest-node + (kbd "DEL") 'Info-scroll-down) + +;;; Speedbar + +(evil-add-hjkl-bindings speedbar-key-map 'motion + "h" 'backward-char + "j" 'speedbar-next + "k" 'speedbar-prev + "l" 'forward-char + "i" 'speedbar-item-info + "r" 'speedbar-refresh + "u" 'speedbar-up-directory + "o" 'speedbar-toggle-line-expansion + (kbd "RET") 'speedbar-edit-line) + +;; Ibuffer +(eval-after-load 'ibuffer + '(progn + (defvar ibuffer-mode-map) + (evil-make-overriding-map ibuffer-mode-map 'normal) + (evil-define-key 'normal ibuffer-mode-map + "j" 'evil-next-line + "k" 'evil-previous-line + "RET" 'ibuffer-visit-buffer))) + +;;; ag.el +(eval-after-load 'ag + '(progn + (defvar ag-mode-map) + (add-to-list 'evil-motion-state-modes 'ag-mode) + (evil-add-hjkl-bindings ag-mode-map 'motion))) + +;;; ELP + +(eval-after-load 'elp + '(defadvice elp-results (after evil activate) + (evil-motion-state))) + +(provide 'evil-keybindings) + +;;; evil-keybindings.el ends here diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-keybindings.elc b/.emacs.d/elpa/evil-20210527.2107/evil-keybindings.elc new file mode 100644 index 0000000..155cc38 Binary files /dev/null and b/.emacs.d/elpa/evil-20210527.2107/evil-keybindings.elc differ diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-macros.el b/.emacs.d/elpa/evil-20210527.2107/evil-macros.el new file mode 100644 index 0000000..7331ae2 --- /dev/null +++ b/.emacs.d/elpa/evil-20210527.2107/evil-macros.el @@ -0,0 +1,814 @@ +;;; evil-macros.el --- Macros -*- lexical-binding: t -*- + +;; Author: Vegard Øye <vegard_oye at hotmail.com> +;; Maintainer: Vegard Øye <vegard_oye at hotmail.com> + +;; Version: 1.14.0 + +;; +;; This file is NOT part of GNU Emacs. + +;;; License: + +;; This file is part of Evil. +;; +;; Evil is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; Evil is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with Evil. If not, see <http://www.gnu.org/licenses/>. + +(require 'evil-common) +(require 'evil-states) +(require 'evil-repeat) + +;;; Code: + +(declare-function evil-ex-p "evil-ex") + +;; set some error codes +(put 'beginning-of-line 'error-conditions '(beginning-of-line error)) +(put 'beginning-of-line 'error-message "Beginning of line") +(put 'end-of-line 'error-conditions '(end-of-line error)) +(put 'end-of-line 'error-message "End of line") + +(defun evil-motion-range (motion &optional count type) + "Execute a motion and return the buffer positions. +The return value is a list (BEG END TYPE)." + (let ((opoint (point)) + (omark (mark t)) + (obuffer (current-buffer)) + (evil-motion-marker (move-marker (make-marker) (point))) + range) + (evil-with-transient-mark-mode + (evil-narrow-to-field + (unwind-protect + (let ((current-prefix-arg count) + ;; Store type in global variable `evil-this-type'. + ;; If necessary, motions can change their type + ;; during execution by setting this variable. + (evil-this-type + (or type (evil-type motion 'exclusive)))) + (condition-case err + (let ((repeat-type (evil-repeat-type motion t))) + (if (functionp repeat-type) + (funcall repeat-type 'pre)) + (unless (with-local-quit + (setq range (call-interactively motion)) + t) + (evil-repeat-abort) + (setq quit-flag t)) + (if (functionp repeat-type) + (funcall repeat-type 'post))) + (error (prog1 nil + (evil-repeat-abort) + ;; some operators depend on succeeding + ;; motions, in particular for + ;; `evil-forward-char' (e.g., used by + ;; `evil-substitute'), therefore we let + ;; end-of-line and end-of-buffer pass + (if (not (memq (car err) '(end-of-line end-of-buffer))) + (signal (car err) (cdr err)) + (message (error-message-string err)))))) + (cond + ;; the motion returned a range + ((evil-range-p range)) + ;; the motion made a Visual selection + ((evil-visual-state-p) + (setq range (evil-visual-range))) + ;; the motion made an active region + ((region-active-p) + (setq range (evil-range (region-beginning) + (region-end) + evil-this-type))) + ;; default: range from previous position to current + (t + (setq range (evil-expand-range + (evil-normalize evil-motion-marker + (point) + evil-this-type))))) + (unless (or (null type) (eq (evil-type range) type)) + (evil-set-type range type) + (evil-expand-range range)) + (evil-set-range-properties range nil) + range) + ;; restore point and mark like `save-excursion', + ;; but only if the motion hasn't disabled the operator + (unless evil-inhibit-operator + (set-buffer obuffer) + (evil-move-mark omark) + (goto-char opoint)) + ;; delete marker so it doesn't slow down editing + (move-marker evil-motion-marker nil)))))) + +(defmacro evil-define-motion (motion args &rest body) + "Define a motion command MOTION. +ARGS is a list of arguments. Motions can have any number of +arguments, but the first (if any) has the predefined meaning of +count. BODY must execute the motion by moving point. + +Optional keyword arguments are: +- `:type' - determines how the motion works after an operator (one of + `inclusive', `line', `block' and `exclusive', or a self-defined + motion type) +- `:jump' - if non-nil, the previous position is stored in the jump + list, so that it can be restored with \ +\\<evil-motion-state-map>\\[evil-jump-backward] + +\(fn MOTION (COUNT ARGS...) DOC [[KEY VALUE]...] BODY...)" + (declare (indent defun) + (doc-string 3) + (debug (&define name lambda-list + [&optional stringp] + [&rest keywordp sexp] + [&optional ("interactive" [&rest form])] + def-body))) + (let (arg doc interactive key keys) + (when args + (setq args `(&optional ,@(delq '&optional args)) + ;; the count is either numerical or nil + interactive '("<c>"))) + ;; collect docstring + (when (and (> (length body) 1) + (or (eq (car-safe (car-safe body)) 'format) + (stringp (car-safe body)))) + (setq doc (pop body))) + ;; collect keywords + (setq keys (plist-put keys :repeat 'motion)) + (while (keywordp (car-safe body)) + (setq key (pop body) + arg (pop body) + keys (plist-put keys key arg))) + ;; collect `interactive' specification + (when (eq (car-safe (car-safe body)) 'interactive) + (setq interactive (cdr (pop body)))) + ;; macro expansion + `(progn + ;; refresh echo area in Eldoc mode + (when ',motion + (eval-after-load 'eldoc + '(and (fboundp 'eldoc-add-command) + (eldoc-add-command ',motion)))) + (evil-define-command ,motion (,@args) + ,@(when doc `(,doc)) ; avoid nil before `interactive' + ,@keys + :keep-visual t + (interactive ,@interactive) + ,@body)))) + +(defmacro evil-narrow-to-line (&rest body) + "Narrow BODY to the current line. +BODY will signal the errors 'beginning-of-line or 'end-of-line +upon reaching the beginning or end of the current line. + +\(fn [[KEY VAL]...] BODY...)" + (declare (indent defun) + (debug t)) + `(let* ((range (evil-expand (point) (point) 'line)) + (beg (evil-range-beginning range)) + (end (evil-range-end range)) + (min (point-min)) + (max (point-max))) + (when (save-excursion (goto-char end) (bolp)) + (setq end (max beg (1- end)))) + ;; don't include the newline in Normal state + (when (and (not evil-move-beyond-eol) + (not (evil-visual-state-p)) + (not (evil-operator-state-p))) + (setq end (max beg (1- end)))) + (evil-with-restriction beg end + (evil-signal-without-movement + (condition-case err + (progn ,@body) + (beginning-of-buffer + (if (= beg min) + (signal (car err) (cdr err)) + (signal 'beginning-of-line nil))) + (end-of-buffer + (if (= end max) + (signal (car err) (cdr err)) + (signal 'end-of-line nil)))))))) + +;; we don't want line boundaries to trigger the debugger +;; when `debug-on-error' is t +(add-to-list 'debug-ignored-errors "^Beginning of line$") +(add-to-list 'debug-ignored-errors "^End of line$") + +(defun evil-eobp (&optional pos) + "Whether point is at end-of-buffer with regard to end-of-line." + (save-excursion + (when pos (goto-char pos)) + (cond + ((eobp)) + ;; the rest only pertains to Normal state + ((not (evil-normal-state-p)) + nil) + ;; at the end of the last line + ((eolp) + (forward-char) + (eobp)) + ;; at the last character of the last line + (t + (forward-char) + (cond + ((eobp)) + ((eolp) + (forward-char) + (eobp))))))) + +(defun evil-move-beginning (count forward &optional backward) + "Move to the beginning of the COUNT next object. +If COUNT is negative, move to the COUNT previous object. +FORWARD is a function which moves to the end of the object, and +BACKWARD is a function which moves to the beginning. +If one is unspecified, the other is used with a negative argument." + (let* ((count (or count 1)) + (backward (or backward + #'(lambda (count) + (funcall forward (- count))))) + (forward (or forward + #'(lambda (count) + (funcall backward (- count))))) + (opoint (point))) + (cond + ((< count 0) + (when (bobp) + (signal 'beginning-of-buffer nil)) + (unwind-protect + (evil-motion-loop (nil count count) + (funcall backward 1)) + (unless (zerop count) + (goto-char (point-min))))) + ((> count 0) + (when (evil-eobp) + (signal 'end-of-buffer nil)) + ;; Do we need to move past the current object? + (when (<= (save-excursion + (funcall forward 1) + (funcall backward 1) + (point)) + opoint) + (setq count (1+ count))) + (unwind-protect + (evil-motion-loop (nil count count) + (funcall forward 1)) + (if (zerop count) + ;; go back to beginning of object + (funcall backward 1) + (goto-char (point-max))))) + (t + count)))) + +(defun evil-move-end (count forward &optional backward inclusive) + "Move to the end of the COUNT next object. +If COUNT is negative, move to the COUNT previous object. +FORWARD is a function which moves to the end of the object, and +BACKWARD is a function which moves to the beginning. +If one is unspecified, the other is used with a negative argument. +If INCLUSIVE is non-nil, then point is placed at the last character +of the object; otherwise it is placed at the end of the object." + (let* ((count (or count 1)) + (backward (or backward + #'(lambda (count) + (funcall forward (- count))))) + (forward (or forward + #'(lambda (count) + (funcall backward (- count))))) + (opoint (point))) + (cond + ((< count 0) + (when (bobp) + (signal 'beginning-of-buffer nil)) + ;; Do we need to move past the current object? + (when (>= (save-excursion + (funcall backward 1) + (funcall forward 1) + (point)) + (if inclusive + (1+ opoint) + opoint)) + (setq count (1- count))) + (unwind-protect + (evil-motion-loop (nil count count) + (funcall backward 1)) + (if (not (zerop count)) + (goto-char (point-min)) + ;; go to end of object + (funcall forward 1) + (when inclusive + (unless (bobp) (backward-char))) + (when (or (evil-normal-state-p) + (evil-motion-state-p)) + (evil-adjust-cursor))))) + ((> count 0) + (when (evil-eobp) + (signal 'end-of-buffer nil)) + (when inclusive + (forward-char)) + (unwind-protect + (evil-motion-loop (nil count count) + (funcall forward 1)) + (if (not (zerop count)) + (goto-char (point-max)) + (when inclusive + (unless (bobp) (backward-char))) + (when (or (evil-normal-state-p) + (evil-motion-state-p)) + (evil-adjust-cursor))))) + (t + count)))) + +(defun evil-text-object-make-linewise (range) + "Turn the text object selection RANGE to linewise. +The selection is adjusted in a sensible way so that the selected +lines match the user intent. In particular, whitespace-only parts +at the first and last lines are omitted. This function returns +the new range." + ;; Bug #607 + ;; If new type is linewise and the selection of the + ;; first line consists of whitespace only, the + ;; beginning is moved to the start of the next line. If + ;; the selections of the last line consists of + ;; whitespace only, the end is moved to the end of the + ;; previous line. + (if (eq (evil-type range) 'line) + range + (let ((expanded (plist-get (evil-range-properties range) :expanded)) + (newrange (evil-expand-range range t))) + (save-excursion + ;; skip whitespace at the beginning + (goto-char (evil-range-beginning newrange)) + (skip-chars-forward " \t") + (when (and (not (bolp)) (eolp)) + (evil-set-range-beginning newrange (1+ (point)))) + ;; skip whitepsace at the end + (goto-char (evil-range-end newrange)) + (skip-chars-backward " \t") + (when (and (not (eolp)) (bolp)) + (evil-set-range-end newrange (1- (point)))) + ;; only modify range if result is not empty + (if (> (evil-range-beginning newrange) + (evil-range-end newrange)) + range + (unless expanded + (evil-contract-range newrange)) + newrange))))) + +(defmacro evil-define-text-object (object args &rest body) + "Define a text object command OBJECT. +BODY should return a range (BEG END) to the right of point +if COUNT is positive, and to the left of it if negative. + +Optional keyword arguments: +- `:type' - determines how the range applies after an operator + (`inclusive', `line', `block', and `exclusive', or a self-defined + motion type). +- `:extend-selection' - if non-nil (default), the text object always + enlarges the current selection. Otherwise, it replaces the current + selection. + +\(fn OBJECT (COUNT) DOC [[KEY VALUE]...] BODY...)" + (declare (indent defun) + (doc-string 3) + (debug (&define name lambda-list + [&optional stringp] + [&rest keywordp sexp] + def-body))) + (let* ((args (delq '&optional args)) + (count (or (pop args) 'count)) + (args (when args `(&optional ,@args))) + (interactive '((interactive "<c><v>"))) + arg doc key keys) + ;; collect docstring + (when (stringp (car-safe body)) + (setq doc (pop body))) + ;; collect keywords + (setq keys (plist-put keys :extend-selection t)) + (while (keywordp (car-safe body)) + (setq key (pop body) + arg (pop body) + keys (plist-put keys key arg))) + ;; interactive + (when (eq (car-safe (car-safe body)) 'interactive) + (setq interactive (list (pop body)))) + ;; macro expansion + `(evil-define-motion ,object (,count ,@args) + ,@(when doc `(,doc)) + ,@keys + ,@interactive + (setq ,count (or ,count 1)) + (when (/= ,count 0) + (let ((type (evil-type ',object evil-visual-char)) + (extend (and (evil-visual-state-p) + (evil-get-command-property + ',object :extend-selection + ',(plist-get keys :extend-selection)))) + (dir evil-visual-direction) + mark point range selection) + (cond + ;; Visual state: extend the current selection + ((and (evil-visual-state-p) + (called-interactively-p 'any)) + ;; if we are at the beginning of the Visual selection, + ;; go to the left (negative COUNT); if at the end, + ;; go to the right (positive COUNT) + (setq dir evil-visual-direction + ,count (* ,count dir)) + (setq range (progn ,@body)) + (when (evil-range-p range) + (setq range (evil-expand-range range)) + (evil-set-type range (evil-type range type)) + (setq range (evil-contract-range range)) + ;; the beginning is mark and the end is point + ;; unless the selection goes the other way + (setq mark (evil-range-beginning range) + point (evil-range-end range) + type (evil-type + (if evil-text-object-change-visual-type + range + (evil-visual-range)))) + (when (and (eq type 'line) + (not (eq type (evil-type range)))) + (let ((newrange (evil-text-object-make-linewise range))) + (setq mark (evil-range-beginning newrange) + point (evil-range-end newrange)))) + (when (< dir 0) + (evil-swap mark point)) + ;; select the union + (evil-visual-make-selection mark point type))) + ;; not Visual state: return a pair of buffer positions + (t + (setq range (progn ,@body)) + (unless (evil-range-p range) + (setq ,count (- ,count) + range (progn ,@body))) + (when (evil-range-p range) + (setq selection (evil-range (point) (point) type)) + (if extend + (setq range (evil-range-union range selection)) + (evil-set-type range (evil-type range type))) + ;; possibly convert to linewise + (when (eq evil-this-type-modified 'line) + (setq range (evil-text-object-make-linewise range))) + (evil-set-range-properties range nil) + range)))))))) + +(defmacro evil-define-operator (operator args &rest body) + "Define an operator command OPERATOR. +The operator acts on the range of characters BEG through +END. BODY must execute the operator by potentially manipulating +the buffer contents, or otherwise causing side effects to happen. + +Optional keyword arguments are: +- `:type' - force the input range to be of a given type (`inclusive', + `line', `block', and `exclusive', or a self-defined motion type). +- `:motion' - use a predetermined motion instead of waiting for one + from the keyboard. This does not affect the behavior in visual + state, where selection boundaries are always used. +- `:repeat' - if non-nil (default), then \ + \\<evil-normal-state-map>\\[evil-repeat] will repeat the + operator. +- `:move-point' - if non-nil (default), the cursor will be moved to + the beginning of the range before the body executes +- `:keep-visual' - if non-nil, the selection is not disabled when the + operator is executed in visual state. By default, visual state is + exited automatically. + +\(fn OPERATOR (BEG END ARGS...) DOC [[KEY VALUE]...] BODY...)" + (declare (indent defun) + (doc-string 3) + (debug (&define name lambda-list + [&optional stringp] + [&rest keywordp sexp] + [&optional ("interactive" [&rest form])] + def-body))) + (let* ((args (delq '&optional args)) + (interactive (if (> (length args) 2) '("<R>") '("<r>"))) + (args (if (> (length args) 2) + `(,(nth 0 args) ,(nth 1 args) + &optional ,@(nthcdr 2 args)) + args)) + arg doc key keys visual) + ;; collect docstring + (when (and (> (length body) 1) + (or (eq (car-safe (car-safe body)) 'format) + (stringp (car-safe body)))) + (setq doc (pop body))) + ;; collect keywords + (setq keys (plist-put keys :move-point t)) + (while (keywordp (car-safe body)) + (setq key (pop body) + arg (pop body)) + (cond + ((eq key :keep-visual) + (setq visual arg)) + (t + (setq keys (plist-put keys key arg))))) + ;; collect `interactive' specification + (when (eq (car-safe (car-safe body)) 'interactive) + (setq interactive (cdr-safe (pop body)))) + ;; transform extended interactive specs + (setq interactive (apply #'evil-interactive-form interactive)) + (setq keys (evil-concat-plists keys (cdr-safe interactive)) + interactive (car-safe interactive)) + ;; macro expansion + `(evil-define-command ,operator ,args + ,@(when doc `(,doc)) + ,@keys + :keep-visual t + :suppress-operator t + (interactive + (let* ((evil-operator-range-motion + (when (evil-has-command-property-p ',operator :motion) + ;; :motion nil is equivalent to :motion undefined + (or (evil-get-command-property ',operator :motion) + #'undefined))) + (evil-operator-range-type + (evil-get-command-property ',operator :type)) + (orig (point)) + evil-operator-range-beginning + evil-operator-range-end + evil-inhibit-operator) + (setq evil-inhibit-operator-value nil + evil-this-operator this-command) + (prog1 ,interactive + (setq orig (point) + evil-inhibit-operator-value evil-inhibit-operator) + (if ,visual + (when (evil-visual-state-p) + (evil-visual-expand-region)) + (when (or (evil-visual-state-p) (region-active-p)) + (setq deactivate-mark t))) + (cond + ((evil-visual-state-p) + (evil-visual-rotate 'upper-left)) + ((evil-get-command-property ',operator :move-point) + (goto-char (or evil-operator-range-beginning orig))) + (t + (goto-char orig)))))) + (unwind-protect + (let ((evil-inhibit-operator evil-inhibit-operator-value)) + (unless (and evil-inhibit-operator + (called-interactively-p 'any)) + ,@body)) + (setq evil-inhibit-operator-value nil))))) + +;; this is used in the `interactive' specification of an operator command +(defun evil-operator-range (&optional return-type) + "Read a motion from the keyboard and return its buffer positions. +The return value is a list (BEG END), or (BEG END TYPE) if +RETURN-TYPE is non-nil." + (let* ((evil-ex-p (and (not (minibufferp)) (evil-ex-p))) + (motion (or evil-operator-range-motion + (when evil-ex-p 'evil-line))) + (type evil-operator-range-type) + (range (evil-range (point) (point))) + command count) + (setq evil-this-type-modified nil) + (evil-save-echo-area + (cond + ;; Ex mode + ((and evil-ex-p evil-ex-range) + (setq range evil-ex-range)) + ;; Visual selection + ((and (not evil-ex-p) (evil-visual-state-p)) + (setq range (evil-visual-range))) + ;; active region + ((and (not evil-ex-p) (region-active-p)) + (setq range (evil-range (region-beginning) + (region-end) + (or evil-this-type 'exclusive)))) + (t + ;; motion + (evil-save-state + (unless motion + (evil-change-state 'operator) + ;; Make linewise operator shortcuts. E.g., "d" yields the + ;; shortcut "dd", and "g?" yields shortcuts "g??" and "g?g?". + (let ((keys (nth 2 (evil-extract-count (this-command-keys))))) + (setq keys (listify-key-sequence keys)) + (dotimes (var (length keys)) + (define-key evil-operator-shortcut-map + (vconcat (nthcdr var keys)) 'evil-line-or-visual-line))) + ;; read motion from keyboard + (setq command (evil-read-motion motion) + motion (nth 0 command) + count (nth 1 command) + type (or type (nth 2 command)))) + (cond + ((eq motion #'undefined) + (setq range (if return-type '(nil nil nil) '(nil nil)) + motion nil)) + ((or (null motion) ; keyboard-quit + (evil-get-command-property motion :suppress-operator)) + (when (fboundp 'evil-repeat-abort) + (evil-repeat-abort)) + (setq quit-flag t + motion nil)) + (evil-repeat-count + (setq count evil-repeat-count + ;; only the first operator's count is overwritten + evil-repeat-count nil)) + ((or count current-prefix-arg) + ;; multiply operator count and motion count together + (setq count + (* (prefix-numeric-value count) + (prefix-numeric-value current-prefix-arg))))) + (when motion + (let ((evil-state 'operator) + mark-active) + ;; calculate motion range + (setq range (evil-motion-range + motion + count + type)))) + ;; update global variables + (setq evil-this-motion motion + evil-this-motion-count count + type (evil-type range type) + evil-this-type type)))) + (when (evil-range-p range) + (unless (or (null type) (eq (evil-type range) type)) + (evil-contract-range range) + (evil-set-type range type) + (evil-expand-range range)) + (evil-set-range-properties range nil) + (unless return-type + (evil-set-type range nil)) + (setq evil-operator-range-beginning (evil-range-beginning range) + evil-operator-range-end (evil-range-end range) + evil-operator-range-type (evil-type range))) + range))) + +(defmacro evil-define-type (type doc &rest body) + "Define type TYPE. +DOC is a general description and shows up in all docstrings. + +Optional keyword arguments: +- `:expand' - expansion function. This function should accept two + positions in the current buffer, BEG and END,and return a pair of + expanded buffer positions. +- `:contract' - the opposite of `:expand'. Optional. +- `:one-to-one' - non-nil if expansion is one-to-one. This means that + `:expand' followed by `:contract' always return the original range. +- `:normalize' - normalization function. This function should accept + two unexpanded positions and adjust them before expansion. May be + used to deal with buffer boundaries. +- `:string' - description function. Takes two buffer positions and + returns a human-readable string. For example \"2 lines\" + +If further keywords and functions are specified, they are assumed to +be transformations on buffer positions, like `:expand' and `:contract'. + +\(fn TYPE DOC [[KEY FUNC]...])" + (declare (indent defun) + (doc-string 2) + (debug (&define name + [&optional stringp] + [&rest [keywordp function-form]]))) + (let (args defun-forms func key name plist string sym val) + ;; standard values + (setq plist (plist-put plist :one-to-one t)) + ;; keywords + (while (keywordp (car-safe body)) + (setq key (pop body) + val (pop body)) + (if (plist-member plist key) ; not a function + (setq plist (plist-put plist key val)) + (setq func val + sym (intern (replace-regexp-in-string + "^:" "" (symbol-name key))) + name (intern (format "evil-%s-%s" type sym)) + args (car (cdr-safe func)) + string (car (cdr (cdr-safe func))) + string (if (stringp string) + (format "%s\n\n" string) "") + plist (plist-put plist key `',name)) + (push + (cond + ((eq key :string) + `(defun ,name (beg end &rest properties) + ,(format "Return size of %s from BEG to END \ +with PROPERTIES.\n\n%s%s" type string doc) + (let ((beg (evil-normalize-position beg)) + (end (evil-normalize-position end)) + (type ',type) + plist range) + (when (and beg end) + (save-excursion + (evil-sort beg end) + (unless (plist-get properties :expanded) + (setq range (apply #'evil-expand + beg end type properties) + beg (evil-range-beginning range) + end (evil-range-end range) + type (evil-type range type) + plist (evil-range-properties range)) + (setq properties + (evil-concat-plists properties plist))) + (or (apply #',func beg end + (when ,(> (length args) 2) + properties)) + "")))))) + (t + `(defun ,name (beg end &rest properties) + ,(format "Perform %s transformation on %s from BEG to END \ +with PROPERTIES.\n\n%s%s" sym type string doc) + (let ((beg (evil-normalize-position beg)) + (end (evil-normalize-position end)) + (type ',type) + plist range) + (when (and beg end) + (save-excursion + (evil-sort beg end) + (when (memq ,key '(:expand :contract)) + (setq properties + (plist-put properties + :expanded + ,(eq key :expand)))) + (setq range (or (apply #',func beg end + (when ,(> (length args) 2) + properties)) + (apply #'evil-range + beg end type properties)) + beg (evil-range-beginning range) + end (evil-range-end range) + type (evil-type range type) + plist (evil-range-properties range)) + (setq properties + (evil-concat-plists properties plist)) + (apply #'evil-range beg end type properties))))))) + defun-forms))) + ;; :one-to-one requires both or neither of :expand and :contract + (when (plist-get plist :expand) + (setq plist (plist-put plist :one-to-one + (and (plist-get plist :contract) + (plist-get plist :one-to-one))))) + `(progn + (evil-put-property 'evil-type-properties ',type ,@plist) + ,@defun-forms + ',type))) + +(defmacro evil-define-interactive-code (code &rest body) + "Define an interactive code. +PROMPT, if given, is the remainder of the interactive string +up to the next newline. Command properties may be specified +via KEY-VALUE pairs. BODY should evaluate to a list of values. + +\(fn CODE (PROMPT) [[KEY VALUE]...] BODY...)" + (declare (indent defun)) + (let* ((args (when (and (> (length body) 1) + (listp (car-safe body))) + (pop body))) + (doc (when (stringp (car-safe body)) (pop body))) + func properties) + (while (keywordp (car-safe body)) + (setq properties + (append properties (list (pop body) (pop body))))) + (cond + (args + (setq func `(lambda ,args + ,@(when doc `(,doc)) + ,@body))) + ((> (length body) 1) + (setq func `(progn ,@body))) + (t + (setq func (car body)))) + `(eval-and-compile + (let* ((code ,code) + (entry (assoc code evil-interactive-alist)) + (value (cons ',func ',properties))) + (if entry + (setcdr entry value) + (push (cons code value) evil-interactive-alist)) + code)))) + +;;; Highlighting + +(when (fboundp 'font-lock-add-keywords) + (font-lock-add-keywords + 'emacs-lisp-mode + ;; Match all `evil-define-' forms except `evil-define-key'. + ;; (In the interests of speed, this expression is incomplete + ;; and does not match all three-letter words.) + '(("(\\(evil-\\(?:ex-\\)?define-\ +\\(?:[^ k][^ e][^ y]\\|[-[:word:]]\\{4,\\}\\)\\)\ +\\>[ \f\t\n\r\v]*\\(\\(?:\\sw\\|\\s_\\)+\\)?" + (1 font-lock-keyword-face) + (2 font-lock-function-name-face nil t)) + ("(\\(evil-\\(?:delay\\|narrow\\|signal\\|save\\|with\\(?:out\\)?\\)\ +\\(?:-[-[:word:]]+\\)?\\)\\>\[ \f\t\n\r\v]+" + 1 font-lock-keyword-face) + ("(\\(evil-\\(?:[-[:word:]]\\)*loop\\)\\>[ \f\t\n\r\v]+" + 1 font-lock-keyword-face)))) + +(provide 'evil-macros) + +;;; evil-macros.el ends here diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-macros.elc b/.emacs.d/elpa/evil-20210527.2107/evil-macros.elc new file mode 100644 index 0000000..9ec4ca0 Binary files /dev/null and b/.emacs.d/elpa/evil-20210527.2107/evil-macros.elc differ diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-maps.el b/.emacs.d/elpa/evil-20210527.2107/evil-maps.el new file mode 100644 index 0000000..7429acd --- /dev/null +++ b/.emacs.d/elpa/evil-20210527.2107/evil-maps.el @@ -0,0 +1,620 @@ +;;; evil-maps.el --- Default keymaps -*- lexical-binding: t -*- + +;; Author: Vegard Øye <vegard_oye at hotmail.com> +;; Maintainer: Vegard Øye <vegard_oye at hotmail.com> + +;; Version: 1.14.0 + +;; +;; This file is NOT part of GNU Emacs. + +;;; License: + +;; This file is part of Evil. +;; +;; Evil is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; Evil is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with Evil. If not, see <http://www.gnu.org/licenses/>. + +(require 'evil-states) +(require 'evil-ex) +(require 'evil-commands) +(require 'evil-command-window) +(require 'evil-common) + +;;; Code: + +;;; Normal state + +(define-key evil-normal-state-map "a" 'evil-append) +(define-key evil-normal-state-map "A" 'evil-append-line) +(define-key evil-normal-state-map "c" 'evil-change) +(define-key evil-normal-state-map "C" 'evil-change-line) +(define-key evil-normal-state-map "d" 'evil-delete) +(define-key evil-normal-state-map "D" 'evil-delete-line) +(define-key evil-normal-state-map "i" 'evil-insert) +(define-key evil-normal-state-map (kbd "<insert>") 'evil-insert) +(define-key evil-normal-state-map (kbd "<insertchar>") 'evil-insert) +(define-key evil-normal-state-map "I" 'evil-insert-line) +(define-key evil-normal-state-map "J" 'evil-join) +(define-key evil-normal-state-map "m" 'evil-set-marker) +(define-key evil-normal-state-map "o" 'evil-open-below) +(define-key evil-normal-state-map "O" 'evil-open-above) +(define-key evil-normal-state-map "p" 'evil-paste-after) +(define-key evil-normal-state-map "P" 'evil-paste-before) +(define-key evil-normal-state-map "q" 'evil-record-macro) +(define-key evil-normal-state-map "r" 'evil-replace) +(define-key evil-normal-state-map "R" 'evil-replace-state) +(define-key evil-normal-state-map "s" 'evil-substitute) +(define-key evil-normal-state-map "S" 'evil-change-whole-line) +(define-key evil-normal-state-map "x" 'evil-delete-char) +(define-key evil-normal-state-map "X" 'evil-delete-backward-char) +(define-key evil-normal-state-map [deletechar] 'evil-delete-char) +(define-key evil-normal-state-map "y" 'evil-yank) +(define-key evil-normal-state-map "Y" 'evil-yank-line) +(define-key evil-normal-state-map "&" 'evil-ex-repeat-substitute) +(define-key evil-normal-state-map "g&" 'evil-ex-repeat-global-substitute) +(define-key evil-normal-state-map "g8" 'what-cursor-position) +(define-key evil-normal-state-map "ga" 'what-cursor-position) +(define-key evil-normal-state-map "gi" 'evil-insert-resume) +(define-key evil-normal-state-map "gJ" 'evil-join-whitespace) +(define-key evil-normal-state-map "gq" 'evil-fill-and-move) +(define-key evil-normal-state-map "gw" 'evil-fill) +(define-key evil-normal-state-map "gu" 'evil-downcase) +(define-key evil-normal-state-map "gU" 'evil-upcase) +(define-key evil-normal-state-map "gf" 'find-file-at-point) +(define-key evil-normal-state-map "gF" 'evil-find-file-at-point-with-line) +(define-key evil-normal-state-map "gx" 'browse-url-at-point) +(define-key evil-normal-state-map "g?" 'evil-rot13) +(define-key evil-normal-state-map "g~" 'evil-invert-case) +(define-key evil-normal-state-map "zo" 'evil-open-fold) +(define-key evil-normal-state-map "zO" 'evil-open-fold-rec) +(define-key evil-normal-state-map "zc" 'evil-close-fold) +(define-key evil-normal-state-map "za" 'evil-toggle-fold) +(define-key evil-normal-state-map "zr" 'evil-open-folds) +(define-key evil-normal-state-map "zm" 'evil-close-folds) +(define-key evil-normal-state-map "z=" 'ispell-word) +(define-key evil-normal-state-map "\C-n" 'evil-paste-pop-next) +(define-key evil-normal-state-map "\C-p" 'evil-paste-pop) +(define-key evil-normal-state-map "\C-t" 'pop-tag-mark) +(define-key evil-normal-state-map (kbd "C-.") 'evil-repeat-pop) +(define-key evil-normal-state-map (kbd "M-.") 'evil-repeat-pop-next) +(define-key evil-normal-state-map "." 'evil-repeat) +(define-key evil-normal-state-map "@" 'evil-execute-macro) +(define-key evil-normal-state-map "\"" 'evil-use-register) +(define-key evil-normal-state-map "~" 'evil-invert-char) +(define-key evil-normal-state-map "=" 'evil-indent) +(define-key evil-normal-state-map "<" 'evil-shift-left) +(define-key evil-normal-state-map ">" 'evil-shift-right) +(define-key evil-normal-state-map "ZZ" 'evil-save-modified-and-close) +(define-key evil-normal-state-map "ZQ" 'evil-quit) +(define-key evil-normal-state-map (kbd "DEL") 'evil-backward-char) +(define-key evil-normal-state-map [escape] 'evil-force-normal-state) +(define-key evil-normal-state-map [remap cua-paste-pop] 'evil-paste-pop) +(define-key evil-normal-state-map [remap yank-pop] 'evil-paste-pop) + +(when (featurep 'tab-bar) + (define-key evil-normal-state-map "gt" 'tab-bar-switch-to-next-tab) + (define-key evil-normal-state-map "gT" 'tab-bar-switch-to-prev-tab)) + +;; go to last change +(define-key evil-normal-state-map "g;" 'goto-last-change) +(define-key evil-normal-state-map "g," 'goto-last-change-reverse) + +;; undo +(define-key evil-normal-state-map "u" 'evil-undo) +(define-key evil-normal-state-map "\C-r" 'evil-redo) + +;; window commands +(define-prefix-command 'evil-window-map) +(define-key evil-window-map "b" 'evil-window-bottom-right) +(define-key evil-window-map "c" 'evil-window-delete) +(define-key evil-window-map "h" 'evil-window-left) +(define-key evil-window-map "H" 'evil-window-move-far-left) +(define-key evil-window-map "j" 'evil-window-down) +(define-key evil-window-map "J" 'evil-window-move-very-bottom) +(define-key evil-window-map "k" 'evil-window-up) +(define-key evil-window-map "K" 'evil-window-move-very-top) +(define-key evil-window-map "l" 'evil-window-right) +(define-key evil-window-map "L" 'evil-window-move-far-right) +(define-key evil-window-map "n" 'evil-window-new) +(define-key evil-window-map "o" 'delete-other-windows) +(define-key evil-window-map "p" 'evil-window-mru) +(define-key evil-window-map "q" 'evil-quit) +(define-key evil-window-map "r" 'evil-window-rotate-downwards) +(define-key evil-window-map "R" 'evil-window-rotate-upwards) +(define-key evil-window-map "s" 'evil-window-split) +(define-key evil-window-map "S" 'evil-window-split) +(define-key evil-window-map "t" 'evil-window-top-left) +(define-key evil-window-map "v" 'evil-window-vsplit) +(define-key evil-window-map "w" 'evil-window-next) +(define-key evil-window-map "W" 'evil-window-prev) +(define-key evil-window-map "+" 'evil-window-increase-height) +(define-key evil-window-map "-" 'evil-window-decrease-height) +(define-key evil-window-map "_" 'evil-window-set-height) +(define-key evil-window-map "<" 'evil-window-decrease-width) +(define-key evil-window-map ">" 'evil-window-increase-width) +(define-key evil-window-map "=" 'balance-windows) +(define-key evil-window-map "|" 'evil-window-set-width) +(define-key evil-window-map "\C-b" 'evil-window-bottom-right) +(define-key evil-window-map "\C-c" 'evil-window-delete) +(define-key evil-window-map (kbd "C-S-h") 'evil-window-move-far-left) +(define-key evil-window-map (kbd "C-S-j") 'evil-window-move-very-bottom) +(define-key evil-window-map (kbd "C-S-k") 'evil-window-move-very-top) +(define-key evil-window-map (kbd "C-S-l") 'evil-window-move-far-right) +(define-key evil-window-map "\C-n" 'evil-window-new) +(define-key evil-window-map "\C-o" 'delete-other-windows) +(define-key evil-window-map "\C-p" 'evil-window-mru) +(define-key evil-window-map "\C-r" 'evil-window-rotate-downwards) +(define-key evil-window-map (kbd "C-S-r") 'evil-window-rotate-upwards) +(define-key evil-window-map "\C-s" 'evil-window-split) +(define-key evil-window-map (kbd "C-S-s") 'evil-window-split) +(define-key evil-window-map "\C-t" 'evil-window-top-left) +(define-key evil-window-map "\C-v" 'evil-window-vsplit) +(define-key evil-window-map "\C-w" 'evil-window-next) +(define-key evil-window-map (kbd "C-S-W") 'evil-window-prev) +(define-key evil-window-map "\C-_" 'evil-window-set-height) +(define-key evil-window-map "\C-f" 'ffap-other-window) + +;;; Motion state + +;; "0" is a special command when called first +(evil-redirect-digit-argument evil-motion-state-map "0" 'evil-beginning-of-line) +(define-key evil-motion-state-map "1" 'digit-argument) +(define-key evil-motion-state-map "2" 'digit-argument) +(define-key evil-motion-state-map "3" 'digit-argument) +(define-key evil-motion-state-map "4" 'digit-argument) +(define-key evil-motion-state-map "5" 'digit-argument) +(define-key evil-motion-state-map "6" 'digit-argument) +(define-key evil-motion-state-map "7" 'digit-argument) +(define-key evil-motion-state-map "8" 'digit-argument) +(define-key evil-motion-state-map "9" 'digit-argument) +(define-key evil-motion-state-map "b" 'evil-backward-word-begin) +(define-key evil-motion-state-map "B" 'evil-backward-WORD-begin) +(define-key evil-motion-state-map "e" 'evil-forward-word-end) +(define-key evil-motion-state-map "E" 'evil-forward-WORD-end) +(define-key evil-motion-state-map "f" 'evil-find-char) +(define-key evil-motion-state-map "F" 'evil-find-char-backward) +(define-key evil-motion-state-map "G" 'evil-goto-line) +(define-key evil-motion-state-map "h" 'evil-backward-char) +(define-key evil-motion-state-map "H" 'evil-window-top) +(define-key evil-motion-state-map "j" 'evil-next-line) +(define-key evil-motion-state-map "k" 'evil-previous-line) +(define-key evil-motion-state-map "l" 'evil-forward-char) +(define-key evil-motion-state-map " " 'evil-forward-char) +(define-key evil-motion-state-map "K" 'evil-lookup) +(define-key evil-motion-state-map "L" 'evil-window-bottom) +(define-key evil-motion-state-map "M" 'evil-window-middle) +(define-key evil-motion-state-map "n" 'evil-search-next) +(define-key evil-motion-state-map "N" 'evil-search-previous) +(define-key evil-motion-state-map "t" 'evil-find-char-to) +(define-key evil-motion-state-map "T" 'evil-find-char-to-backward) +(define-key evil-motion-state-map "w" 'evil-forward-word-begin) +(define-key evil-motion-state-map "W" 'evil-forward-WORD-begin) +(define-key evil-motion-state-map "y" 'evil-yank) +(define-key evil-motion-state-map "Y" 'evil-yank-line) +(define-key evil-motion-state-map "gd" 'evil-goto-definition) +(define-key evil-motion-state-map "ge" 'evil-backward-word-end) +(define-key evil-motion-state-map "gE" 'evil-backward-WORD-end) +(define-key evil-motion-state-map "gg" 'evil-goto-first-line) +(define-key evil-motion-state-map "gj" 'evil-next-visual-line) +(define-key evil-motion-state-map "gk" 'evil-previous-visual-line) +(define-key evil-motion-state-map "g0" 'evil-beginning-of-visual-line) +(define-key evil-motion-state-map "g_" 'evil-last-non-blank) +(define-key evil-motion-state-map "g^" 'evil-first-non-blank-of-visual-line) +(define-key evil-motion-state-map "gm" 'evil-middle-of-visual-line) +(define-key evil-motion-state-map "go" 'evil-goto-char) +(define-key evil-motion-state-map "g$" 'evil-end-of-visual-line) +(define-key evil-motion-state-map "g\C-]" 'evil-jump-to-tag) +(define-key evil-motion-state-map "{" 'evil-backward-paragraph) +(define-key evil-motion-state-map "}" 'evil-forward-paragraph) +(define-key evil-motion-state-map "#" 'evil-search-word-backward) +(define-key evil-motion-state-map "g#" 'evil-search-unbounded-word-backward) +(define-key evil-motion-state-map "$" 'evil-end-of-line) +(define-key evil-motion-state-map [end] 'evil-end-of-line) +(define-key evil-motion-state-map [home] 'evil-beginning-of-line) +(define-key evil-motion-state-map "%" 'evil-jump-item) +(define-key evil-motion-state-map "`" 'evil-goto-mark) +(define-key evil-motion-state-map "'" 'evil-goto-mark-line) +(define-key evil-motion-state-map "(" 'evil-backward-sentence-begin) +(define-key evil-motion-state-map ")" 'evil-forward-sentence-begin) +(define-key evil-motion-state-map "]]" 'evil-forward-section-begin) +(define-key evil-motion-state-map "][" 'evil-forward-section-end) +(define-key evil-motion-state-map "[[" 'evil-backward-section-begin) +(define-key evil-motion-state-map "[]" 'evil-backward-section-end) +(define-key evil-motion-state-map "[(" 'evil-previous-open-paren) +(define-key evil-motion-state-map "])" 'evil-next-close-paren) +(define-key evil-motion-state-map "[{" 'evil-previous-open-brace) +(define-key evil-motion-state-map "]}" 'evil-next-close-brace) +(define-key evil-motion-state-map "]'" 'evil-next-mark-line) +(define-key evil-motion-state-map "]`" 'evil-next-mark) +(define-key evil-motion-state-map "['" 'evil-previous-mark-line) +(define-key evil-motion-state-map "[`" 'evil-previous-mark) +(define-key evil-motion-state-map "]s" 'evil-next-flyspell-error) +(define-key evil-motion-state-map "[s" 'evil-prev-flyspell-error) +(define-key evil-motion-state-map "*" 'evil-search-word-forward) +(define-key evil-motion-state-map "g*" 'evil-search-unbounded-word-forward) +(define-key evil-motion-state-map "," 'evil-repeat-find-char-reverse) +(define-key evil-motion-state-map "/" 'evil-search-forward) +(define-key evil-motion-state-map ";" 'evil-repeat-find-char) +(define-key evil-motion-state-map "?" 'evil-search-backward) +(define-key evil-motion-state-map "|" 'evil-goto-column) +(define-key evil-motion-state-map "^" 'evil-first-non-blank) +(define-key evil-motion-state-map "+" 'evil-next-line-first-non-blank) +(define-key evil-motion-state-map "_" 'evil-next-line-1-first-non-blank) +(define-key evil-motion-state-map "-" 'evil-previous-line-first-non-blank) +(define-key evil-motion-state-map "\C-w" 'evil-window-map) +(define-key evil-motion-state-map (kbd "C-6") 'evil-switch-to-windows-last-buffer) +(define-key evil-motion-state-map "\C-]" 'evil-jump-to-tag) +(define-key evil-motion-state-map (kbd "C-b") 'evil-scroll-page-up) +(define-key evil-motion-state-map (kbd "C-e") 'evil-scroll-line-down) +(define-key evil-motion-state-map (kbd "C-f") 'evil-scroll-page-down) +(define-key evil-motion-state-map (kbd "C-o") 'evil-jump-backward) +(define-key evil-motion-state-map (kbd "C-y") 'evil-scroll-line-up) +(define-key evil-motion-state-map (kbd "RET") 'evil-ret) +(define-key evil-motion-state-map "\\" 'evil-execute-in-emacs-state) +(define-key evil-motion-state-map "z^" 'evil-scroll-top-line-to-bottom) +(define-key evil-motion-state-map "z+" 'evil-scroll-bottom-line-to-top) +(define-key evil-motion-state-map "zt" 'evil-scroll-line-to-top) +;; TODO: z RET has an advanced form taking an count before the RET +;; but this requires again a special state with a single command +;; bound to RET +(define-key evil-motion-state-map (vconcat "z" [return]) "zt^") +(define-key evil-motion-state-map (kbd "z RET") (vconcat "z" [return])) +(define-key evil-motion-state-map "zz" 'evil-scroll-line-to-center) +(define-key evil-motion-state-map "z." "zz^") +(define-key evil-motion-state-map "zb" 'evil-scroll-line-to-bottom) +(define-key evil-motion-state-map "z-" "zb^") +(define-key evil-motion-state-map "v" 'evil-visual-char) +(define-key evil-motion-state-map "V" 'evil-visual-line) +(define-key evil-motion-state-map "\C-v" 'evil-visual-block) +(define-key evil-motion-state-map "gv" 'evil-visual-restore) +(define-key evil-motion-state-map (kbd "C-^") 'evil-buffer) +(define-key evil-motion-state-map [left] 'evil-backward-char) +(define-key evil-motion-state-map [right] 'evil-forward-char) +(define-key evil-motion-state-map [up] 'evil-previous-line) +(define-key evil-motion-state-map [down] 'evil-next-line) +(define-key evil-motion-state-map "zl" 'evil-scroll-column-right) +(define-key evil-motion-state-map [?z right] "zl") +(define-key evil-motion-state-map "zh" 'evil-scroll-column-left) +(define-key evil-motion-state-map [?z left] "zh") +(define-key evil-motion-state-map "zL" 'evil-scroll-right) +(define-key evil-motion-state-map "zH" 'evil-scroll-left) +(define-key evil-motion-state-map + (read-kbd-macro evil-toggle-key) 'evil-emacs-state) + +;; text objects +(define-key evil-outer-text-objects-map "w" 'evil-a-word) +(define-key evil-outer-text-objects-map "W" 'evil-a-WORD) +(define-key evil-outer-text-objects-map "s" 'evil-a-sentence) +(define-key evil-outer-text-objects-map "p" 'evil-a-paragraph) +(define-key evil-outer-text-objects-map "b" 'evil-a-paren) +(define-key evil-outer-text-objects-map "(" 'evil-a-paren) +(define-key evil-outer-text-objects-map ")" 'evil-a-paren) +(define-key evil-outer-text-objects-map "[" 'evil-a-bracket) +(define-key evil-outer-text-objects-map "]" 'evil-a-bracket) +(define-key evil-outer-text-objects-map "B" 'evil-a-curly) +(define-key evil-outer-text-objects-map "{" 'evil-a-curly) +(define-key evil-outer-text-objects-map "}" 'evil-a-curly) +(define-key evil-outer-text-objects-map "<" 'evil-an-angle) +(define-key evil-outer-text-objects-map ">" 'evil-an-angle) +(define-key evil-outer-text-objects-map "'" 'evil-a-single-quote) +(define-key evil-outer-text-objects-map "\"" 'evil-a-double-quote) +(define-key evil-outer-text-objects-map "`" 'evil-a-back-quote) +(define-key evil-outer-text-objects-map "t" 'evil-a-tag) +(define-key evil-outer-text-objects-map "o" 'evil-a-symbol) +(define-key evil-inner-text-objects-map "w" 'evil-inner-word) +(define-key evil-inner-text-objects-map "W" 'evil-inner-WORD) +(define-key evil-inner-text-objects-map "s" 'evil-inner-sentence) +(define-key evil-inner-text-objects-map "p" 'evil-inner-paragraph) +(define-key evil-inner-text-objects-map "b" 'evil-inner-paren) +(define-key evil-inner-text-objects-map "(" 'evil-inner-paren) +(define-key evil-inner-text-objects-map ")" 'evil-inner-paren) +(define-key evil-inner-text-objects-map "[" 'evil-inner-bracket) +(define-key evil-inner-text-objects-map "]" 'evil-inner-bracket) +(define-key evil-inner-text-objects-map "B" 'evil-inner-curly) +(define-key evil-inner-text-objects-map "{" 'evil-inner-curly) +(define-key evil-inner-text-objects-map "}" 'evil-inner-curly) +(define-key evil-inner-text-objects-map "<" 'evil-inner-angle) +(define-key evil-inner-text-objects-map ">" 'evil-inner-angle) +(define-key evil-inner-text-objects-map "'" 'evil-inner-single-quote) +(define-key evil-inner-text-objects-map "\"" 'evil-inner-double-quote) +(define-key evil-inner-text-objects-map "`" 'evil-inner-back-quote) +(define-key evil-inner-text-objects-map "t" 'evil-inner-tag) +(define-key evil-inner-text-objects-map "o" 'evil-inner-symbol) +(define-key evil-motion-state-map "gn" 'evil-next-match) +(define-key evil-motion-state-map "gN" 'evil-previous-match) + +(when evil-want-C-i-jump + (define-key evil-motion-state-map (kbd "C-i") 'evil-jump-forward)) + +(when evil-want-C-u-scroll + (define-key evil-motion-state-map (kbd "C-u") 'evil-scroll-up)) + +(when evil-want-C-d-scroll + (define-key evil-motion-state-map (kbd "C-d") 'evil-scroll-down)) + +(when evil-want-C-g-bindings + (define-key evil-motion-state-map "g\C-g" 'count-words)) + +;;; Visual state + +(define-key evil-visual-state-map "A" 'evil-append) +(define-key evil-visual-state-map "I" 'evil-insert) +(define-key evil-visual-state-map "o" 'exchange-point-and-mark) +(define-key evil-visual-state-map "O" 'evil-visual-exchange-corners) +(define-key evil-visual-state-map "R" 'evil-change-whole-line) +(define-key evil-visual-state-map "u" 'evil-downcase) +(define-key evil-visual-state-map "U" 'evil-upcase) +(define-key evil-visual-state-map "z=" 'ispell-word) +(define-key evil-visual-state-map "a" evil-outer-text-objects-map) +(define-key evil-visual-state-map "i" evil-inner-text-objects-map) +(define-key evil-visual-state-map (kbd "<insert>") 'undefined) +(define-key evil-visual-state-map (kbd "<insertchar>") 'undefined) +(define-key evil-visual-state-map [remap evil-repeat] 'undefined) +(define-key evil-visual-state-map [escape] 'evil-exit-visual-state) +(define-key evil-visual-state-map "gf" 'evil-find-file-at-point-visual) + +;;; Operator-Pending state + +(define-key evil-operator-state-map "a" evil-outer-text-objects-map) +(define-key evil-operator-state-map "i" evil-inner-text-objects-map) +;; (define-key evil-operator-state-map [escape] 'keyboard-quit) + +;;; Insert state + +(defvar evil-insert-state-bindings + `(("\C-v" . quoted-insert) + ("\C-k" . evil-insert-digraph) + ("\C-o" . evil-execute-in-normal-state) + ("\C-r" . evil-paste-from-register) + ("\C-y" . evil-copy-from-above) + ("\C-e" . evil-copy-from-below) + ("\C-n" . evil-complete-next) + ("\C-p" . evil-complete-previous) + ("\C-x\C-n" . evil-complete-next-line) + ("\C-x\C-p" . evil-complete-previous-line) + ("\C-t" . evil-shift-right-line) + ("\C-d" . evil-shift-left-line) + ("\C-a" . evil-paste-last-insertion) + ([remap delete-backward-char] . evil-delete-backward-char-and-join) + ,(if evil-want-C-w-delete + '("\C-w" . evil-delete-backward-word) + '("\C-w" . evil-window-map)) + ,@(when evil-want-C-u-delete + '(("\C-u" . evil-delete-back-to-indentation))) + ([mouse-2] . mouse-yank-primary)) + "Evil's bindings for insert state (for +`evil-insert-state-map'), excluding <delete>, <escape>, and +`evil-toggle-key'.") + +(defun evil-update-insert-state-bindings (&optional _option-name remove force) + "Update bindings in `evil-insert-state-map'. +If no arguments are given add the bindings specified in +`evil-insert-state-bindings'. If REMOVE is non nil, remove only +these bindings. Unless FORCE is non nil, this will not +overwriting existing bindings, which means bindings will not be +added if one already exists for a key and only default bindings +are removed. + +Note that <delete>, <escape> and `evil-toggle-key' are not +included in `evil-insert-state-bindings' by default." + (interactive) + (dolist (binding evil-insert-state-bindings) + (cond + ((and remove + (or force + ;; Only remove if the default binding has not changed + (eq (evil-lookup-key evil-insert-state-map (car binding)) + (cdr binding)))) + (define-key evil-insert-state-map (car binding) nil)) + ((and (null remove) + (or force + ;; Check to see that nothing is bound here before adding + (not (evil-lookup-key evil-insert-state-map (car binding))))) + (define-key evil-insert-state-map (car binding) (cdr binding)))))) + +(define-key evil-insert-state-map [delete] 'delete-char) +(define-key evil-insert-state-map [escape] 'evil-normal-state) +(define-key evil-insert-state-map + (read-kbd-macro evil-toggle-key) 'evil-emacs-state) + +;;; Replace state + +(define-key evil-replace-state-map (kbd "DEL") 'evil-replace-backspace) +(define-key evil-replace-state-map [escape] 'evil-normal-state) + +;;; Emacs state + +(define-key evil-emacs-state-map + (read-kbd-macro evil-toggle-key) 'evil-exit-emacs-state) + +(when evil-want-C-w-in-emacs-state + (define-key evil-emacs-state-map "\C-w" 'evil-window-map)) + +;;; Mouse +(define-key evil-motion-state-map [down-mouse-1] 'evil-mouse-drag-region) +(define-key evil-visual-state-map [mouse-2] 'evil-exit-visual-and-repeat) +(define-key evil-normal-state-map [mouse-2] 'mouse-yank-primary) + +;; Ex +(define-key evil-motion-state-map ":" 'evil-ex) +(define-key evil-motion-state-map "!" 'evil-shell-command) + +(evil-ex-define-cmd "e[dit]" 'evil-edit) +(evil-ex-define-cmd "w[rite]" 'evil-write) +(evil-ex-define-cmd "wa[ll]" 'evil-write-all) +(evil-ex-define-cmd "sav[eas]" 'evil-save) +(evil-ex-define-cmd "r[ead]" 'evil-read) +(evil-ex-define-cmd "b[uffer]" 'evil-buffer) +(evil-ex-define-cmd "bn[ext]" 'evil-next-buffer) +(evil-ex-define-cmd "bp[revious]" 'evil-prev-buffer) +(evil-ex-define-cmd "bN[ext]" "bprevious") +(evil-ex-define-cmd "sb[uffer]" 'evil-split-buffer) +(evil-ex-define-cmd "sbn[ext]" 'evil-split-next-buffer) +(evil-ex-define-cmd "sbp[revious]" 'evil-split-prev-buffer) +(evil-ex-define-cmd "sbN[ext]" "sbprevious") +(evil-ex-define-cmd "buffers" 'buffer-menu) +(evil-ex-define-cmd "files" 'evil-show-files) +(evil-ex-define-cmd "ls" "buffers") + +(evil-ex-define-cmd "c[hange]" 'evil-change) +(evil-ex-define-cmd "co[py]" 'evil-copy) +(evil-ex-define-cmd "t" "copy") +(evil-ex-define-cmd "m[ove]" 'evil-move) +(evil-ex-define-cmd "d[elete]" 'evil-ex-delete) +(evil-ex-define-cmd "y[ank]" 'evil-ex-yank) +(evil-ex-define-cmd "pu[t]" 'evil-ex-put) +(evil-ex-define-cmd "go[to]" 'evil-goto-char) +(evil-ex-define-cmd "j[oin]" 'evil-ex-join) +(evil-ex-define-cmd "le[ft]" 'evil-align-left) +(evil-ex-define-cmd "ri[ght]" 'evil-align-right) +(evil-ex-define-cmd "ce[nter]" 'evil-align-center) +(evil-ex-define-cmd "sp[lit]" 'evil-window-split) +(evil-ex-define-cmd "vs[plit]" 'evil-window-vsplit) +(evil-ex-define-cmd "new" 'evil-window-new) +(evil-ex-define-cmd "ene[w]" 'evil-buffer-new) +(evil-ex-define-cmd "vne[w]" 'evil-window-vnew) +(evil-ex-define-cmd "clo[se]" 'evil-window-delete) +(evil-ex-define-cmd "on[ly]" 'delete-other-windows) +(evil-ex-define-cmd "q[uit]" 'evil-quit) +(evil-ex-define-cmd "wq" 'evil-save-and-close) +(evil-ex-define-cmd "quita[ll]" 'evil-quit-all) +(evil-ex-define-cmd "qa[ll]" "quitall") +(evil-ex-define-cmd "cq[uit]" 'evil-quit-all-with-error-code) +(evil-ex-define-cmd "wqa[ll]" 'evil-save-and-quit) +(evil-ex-define-cmd "xa[ll]" "wqall") +(evil-ex-define-cmd "x[it]" 'evil-save-modified-and-close) +(evil-ex-define-cmd "exi[t]" 'evil-save-modified-and-close) +(evil-ex-define-cmd "bd[elete]" 'evil-delete-buffer) +(evil-ex-define-cmd "bw[ipeout]" 'evil-delete-buffer) +(evil-ex-define-cmd "g[lobal]" 'evil-ex-global) +(evil-ex-define-cmd "v[global]" 'evil-ex-global-inverted) +(evil-ex-define-cmd "norm[al]" 'evil-ex-normal) +(evil-ex-define-cmd "s[ubstitute]" 'evil-ex-substitute) +(evil-ex-define-cmd "&" 'evil-ex-repeat-substitute) +(evil-ex-define-cmd "&&" 'evil-ex-repeat-substitute-with-flags) +(evil-ex-define-cmd "~" 'evil-ex-repeat-substitute-with-search) +(evil-ex-define-cmd "~&" 'evil-ex-repeat-substitute-with-search-and-flags) +(evil-ex-define-cmd "registers" 'evil-show-registers) +(evil-ex-define-cmd "di[splay]" "registers") +(evil-ex-define-cmd "ma[rk]" 'evil-set-col-0-mark) +(evil-ex-define-cmd "marks" 'evil-show-marks) +(evil-ex-define-cmd "delm[arks]" 'evil-delete-marks) +(evil-ex-define-cmd "ju[mps]" 'evil-show-jumps) +(evil-ex-define-cmd "noh[lsearch]" 'evil-ex-nohighlight) +(evil-ex-define-cmd "f[ile]" 'evil-show-file-info) +(evil-ex-define-cmd "<" 'evil-shift-left) +(evil-ex-define-cmd ">" 'evil-shift-right) +(evil-ex-define-cmd "=" 'evil-ex-line-number) +(evil-ex-define-cmd "!" 'evil-shell-command) +(evil-ex-define-cmd "@:" 'evil-ex-repeat) +(evil-ex-define-cmd "mak[e]" 'evil-make) +(evil-ex-define-cmd "cc" 'evil-goto-error) +(evil-ex-define-cmd "cfir[st]" 'first-error) +(evil-ex-define-cmd "cr[ewind]" 'first-error) +(evil-ex-define-cmd "cn[ext]" 'next-error) +(evil-ex-define-cmd "cp[revious]" 'previous-error) +(evil-ex-define-cmd "set-initial-state" 'evil-ex-set-initial-state) +(evil-ex-define-cmd "show-digraphs" 'evil-ex-show-digraphs) +(evil-ex-define-cmd "sor[t]" 'evil-ex-sort) +(evil-ex-define-cmd "res[ize]" 'evil-ex-resize) +(evil-ex-define-cmd "u[ndo]" 'evil-undo) +(evil-ex-define-cmd "red[o]" 'evil-redo) + +(when (featurep 'tab-bar) + (evil-ex-define-cmd "tabnew" 'tab-bar-new-tab) + (evil-ex-define-cmd "tabn[ext]" 'tab-bar-switch-to-next-tab) + (evil-ex-define-cmd "tabp[revious]" 'tab-bar-switch-to-prev-tab)) + +;; search command line +(define-key evil-ex-search-keymap "\d" #'evil-ex-delete-backward-char) +(define-key evil-ex-search-keymap "\C-b" 'move-beginning-of-line) +(define-key evil-ex-search-keymap "\C-c" 'abort-recursive-edit) +(define-key evil-ex-search-keymap "\C-g" 'abort-recursive-edit) +(define-key evil-ex-search-keymap "\C-k" 'evil-insert-digraph) +(define-key evil-ex-search-keymap "\C-f" 'evil-ex-search-command-window) +(define-key evil-ex-search-keymap "\C-r" 'evil-paste-from-register) +(define-key evil-ex-search-keymap "\C-n" 'next-history-element) +(define-key evil-ex-search-keymap "\C-p" 'previous-history-element) +(define-key evil-ex-search-keymap "\C-u" 'evil-delete-whole-line) +(define-key evil-ex-search-keymap "\C-v" #'quoted-insert) +(define-key evil-ex-search-keymap "\C-w" 'backward-kill-word) + +;; ex command line +(define-key evil-ex-completion-map "\d" #'evil-ex-delete-backward-char) +(define-key evil-ex-completion-map "\t" #'evil-ex-completion) +(define-key evil-ex-completion-map [tab] #'evil-ex-completion) +(define-key evil-ex-completion-map [remap completion-at-point] #'evil-ex-completion) +(define-key evil-ex-completion-map "\C-a" 'evil-ex-completion) +(define-key evil-ex-completion-map "\C-b" 'move-beginning-of-line) +(define-key evil-ex-completion-map "\C-c" 'abort-recursive-edit) +(define-key evil-ex-completion-map "\C-d" 'evil-ex-completion) +(define-key evil-ex-completion-map "\C-f" 'evil-ex-command-window) +(define-key evil-ex-completion-map "\C-g" 'abort-recursive-edit) +(define-key evil-ex-completion-map "\C-k" 'evil-insert-digraph) +(define-key evil-ex-completion-map "\C-l" 'evil-ex-completion) +(define-key evil-ex-completion-map "\C-p" #'previous-complete-history-element) +(define-key evil-ex-completion-map "\C-r" 'evil-paste-from-register) +(define-key evil-ex-completion-map "\C-n" #'next-complete-history-element) +(define-key evil-ex-completion-map "\C-u" 'evil-delete-whole-line) +(define-key evil-ex-completion-map "\C-v" #'quoted-insert) +(define-key evil-ex-completion-map "\C-w" 'backward-kill-word) +(define-key evil-ex-completion-map [escape] 'abort-recursive-edit) +(define-key evil-ex-completion-map [S-left] 'backward-word) +(define-key evil-ex-completion-map [S-right] 'forward-word) +(define-key evil-ex-completion-map [up] 'previous-complete-history-element) +(define-key evil-ex-completion-map [down] 'next-complete-history-element) +(define-key evil-ex-completion-map [prior] 'previous-history-element) +(define-key evil-ex-completion-map [next] 'next-history-element) +(define-key evil-ex-completion-map [return] 'exit-minibuffer) +(define-key evil-ex-completion-map (kbd "RET") 'exit-minibuffer) + +;; eval prompt (the `=' register) +(define-key evil-eval-map "\C-b" 'move-beginning-of-line) +(define-key evil-eval-map "\C-c" 'abort-recursive-edit) +(define-key evil-eval-map "\C-g" 'abort-recursive-edit) +(define-key evil-eval-map "\C-k" 'evil-insert-digraph) +(define-key evil-eval-map "\C-p" #'previous-complete-history-element) +(define-key evil-eval-map "\C-r" 'evil-paste-from-register) +(define-key evil-eval-map "\C-n" #'next-complete-history-element) +(define-key evil-eval-map "\C-u" 'evil-delete-whole-line) +(define-key evil-eval-map "\C-v" #'quoted-insert) +(define-key evil-eval-map "\C-w" 'backward-kill-word) +(define-key evil-eval-map [escape] 'abort-recursive-edit) +(define-key evil-eval-map [S-left] 'backward-word) +(define-key evil-eval-map [S-right] 'forward-word) +(define-key evil-eval-map [up] 'previous-complete-history-element) +(define-key evil-eval-map [down] 'next-complete-history-element) +(define-key evil-eval-map [prior] 'previous-history-element) +(define-key evil-eval-map [next] 'next-history-element) +(define-key evil-eval-map [return] 'exit-minibuffer) +(define-key evil-eval-map (kbd "RET") 'exit-minibuffer) + +;; evil-read-key +(define-key evil-read-key-map (kbd "ESC") #'keyboard-quit) +(define-key evil-read-key-map (kbd "C-]") #'keyboard-quit) +(define-key evil-read-key-map (kbd "C-g") #'keyboard-quit) +(define-key evil-read-key-map (kbd "C-q") #'evil-read-quoted-char) +(define-key evil-read-key-map (kbd "C-v") #'evil-read-quoted-char) +(define-key evil-read-key-map (kbd "C-k") #'evil-read-digraph-char) +(define-key evil-read-key-map "\r" "\n") + +;; command line window +(evil-define-key 'normal + evil-command-window-mode-map (kbd "RET") 'evil-command-window-execute) +(evil-define-key 'insert + evil-command-window-mode-map (kbd "RET") 'evil-command-window-execute) + +(provide 'evil-maps) + +;;; evil-maps.el ends here diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-maps.elc b/.emacs.d/elpa/evil-20210527.2107/evil-maps.elc new file mode 100644 index 0000000..a045e64 Binary files /dev/null and b/.emacs.d/elpa/evil-20210527.2107/evil-maps.elc differ diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-pkg.el b/.emacs.d/elpa/evil-20210527.2107/evil-pkg.el new file mode 100644 index 0000000..74d69b3 --- /dev/null +++ b/.emacs.d/elpa/evil-20210527.2107/evil-pkg.el @@ -0,0 +1,10 @@ +(define-package "evil" "20210527.2107" "Extensible Vi layer for Emacs." + '((emacs "24.1") + (goto-chg "1.6") + (cl-lib "0.5")) + :commit "ad47644eea5e351269f5bead18e713768d96f207" :keywords + '("emulation" "vim") + :url "https://github.com/emacs-evil/evil") +;; Local Variables: +;; no-byte-compile: t +;; End: diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-repeat.el b/.emacs.d/elpa/evil-20210527.2107/evil-repeat.el new file mode 100644 index 0000000..f0014bd --- /dev/null +++ b/.emacs.d/elpa/evil-20210527.2107/evil-repeat.el @@ -0,0 +1,643 @@ +;;; evil-repeat.el --- Repeat system -*- lexical-binding: t -*- + +;; Author: Frank Fischer <frank.fischer at mathematik.tu-chemnitz.de> +;; Maintainer: Vegard Øye <vegard_oye at hotmail.com> + +;; Version: 1.14.0 + +;; +;; This file is NOT part of GNU Emacs. + +;;; License: + +;; This file is part of Evil. +;; +;; Evil is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; Evil is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with Evil. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: + +;; A repeat begins when leaving Normal state; it ends when re-entering +;; Normal state. The diagram below shows possible routes between +;; Normal state (N), Insert state (I), Visual state (V), +;; Operator-Pending state (O) and Replace state (R). (Emacs state +;; is an exception: nothing is repeated in that state.) +;; ___ +;; / \ +;; | R | +;; \___/ +;; ^ | +;; | | +;; ___ |___V ___ +;; / \ <------- / \ -------> / \ +;; | V | | N | | O | +;; \___/ -------> \___/ <------- \___/ +;; | | ^ | +;; | | | | +;; | V___| | +;; | / \ | +;; +--------> | I | <--------+ +;; \___/ +;; +;; The recording of a repeat is started in one of two cases: Either a +;; command is about to be executed (in pre-command-hook) or normal +;; state is exited. The recording is stopped whenever a command has +;; been completed and evil is in normal state afterwards. Therefore, +;; a non-inserting command in normal-state is recorded as a single +;; repeat unit. In contrast, if the command leaves normal state and +;; starts insert-state, all commands that are executed until +;; insert-state is left and normal state is reactivated are recorded +;; together in one repeat unit. In other words, a repeat unit consists +;; of all commands that are executed starting and ending in normal +;; state. +;; +;; Not all commands are recorded. There are several commands that are +;; completely ignored and other commands that even abort the currently +;; active recording, e.g., commands that switch buffer. +;; +;; During recording the repeat information is appended to the variable +;; `evil-repeat-info', which is cleared when the recording +;; starts. This accumulated repeat information is put into the +;; `evil-repeat-ring' when the recording is finished. The dot command, +;; `\[evil-repeat]' (`evil-repeat') replays the most recent entry in +;; the ring, preceeding repeats can be replayed using +;; `\[evil-repeat-pop]' (`evil-repeat-pop'). +;; +;; Repeat information can be stored in almost arbitrary form. How the +;; repeat information for each single command is recored is determined +;; by the :repeat property of the command. This property has the +;; following interpretation: +;; +;; t record commands by storing the key-sequence that invoked it +;; nil ignore this command completely +;; ignore synonym to nil +;; motion command is recorded by storing the key-sequence but only in +;; insert state, otherwise it is ignored. +;; abort stop recording of repeat information immediately +;; change record commands by storing buffer changes +;; SYMBOL if SYMBOL is contained as key in `evil-repeat-types' +;; call the corresponding (function-)value, otherwise +;; call the function associated with SYMBOL. In both +;; cases the function should take exactly one argument +;; which is either 'pre or 'post depending on whether +;; the function is called before or after the execution +;; of the command. +;; +;; Therefore, using a certain SYMBOL one can write specific repeation +;; functions for each command. +;; +;; Each value of ring `evil-repeat-info', i.e., each single repeat +;; information must be one of the following two possibilities: +;; If element is a sequence, it is regarded as a key-sequence to +;; be repeated. Otherwise the element must be a list +;; (FUNCTION PARAMS ...) which will be called using +;; (apply FUNCTION PARAMS) whenever this repeat is being executed. +;; +;; A user supplied repeat function can use the functions +;; `evil-record-repeat' to append further repeat-information of the +;; form described above to `evil-repeat-info'. See the implementation +;; of `evil-repeat-keystrokes' and `evil-repeat-changes' for examples. +;; Those functions are called in different situations before and after +;; the execution of a command. Each function should take one argument +;; which can be either 'pre, 'post, 'pre-operator or 'post-operator +;; specifying when the repeat function has been called. If the command +;; is a usual command the function is called with 'pre before the +;; command is executed and with 'post after the command has been +;; executed. +;; +;; The repeat information is executed with `evil-execute-repeat-info', +;; which passes key-sequence elements to `execute-kbd-macro' and +;; executes other elements as defined above. A special version is +;; `evil-execute-repeat-info-with-count'. This function works as +;; `evil-execute-repeat-info', but replaces the count of the first +;; command. This is done by parsing the key-sequence, ignoring all +;; calls to `digit-prefix-argument' and `negative-argument', and +;; prepending the count as a string to the vector of the remaining +;; key-sequence. + +(require 'evil-states) + +;;; Code: + +(declare-function evil-visual-state-p "evil-visual") +(declare-function evil-visual-range "evil-visual") +(declare-function evil-visual-char "evil-visual") +(declare-function evil-visual-line "evil-visual") +(declare-function evil-visual-block "evil-visual") + +(defmacro evil-without-repeat (&rest body) + (declare (indent defun) + (debug t)) + `(let ((pre-command-hook (remq 'evil-repeat-pre-hook pre-command-hook)) + (post-command-hook (remq 'evil-repeat-post-hook post-command-hook))) + ,@body + (evil-repeat-abort))) + +(defsubst evil-repeat-recording-p () + "Returns non-nil iff a recording is in progress." + (eq evil-recording-repeat t)) + +(defun evil-repeat-start () + "Start recording a new repeat into `evil-repeat-info'." + (evil-repeat-reset t) + (evil-repeat-record-buffer) + (when (evil-visual-state-p) + (let* ((range (evil-visual-range)) + (beg (evil-range-beginning range)) + (end (1- (evil-range-end range))) + (nfwdlines (evil-count-lines beg end))) + (evil-repeat-record + (cond + ((eq evil-visual-selection 'char) + (list #'evil-repeat-visual-char + nfwdlines + (- end + (if (zerop nfwdlines) + beg + (save-excursion + (goto-char end) + (line-beginning-position)))))) + ((eq evil-visual-selection 'line) + (list #'evil-repeat-visual-line nfwdlines)) + ((eq evil-visual-selection 'block) + (list #'evil-repeat-visual-block + nfwdlines + (abs (- (evil-column beg) (evil-column end)))))))))) + +(defun evil-repeat-stop () + "Stop recording a repeat. +Update `evil-repeat-ring' with the accumulated changes +in `evil-repeat-info' and clear variables." + (unwind-protect + (when (evil-repeat-recording-p) + (setq evil-repeat-info + (evil-normalize-repeat-info evil-repeat-info)) + (when (and evil-repeat-info evil-repeat-ring) + (ring-insert evil-repeat-ring evil-repeat-info))) + (evil-repeat-reset nil))) + +(defun evil-repeat-abort () + "Abort current repeation." + (evil-repeat-reset 'abort)) + +(defun evil-repeat-reset (flag) + "Clear all repeat recording variables. +Set `evil-recording-repeat' to FLAG." + (setq evil-recording-repeat flag + evil-repeat-info nil + evil-repeat-buffer nil)) + +(defsubst evil-repeat-record-position (&optional pos) + "Set `evil-repeat-pos' to POS or point." + (setq evil-repeat-pos (or pos (point)))) + +(defun evil-repeat-record-buffer () + "Set `evil-repeat-buffer' to the current buffer." + (unless (minibufferp) + (setq evil-repeat-buffer (current-buffer)))) + +(defmacro evil-save-repeat-info (&rest body) + "Execute BODY, protecting the values of repeat variables." + (declare (indent defun) + (debug t)) + `(let (evil-repeat-ring + evil-recording-repeat + evil-recording-current-command + evil-repeat-info + evil-repeat-changes + evil-repeat-pos + evil-repeat-keys + evil-repeat-buffer + this-command + last-command) + ,@body)) + +(defun evil-repeat-different-buffer-p (&optional strict) + "Whether the buffer has changed in a repeat. +If STRICT is non-nil, returns t if the previous buffer +is unknown; otherwise returns t only if the previous +buffer is known and different from the current buffer." + (and (or (buffer-live-p evil-repeat-buffer) strict) + (not (minibufferp)) + (not (eq (current-buffer) evil-repeat-buffer)))) + +(defun evil-repeat-type (command &optional default) + "Return the :repeat property of COMMAND. +If COMMAND doesn't have this property, return DEFAULT." + (when (functionp command) ; ignore keyboard macros + (let* ((type (evil-get-command-property command :repeat default)) + (repeat-type (assq type evil-repeat-types))) + (if repeat-type (cdr repeat-type) type)))) + +(defun evil-repeat-force-abort-p (repeat-type) + "Returns non-nil iff the current command should abort the recording of repeat information." + (or (evil-repeat-different-buffer-p) ; ... buffer changed + (eq repeat-type 'abort) ; ... explicitely forced + (eq evil-recording-repeat 'abort) ; ... already aborted + (evil-emacs-state-p) ; ... in Emacs state + (and (evil-mouse-events-p (this-command-keys)) ; ... mouse events + (eq repeat-type nil)) + (minibufferp))) ; ... minibuffer activated + +(defun evil-repeat-record (info) + "Add INFO to the end of `evil-repeat-info'." + (when (evil-repeat-recording-p) + (setq evil-repeat-info (nconc evil-repeat-info (list info))))) + +;; called from `evil-normal-state-exit-hook' +(defun evil-repeat-start-hook () + "Record a new repeat when exiting Normal state. +Does not record in Emacs state or if the current command +has :repeat nil." + (when (and (eq (evil-repeat-type this-command t) t) + (not (evil-emacs-state-p))) + (evil-repeat-start))) + +;; called from `pre-command-hook' +(defun evil-repeat-pre-hook () + "Prepare the current command for recording the repeation." + (when evil-local-mode + (let ((repeat-type (evil-repeat-type this-command t))) + (cond + ;; abort the repeat + ((evil-repeat-force-abort-p repeat-type) + ;; We mark the current record as being aborted, because there + ;; may be further pre-hooks following before the post-hook is + ;; called. + (evil-repeat-abort)) + ;; ignore those commands completely + ((or (null repeat-type) + (evil-mouse-events-p (this-command-keys)))) + ;; record command + (t + ;; In normal-state or visual state, each command is a single + ;; repeation, therefore start a new repeation. + (when (or (evil-normal-state-p) + (evil-visual-state-p)) + (evil-repeat-start)) + (setq evil-recording-current-command t) + (funcall repeat-type 'pre)))))) +(put 'evil-repeat-pre-hook 'permanent-local-hook t) + +;; called from `post-command-hook' +(defun evil-repeat-post-hook () + "Finish recording of repeat-information for the current-command." + (when (and evil-local-mode evil-recording-repeat) + (let ((repeat-type (evil-repeat-type this-command t))) + (cond + ;; abort the repeat + ((evil-repeat-force-abort-p repeat-type) + ;; The command has been aborted but is complete, so just reset + ;; the recording state. + (evil-repeat-reset nil)) + ;; ignore if command should not be recorded or the current + ;; command is not being recorded + ((or (null repeat-type) + (not evil-recording-current-command))) + ;; record command + (t + (funcall repeat-type 'post) + ;; In normal state, the repeat sequence is complete, so record it. + (when (evil-normal-state-p) + (evil-repeat-stop))))) + ;; done with recording the current command + (setq evil-recording-current-command nil))) +(put 'evil-repeat-post-hook 'permanent-local-hook t) + +(defun evil-clear-command-keys () + "Clear `this-command-keys' and all information about the current command keys. +Calling this function prevents further recording of the keys that +invoked the current command" + (clear-this-command-keys t) + (setq evil-repeat-keys "")) + +(defun evil-this-command-keys (&optional post-cmd) + "Version of `this-command-keys' with finer control over prefix args." + (let ((arg (if post-cmd current-prefix-arg prefix-arg))) + (vconcat + (when (and (numberp arg) + ;; Only add prefix if no repeat info recorded yet + (null evil-repeat-info)) + (string-to-vector (number-to-string arg))) + (this-single-command-keys)))) + +(defun evil-repeat-keystrokes (flag) + "Repeation recording function for commands that are repeated by keystrokes." + (cond + ((eq flag 'pre) + (when evil-this-register + (evil-repeat-record + `(set evil-this-register ,evil-this-register))) + (setq evil-repeat-keys (evil-this-command-keys))) + ((eq flag 'post) + (evil-repeat-record (if (zerop (length (evil-this-command-keys t))) + evil-repeat-keys + (evil-this-command-keys t))) + ;; erase commands keys to prevent double recording + (evil-clear-command-keys)))) + +(defun evil-repeat-motion (flag) + "Repeation for motions. Motions are recorded by keystroke but only in insert state." + (when (memq evil-state '(insert replace)) + (evil-repeat-keystrokes flag))) + +(defun evil-repeat-changes (flag) + "Repeation recording function for commands that are repeated by buffer changes." + (cond + ((eq flag 'pre) + (add-hook 'after-change-functions #'evil-repeat-change-hook nil t) + (evil-repeat-start-record-changes)) + ((eq flag 'post) + (remove-hook 'after-change-functions #'evil-repeat-change-hook t) + (evil-repeat-finish-record-changes)))) + +;; called from the `after-change-functions' hook +(defun evil-repeat-change-hook (beg end length) + "Record change information for current command." + (let ((repeat-type (evil-repeat-type this-command t))) + (when (and (evil-repeat-recording-p) + (eq repeat-type 'evil-repeat-changes) + (not (evil-emacs-state-p)) + (not (evil-repeat-different-buffer-p t)) + evil-state) + (unless (evil-repeat-recording-p) + (evil-repeat-start)) + (evil-repeat-record-change (- beg evil-repeat-pos) + (buffer-substring beg end) + length)))) +(put 'evil-repeat-change-hook 'permanent-local-hook t) + +(defun evil-repeat-record-change (relpos ins ndel) + "Record the current buffer changes during a repeat. +If CHANGE is specified, it is added to `evil-repeat-changes'." + (when (evil-repeat-recording-p) + (setq evil-repeat-changes + (nconc evil-repeat-changes (list (list relpos ins ndel)))))) + +(defun evil-repeat-start-record-changes () + "Starts the recording of a new set of buffer changes." + (setq evil-repeat-changes nil) + (evil-repeat-record-position)) + +(defun evil-repeat-finish-record-changes () + "Finishes the recording of buffer changes and records them as repeat." + (when (evil-repeat-recording-p) + (evil-repeat-record `(evil-execute-change + ,evil-repeat-changes + ,(- (point) evil-repeat-pos))) + (setq evil-repeat-changes nil))) + +(defun evil-repeat-insert-at-point (flag) + "Repeation recording function for commands that insert text in region. +For example `mouse-yank-primary'. This records text insertion when a command +inserts some text in a buffer between (point) and (mark)." + (cond + ((eq flag 'pre) + (add-hook 'after-change-functions #'evil-repeat-insert-at-point-hook nil t)) + ((eq flag 'post) + (remove-hook 'after-change-functions #'evil-repeat-insert-at-point-hook t)))) + +(defun evil-repeat-insert-at-point-hook (beg end _length) + (let ((repeat-type (evil-repeat-type this-command t))) + (when (and (evil-repeat-recording-p) + (eq repeat-type 'evil-repeat-insert-at-point) + (not (evil-emacs-state-p)) + (not (evil-repeat-different-buffer-p t)) + evil-state) + (setq evil-repeat-pos beg) + (evil-repeat-record (list 'insert (buffer-substring beg end)))))) +(put 'evil-repeat-insert-at-point-hook 'permanent-local-hook t) + +(defun evil-normalize-repeat-info (repeat-info) + "Concatenate consecutive arrays in REPEAT-INFO. +Returns a single array." + (let* ((result (cons nil nil)) + (result-last result) + cur cur-last) + (dolist (rep repeat-info) + (cond + ((null rep)) + ((arrayp rep) + (setq rep (listify-key-sequence rep)) + (cond + (cur + (setcdr cur-last (cons rep nil)) + (setq cur-last (cdr cur-last))) + (t + (setq cur (cons rep nil)) + (setq cur-last cur)))) + (t + (when cur + (setcdr result-last (cons (apply #'vconcat cur) nil)) + (setq result-last (cdr result-last)) + (setq cur nil)) + (setcdr result-last (cons rep nil)) + (setq result-last (cdr result-last))))) + (when cur + (setcdr result-last (cons (apply #'vconcat cur) nil))) + (cdr result))) + +(defun evil-repeat-visual-char (nfwdlines nfwdchars) + "Restores a character visual selection. +If the selection is in a single line, the restored visual +selection covers the same number of characters. If the selection +covers several lines, the restored selection covers the same +number of lines and the same number of characters in the last +line as the original selection." + (evil-visual-char) + (when (> nfwdlines 0) + (forward-line nfwdlines)) + (forward-char nfwdchars)) + +(defun evil-repeat-visual-line (nfwdlines) + "Restores a character visual selection. +If the selection is in a single line, the restored visual +selection covers the same number of characters. If the selection +covers several lines, the restored selection covers the same +number of lines and the same number of characters in the last +line as the original selection." + (evil-visual-line) + (forward-line nfwdlines)) + +(defun evil-repeat-visual-block (nfwdlines nfwdchars) + "Restores a character visual selection. +If the selection is in a single line, the restored visual +selection covers the same number of characters. If the selection +covers several lines, the restored selection covers the same +number of lines and the same number of characters in the last +line as the original selection." + (evil-visual-block) + (let ((col (current-column))) + (forward-line nfwdlines) + (move-to-column (+ col nfwdchars) t))) + +(defun evil-execute-change (changes rel-point) + "Executes as list of changes. + +CHANGES is a list of triples (REL-BEG INSERT-TEXT NDEL). +REL-BEG is the relative position (to point) where the change +takes place. INSERT-TEXT is the text to be inserted at that +position and NDEL the number of characters to be deleted at that +position before insertion. + +REL-POINT is the relative position to point before the changed +where point should be placed after all changes." + (evil-save-repeat-info + (let ((point (point))) + (dolist (change changes) + (goto-char (+ point (nth 0 change))) + (delete-char (nth 2 change)) + (insert (nth 1 change))) + (goto-char (+ point rel-point))))) + +(defun evil-execute-repeat-info (repeat-info) + "Executes a repeat-information REPEAT-INFO." + (evil-save-repeat-info + (dolist (rep repeat-info) + (cond + ((or (arrayp rep) (stringp rep)) + (let ((input-method current-input-method) + (evil-input-method nil)) + (deactivate-input-method) + (unwind-protect + (execute-kbd-macro rep) + (activate-input-method input-method)))) + ((consp rep) + (when (and (= 3 (length rep)) + (eq (nth 0 rep) 'set) + (eq (nth 1 rep) 'evil-this-register) + (>= (nth 2 rep) ?0) + (< (nth 2 rep) ?9)) + (setcar (nthcdr 2 rep) (1+ (nth 2 rep)))) + (apply (car rep) (cdr rep))) + (t + (error "Unexpected repeat-info: %S" rep)))))) + +;; TODO: currently we prepend the replacing count before the +;; key-sequence that calls the command. Can we use direct +;; modification of prefix-arg instead? Does it work in +;; conjunction with `execute-kbd-macro'? +(defun evil-execute-repeat-info-with-count (count repeat-info) + "Repeat the repeat-information REPEAT-INFO with the count of +the first command replaced by COUNT. The count is replaced if +and only if COUNT is non-nil." + (evil-save-repeat-info + (cond + ;; do nothing (zero repeating) + ((and count (zerop count))) + ;; replace count + (count + (let ((evil-repeat-count count) + done) + (while (and repeat-info + (arrayp (car repeat-info)) + (not done)) + (let* ((count-and-cmd (evil-extract-count (pop repeat-info)))) + (push (vconcat (number-to-string count) + (nth 2 count-and-cmd) + (nth 3 count-and-cmd)) + repeat-info) + (setq done t))) + (evil-execute-repeat-info repeat-info))) + ;; repeat with original count + (t + (evil-execute-repeat-info repeat-info))))) + +(evil-define-command evil-repeat (count &optional save-point) + "Repeat the last editing command with count replaced by COUNT. +If SAVE-POINT is non-nil, do not move point." + :repeat ignore + :suppress-operator t + (interactive (list current-prefix-arg + (not evil-repeat-move-cursor))) + (cond + ((null evil-repeat-ring) + (error "Already executing repeat")) + (save-point + (save-excursion + (evil-repeat count))) + (t + (unwind-protect + (let ((evil-last-find-temp evil-last-find) + (confirm-kill-emacs t) + (kill-buffer-hook + (cons #'(lambda () + (user-error "Cannot delete buffer in repeat command")) + kill-buffer-hook)) + (undo-pointer buffer-undo-list)) + (evil-with-single-undo + (setq evil-last-repeat (list (point) count undo-pointer)) + (evil-execute-repeat-info-with-count + count (ring-ref evil-repeat-ring 0)) + (setq evil-last-find evil-last-find-temp))) + (if (eq 'evil-execute-in-normal-state last-command) + (evil-change-state evil--execute-normal-return-state) + (evil-normal-state)))))) + +;; TODO: the same issue concering disabled undos as for `evil-paste-pop' +(evil-define-command evil-repeat-pop (count &optional save-point) + "Replace the just repeated command with a previously executed command. +Only allowed after `evil-repeat', `evil-repeat-pop' or +`evil-repeat-pop-next'. Uses the same repeat count that +was used for the first repeat. + +The COUNT argument inserts the COUNT-th previous kill. +If COUNT is negative, this is a more recent kill." + :repeat nil + :suppress-operator t + (interactive (list (prefix-numeric-value current-prefix-arg) + (not evil-repeat-move-cursor))) + (cond + ((not (and (eq last-command #'evil-repeat) + evil-last-repeat)) + (user-error "Previous command was not evil-repeat: %s" last-command)) + (save-point + (save-excursion + (evil-repeat-pop count))) + (t + (unless (eq buffer-undo-list (nth 2 evil-last-repeat)) + (evil-undo-pop)) + (goto-char (car evil-last-repeat)) + ;; rotate the repeat-ring + (while (> count 0) + (when evil-repeat-ring + (ring-insert-at-beginning evil-repeat-ring + (ring-remove evil-repeat-ring 0))) + (setq count (1- count))) + (while (< count 0) + (when evil-repeat-ring + (ring-insert evil-repeat-ring + (ring-remove evil-repeat-ring))) + (setq count (1+ count))) + (setq this-command #'evil-repeat) + (evil-repeat (cadr evil-last-repeat))))) + +(evil-define-command evil-repeat-pop-next (count &optional save-point) + "Same as `evil-repeat-pop', but with negative COUNT." + :repeat nil + :suppress-operator t + (interactive (list (prefix-numeric-value current-prefix-arg) + (not evil-repeat-move-cursor))) + (evil-repeat-pop (- count) save-point)) + +(defadvice read-key-sequence (before evil activate) + "Record `this-command-keys' before it is reset." + (when (and (evil-repeat-recording-p) + evil-recording-current-command) + (let ((repeat-type (evil-repeat-type this-command t))) + (if (functionp repeat-type) + (funcall repeat-type 'post))))) + +(provide 'evil-repeat) + +;;; evil-repeat.el ends here diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-repeat.elc b/.emacs.d/elpa/evil-20210527.2107/evil-repeat.elc new file mode 100644 index 0000000..bdb031f Binary files /dev/null and b/.emacs.d/elpa/evil-20210527.2107/evil-repeat.elc differ diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-search.el b/.emacs.d/elpa/evil-20210527.2107/evil-search.el new file mode 100644 index 0000000..2e88d56 --- /dev/null +++ b/.emacs.d/elpa/evil-20210527.2107/evil-search.el @@ -0,0 +1,1318 @@ +;;; evil-search.el --- Search and substitute -*- lexical-binding: t -*- + +;; Author: Vegard Øye <vegard_oye at hotmail.com> +;; Maintainer: Vegard Øye <vegard_oye at hotmail.com> + +;; Version: 1.14.0 + +;; +;; This file is NOT part of GNU Emacs. + +;;; License: + +;; This file is part of Evil. +;; +;; Evil is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; Evil is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with Evil. If not, see <http://www.gnu.org/licenses/>. + +(require 'evil-core) +(require 'evil-common) +(require 'evil-ex) + +;;; Code: + +(defun evil-select-search-module (option module) + "Change the search module according to MODULE. +If MODULE is `isearch', then Emacs' isearch module is used. +If MODULE is `evil-search', then Evil's own interactive +search module is used." + (let ((search-functions + '(forward + backward + word-forward + word-backward + unbounded-word-forward + unbounded-word-backward + next + previous))) + (dolist (fun search-functions) + (let ((isearch (intern (format "evil-search-%s" fun))) + (evil-search (intern (format "evil-ex-search-%s" fun)))) + (if (eq module 'isearch) + (substitute-key-definition + evil-search isearch evil-motion-state-map) + (substitute-key-definition + isearch evil-search evil-motion-state-map))))) + (set-default option module)) + +;; this customization is here because it requires +;; the knowledge of `evil-select-search-mode' +(defcustom evil-search-module 'isearch + "The search module to be used. May be either `isearch', for +Emacs' isearch module, or `evil-search', for Evil's own +interactive search module." + :type '(radio (const :tag "Emacs built-in isearch." :value isearch) + (const :tag "Evil interactive search." :value evil-search)) + :group 'evil + :set 'evil-select-search-module + :initialize 'evil-custom-initialize-pending-reset) + +(defun evil-push-search-history (string forward) + "Push STRING into the appropriate search history (determined by FORWARD)." + (let* ((history-var (if forward + 'evil-search-forward-history + 'evil-search-backward-history)) + (history (symbol-value history-var))) + (unless (equal (car-safe history) string) + (set history-var (cons string history))))) + +(defun evil-search-incrementally (forward regexp-p) + "Search incrementally for user-entered text." + (let ((evil-search-prompt (evil-search-prompt forward)) + (isearch-search-fun-function 'evil-isearch-function) + (point (point)) + search-nonincremental-instead) + (setq isearch-forward forward) + (evil-save-echo-area + (evil-without-input-method-hooks + ;; set the input method locally rather than globally to ensure that + ;; isearch clears the input method when it's finished + (setq current-input-method evil-input-method) + (if forward + (isearch-forward regexp-p) + (isearch-backward regexp-p)) + (evil-push-search-history isearch-string forward) + (setq current-input-method nil)) + (when (/= (point) point) + ;; position the point at beginning of the match only if the call to + ;; `isearch' has really moved the point. `isearch' doesn't move the + ;; point only if "C-g" is hit twice to exit the search, in which case we + ;; shouldn't move the point either. + (when (and forward isearch-other-end) + (goto-char isearch-other-end)) + (when (and (eq point (point)) + (not (string= isearch-string ""))) + (if forward + (isearch-repeat-forward) + (isearch-repeat-backward)) + (isearch-exit) + (when (and forward isearch-other-end) + (goto-char isearch-other-end))) + (evil-flash-search-pattern + (evil-search-message isearch-string forward)))))) + +(defun evil-flash-search-pattern (string &optional all) + "Flash last search matches for duration of `evil-flash-delay'. +If ALL is non-nil, flash all matches. STRING is a message +to display in the echo area." + (let ((lazy-highlight-initial-delay 0) + (isearch-search-fun-function 'evil-isearch-function) + (isearch-case-fold-search case-fold-search) + (disable #'(lambda (&optional _arg) (evil-flash-hook t)))) + (when evil-flash-timer + (cancel-timer evil-flash-timer)) + (unless (or (null string) + (string= string "")) + (evil-echo-area-save) + (evil-echo "%s" string) + (isearch-highlight (match-beginning 0) (match-end 0)) + (when all + (setq isearch-lazy-highlight-wrapped nil + isearch-lazy-highlight-start (point) + isearch-lazy-highlight-end (point)) + (isearch-lazy-highlight-new-loop) + (unless isearch-lazy-highlight-overlays + (isearch-lazy-highlight-update))) + (add-hook 'pre-command-hook #'evil-flash-hook nil t) + (add-hook 'evil-operator-state-exit-hook #'evil-flash-hook nil t) + (add-hook 'pre-command-hook #'evil-clean-isearch-overlays nil t) + (setq evil-flash-timer + (run-at-time evil-flash-delay nil disable))))) + +(defun evil-clean-isearch-overlays () + "Clean isearch overlays unless `this-command' is search." + (remove-hook 'pre-command-hook #'evil-clean-isearch-overlays t) + (unless (memq this-command + '(evil-search-backward + evil-search-forward + evil-search-next + evil-search-previous + evil-search-word-backward + evil-search-word-forward)) + (isearch-clean-overlays))) +(put 'evil-clean-isearch-overlays 'permanent-local-hook t) + +(defun evil-flash-hook (&optional force) + "Disable hightlighting if `this-command' is not search. +Disable anyway if FORCE is t." + (when (or force + ;; to avoid flicker, don't disable highlighting + ;; if the next command is also a search command + (not (memq this-command + '(evil-search-backward + evil-search-forward + evil-search-next + evil-search-previous + evil-search-word-backward + evil-search-word-forward)))) + (evil-echo-area-restore) + (isearch-dehighlight) + (setq isearch-lazy-highlight-last-string nil) + (lazy-highlight-cleanup t) + (when evil-flash-timer + (cancel-timer evil-flash-timer))) + (remove-hook 'pre-command-hook #'evil-flash-hook t) + (remove-hook 'evil-operator-state-exit-hook #'evil-flash-hook t)) +(put 'evil-flash-hook 'permanent-local-hook t) + +(defun evil-search-with-predicate (search-fun pred string bound noerror count) + "Execute a search with a predicate function. +SEARCH-FUN is a search function (e.g. `re-search-forward') and +PREDICATE is a two-argument function satisfying the interface of +`isearch-filter-predicate', or `nil'. STRING, BOUND, NOERROR and +COUNT are passed unchanged to SEARCH-FUN. The first match +satisfying the predicate (or `nil') is returned." + (catch 'done + (while t + (let ((result (funcall search-fun string bound noerror count))) + (cond + ((not result) (throw 'done nil)) + ((not pred) (throw 'done result)) + ((funcall pred (match-beginning 0) (match-end 0)) (throw 'done result))))))) + +(defun evil-search-function (&optional forward regexp-p wrap predicate) + "Return a search function. +If FORWARD is nil, search backward, otherwise forward. +If REGEXP-P is non-nil, the input is a regular expression. +If WRAP is non-nil, the search wraps around the top or bottom +of the buffer. +If PREDICATE is non-nil, it must be a function accepting two +arguments: the bounds of a match, returning non-nil if that match is +acceptable." + `(lambda (string &optional bound noerror count) + (let ((start (point)) + (search-fun ',(if regexp-p + (if forward + 're-search-forward + 're-search-backward) + (if forward + 'search-forward + 'search-backward))) + result) + (setq result (evil-search-with-predicate + search-fun ,predicate string + bound ,(if wrap t 'noerror) count)) + (when (and ,wrap (null result)) + (goto-char ,(if forward '(point-min) '(point-max))) + (unwind-protect + (setq result (evil-search-with-predicate + search-fun ,predicate string bound noerror count)) + (unless result + (goto-char start)))) + result))) + +(defun evil-isearch-function () + "Return a search function for use with isearch. +Based on `isearch-regexp' and `isearch-forward'." + (evil-search-function isearch-forward evil-regexp-search evil-search-wrap 'isearch-filter-predicate)) + +(defun evil-search (string forward &optional regexp-p start) + "Search for STRING and highlight matches. +If FORWARD is nil, search backward, otherwise forward. +If REGEXP-P is non-nil, STRING is taken to be a regular expression. +START is the position to search from; if unspecified, it is +one more than the current position." + (when (and (stringp string) + (not (string= string ""))) + (let* ((orig (point)) + (start (or start + (if forward + (min (point-max) (1+ orig)) + orig))) + (isearch-regexp regexp-p) + (isearch-forward forward) + (case-fold-search + (unless (and search-upper-case + (not (isearch-no-upper-case-p string nil))) + case-fold-search)) + (search-func (evil-search-function + forward regexp-p evil-search-wrap 'isearch-filter-predicate))) + ;; no text properties, thank you very much + (set-text-properties 0 (length string) nil string) + ;; position to search from + (goto-char start) + (setq isearch-string string) + (isearch-update-ring string regexp-p) + (condition-case nil + (funcall search-func string) + (search-failed + (goto-char orig) + (user-error "\"%s\": %s not found" + string (if regexp-p "pattern" "string")))) + ;; always position point at the beginning of the match + (goto-char (match-beginning 0)) + ;; determine message for echo area + (cond + ((and forward (< (point) start)) + (setq string "Search wrapped around BOTTOM of buffer")) + ((and (not forward) (> (point) start)) + (setq string "Search wrapped around TOP of buffer")) + (t + (setq string (evil-search-message string forward)))) + (evil-flash-search-pattern string t)))) + +(defun evil-search-word (forward unbounded symbol) + "Search for word near point. +If FORWARD is nil, search backward, otherwise forward. If SYMBOL +is non-nil then the functions searches for the symbol at point, +otherwise for the word at point." + (let ((string (car-safe regexp-search-ring))) + (setq isearch-forward forward) + (cond + ((and (memq last-command + '(evil-search-word-forward + evil-search-word-backward)) + (stringp string) + (not (string= string ""))) + (evil-search string forward t)) + (t + (setq string (evil-find-thing forward (if symbol 'symbol 'evil-word))) + (cond + ((null string) + (user-error "No word under point")) + (unbounded + (setq string (regexp-quote string))) + (t + (setq string + (format (if symbol "\\_<%s\\_>" "\\<%s\\>") + (regexp-quote string))))) + (evil-push-search-history string forward) + (evil-search string forward t))))) + +(defun evil--find-thing (forward thing) + "Return a cons of THING near point as a string and its position. +THING should be a symbol understood by `thing-at-point', +e.g. 'symbol or 'word. If FORWARD is nil, search backward, +otherwise forward. Returns nil if nothing is found." + (let ((move (if forward #'forward-char #'backward-char)) + (end (if forward #'eobp #'bobp)) + string) + (save-excursion + (setq string (thing-at-point thing)) + ;; if there's nothing under point, go forwards + ;; (or backwards) to find it + (while (and (null string) (not (funcall end))) + (funcall move) + (setq string (thing-at-point thing))) + (when (stringp string) + (set-text-properties 0 (length string) nil string)) + (when (> (length string) 0) + (cons string (point)))))) + +(defun evil-find-thing (forward thing) + "Return a THING near point as a string. +THING should be a symbol understood by `thing-at-point', +e.g. 'symbol or 'word. If FORWARD is nil, search backward, +otherwise forward. Returns nil if nothing is found." + (car (evil--find-thing forward thing))) + +(defun evil-find-word (forward) + "Return word near point as a string. +If FORWARD is nil, search backward, otherwise forward. Returns +nil if nothing is found." + (evil-find-thing forward 'word)) + +(defun evil-find-symbol (forward) + "Return word near point as a string. +If FORWARD is nil, search backward, otherwise forward. Returns +nil if nothing is found." + (evil-find-thing forward 'symbol)) + +(defun evil-search-prompt (forward) + "Return the search prompt for the given direction." + (if forward "/" "?")) + +(defun evil-search-message (string forward) + "Prefix STRING with the search prompt." + (format "%s%s" (evil-search-prompt forward) string)) + +(defadvice isearch-message-prefix (around evil activate) + "Use `evil-search-prompt'." + (if evil-search-prompt + (setq ad-return-value evil-search-prompt) + ad-do-it)) + +(defadvice isearch-delete-char (around evil activate) + "Exit search if no search string." + (cond + ((and evil-search-prompt (string= isearch-string "")) + (let (search-nonincremental-instead) + (setq isearch-success nil) + (isearch-exit))) + (t + ad-do-it))) + +(defadvice isearch-lazy-highlight-search (around evil activate) + "Never wrap the search in this context." + (let (evil-search-wrap) + ad-do-it)) + +;;; Ex search + +(defun evil-ex-regex-without-case (re) + "Return the regular expression without all occurrences of \\c and \\C." + (evil-transform-regexp re '((?c . "") (?C . "")))) + +(defun evil-ex-regex-case (re default-case) + "Return the case as implied by \\c or \\C in regular expression RE. +If \\c appears anywhere in the pattern, the pattern is case +insensitive. If \\C appears, the pattern is case sensitive. +Only the first occurrence of \\c or \\C is used, all others are +ignored. If neither \\c nor \\C appears in the pattern, the case +specified by DEFAULT-CASE is used. DEFAULT-CASE should be either +`sensitive', `insensitive' or `smart'. In the latter case, the pattern +will be case-sensitive if and only if it contains an upper-case +letter, otherwise it will be case-insensitive." + (cond + ((string-match "\\(?:^\\|[^\\\\]\\)\\(?:\\\\\\\\\\)*\\\\\\([cC]\\)" re) + (if (eq (aref (match-string 1 re) 0) ?c) 'insensitive 'sensitive)) + ((eq default-case 'smart) + (if (isearch-no-upper-case-p re t) + 'insensitive + 'sensitive)) + (t default-case))) + +;; a pattern +(defun evil-ex-make-substitute-pattern (regexp flags) + "Creates a PATTERN for substitution with FLAGS. +This function respects the values of `evil-ex-substitute-case' +and `evil-ex-substitute-global'." + (evil-ex-make-pattern regexp + (cond + ((memq ?i flags) 'insensitive) + ((memq ?I flags) 'sensitive) + ((not evil-ex-substitute-case) + evil-ex-search-case) + (t evil-ex-substitute-case)) + (or (and evil-ex-substitute-global + (not (memq ?g flags))) + (and (not evil-ex-substitute-global) + (memq ?g flags))))) + +(defun evil-ex-make-search-pattern (regexp) + "Creates a PATTERN for search. +This function respects the values of `evil-ex-search-case'." + (evil-ex-make-pattern regexp evil-ex-search-case t)) + +(defun evil-ex-make-pattern (regexp case whole-line) + "Create a new search pattern. +REGEXP is the regular expression to be searched for. CASE should +be either 'sensitive, 'insensitive for case-sensitive and +case-insensitive search, respectively, or anything else. In the +latter case the pattern is smart-case, i.e. it is automatically +sensitive of the pattern contains one upper case letter, +otherwise it is insensitive. The input REGEXP is considered a +Vim-style regular expression if `evil-ex-search-vim-style-regexp' +is non-nil, in which case it is transformed to an Emacs style +regular expression (i.e. certain backslash-codes are +transformed. Otherwise REGEXP must be an Emacs style regular +expression and is not transformed." + (let ((re (evil-ex-regex-without-case regexp)) + (ignore-case (eq (evil-ex-regex-case regexp case) 'insensitive))) + ;; possibly transform regular expression from vim-style to + ;; Emacs-style. + (if evil-ex-search-vim-style-regexp + (setq re (evil-transform-vim-style-regexp re)) + ;; Even for Emacs regular expressions we translate certain + ;; whitespace sequences + (setq re (evil-transform-regexp re + '((?t . "\t") + (?n . "\n") + (?r . "\r"))))) + (list re ignore-case whole-line))) + +(defun evil-ex-pattern-regex (pattern) + "Return the regular expression of a search PATTERN." + (nth 0 pattern)) + +(defun evil-ex-pattern-ignore-case (pattern) + "Return t if and only if PATTERN should ignore case." + (nth 1 pattern)) + +(defun evil-ex-pattern-whole-line (pattern) + "Return t if and only if PATTERN should match all occurences of a line. +Otherwise PATTERN matches only the first occurence." + (nth 2 pattern)) + +;; Highlight +(defun evil-ex-make-hl (name &rest args) + "Create a new highlight object with name NAME and properties ARGS. +The following properties are supported: +:face The face to be used for the highlighting overlays. +:win The window in which the highlighting should be shown. + Note that the highlight will be visible in all windows showing + the corresponding buffer, but only the matches visible in the + specified window will actually be highlighted. If :win is nil, + the matches in all windows will be highlighted. +:min The minimal buffer position for highlighted matches. +:max The maximal buffer position for highlighted matches. +:match-hook A hook to be called once for each highlight. + The hook must take two arguments, the highlight and + the overlay for that highlight. +:update-hook A hook called once after updating the highlighting + with two arguments, the highlight and a message string + describing the current match status." + (unless (symbolp name) + (user-error "Expected symbol as name of highlight")) + (let ((face 'evil-ex-lazy-highlight) + (win (selected-window)) + min max match-hook update-hook) + (while args + (let ((key (pop args)) + (val (pop args))) + (cond + ((eq key :face) (setq face val)) + ((eq key :win) (setq win val)) + ((eq key :min) (setq min val)) + ((eq key :max) (setq max val)) + ((eq key :match-hook) (setq match-hook val)) + ((eq key :update-hook) (setq update-hook val)) + (t (user-error "Unexpected keyword: %s" key))))) + (when (assoc name evil-ex-active-highlights-alist) + (evil-ex-delete-hl name)) + (when (null evil-ex-active-highlights-alist) + (add-hook 'window-scroll-functions + #'evil-ex-hl-update-highlights-scroll nil t) + (add-hook 'window-size-change-functions + #'evil-ex-hl-update-highlights-resize nil)) + (push (cons name (vector name + nil + face + win + min + max + match-hook + update-hook + nil)) + evil-ex-active-highlights-alist))) + +(defun evil-ex-hl-name (hl) + "Return the name of the highlight HL." + (aref hl 0)) + +(defun evil-ex-hl-pattern (hl) + "Return the pattern of the highlight HL." + (aref hl 1)) + +(defun evil-ex-hl-set-pattern (hl pattern) + "Set the pattern of the highlight HL to PATTERN." + (aset hl 1 pattern)) + +(defun evil-ex-hl-face (hl) + "Return the face of the highlight HL." + (aref hl 2)) + +(defun evil-ex-hl-window (hl) + "Return the window of the highlight HL." + (aref hl 3)) + +(defun evil-ex-hl-min (hl) + "Return the minimal buffer position of the highlight HL." + (aref hl 4)) + +(defun evil-ex-hl-set-min (hl min) + "Set the minimal buffer position of the highlight HL to MIN." + (aset hl 4 min)) + +(defun evil-ex-hl-max (hl) + "Return the maximal buffer position of the highlight HL." + (aref hl 5)) + +(defun evil-ex-hl-set-max (hl max) + "Set the minimal buffer position of the highlight HL to MAX." + (aset hl 5 max)) + +(defun evil-ex-hl-match-hook (hl) + "Return the match-hook of the highlight HL." + (aref hl 6)) + +(defun evil-ex-hl-update-hook (hl) + "Return the update-hook of the highlight HL." + (aref hl 7)) + +(defun evil-ex-hl-overlays (hl) + "Return the list of active overlays of the highlight HL." + (aref hl 8)) + +(defun evil-ex-hl-set-overlays (hl overlays) + "Set the list of active overlays of the highlight HL to OVERLAYS." + (aset hl 8 overlays)) + +(defun evil-ex-delete-hl (name) + "Remove the highlighting object with a certain NAME." + (let ((hl (cdr-safe (assoc name evil-ex-active-highlights-alist)))) + (when hl + (mapc #'delete-overlay (evil-ex-hl-overlays hl)) + (setq evil-ex-active-highlights-alist + (assq-delete-all name evil-ex-active-highlights-alist)) + (evil-ex-hl-update-highlights)) + (when (null evil-ex-active-highlights-alist) + (remove-hook 'window-scroll-functions + #'evil-ex-hl-update-highlights-scroll t) + (remove-hook 'window-size-change-functions + #'evil-ex-hl-update-highlights-resize)))) + +(defun evil-ex-hl-active-p (name) + "Whether the highlight with a certain NAME is active." + (and (assoc name evil-ex-active-highlights-alist) t)) + +(defun evil-ex-hl-change (name pattern) + "Set the regular expression of highlight NAME to PATTERN." + (let ((hl (cdr-safe (assoc name evil-ex-active-highlights-alist)))) + (when hl + (evil-ex-hl-set-pattern hl + (if (zerop (length pattern)) + nil + pattern)) + (evil-ex-hl-idle-update)))) + +(defun evil-ex-hl-set-region (name beg end &optional _type) + "Set minimal and maximal position of highlight NAME to BEG and END." + (let ((hl (cdr-safe (assoc name evil-ex-active-highlights-alist)))) + (when hl + (evil-ex-hl-set-min hl beg) + (evil-ex-hl-set-max hl end) + (evil-ex-hl-idle-update)))) + +(defun evil-ex-hl-get-max (name) + "Return the maximal position of the highlight with name NAME." + (let ((hl (cdr-safe (assoc name evil-ex-active-highlights-alist)))) + (and hl (evil-ex-hl-max hl)))) + +(defun evil-ex-hl-update-highlights () + "Update the overlays of all active highlights." + (dolist (hl (mapcar #'cdr evil-ex-active-highlights-alist)) + (let* ((old-ovs (evil-ex-hl-overlays hl)) + new-ovs + (pattern (evil-ex-hl-pattern hl)) + (case-fold-search (evil-ex-pattern-ignore-case pattern)) + (case-replace case-fold-search) + (face (evil-ex-hl-face hl)) + (match-hook (evil-ex-hl-match-hook hl)) + result) + (if pattern + ;; collect all visible ranges + (let (ranges sranges) + (dolist (win (if (eq evil-ex-interactive-search-highlight + 'all-windows) + (get-buffer-window-list (current-buffer) nil t) + (list (evil-ex-hl-window hl)))) + (when (window-live-p win) + (let ((beg (max (window-start win) + (or (evil-ex-hl-min hl) (point-min)))) + (end (min (window-end win) + (or (evil-ex-hl-max hl) (point-max))))) + (when (< beg end) + (push (cons beg end) ranges))))) + (setq ranges + (sort ranges #'(lambda (r1 r2) (< (car r1) (car r2))))) + (while ranges + (let ((r1 (pop ranges)) + (r2 (pop ranges))) + (cond + ;; last range + ((null r2) + (push r1 sranges)) + ;; ranges overlap, union + ((>= (cdr r1) (car r2)) + (push (cons (car r1) + (max (cdr r1) (cdr r2))) + ranges)) + ;; ranges distinct + (t + (push r1 sranges) + (push r2 ranges))))) + + ;; run through all ranges + (condition-case lossage + (save-match-data + (dolist (r sranges) + (let ((beg (car r)) + (end (cdr r))) + (save-excursion + (goto-char beg) + ;; set the overlays for the current highlight, + ;; reusing old overlays (if possible) + (while (and (not (eobp)) + (evil-ex-search-find-next-pattern pattern) + (<= (match-end 0) end) + (not (and (= (match-end 0) end) + (string= (evil-ex-pattern-regex pattern) + "^")))) + (let ((ov (or (pop old-ovs) (make-overlay 0 0)))) + (move-overlay ov (match-beginning 0) (match-end 0)) + (overlay-put ov 'face face) + (overlay-put ov 'evil-ex-hl (evil-ex-hl-name hl)) + (overlay-put ov 'priority 1000) + (push ov new-ovs) + (when match-hook (funcall match-hook hl ov))) + (cond + ((and (not (evil-ex-pattern-whole-line pattern)) + (not (string-match-p "\n" (buffer-substring-no-properties + (match-beginning 0) + (match-end 0))))) + (forward-line)) + ((= (match-beginning 0) (match-end 0)) + (forward-char)) + (t (goto-char (match-end 0)))))))) + (mapc #'delete-overlay old-ovs) + (evil-ex-hl-set-overlays hl new-ovs) + (if (or (null pattern) new-ovs) + (setq result t) + ;; Maybe the match could just not be found somewhere else? + (save-excursion + (goto-char (or (evil-ex-hl-min hl) (point-min))) + (if (and (evil-ex-search-find-next-pattern pattern) + (< (match-end 0) (or (evil-ex-hl-max hl) + (point-max)))) + (setq result (format "Match in line %d" + (line-number-at-pos + (match-beginning 0)))) + (setq result "No match"))))) + + (invalid-regexp + (setq result (cadr lossage))) + + (search-failed + (setq result (nth 2 lossage))) + + (error + (setq result (format "%s" (cadr lossage)))) + + (user-error + (setq result (format "%s" (cadr lossage)))))) + ;; no pattern, remove all highlights + (mapc #'delete-overlay old-ovs) + (evil-ex-hl-set-overlays hl new-ovs)) + (when (evil-ex-hl-update-hook hl) + (funcall (evil-ex-hl-update-hook hl) hl result))))) + +(defun evil-ex-search-find-next-pattern (pattern &optional direction) + "Look for the next occurrence of PATTERN in a certain DIRECTION. +Note that this function ignores the whole-line property of PATTERN." + (setq direction (or direction 'forward)) + (let ((case-fold-search (evil-ex-pattern-ignore-case pattern))) + (cond + ((eq direction 'forward) + (re-search-forward (evil-ex-pattern-regex pattern) nil t)) + ((eq direction 'backward) + (let* ((pnt (point)) + (ret (re-search-backward (evil-ex-pattern-regex pattern) nil t)) + (m (and ret (match-data)))) + (if ret + (forward-char) + (goto-char (point-min))) + (let ((fwdret + (re-search-forward (evil-ex-pattern-regex pattern) nil t))) + (cond + ((and fwdret (< (match-beginning 0) pnt)) + (setq ret fwdret) + (goto-char (match-beginning 0))) + (ret + (set-match-data m) + (goto-char (match-beginning 0))) + (t + (goto-char pnt) + ret))))) + (t + (user-error "Unknown search direction: %s" direction))))) + +(defun evil-ex-hl-idle-update () + "Triggers the timer to update the highlights in the current buffer." + (when (and evil-ex-interactive-search-highlight + evil-ex-active-highlights-alist) + (when evil-ex-hl-update-timer + (cancel-timer evil-ex-hl-update-timer)) + (setq evil-ex-hl-update-timer + (run-at-time evil-ex-hl-update-delay nil + #'evil-ex-hl-do-update-highlight + (current-buffer))))) + +(defun evil-ex-hl-do-update-highlight (&optional buffer) + "Timer function for updating the highlights." + (when (buffer-live-p buffer) + (with-current-buffer buffer + (evil-ex-hl-update-highlights))) + (setq evil-ex-hl-update-timer nil)) + +(defun evil-ex-hl-update-highlights-scroll (win _beg) + "Update highlights after scrolling in some window." + (with-current-buffer (window-buffer win) + (evil-ex-hl-idle-update))) +(put 'evil-ex-hl-update-highlights-scroll 'permanent-local-hook t) + +(defun evil-ex-hl-update-highlights-resize (frame) + "Update highlights after resizing a window." + (let ((buffers (delete-dups (mapcar #'window-buffer (window-list frame))))) + (dolist (buf buffers) + (with-current-buffer buf + (evil-ex-hl-idle-update))))) +(put 'evil-ex-hl-update-highlights-resize 'permanent-local-hook t) + +;; interactive search +(defun evil-ex-search-activate-highlight (pattern) + "Activate highlighting of the search pattern set to PATTERN. +This function does nothing if `evil-ex-search-interactive' or +`evil-ex-search-highlight-all' is nil. " + (when (and evil-ex-search-interactive evil-ex-search-highlight-all) + (with-current-buffer (or evil-ex-current-buffer (current-buffer)) + (unless (evil-ex-hl-active-p 'evil-ex-search) + (evil-ex-make-hl 'evil-ex-search + :win (or (minibuffer-selected-window) (selected-window)))) + (if pattern + (evil-ex-hl-change 'evil-ex-search pattern))))) + +(defun evil-ex-search (&optional count) + "Search forward or backward COUNT times for the current ex search pattern. +The search pattern is determined by `evil-ex-search-pattern' and +the direcion is determined by `evil-ex-search-direction'." + (setq evil-ex-search-start-point (point) + evil-ex-last-was-search t + count (or count 1)) + (let ((orig (point)) + wrapped) + (dotimes (_ (or count 1)) + (when (eq evil-ex-search-direction 'forward) + (unless (eobp) (forward-char)) + ;; maybe skip end-of-line + (when (and (not evil-move-beyond-eol) (eolp) (not (eobp))) + (forward-char))) + (let ((res (evil-ex-find-next nil nil (not evil-search-wrap)))) + (cond + ((not res) + (goto-char orig) + (signal 'search-failed + (list (evil-ex-pattern-regex evil-ex-search-pattern)))) + ((eq res 'wrapped) (setq wrapped t))))) + (if wrapped + (let (message-log-max) + (message "Search wrapped"))) + (goto-char (match-beginning 0)) + (setq evil-ex-search-match-beg (match-beginning 0) + evil-ex-search-match-end (match-end 0)) + (evil-ex-search-goto-offset evil-ex-search-offset) + (evil-ex-search-activate-highlight evil-ex-search-pattern))) + +(defun evil-ex-find-next (&optional pattern direction nowrap) + "Search for the next occurrence of the PATTERN in DIRECTION. +PATTERN must be created using `evil-ex-make-pattern', DIRECTION +is either 'forward or 'backward. If NOWRAP is non nil, the search +does not wrap at buffer boundaries. Furthermore this function +only searches invisible text if `search-invisible' is t. If +PATTERN is not specified the current global pattern +`evil-ex-search-pattern' and if DIRECTION is not specified the +current global direction `evil-ex-search-direction' is used. +This function returns t if the search was successful, nil if it +was unsuccessful and 'wrapped if the search was successful but +has been wrapped at the buffer boundaries." + (setq pattern (or pattern evil-ex-search-pattern) + direction (or direction evil-ex-search-direction)) + (unless (and pattern (evil-ex-pattern-regex pattern)) + (signal 'search-failed (list "No search pattern"))) + (catch 'done + (let (wrapped) + (while t + (let ((search-result (evil-ex-search-find-next-pattern pattern + direction))) + (cond + ((and search-result + (or (eq search-invisible t) + (not (isearch-range-invisible + (match-beginning 0) (match-end 0))))) + ;; successful search and not invisible + (throw 'done (if wrapped 'wrapped t))) + ((not search-result) + ;; unsuccessful search + (if nowrap + (throw 'done nil) + (setq nowrap t + wrapped t) + (goto-char (if (eq direction 'forward) + (point-min) + (point-max))))))))))) + +(defun evil-ex-search-update (pattern offset beg end message) + "Update the highlighting and info-message for the search pattern. +PATTERN is the search pattern and OFFSET the associated offset. +BEG and END specifiy the current match, MESSAGE is the info +message to be shown. This function does nothing if +`evil-ex-search-interactive' is nil." + (when evil-ex-search-interactive + (cond + ((and beg end) + ;; update overlay + (if evil-ex-search-overlay + (move-overlay evil-ex-search-overlay beg end) + (setq evil-ex-search-overlay + (make-overlay beg end)) + (overlay-put evil-ex-search-overlay 'priority 1001) + (overlay-put evil-ex-search-overlay 'face 'evil-ex-search)) + ;; move point + (goto-char beg) + (evil-ex-search-goto-offset offset) + ;; update highlights + (when evil-ex-search-highlight-all + (evil-ex-hl-change 'evil-ex-search pattern))) + (t + ;; no match + (when evil-ex-search-overlay + ;; remove overlay + (delete-overlay evil-ex-search-overlay) + (setq evil-ex-search-overlay nil)) + ;; no highlights + (when evil-ex-search-highlight-all + (evil-ex-hl-change 'evil-ex-search nil)) + ;; and go to initial position + (goto-char evil-ex-search-start-point))) + (when (stringp message) + (evil-ex-echo "%s" message)))) + +(defun evil-ex-search-start-session () + "Initialize Ex for interactive search." + (remove-hook 'minibuffer-setup-hook #'evil-ex-search-start-session) + (add-hook 'after-change-functions #'evil-ex-search-update-pattern nil t) + (add-hook 'minibuffer-exit-hook #'evil-ex-search-stop-session) + (evil-ex-search-activate-highlight nil)) +(put 'evil-ex-search-start-session 'permanent-local-hook t) + +(defun evil-ex-search-stop-session () + "Stop interactive search." + (with-current-buffer evil-ex-current-buffer + ;; TODO: This is a bad fix to remove duplicates. The duplicates + ;; exist because `isearch-range-invisible' may add a single + ;; overlay multiple times if we are in an unlucky situation + ;; of overlapping overlays. This happens in our case because + ;; of the overlays that are used for (lazy) highlighting. + ;; Perhaps it would be better to disable those overlays + ;; temporarily before calling `isearch-range-invisible'. + (setq isearch-opened-overlays (delete-dups isearch-opened-overlays)) + (isearch-clean-overlays)) + (remove-hook 'minibuffer-exit-hook #'evil-ex-search-stop-session) + (remove-hook 'after-change-functions #'evil-ex-search-update-pattern t) + (when evil-ex-search-overlay + (delete-overlay evil-ex-search-overlay) + (setq evil-ex-search-overlay nil))) +(put 'evil-ex-search-stop-session 'permanent-local-hook t) + +(defun evil-ex-split-search-pattern (pattern direction) + "Split PATTERN in regexp, offset and next-pattern parts. +Returns a triple (regexp offset next-search)." + (save-match-data + (if (or (and (eq direction 'forward) + (string-match "\\(?:^\\|[^\\\\]\\)\\(?:\\\\\\\\\\)*\\(/\\([^;]*\\)\\(?:;\\([/?].*\\)?\\)?\\)?$" + pattern)) + (and (eq direction 'backward) + (string-match "\\(?:^\\|[^\\\\]\\)\\(?:\\\\\\\\\\)*\\(\\?\\([^;]*\\)\\(?:;\\([/?].*\\)?\\)?\\)?$" + pattern))) + (list (substring pattern 0 (match-beginning 1)) + (match-string 2 pattern) + (match-string 3 pattern)) + (list pattern nil nil)))) + +(defun evil-ex-search-full-pattern (pattern-string count direction) + "Search for a full search pattern PATTERN-STRING in DIRECTION. +This function split PATTERN-STRING in +pattern/offset/;next-pattern parts and performs the search in +DIRECTION which must be either 'forward or 'backward. The first +search is repeated COUNT times. If the pattern part of +PATTERN-STRING is empty, the last global pattern stored in +`evil-ex-search-pattern' is used instead if in addition the +offset part is nil (i.e. no pattern/offset separator), the last +global offset stored in `evil-ex-search-offset' is used as +offset. The current match data will correspond to the last +successful match. This function returns a triple (RESULT PATTERN +OFFSET) where RESULT is + + t the search has been successful without wrap + 'wrap the search has been successful with wrap + 'empty-pattern the last pattern has been empty + nil the search has not been successful + +and PATTERN and OFFSET are the last pattern and offset this +function searched for. Note that this function does not handle +any error conditions." + (setq count (or count 1)) + (catch 'done + (while t + (let* ((res (evil-ex-split-search-pattern pattern-string direction)) + (pat (pop res)) + (offset (pop res)) + (next-pat (pop res))) + ;; use last pattern if no new pattern has been specified + (if (not (zerop (length pat))) + (setq pat (evil-ex-make-search-pattern pat)) + (setq pat evil-ex-search-pattern + offset (or offset evil-ex-search-offset))) + (when (zerop (length pat)) + (throw 'done (list 'empty-pattern pat offset))) + (let (search-result) + (while (> count 0) + (let ((result (evil-ex-find-next pat direction + (not evil-search-wrap)))) + (if (not result) (setq search-result nil count 0) + (setq search-result + (if (or (eq result 'wrap) + (eq search-result 'wrap)) + 'wrap t) + count (1- count))))) + (cond + ;; search failed + ((not search-result) (throw 'done (list nil pat offset))) + ;; no next pattern, search complete + ((zerop (length next-pat)) + (evil-ex-search-goto-offset offset) + (throw 'done (list search-result pat offset))) + ;; next pattern but empty + ((= 1 (length next-pat)) + (evil-ex-search-goto-offset offset) + (throw 'done (list 'empty-pattern pat offset))) + ;; next non-empty pattern, next search iteration + (t + (evil-ex-search-goto-offset offset) + (setq count 1 + pattern-string (substring next-pat 1) + direction (if (= (aref next-pat 0) ?/) + 'forward + 'backward))))))))) + +(defun evil-ex-search-update-pattern (_beg _end _range) + "Update the current search pattern." + (save-match-data + (let ((pattern-string (minibuffer-contents))) + (with-current-buffer evil-ex-current-buffer + (with-selected-window (minibuffer-selected-window) + (goto-char (1+ evil-ex-search-start-point)) + (condition-case err + (let* ((result (evil-ex-search-full-pattern pattern-string + (or evil-ex-search-count 1) + evil-ex-search-direction)) + (success (pop result)) + (pattern (pop result)) + (offset (pop result))) + (cond + ((eq success 'wrap) + (evil-ex-search-update pattern offset + (match-beginning 0) (match-end 0) + "Wrapped")) + ((eq success 'empty-pattern) + (evil-ex-search-update nil nil nil nil nil)) + (success + (evil-ex-search-update pattern offset + (match-beginning 0) (match-end 0) + nil)) + (t + (evil-ex-search-update nil nil + nil nil + "search failed")))) + (invalid-regexp + (evil-ex-search-update nil nil nil nil (cadr err))) + (error + (evil-ex-search-update nil nil nil nil (format "%s" err))))))))) +(put 'evil-ex-search-update-pattern 'permanent-local-hook t) + +(defun evil-ex-search-exit () + "Exit interactive search, keeping lazy highlighting active." + (interactive) + (evil-ex-search-stop-session) + (exit-minibuffer)) + +(defun evil-ex-search-abort () + "Abort interactive search, disabling lazy highlighting." + (interactive) + (evil-ex-search-stop-session) + (evil-ex-delete-hl 'evil-ex-search) + (abort-recursive-edit)) + +(defun evil-ex-search-goto-offset (offset) + "Move point according to search OFFSET and set `evil-this-type' accordingly. +This function assumes that the current match data represents the +current search result." + (unless (zerop (length offset)) + (let ((beg (match-beginning 0)) + (end (match-end 0))) + (save-match-data + (unless + (string-match + "^\\([esb]\\)?\\(\\([-+]\\)?\\([0-9]*\\)\\)$" + offset) + (user-error "Invalid search offset: %s" offset)) + (let ((count (if (= (match-beginning 4) (match-end 4)) + (cond + ((not (match-beginning 3)) 0) + ((= (aref offset (match-beginning 3)) ?+) +1) + (t -1)) + (string-to-number (match-string 2 offset))))) + (cond + ((not (match-beginning 1)) + (setq evil-this-type 'line) + (forward-line count)) + ((= (aref offset (match-beginning 1)) ?e) + (goto-char (+ end count -1)) + (setq evil-this-type 'inclusive)) + ((memq (aref offset (match-beginning 1)) '(?s ?b)) + (goto-char (+ beg count)) + (setq evil-this-type 'inclusive)))))))) + +(defun evil-ex-search-setup () + "Hook to initialize the minibuffer for ex search." + (add-hook 'pre-command-hook #'evil-ex-remove-default)) + +(defun evil-ex-start-search (direction count) + "Start a new search in a certain DIRECTION." + ;; store buffer and window where the search started + (let ((evil-ex-current-buffer (current-buffer))) + (setq evil-ex-search-count count + evil-ex-search-direction direction + evil-ex-search-start-point (point) + evil-ex-last-was-search t) + (progn + ;; ensure minibuffer is initialized accordingly + (add-hook 'minibuffer-setup-hook #'evil-ex-search-start-session) + ;; read the search string + (let* ((minibuffer-local-map evil-ex-search-keymap) + (search-string + (condition-case err + (minibuffer-with-setup-hook + #'evil-ex-search-setup + (read-string (if (eq evil-ex-search-direction 'forward) + "/" "?") + (and evil-ex-search-history + (propertize + (car evil-ex-search-history) + 'face 'shadow)) + 'evil-ex-search-history)) + (quit + (evil-ex-search-stop-session) + (evil-ex-delete-hl 'evil-ex-search) + (goto-char evil-ex-search-start-point) + (signal (car err) (cdr err)))))) + ;; pattern entered successful + (goto-char (if (eq evil-ex-search-direction 'forward) + (1+ evil-ex-search-start-point) + (1- evil-ex-search-start-point))) + (let* ((result + (evil-ex-search-full-pattern search-string + evil-ex-search-count + evil-ex-search-direction)) + (success (pop result)) + (pattern (pop result)) + (offset (pop result))) + (setq evil-ex-search-pattern pattern + evil-ex-search-offset offset) + (cond + ((memq success '(t wrap)) + (goto-char (match-beginning 0)) + (setq evil-ex-search-match-beg (match-beginning 0) + evil-ex-search-match-end (match-end 0)) + (evil-ex-search-goto-offset offset) + (evil-push-search-history search-string (eq direction 'forward)) + (unless evil-ex-search-persistent-highlight + (evil-ex-delete-hl 'evil-ex-search))) + (t + (goto-char evil-ex-search-start-point) + (evil-ex-delete-hl 'evil-ex-search) + (signal 'search-failed (list search-string))))))))) + +(defun evil-ex-start-word-search (unbounded direction count &optional symbol) + "Search for the symbol under point. +The search matches the COUNT-th occurrence of the word. If the +UNBOUNDED argument is nil, the search matches only at symbol +boundaries, otherwise it matches anywhere. The DIRECTION +argument should be either `forward' or `backward', determining +the search direction. If SYMBOL is non-nil then the functions +searches for the symbol at point, otherwise for the word at +point." + (let ((string (evil-find-thing (eq direction 'forward) + (if symbol 'symbol 'word)))) + (if (null string) + (user-error "No word under point") + (let ((regex (if unbounded + (regexp-quote string) + (format (if symbol "\\_<%s\\_>" "\\<%s\\>") + (regexp-quote string))))) + (setq evil-ex-search-count count + evil-ex-search-direction direction + evil-ex-search-pattern + (evil-ex-make-search-pattern regex) + evil-ex-search-offset nil + evil-ex-last-was-search t) + ;; update search history unless this pattern equals the + ;; previous pattern + (unless (equal (car-safe evil-ex-search-history) regex) + (push regex evil-ex-search-history)) + (evil-push-search-history regex (eq direction 'forward))) + (evil-ex-delete-hl 'evil-ex-search) + (when (fboundp 'evil-ex-search-next) + (evil-ex-search-next count))))) + +;; substitute +(evil-ex-define-argument-type substitution + "A substitution pattern argument /pattern/replacement/flags. +This handler highlights the pattern of the current substitution." + :runner + (lambda (flag &optional arg) + (with-selected-window (minibuffer-selected-window) + (with-current-buffer evil-ex-current-buffer + (cond + ((eq flag 'start) + (evil-ex-make-hl + 'evil-ex-substitute + :face 'evil-ex-substitute-matches + :update-hook #'evil-ex-pattern-update-ex-info + :match-hook (and evil-ex-substitute-interactive-replace + #'evil-ex-pattern-update-replacement)) + (setq flag 'update)) + + ((eq flag 'stop) + (evil-ex-delete-hl 'evil-ex-substitute)))) + + (when (and (eq flag 'update) + evil-ex-substitute-highlight-all + (not (zerop (length arg)))) + (condition-case lossage + (let* ((result (evil-ex-get-substitute-info arg t)) + (pattern (pop result)) + (replacement (pop result)) + (range (or (evil-copy-range evil-ex-range) + (evil-range (line-beginning-position) + (line-end-position) + 'line + :expanded t)))) + (setq evil-ex-substitute-current-replacement replacement) + (evil-expand-range range) + (evil-ex-hl-set-region 'evil-ex-substitute + (evil-range-beginning range) + (evil-range-end range)) + (evil-ex-hl-change 'evil-ex-substitute pattern)) + (end-of-file + (evil-ex-pattern-update-ex-info nil + "incomplete replacement")) + (user-error + (evil-ex-pattern-update-ex-info nil + (format "%s" lossage)))))))) + +(defun evil-ex-pattern-update-ex-info (_hl result) + "Update the Ex info string." + (when (stringp result) + (evil-ex-echo "%s" result))) + +(defun evil-ex-pattern-update-replacement (_hl overlay) + "Update the replacement display." + (when (fboundp 'match-substitute-replacement) + (let ((fixedcase (not case-replace)) + repl) + (setq repl (if evil-ex-substitute-current-replacement + (evil-match-substitute-replacement + evil-ex-substitute-current-replacement + fixedcase) + "")) + (put-text-property 0 (length repl) + 'face 'evil-ex-substitute-replacement + repl) + (overlay-put overlay 'after-string repl)))) + +(defun evil-ex-parse-global (string) + "Parse STRING as a global argument." + (let* ((pattern (nth 0 (evil-delimited-arguments string 2))) + (command (and pattern + (>= (- (length string) (length pattern)) 2) + (substring string (+ (length pattern) 2))))) + ;; use last pattern if none given + (when (zerop (length pattern)) + (setq pattern + (cond + ((and (eq evil-search-module 'evil-search) evil-ex-search-pattern) + (evil-ex-pattern-regex evil-ex-search-pattern)) + ((and (eq evil-search-module 'isearch) (not (zerop (length isearch-string)))) + isearch-string) + (t (user-error "No previous pattern"))))) + (list pattern command))) + +(defun evil-ex-get-substitute-info (string &optional implicit-r) + "Returns the substitution info of command line STRING. +This function returns a three-element list \(PATTERN REPLACEMENT +FLAGS) consisting of the substitution parts of STRING. PATTERN is +a ex-pattern (see `evil-ex-make-pattern') and REPLACEMENT in a +compiled replacement expression (see `evil-compile-replacement'). +The information returned is the actual substitution information +w.r.t. to special situations like empty patterns or repetition of +previous substitution commands. If IMPLICIT-R is non-nil, then +the flag 'r' is assumed, i.e. in the case of an empty pattern the +last search pattern is used. This will be used when called from +a :substitute command with arguments." + (let (pattern replacement flags) + (cond + ((or (null string) (string-match "^[a-zA-Z]" string)) + ;; starts with letter so there is no pattern because the + ;; separator must not be a letter repeat last substitute + (setq replacement evil-ex-substitute-replacement) + ;; flags are everything that is not a white space + (when (and string (string-match "[^[:space:]]+" string)) + (setq flags (match-string 0 string)))) + (t + (let ((args (evil-delimited-arguments string 3))) + (setq pattern (pop args) + replacement (pop args) + flags (pop args)) + ;; if replacment equals "~" use previous replacement + (if (equal replacement "~") + (setq replacement evil-ex-substitute-replacement) + (setq replacement (evil-compile-replacement replacement))) + ;; append implicit "r" flag if required + (when (and implicit-r (not (memq ?r (append flags nil)))) + (setq flags (concat flags "r")))))) + ;; if flags equals "&" add previous flags + (if (and (not (zerop (length flags))) + (= (aref flags 0) ?&)) + (setq flags (append (substring flags 1) + evil-ex-substitute-flags)) + (setq flags (append flags nil))) + ;; if no pattern, use previous pattern, either search or + ;; substitute pattern depending on `evil-ex-last-was-search' and + ;; the r flag + (when (zerop (length pattern)) + (setq pattern + (if (eq evil-search-module 'evil-search) + (if (and evil-ex-last-was-search (memq ?r flags)) + (and evil-ex-search-pattern + (evil-ex-pattern-regex evil-ex-search-pattern)) + (and evil-ex-substitute-pattern + (evil-ex-pattern-regex evil-ex-substitute-pattern))) + (if (eq case-fold-search t) + isearch-string + (concat isearch-string "\\C"))) + flags (remq ?r flags))) + ;; generate pattern + (when pattern + (setq pattern (evil-ex-make-substitute-pattern pattern flags))) + (list pattern replacement flags))) + +(defun evil-ex-nohighlight () + "Disable the active search highlightings." + (interactive) + (evil-ex-delete-hl 'evil-ex-substitute) + (evil-ex-delete-hl 'evil-ex-search)) + +(provide 'evil-search) + +;;; evil-search.el ends here diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-search.elc b/.emacs.d/elpa/evil-20210527.2107/evil-search.elc new file mode 100644 index 0000000..0588b7e Binary files /dev/null and b/.emacs.d/elpa/evil-20210527.2107/evil-search.elc differ diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-states.el b/.emacs.d/elpa/evil-20210527.2107/evil-states.el new file mode 100644 index 0000000..68b2726 --- /dev/null +++ b/.emacs.d/elpa/evil-20210527.2107/evil-states.el @@ -0,0 +1,924 @@ +;;; evil-states.el --- States -*- lexical-binding: t -*- + +;; Author: Vegard Øye <vegard_oye at hotmail.com> +;; Maintainer: Vegard Øye <vegard_oye at hotmail.com> + +;; Version: 1.14.0 + +;; +;; This file is NOT part of GNU Emacs. + +;;; License: + +;; This file is part of Evil. +;; +;; Evil is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; Evil is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with Evil. If not, see <http://www.gnu.org/licenses/>. + +(require 'evil-core) + +;;; Code: + +;;; Normal state + +(evil-define-state normal + "Normal state. +AKA \"Command\" state." + :tag " <N> " + :enable (motion) + :exit-hook (evil-repeat-start-hook) + (cond + ((evil-normal-state-p) + (overwrite-mode -1) + (add-hook 'post-command-hook #'evil-normal-post-command nil t)) + (t + (remove-hook 'post-command-hook #'evil-normal-post-command t)))) + +(defun evil-normal-post-command (&optional command) + "Reset command loop variables in Normal state. +Also prevent point from reaching the end of the line. +If the region is activated, enter Visual state." + (unless (or (evil-initializing-p) + (null this-command)) + (setq command (or command this-command)) + (when (evil-normal-state-p) + (setq evil-this-type nil + evil-this-operator nil + evil-this-motion nil + evil-this-motion-count nil + evil-inhibit-operator nil + evil-inhibit-operator-value nil) + (unless (memq command '(evil-use-register + digit-argument + negative-argument + universal-argument + universal-argument-minus + universal-argument-more + universal-argument-other-key)) + (setq evil-this-register nil)) + (evil-adjust-cursor)))) +(put 'evil-normal-post-command 'permanent-local-hook t) + +;;; Insert state + +(defun evil-maybe-remove-spaces (&optional do-remove) + "Remove space from newly opened empty line. +This function removes (indentation) spaces that have been +inserted by opening a new empty line. The behavior depends on the +variable `evil-maybe-remove-spaces'. If this variable is nil the +function does nothing. Otherwise the behavior depends on +DO-REMOVE. If DO-REMOVE is non-nil the spaces are +removed. Otherwise `evil-maybe-remove-spaces' is set to nil +unless the last command opened yet another new line. + +This function should be added as a post-command-hook to track +commands opening a new line." + (cond + ((not evil-maybe-remove-spaces) + (remove-hook 'post-command-hook #'evil-maybe-remove-spaces)) + (do-remove + (when (save-excursion + (beginning-of-line) + (looking-at "^\\s-*$")) + (delete-region (line-beginning-position) + (line-end-position))) + (setq evil-maybe-remove-spaces nil) + (remove-hook 'post-command-hook #'evil-maybe-remove-spaces)) + ((not (memq this-command + '(evil-open-above + evil-open-below + evil-append + evil-append-line + newline + newline-and-indent + indent-and-newline))) + (setq evil-maybe-remove-spaces nil) + (remove-hook 'post-command-hook #'evil-maybe-remove-spaces)))) + +(evil-define-state insert + "Insert state." + :tag " <I> " + :cursor (bar . 2) + :message "-- INSERT --" + :entry-hook (evil-start-track-last-insertion) + :exit-hook (evil-cleanup-insert-state evil-stop-track-last-insertion) + :input-method t + (cond + ((evil-insert-state-p) + (add-hook 'post-command-hook #'evil-maybe-remove-spaces) + (add-hook 'pre-command-hook #'evil-insert-repeat-hook) + (setq evil-maybe-remove-spaces t) + (unless (eq evil-want-fine-undo t) + (evil-start-undo-step))) + (t + (remove-hook 'post-command-hook #'evil-maybe-remove-spaces) + (remove-hook 'pre-command-hook #'evil-insert-repeat-hook) + (evil-maybe-remove-spaces t) + (setq evil-insert-repeat-info evil-repeat-info) + (evil-set-marker ?^ nil t) + (unless (eq evil-want-fine-undo t) + (evil-end-undo-step)) + (when (or (evil-normal-state-p evil-next-state) + (evil-motion-state-p evil-next-state)) + (evil-move-cursor-back + (and (eolp) (not evil-move-beyond-eol))))))) + +(defun evil-insert-repeat-hook () + "Record insertion keys in `evil-insert-repeat-info'." + (setq evil-insert-repeat-info (last evil-repeat-info)) + (remove-hook 'pre-command-hook #'evil-insert-repeat-hook)) +(put 'evil-insert-repeat-hook 'permanent-local-hook t) + +(defun evil-cleanup-insert-state () + "Called when Insert state is about to be exited. +Handles the repeat-count of the insertion command." + (when evil-insert-count + (dotimes (_ (1- evil-insert-count)) + (when evil-insert-lines + (evil-insert-newline-below) + (when evil-auto-indent + (indent-according-to-mode))) + (when (fboundp 'evil-execute-repeat-info) + (evil-execute-repeat-info + (cdr evil-insert-repeat-info))))) + (when evil-insert-vcount + (let ((buffer-invisibility-spec buffer-invisibility-spec)) + ;; make all lines hidden by hideshow temporarily visible + (when (listp buffer-invisibility-spec) + (setq buffer-invisibility-spec + (evil-filter-list + #'(lambda (x) + (or (eq x 'hs) + (eq (car-safe x) 'hs))) + buffer-invisibility-spec))) + (let ((line (nth 0 evil-insert-vcount)) + (col (nth 1 evil-insert-vcount)) + (vcount (nth 2 evil-insert-vcount))) + (save-excursion + (dotimes (v (1- vcount)) + (goto-char (point-min)) + (forward-line (+ line v)) + (when (or (not evil-insert-skip-empty-lines) + (not (integerp col)) + (save-excursion + (evil-move-end-of-line) + (>= (current-column) col))) + (if (integerp col) + (move-to-column col t) + (funcall col)) + (dotimes (_ (or evil-insert-count 1)) + (when (fboundp 'evil-execute-repeat-info) + (evil-execute-repeat-info + (cdr evil-insert-repeat-info))))))))))) + +;;; Visual state + +;; Visual selections are implemented in terms of types, and are +;; compatible with the Emacs region. This is achieved by "translating" +;; the region to the selected text right before a command is executed. +;; If the command is a motion, the translation is postponed until a +;; non-motion command is invoked (distinguished by the :keep-visual +;; command property). +;; +;; Visual state activates the region, enabling Transient Mark mode if +;; not already enabled. This is only temporay: if Transient Mark mode +;; was disabled before entering Visual state, it is disabled when +;; exiting Visual state. This allows Visual state to harness the +;; "transient" behavior of many commands without overriding the user's +;; preferences in other states. + +(defmacro evil-define-visual-selection (selection doc &rest body) + "Define a Visual selection SELECTION. +Creates a command evil-visual-SELECTION for enabling the selection. +DOC is the function's documentation string. The following keywords +may be specified in BODY: + +:message STRING Status message when enabling the selection. +:type TYPE Type to use (defaults to SELECTION). + +Following the keywords is optional code which is executed each time +the selection is enabled. + +\(fn SELECTION DOC [[KEY VAL]...] BODY...)" + (declare (indent defun) + (doc-string 2) + (debug (&define name stringp + [&rest keywordp sexp] + def-body))) + (let* ((name (intern (format "evil-visual-%s" selection))) + (message (intern (format "%s-message" name))) + (tagvar (intern (format "%s-tag" name))) + (type selection) + (tag " <V> ") + arg key string) + ;; collect keywords + (while (keywordp (car-safe body)) + (setq key (pop body) + arg (pop body)) + (cond + ((eq key :message) + (setq string arg)) + ((eq key :type) + (setq type arg)) + ((eq key :tag) + (setq tag arg)))) + ;; macro expansion + `(progn + (add-to-list 'evil-visual-alist (cons ',selection ',name)) + (defvar ,name ',type ,(format "*%s" doc)) + (defvar ,message ,string ,doc) + (defvar ,tagvar ,tag ,doc) + (evil-define-command ,name (&optional mark point type message) + ,@(when doc `(,doc)) + :keep-visual t + :repeat nil + (interactive + (list nil nil + (if (and (evil-visual-state-p) + (eq evil-visual-selection ',selection)) + 'exit ,name) t)) + (if (eq type 'exit) + (evil-exit-visual-state) + (setq type (or type ,name) + evil-visual-selection ',selection) + (evil-visual-make-region mark point type message) + ,@body)) + ',selection))) + +(evil-define-visual-selection char + "Characterwise selection." + :type inclusive + :message "-- VISUAL --" + :tag " <V> ") + +(evil-define-visual-selection line + "Linewise selection." + :message "-- VISUAL LINE --" + :tag " <Vl> ") + +(evil-define-visual-selection screen-line + "Linewise selection in `visual-line-mode'." + :message "-- SCREEN LINE --" + :tag " <Vs> ") + +(evil-define-visual-selection block + "Blockwise selection." + :message "-- VISUAL BLOCK --" + :tag " <Vb> " + (evil-transient-mark -1) + ;; refresh the :corner property + (setq evil-visual-properties + (plist-put evil-visual-properties :corner + (evil-visual-block-corner 'upper-left)))) + +(evil-define-state visual + "Visual state." + :tag 'evil-visual-tag + :enable (motion normal) + :message 'evil-visual-message + (cond + ((evil-visual-state-p) + (evil-save-transient-mark-mode) + (setq select-active-regions nil) + (cond + ((region-active-p) + (if (< (evil-visual-direction) 0) + (evil-visual-select (region-beginning) (region-end) + evil-visual-char + (evil-visual-direction)) + (evil-visual-make-selection (mark t) (point) + evil-visual-char)) + (evil-visual-highlight)) + (t + (evil-visual-make-region (point) (point) evil-visual-char))) + (add-hook 'pre-command-hook #'evil-visual-pre-command nil t) + (add-hook 'post-command-hook #'evil-visual-post-command nil t) + (add-hook 'deactivate-mark-hook #'evil-visual-deactivate-hook nil t)) + (t + ;; Postpone deactivation of region if next state is Insert. + ;; This gives certain insertion commands (auto-pairing characters, + ;; for example) an opportunity to access the region. + (if (and (eq evil-next-state 'insert) + (eq evil-visual-selection 'char)) + (add-hook 'evil-normal-state-entry-hook + #'evil-visual-deactivate-hook nil t) + (evil-visual-deactivate-hook)) + (setq evil-visual-region-expanded nil) + (remove-hook 'pre-command-hook #'evil-visual-pre-command t) + (remove-hook 'post-command-hook #'evil-visual-post-command t) + (remove-hook 'deactivate-mark-hook #'evil-visual-deactivate-hook t) + (evil-visual-highlight -1)))) + +(defun evil-visual-pre-command (&optional command) + "Run before each COMMAND in Visual state. +Expand the region to the selection unless COMMAND is a motion." + (when (evil-visual-state-p) + (setq command (or command this-command)) + (when evil-visual-x-select-timer + (cancel-timer evil-visual-x-select-timer)) + (unless (evil-get-command-property command :keep-visual) + (evil-visual-update-x-selection) + (evil-visual-expand-region + ;; exclude final newline from linewise selection + ;; unless the command has real need of it + (and (eq (evil-visual-type) 'line) + (evil-get-command-property command :exclude-newline)))))) + +(put 'evil-visual-pre-command 'permanent-local-hook t) + +(defun evil-visual-post-command (&optional command) + "Run after each COMMAND in Visual state. +If COMMAND is a motion, refresh the selection; +otherwise exit Visual state." + (when (evil-visual-state-p) + (setq command (or command this-command)) + (if (or quit-flag + (eq command #'keyboard-quit) + ;; Is `mark-active' nil for an unexpanded region? + deactivate-mark + (and (not evil-visual-region-expanded) + (not (region-active-p)) + (not (eq evil-visual-selection 'block)))) + (progn + (evil-exit-visual-state) + (evil-adjust-cursor)) + (if evil-visual-region-expanded + (evil-visual-contract-region) + (evil-visual-refresh)) + (setq evil-visual-x-select-timer + (run-with-idle-timer evil-visual-x-select-timeout nil + #'evil-visual-update-x-selection + (current-buffer))) + (evil-visual-highlight)))) +(put 'evil-visual-post-command 'permanent-local-hook t) + +(defun evil-visual-update-x-selection (&optional buffer) + "Update the X selection with the current visual region." + (let ((buf (or buffer (current-buffer)))) + (when (buffer-live-p buf) + (with-current-buffer buf + (when (and (evil-visual-state-p) + (display-selections-p) + (not (eq evil-visual-selection 'block))) + (evil-set-selection 'PRIMARY (buffer-substring-no-properties + evil-visual-beginning + evil-visual-end))))))) + +(defun evil-visual-activate-hook (&optional _command) + "Enable Visual state if the region is activated." + (unless (evil-visual-state-p) + (evil-delay nil + ;; the activation may only be momentary, so re-check + ;; in `post-command-hook' before entering Visual state + '(unless (or (evil-visual-state-p) + (evil-insert-state-p) + (evil-emacs-state-p)) + (when (and (region-active-p) + (not deactivate-mark)) + (evil-visual-state))) + 'post-command-hook nil t + "evil-activate-visual-state"))) +(put 'evil-visual-activate-hook 'permanent-local-hook t) + +(defun evil-visual-deactivate-hook (&optional command) + "Deactivate the region and restore Transient Mark mode." + (setq command (or command this-command)) + (remove-hook 'deactivate-mark-hook + #'evil-visual-deactivate-hook t) + (remove-hook 'evil-normal-state-entry-hook + #'evil-visual-deactivate-hook t) + (cond + ((and (evil-visual-state-p) command + (not (evil-get-command-property command :keep-visual))) + (setq evil-visual-region-expanded nil) + (evil-exit-visual-state)) + ((not (evil-visual-state-p)) + (evil-active-region -1) + (evil-restore-transient-mark-mode)))) +(put 'evil-visual-deactivate-hook 'permanent-local-hook t) + +(evil-define-command evil-exit-visual-state (&optional later buffer) + "Exit from Visual state to the previous state. +If LATER is non-nil, exit after the current command." + :keep-visual t + :repeat abort + (with-current-buffer (or buffer (current-buffer)) + (when (evil-visual-state-p) + (if later + (setq deactivate-mark t) + (when evil-visual-region-expanded + (evil-visual-contract-region)) + (evil-change-to-previous-state))))) + +(defun evil-visual-tag (&optional selection) + "Return a mode-line tag for SELECTION. +SELECTION is a kind of selection as defined by +`evil-define-visual-selection', such as `char', `line' +or `block'." + (setq selection (or selection evil-visual-selection)) + (when selection + (symbol-value (intern (format "evil-visual-%s-tag" selection))))) + +(defun evil-visual-message (&optional selection) + "Create an echo area message for SELECTION. +SELECTION is a kind of selection as defined by +`evil-define-visual-selection', such as `char', `line' +or `block'." + (let (message) + (setq selection (or selection evil-visual-selection)) + (when selection + (setq message + (symbol-value (intern (format "evil-visual-%s-message" + selection)))) + (cond + ((functionp message) + (funcall message)) + ((stringp message) + (evil-echo "%s" message)))))) + +(defun evil-visual-select (beg end &optional type dir message) + "Create a Visual selection of type TYPE from BEG to END. +Point and mark are positioned so that the resulting selection +has the specified boundaries. If DIR is negative, point precedes mark, +otherwise it succedes it. To specify point and mark directly, +use `evil-visual-make-selection'." + (let* ((range (evil-contract beg end type)) + (mark (evil-range-beginning range)) + (point (evil-range-end range)) + (dir (or dir 1))) + (when (< dir 0) + (evil-swap mark point)) + (evil-visual-make-selection mark point type message))) + +(defun evil-visual-make-selection (mark point &optional type message) + "Create a Visual selection with point at POINT and mark at MARK. +The boundaries of the selection are inferred from these +and the current TYPE. To specify the boundaries and infer +mark and point, use `evil-visual-select' instead." + (let* ((selection (evil-visual-selection-for-type type)) + (func (evil-visual-selection-function selection)) + (prev (and (evil-visual-state-p) evil-visual-selection)) + (mark (evil-normalize-position mark)) + (point (evil-normalize-position point)) + (state evil-state)) + (unless (evil-visual-state-p) + (evil-visual-state)) + (setq evil-visual-selection selection) + (funcall func mark point type + ;; signal a message when changing the selection + (when (or (not (evil-visual-state-p state)) + (not (eq selection prev))) + message)))) + +(defun evil-visual-make-region (mark point &optional type message) + "Create an active region from MARK to POINT. +If TYPE is given, also set the Visual type. +If MESSAGE is given, display it in the echo area." + (interactive) + (let* ((point (evil-normalize-position + (or point (point)))) + (mark (evil-normalize-position + (or mark + (when (or (evil-visual-state-p) + (region-active-p)) + (mark t)) + point)))) + (unless (evil-visual-state-p) + (evil-visual-state)) + (evil-active-region 1) + (setq evil-visual-region-expanded nil) + (evil-visual-refresh mark point type) + (cond + ((null evil-echo-state)) + ((stringp message) + (evil-echo "%s" message)) + (message + (cond + ((stringp evil-visual-state-message) + (evil-echo "%s" evil-visual-state-message)) + ((functionp evil-visual-state-message) + (funcall evil-visual-state-message))))))) + +(defun evil-visual-expand-region (&optional exclude-newline) + "Expand the region to the Visual selection. +If EXCLUDE-NEWLINE is non-nil and the selection ends with a newline, +exclude that newline from the region." + (when (and (evil-visual-state-p) + (not evil-visual-region-expanded)) + (let ((mark evil-visual-beginning) + (point evil-visual-end)) + (when (< evil-visual-direction 0) + (evil-swap mark point)) + (setq evil-visual-region-expanded t) + (evil-visual-refresh mark point) + (when (and exclude-newline + (save-excursion + (goto-char evil-visual-end) + (and (bolp) (not (bobp))))) + (if (< evil-visual-direction 0) + (evil-move-mark (max point (1- (mark)))) + (goto-char (max mark (1- (point))))))))) + +(defun evil-visual-contract-region () + "The inverse of `evil-visual-expand-region'. +Create a Visual selection that expands to the current region." + (evil-visual-refresh) + (setq evil-visual-region-expanded nil) + (evil-visual-refresh evil-visual-mark evil-visual-point)) + +(defun evil-visual-refresh (&optional mark point type &rest properties) + "Refresh point, mark and Visual variables. +Refreshes `evil-visual-beginning', `evil-visual-end', +`evil-visual-mark', `evil-visual-point', `evil-visual-selection', +`evil-visual-direction', `evil-visual-properties' and `evil-this-type'." + (let* ((point (or point (point))) + (mark (or mark (mark t) point)) + (dir (evil-visual-direction)) + (type (or type (evil-visual-type evil-visual-selection) + (evil-visual-type))) + range) + (evil-move-mark mark) + (goto-char point) + (setq evil-visual-beginning + (or evil-visual-beginning + (let ((marker (make-marker))) + (move-marker marker (min point mark)))) + evil-visual-end + (or evil-visual-end + (let ((marker (make-marker))) + (set-marker-insertion-type marker t) + (move-marker marker (max point mark)))) + evil-visual-mark + (or evil-visual-mark + (let ((marker (make-marker))) + (move-marker marker mark))) + evil-visual-point + (or evil-visual-point + (let ((marker (make-marker))) + (move-marker marker point)))) + (setq evil-visual-properties + (evil-concat-plists evil-visual-properties properties)) + (cond + (evil-visual-region-expanded + (setq type (or (evil-visual-type) type)) + (move-marker evil-visual-beginning (min point mark)) + (move-marker evil-visual-end (max point mark)) + ;; if the type is one-to-one, we can safely refresh + ;; the unexpanded positions as well + (when (evil-type-property type :one-to-one) + (setq range (apply #'evil-contract point mark type + evil-visual-properties) + mark (evil-range-beginning range) + point (evil-range-end range)) + (when (< dir 0) + (evil-swap mark point)) + (move-marker evil-visual-mark mark) + (move-marker evil-visual-point point))) + (t + (setq range (apply #'evil-expand point mark type + evil-visual-properties) + type (evil-type range type)) + (move-marker evil-visual-beginning (evil-range-beginning range)) + (move-marker evil-visual-end (evil-range-end range)) + (move-marker evil-visual-mark mark) + (move-marker evil-visual-point point))) + (setq evil-visual-direction dir + evil-this-type type))) + +(defun evil-visual-highlight (&optional arg) + "Highlight Visual selection, depending on the Visual type. +With negative ARG, disable highlighting." + (cond + ((and (numberp arg) (< arg 1)) + (when evil-visual-overlay + (delete-overlay evil-visual-overlay) + (setq evil-visual-overlay nil)) + (when evil-visual-block-overlays + (mapc #'delete-overlay evil-visual-block-overlays) + (setq evil-visual-block-overlays nil))) + ((eq evil-visual-selection 'block) + (when evil-visual-overlay + (evil-visual-highlight -1)) + (evil-visual-highlight-block + evil-visual-beginning + evil-visual-end)) + (t + (when evil-visual-block-overlays + (evil-visual-highlight -1)) + (if evil-visual-overlay + (move-overlay evil-visual-overlay + evil-visual-beginning evil-visual-end) + (setq evil-visual-overlay + (make-overlay evil-visual-beginning evil-visual-end))) + (overlay-put evil-visual-overlay 'face 'region) + (overlay-put evil-visual-overlay 'priority 99)))) + +(defun evil-visual-highlight-block (beg end &optional overlays) + "Highlight rectangular region from BEG to END. +Do this by putting an overlay on each line within the rectangle. +Each overlay extends across all the columns of the rectangle. +Reuse overlays where possible to prevent flicker." + (let* ((point (point)) + (overlays (or overlays 'evil-visual-block-overlays)) + (old (symbol-value overlays)) + (eol-col (and (memq this-command '(next-line previous-line)) + (numberp temporary-goal-column) + (1+ (min (round temporary-goal-column) + (1- most-positive-fixnum))))) + beg-col end-col new nlines overlay window-beg window-end) + (save-excursion + ;; calculate the rectangular region represented by BEG and END, + ;; but put BEG in the upper-left corner and END in the + ;; lower-right if not already there + (setq beg-col (evil-column beg) + end-col (evil-column end)) + (when (>= beg-col end-col) + (if (= beg-col end-col) + (setq end-col (1+ end-col)) + (evil-sort beg-col end-col)) + (setq beg (save-excursion + (goto-char beg) + (evil-move-to-column beg-col)) + end (save-excursion + (goto-char end) + (evil-move-to-column end-col 1)))) + ;; update end column with eol-col (extension to eol). + (when (and eol-col (> eol-col end-col)) + (setq end-col eol-col)) + ;; force a redisplay so we can do reliable window + ;; BEG/END calculations + (sit-for 0) + (setq window-beg (max (window-start) beg) + window-end (min (window-end) (1+ end)) + nlines (count-lines window-beg + (min window-end (point-max)))) + ;; iterate over those lines of the rectangle which are + ;; visible in the currently selected window + (goto-char window-beg) + (dotimes (_ nlines) + (let (before after row-beg row-end) + ;; beginning of row + (evil-move-to-column beg-col) + (when (< (current-column) beg-col) + ;; prepend overlay with virtual spaces if unable to + ;; move directly to the first column + (setq before + (propertize + (make-string + (- beg-col (current-column)) ?\s) + 'face + (or (get-text-property (1- (point)) 'face) + 'default)))) + (setq row-beg (point)) + ;; end of row + (evil-move-to-column end-col) + (when (and (not (eolp)) + (< (current-column) end-col)) + ;; append overlay with virtual spaces if unable to + ;; move directly to the last column + (setq after + (propertize + (make-string + (if (= (point) row-beg) + (- end-col beg-col) + (- end-col (current-column))) + ?\s) 'face 'region)) + ;; place cursor on one of the virtual spaces + (if (= point row-beg) + (put-text-property + 0 (min (length after) 1) + 'cursor t after) + (put-text-property + (max 0 (1- (length after))) (length after) + 'cursor t after))) + (setq row-end (min (point) (line-end-position))) + ;; trim old leading overlays + (while (and old + (setq overlay (car old)) + (< (overlay-start overlay) row-beg) + (/= (overlay-end overlay) row-end)) + (delete-overlay overlay) + (setq old (cdr old))) + ;; reuse an overlay if possible, otherwise create one + (cond + ((and old (setq overlay (car old)) + (or (= (overlay-start overlay) row-beg) + (= (overlay-end overlay) row-end))) + (move-overlay overlay row-beg row-end) + (overlay-put overlay 'before-string before) + (overlay-put overlay 'after-string after) + (setq new (cons overlay new) + old (cdr old))) + (t + (setq overlay (make-overlay row-beg row-end)) + (overlay-put overlay 'before-string before) + (overlay-put overlay 'after-string after) + (setq new (cons overlay new))))) + (forward-line 1)) + ;; display overlays + (dolist (overlay new) + (overlay-put overlay 'face 'region) + (overlay-put overlay 'priority 99)) + ;; trim old overlays + (dolist (overlay old) + (delete-overlay overlay)) + (set overlays (nreverse new))))) + +(defun evil-visual-range () + "Return the Visual selection as a range. +This is a list (BEG END TYPE PROPERTIES...), where BEG is the +beginning of the selection, END is the end of the selection, +TYPE is the selection's type, and PROPERTIES is a property list +of miscellaneous selection attributes." + (apply #'evil-range + evil-visual-beginning evil-visual-end + (evil-visual-type) + :expanded t + evil-visual-properties)) + +(defun evil-visual-direction () + "Return direction of Visual selection. +The direction is -1 if point precedes mark and 1 otherwise. +See also the variable `evil-visual-direction', which holds +the direction of the last selection." + (let* ((point (point)) + (mark (or (mark t) point))) + (if (< point mark) -1 1))) + +(defun evil-visual-type (&optional selection) + "Return the type of the Visual selection. +If SELECTION is specified, return the type of that instead." + (if (and (null selection) (evil-visual-state-p)) + (or evil-this-type (evil-visual-type evil-visual-selection)) + (setq selection (or selection evil-visual-selection)) + (symbol-value (cdr-safe (assq selection evil-visual-alist))))) + +(defun evil-visual-goto-end () + "Go to the last line of the Visual selection. +This position may differ from `evil-visual-end' depending on +the selection type, and is contained in the selection." + (let ((range (evil-contract-range (evil-visual-range)))) + (goto-char (evil-range-end range)))) + +(defun evil-visual-alist () + "Return an association list from types to selection symbols." + (mapcar #'(lambda (e) + (cons (symbol-value (cdr-safe e)) (cdr-safe e))) + evil-visual-alist)) + +(defun evil-visual-selection-function (selection) + "Return a selection function for TYPE. +Default to `evil-visual-make-region'." + (or (cdr-safe (assq selection evil-visual-alist)) + ;; generic selection function + 'evil-visual-make-region)) + +(defun evil-visual-selection-for-type (type) + "Return a Visual selection for TYPE." + (catch 'done + (dolist (selection evil-visual-alist) + (when (eq (symbol-value (cdr selection)) type) + (throw 'done (car selection)))))) + +(defun evil-visual-block-corner (&optional corner point mark) + "Block corner corresponding to POINT, with MARK in opposite corner. +Depending on POINT and MARK, the return value is `upper-left', +`upper-right', `lower-left' or `lower-right': + + upper-left +---+ upper-right + | | + lower-left +---+ lower-right + +One-column or one-row blocks are ambiguous. In such cases, +the horizontal or vertical component of CORNER is used. +CORNER defaults to `upper-left'." + (let* ((point (or point (point))) + (mark (or mark (mark t))) + (corner (symbol-name + (or corner + (and (overlayp evil-visual-overlay) + (overlay-get evil-visual-overlay + :corner)) + 'upper-left))) + (point-col (evil-column point)) + (mark-col (evil-column mark)) + horizontal vertical) + (cond + ((= point-col mark-col) + (setq horizontal + (or (and (string-match "left\\|right" corner) + (match-string 0 corner)) + "left"))) + ((< point-col mark-col) + (setq horizontal "left")) + ((> point-col mark-col) + (setq horizontal "right"))) + (cond + ((= (line-number-at-pos point) + (line-number-at-pos mark)) + (setq vertical + (or (and (string-match "upper\\|lower" corner) + (match-string 0 corner)) + "upper"))) + ((< point mark) + (setq vertical "upper")) + ((> point mark) + (setq vertical "lower"))) + (intern (format "%s-%s" vertical horizontal)))) + +;;; Operator-Pending state + +(evil-define-state operator + "Operator-Pending state." + :tag " <O> " + :cursor evil-half-cursor + :enable (evil-operator-shortcut-map operator motion normal)) + +(evil-define-keymap evil-operator-shortcut-map + "Keymap for Operator-Pending shortcuts like \"dd\" and \"gqq\"." + :local t + (setq evil-operator-shortcut-map (make-sparse-keymap)) + (evil-initialize-local-keymaps)) + +;; the half-height "Operator-Pending cursor" cannot be specified +;; as a static `cursor-type' value, since its height depends on +;; the current font size +(defun evil-half-cursor () + "Change cursor to a half-height box. +\(This is really just a thick horizontal bar.)" + (let ((height (/ (window-pixel-height) (* (window-height) 2)))) + (setq cursor-type (cons 'hbar height)))) + +;;; Replace state + +(evil-define-state replace + "Replace state." + :tag " <R> " + :cursor hbar + :message "-- REPLACE --" + :input-method t + (cond + ((evil-replace-state-p) + (overwrite-mode 1) + (add-hook 'pre-command-hook #'evil-replace-pre-command nil t) + (unless (eq evil-want-fine-undo t) + (evil-start-undo-step))) + (t + (overwrite-mode -1) + (remove-hook 'pre-command-hook #'evil-replace-pre-command t) + (unless (eq evil-want-fine-undo t) + (evil-end-undo-step)) + (evil-move-cursor-back))) + (setq evil-replace-alist nil)) + +(defun evil-replace-pre-command () + "Remember the character under point." + (when (evil-replace-state-p) + (unless (assq (point) evil-replace-alist) + (add-to-list 'evil-replace-alist + (cons (point) + (unless (eolp) + (char-after))))))) +(put 'evil-replace-pre-command 'permanent-local-hook t) + +(defun evil-replace-backspace () + "Restore character under cursor." + (interactive) + (let (char) + (backward-char) + (when (assq (point) evil-replace-alist) + (setq char (cdr (assq (point) evil-replace-alist))) + (save-excursion + (delete-char 1) + (when char + (insert char)))))) + +;;; Motion state + +(evil-define-state motion + "Motion state." + :tag " <M> " + :suppress-keymap t) + +;;; Emacs state + +(evil-define-state emacs + "Emacs state." + :tag " <E> " + :message "-- EMACS --" + :input-method t + :intercept-esc nil) + +(provide 'evil-states) + +;;; evil-states.el ends here diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-states.elc b/.emacs.d/elpa/evil-20210527.2107/evil-states.elc new file mode 100644 index 0000000..498e175 Binary files /dev/null and b/.emacs.d/elpa/evil-20210527.2107/evil-states.elc differ diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-types.el b/.emacs.d/elpa/evil-20210527.2107/evil-types.el new file mode 100644 index 0000000..fe4972b --- /dev/null +++ b/.emacs.d/elpa/evil-20210527.2107/evil-types.el @@ -0,0 +1,462 @@ +;;; evil-types.el --- Type system -*- lexical-binding: t -*- + +;; Author: Vegard Øye <vegard_oye at hotmail.com> +;; Maintainer: Vegard Øye <vegard_oye at hotmail.com> + +;; Version: 1.14.0 + +;; +;; This file is NOT part of GNU Emacs. + +;;; License: + +;; This file is part of Evil. +;; +;; Evil is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; Evil is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with Evil. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: + +;; A type defines a transformation on a pair of buffer positions. +;; Types are used by Visual state (character/line/block selection) +;; and Operator-Pending state (character/line/block motions). +;; +;; The basic transformation is "expansion". For example, the `line' +;; type "expands" a pair of positions to whole lines by moving the +;; first position to the beginning of the line and the last position +;; to the end of the line. That expanded selection is what the rest +;; of Emacs sees and acts on. +;; +;; An optional transformation is "contraction", which is the opposite +;; of expansion. If the transformation is one-to-one, expansion +;; followed by contraction always returns the original range. +;; (The `line' type is not one-to-one, as it may expand multiple +;; positions to the same lines.) +;; +;; Another optional transformation is "normalization", which takes +;; two unexpanded positions and adjusts them before expansion. +;; This is useful for cleaning up "invalid" positions. +;; +;; Types are defined at the end of this file using the macro +;; `evil-define-type'. + +(require 'evil-common) +(require 'evil-macros) + +;;; Code: + +;;; Type definitions + +(evil-define-type exclusive + "Return the positions unchanged, with some exceptions. +If the end position is at the beginning of a line, then: + +* If the beginning position is at or before the first non-blank + character on the line, return `line' (expanded). + +* Otherwise, move the end position to the end of the previous + line and return `inclusive' (expanded)." + :normalize (lambda (beg end) + (cond + ((progn + (goto-char end) + (and (/= beg end) (bolp))) + (setq end (max beg (1- end))) + (cond + ((progn + (goto-char beg) + (looking-back "^[ \f\t\v]*" (line-beginning-position))) + (evil-expand beg end 'line)) + (t + (unless evil-cross-lines + (setq end (max beg (1- end)))) + (evil-expand beg end 'inclusive)))) + (t + (evil-range beg end)))) + :string (lambda (beg end) + (let ((width (- end beg))) + (format "%s character%s" width + (if (= width 1) "" "s"))))) + +(evil-define-type inclusive + "Include the character under point. +If the end position is at the beginning of a line or the end of a +line and `evil-want-visual-char-semi-exclusive', then: + +* If in visual state return `exclusive' (expanded)." + :expand (lambda (beg end) + (if (and evil-want-visual-char-semi-exclusive + (evil-visual-state-p) + (< beg end) + (save-excursion + (goto-char end) + (or (bolp) (eolp)))) + (evil-range beg end 'exclusive) + (evil-range beg (1+ end)))) + :contract (lambda (beg end) + (evil-range beg (max beg (1- end)))) + :normalize (lambda (beg end) + (goto-char end) + (when (eq (char-after) ?\n) + (setq end (max beg (1- end)))) + (evil-range beg end)) + :string (lambda (beg end) + (let ((width (- end beg))) + (format "%s character%s" width + (if (= width 1) "" "s"))))) + +(evil-define-type line + "Include whole lines." + :one-to-one nil + :expand (lambda (beg end) + (evil-range + (progn + (goto-char beg) + (min (line-beginning-position) + (progn + ;; move to beginning of line as displayed + (evil-move-beginning-of-line) + (line-beginning-position)))) + (progn + (goto-char end) + (max (line-beginning-position 2) + (progn + ;; move to end of line as displayed + (evil-move-end-of-line) + (line-beginning-position 2)))))) + :contract (lambda (beg end) + (evil-range beg (max beg (1- end)))) + :string (lambda (beg end) + (let ((height (count-lines beg end))) + (format "%s line%s" height + (if (= height 1) "" "s"))))) + +(evil-define-type screen-line + "Include whole lines, being aware of `visual-line-mode' +when `evil-respect-visual-line-mode' is non-nil." + :one-to-one nil + :expand (lambda (beg end) + (if (or (not evil-respect-visual-line-mode) + (not visual-line-mode)) + (evil-line-expand beg end) + (evil-range + (progn + (goto-char beg) + (save-excursion + (beginning-of-visual-line))) + (progn + (goto-char end) + (save-excursion + ;; `beginning-of-visual-line' reverts to the beginning of the + ;; last visual line if the end of the last line is the end of + ;; the buffer. This would prevent selecting the last screen + ;; line. + (if (= (line-beginning-position 2) (point-max)) + (point-max) + (beginning-of-visual-line 2))))))) + :contract (lambda (beg end) + (evil-range beg (max beg (1- end)))) + :string (lambda (beg end) + (let ((height (count-screen-lines beg end))) + (format "%s screen line%s" height + (if (= height 1) "" "s"))))) + +(evil-define-type block + "Like `inclusive', but for rectangles: +the last column is included." + :expand (lambda (beg end &rest properties) + (let ((beg-col (evil-column beg)) + (end-col (evil-column end)) + (corner (plist-get properties :corner))) + ;; Since blocks are implemented as a pair of buffer + ;; positions, expansion is restricted to what the buffer + ;; allows. In the case of a one-column block, there are + ;; two ways to expand it (either move the upper corner + ;; beyond the lower corner, or the lower beyond the + ;; upper), so try out both possibilities when + ;; encountering the end of the line. + (cond + ((= beg-col end-col) + (goto-char end) + (cond + ((eolp) + (goto-char beg) + (if (eolp) + (evil-range beg end) + (evil-range (1+ beg) end))) + ((memq corner '(lower-right upper-right right)) + (evil-range (1+ beg) end)) + (t + (evil-range beg (1+ end))))) + ((< beg-col end-col) + (goto-char end) + (if (eolp) + (evil-range beg end) + (evil-range beg (1+ end)))) + (t + (goto-char beg) + (if (eolp) + (evil-range beg end) + (evil-range (1+ beg) end)))))) + :contract (lambda (beg end) + (let ((beg-col (evil-column beg)) + (end-col (evil-column end))) + (if (> beg-col end-col) + (evil-range (1- beg) end) + (evil-range beg (max beg (1- end)))))) + :string (lambda (beg end) + (let ((height (count-lines + beg + (progn + (goto-char end) + (if (and (bolp) (not (eobp))) + (1+ end) + end)))) + (width (abs (- (evil-column beg) + (evil-column end))))) + (format "%s row%s and %s column%s" + height + (if (= height 1) "" "s") + width + (if (= width 1) "" "s")))) + :rotate (lambda (beg end &rest properties) + "Rotate block according to :corner property. +:corner can be one of `upper-left',``upper-right', `lower-left' +and `lower-right'." + (let ((left (evil-column beg)) + (right (evil-column end)) + (corner (or (plist-get properties :corner) + 'upper-left))) + (evil-sort left right) + (goto-char beg) + (if (memq corner '(upper-right lower-left)) + (move-to-column right) + (move-to-column left)) + (setq beg (point)) + (goto-char end) + (if (memq corner '(upper-right lower-left)) + (move-to-column left) + (move-to-column right)) + (setq end (point)) + (setq properties (plist-put properties + :corner corner)) + (apply #'evil-range beg end properties)))) + +(evil-define-type rectangle + "Like `exclusive', but for rectangles: +the last column is excluded." + :expand (lambda (beg end) + ;; select at least one column + (if (= (evil-column beg) (evil-column end)) + (evil-expand beg end 'block) + (evil-range beg end 'block)))) + +;;; Standard interactive codes + +(evil-define-interactive-code "*" + "Signal error if the buffer is read-only." + (when buffer-read-only + (signal 'buffer-read-only nil))) + +(evil-define-interactive-code "b" (prompt) + "Name of existing buffer." + (list (read-buffer prompt (current-buffer) t))) + +(evil-define-interactive-code "c" + "Read character." + (list (read-char))) + +(evil-define-interactive-code "p" + "Prefix argument converted to number." + (list (prefix-numeric-value current-prefix-arg))) + +(evil-define-interactive-code "P" + "Prefix argument in raw form." + (list current-prefix-arg)) + +;;; Custom interactive codes + +(evil-define-interactive-code "<c>" + "Count." + (list (when current-prefix-arg + (prefix-numeric-value + current-prefix-arg)))) + +(evil-define-interactive-code "<vc>" + "Count, but only in visual state. +This should be used by an operator taking a count. In normal +state the count should not be handled by the operator but by the +motion that defines the operator's range. In visual state the +range is specified by the visual region and the count is not used +at all. Thus in the case the operator may use the count +directly." + (list (when (and (evil-visual-state-p) current-prefix-arg) + (prefix-numeric-value + current-prefix-arg)))) + +(evil-define-interactive-code "<C>" + "Character read through `evil-read-key'." + (list + (if (evil-operator-state-p) + (evil-without-restriction (evil-read-key)) + (evil-read-key)))) + +(evil-define-interactive-code "<r>" + "Untyped motion range (BEG END)." + (evil-operator-range)) + +(evil-define-interactive-code "<R>" + "Typed motion range (BEG END TYPE)." + (evil-operator-range t)) + +(evil-define-interactive-code "<v>" + "Typed motion range of visual range(BEG END TYPE). +If visual state is inactive then those values are nil." + (if (evil-visual-state-p) + (let ((range (evil-visual-range))) + (list (car range) + (cadr range) + (evil-type range))) + (list nil nil nil))) + +(evil-define-interactive-code "<x>" + "Current register." + (list evil-this-register)) + +(evil-define-interactive-code "<y>" + "Current yank-handler." + (list (evil-yank-handler))) + +(evil-define-interactive-code "<a>" + "Ex argument." + :ex-arg t + (list (when (evil-ex-p) evil-ex-argument))) + +(evil-define-interactive-code "<N>" (prompt) + "Prefix argument, ex-arg or minibuffer input, converted to number" + (list (cond + (current-prefix-arg (prefix-numeric-value current-prefix-arg)) + ((and evil-ex-argument (evil-ex-p)) (string-to-number evil-ex-argument)) + ((evil-ex-p) nil) + (t (string-to-number (read-string prompt)))))) + +(evil-define-interactive-code "<f>" + "Ex file argument." + :ex-arg file + (list (when (evil-ex-p) (evil-ex-file-arg)))) + +(evil-define-interactive-code "<b>" + "Ex buffer argument." + :ex-arg buffer + (list (when (evil-ex-p) evil-ex-argument))) + +(evil-define-interactive-code "<sh>" + "Ex shell command argument." + :ex-arg shell + (list (when (evil-ex-p) evil-ex-argument))) + +(evil-define-interactive-code "<fsh>" + "Ex file or shell command argument." + :ex-arg file-or-shell + (list (when (evil-ex-p) evil-ex-argument))) + +(evil-define-interactive-code "<sym>" + "Ex symbolic argument." + :ex-arg sym + (list (when (and (evil-ex-p) evil-ex-argument) + (intern evil-ex-argument)))) + +(evil-define-interactive-code "<addr>" + "Ex line number." + (list + (and (evil-ex-p) + (let ((expr (evil-ex-parse evil-ex-argument))) + (if (eq (car expr) 'evil-goto-line) + (save-excursion + (goto-char evil-ex-point) + (eval (cadr expr))) + (user-error "Invalid address")))))) + +(evil-define-interactive-code "<!>" + "Ex bang argument." + :ex-bang t + (list (when (evil-ex-p) evil-ex-bang))) + +(evil-define-interactive-code "</>" + "Ex delimited argument." + (when (evil-ex-p) + (evil-delimited-arguments evil-ex-argument))) + +(evil-define-interactive-code "<g/>" + "Ex global argument." + (when (evil-ex-p) + (evil-ex-parse-global evil-ex-argument))) + +(evil-define-interactive-code "<s/>" + "Ex substitution argument." + :ex-arg substitution + (when (evil-ex-p) + (evil-ex-get-substitute-info evil-ex-argument t))) + +(evil-define-interactive-code "<xc/>" + "Ex register and count argument, both optional. +Can be used for commands such as :delete [REGISTER] [COUNT] where the +command can be called with either zero, one or two arguments. When the +argument is one, if it's numeric it's treated as a COUNT, otherwise - +REGISTER" + (when (evil-ex-p) + (evil-ex-get-optional-register-and-count evil-ex-argument))) + +(defun evil-ex-get-optional-register-and-count (string) + "Parse STRING as an ex arg with both optional REGISTER and COUNT. +Returns a list (REGISTER COUNT)." + (let* ((split-args (split-string (or string ""))) + (arg-count (length split-args)) + (arg0 (car split-args)) + (arg1 (cadr split-args)) + (number-regex "^-?[1-9][0-9]*$") + (register nil) + (count nil)) + (cond + ;; :command REGISTER or :command COUNT + ((= arg-count 1) + (if (string-match-p number-regex arg0) + (setq count arg0) + (setq register arg0))) + ;; :command REGISTER COUNT + ((eq arg-count 2) + (setq register arg0 + count arg1)) + ;; more than 2 args aren't allowed + ((> arg-count 2) + (user-error "Invalid use"))) + + ;; if register is given, check it's valid + (when register + (unless (= (length register) 1) + (user-error "Invalid register")) + (setq register (string-to-char register))) + + ;; if count is given, check it's valid + (when count + (unless (string-match-p number-regex count) + (user-error "Invalid count")) + (setq count (string-to-number count)) + (unless (> count 0) + (user-error "Invalid count"))) + + (list register count))) + +(provide 'evil-types) + +;;; evil-types.el ends here diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-types.elc b/.emacs.d/elpa/evil-20210527.2107/evil-types.elc new file mode 100644 index 0000000..6db78b8 Binary files /dev/null and b/.emacs.d/elpa/evil-20210527.2107/evil-types.elc differ diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-vars.el b/.emacs.d/elpa/evil-20210527.2107/evil-vars.el new file mode 100644 index 0000000..9e8b879 --- /dev/null +++ b/.emacs.d/elpa/evil-20210527.2107/evil-vars.el @@ -0,0 +1,2034 @@ +;;; evil-vars.el --- Settings and variables -*- lexical-binding: t -*- + +;; Author: Vegard Øye <vegard_oye at hotmail.com> +;; Maintainer: Vegard Øye <vegard_oye at hotmail.com> + +;; Version: 1.14.0 + +;; +;; This file is NOT part of GNU Emacs. + +;;; License: + +;; This file is part of Evil. +;; +;; Evil is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; Evil is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with Evil. If not, see <http://www.gnu.org/licenses/>. + +;;; Code: + +(declare-function evil-add-command-properties "evil-common" + (command &rest properties)) +(declare-function evil-update-insert-state-bindings "evil-maps" + (&optional _option-name remove force)) + +;;; Hooks + +(defvar evil-after-load-hook nil + "Functions to be run when loading of Evil is finished. +This hook can be used the execute some initialization routines +when Evil is completely loaded.") + +(defcustom evil-goto-definition-functions + '(evil-goto-definition-imenu + evil-goto-definition-semantic + evil-goto-definition-xref + evil-goto-definition-search) + "List of functions run until success by `evil-goto-definition'." + :type 'hook + :group 'evil) + +;;; Initialization + +(defvar evil-pending-custom-initialize nil + "A list of pending initializations for custom variables. +Each element is a triple (FUNC VAR VALUE). When Evil is +completely loaded then the functions (funcall FUNC VAR VALUE) is +called for each element. FUNC should be a function suitable for +the :initialize property of `defcustom'.") + +(defun evil-custom-initialize-pending-reset (var value) + "Add a pending customization with `custom-initialize-reset'." + (push (list 'custom-initialize-reset var value) + evil-pending-custom-initialize)) + +(defun evil-run-pending-custom-initialize () + "Executes the pending initializations. +See `evil-pending-custom-initialize'." + (dolist (init evil-pending-custom-initialize) + (apply (car init) (cdr init))) + (remove-hook 'evil-after-load-hook 'evil-run-pending-custom-initialize)) +(add-hook 'evil-after-load-hook 'evil-run-pending-custom-initialize) + +;;; Setters + +(defun evil-set-toggle-key (key) + "Set `evil-toggle-key' to KEY. +KEY must be readable by `read-kbd-macro'." + (let ((old-key (read-kbd-macro + (if (boundp 'evil-toggle-key) + evil-toggle-key + "C-z"))) + (key (read-kbd-macro key))) + (with-no-warnings + (dolist (pair '((evil-motion-state-map evil-emacs-state) + (evil-insert-state-map evil-emacs-state) + (evil-emacs-state-map evil-exit-emacs-state))) + (when (boundp (car pair)) + (let ((map (symbol-value (car pair))) + (fun (cadr pair))) + (when (keymapp map) + (define-key map key fun) + (define-key map old-key nil)))))))) + +(defun evil-set-custom-state-maps (var pending-var key _make newlist) + "Changes the list of special keymaps. +VAR is the variable containing the list of keymaps. +PENDING-VAR is the variable containing the list of the currently pending + keymaps. +KEY the special symbol to be stored in the keymaps. +MAKE the creation function of the special keymaps. +NEWLIST the list of new special keymaps." + (set-default pending-var newlist) + (when (default-boundp var) + (dolist (map (default-value var)) + (when (and (boundp (car map)) + (keymapp (default-value (car map)))) + (define-key (default-value (car map)) (vector key) nil)))) + (set-default var newlist) + (evil-update-pending-maps)) + +(defun evil-update-pending-maps (&optional _file) + "Tries to set pending special keymaps. +This function should be called from an `after-load-functions' +hook." + (let ((maps '((evil-make-overriding-map . evil-pending-overriding-maps) + (evil-make-intercept-map . evil-pending-intercept-maps)))) + (while maps + (let* ((map (pop maps)) + (make (car map)) + (pending-var (cdr map)) + (pending (symbol-value pending-var)) + newlist) + (while pending + (let* ((map (pop pending)) + (kmap (and (boundp (car map)) + (keymapp (symbol-value (car map))) + (symbol-value (car map)))) + (state (cdr map))) + (if kmap + (funcall make kmap state) + (push map newlist)))) + (set-default pending-var newlist))))) + +(defun evil-set-visual-newline-commands (var value) + "Set the value of `evil-visual-newline-commands'. +Setting this variable changes the properties of the appropriate +commands." + (with-no-warnings + (when (default-boundp var) + (dolist (cmd (default-value var)) + (evil-set-command-property cmd :exclude-newline nil))) + (set-default var value) + (dolist (cmd (default-value var)) + (evil-set-command-property cmd :exclude-newline t)))) + +(defun evil-set-custom-motions (var values) + "Sets the list of motion commands." + (with-no-warnings + (when (default-boundp var) + (dolist (motion (default-value var)) + (evil-add-command-properties motion :keep-visual nil :repeat nil))) + (set-default var values) + (mapc #'evil-declare-motion (default-value var)))) + +;;; Customization group + +(defgroup evil nil + "Extensible vi layer." + :group 'emulations + :prefix 'evil-) + +(defcustom evil-auto-indent t + "\\<evil-normal-state-map> +Whether to auto-indent when opening lines with \\[evil-open-below] \ +and \\[evil-open-above]." + :type 'boolean + :group 'evil) +(make-variable-buffer-local 'evil-auto-indent) + +(defcustom evil-shift-width 4 + "\\<evil-normal-state-map> +The number of columns by which a line is shifted. +This applies to the shifting operators \\[evil-shift-right] and \ +\\[evil-shift-left]." + :type 'integer + :group 'evil) +(make-variable-buffer-local 'evil-shift-width) + +(defcustom evil-shift-round t + "\\<evil-normal-state-map> +Whether shifting rounds to the nearest multiple. +If non-nil, \\[evil-shift-right] and \\[evil-shift-left] adjust line +indentation to the nearest multiple of `evil-shift-width'." + :type 'boolean + :group 'evil) +(make-variable-buffer-local 'evil-shift-round) + +(defcustom evil-indent-convert-tabs t + "\\<evil-normal-state-map> +If non-nil, the \\[evil-indent] operator converts between leading tabs and spaces. +Whether tabs are converted to spaces or vice versa depends on the +value of `indent-tabs-mode'." + :type 'boolean + :group 'evil) + +(defcustom evil-default-cursor t + "The default cursor. +May be a cursor type as per `cursor-type', a color string as passed +to `set-cursor-color', a zero-argument function for changing the +cursor, or a list of the above." + :type '(set symbol (cons symbol symbol) string function) + :group 'evil) + +(defvar evil-force-cursor nil + "Overwrite the current states default cursor.") + +(defcustom evil-repeat-move-cursor t + "\\<evil-normal-state-map> +Whether repeating commands with \\[evil-repeat] may move the cursor. +If nil, the original cursor position is preserved, even if the command +normally would have moved the cursor." + :type 'boolean + :group 'evil) + +(defcustom evil-cross-lines nil + "\\<evil-motion-state-map> +Whether horizontal motions may move to other lines. If non-nil, +certain motions that conventionally operate in a single line may move +the cursor to other lines. Otherwise, they are restricted to the +current line. This applies to \\[evil-backward-char], \ +\\[evil-forward-char], \\[evil-find-char], \ +\\[evil-find-char-backward], \\[evil-find-char-to], \ +\\[evil-find-char-to-backward], \ +\\<evil-normal-state-map>\\[evil-invert-char]." + :type 'boolean + :group 'evil) + +(defcustom evil-backspace-join-lines t + "Whether backward delete in insert state may join lines." + :type 'boolean + :group 'evil) + +(defcustom evil-move-cursor-back t + "Whether the cursor is moved backwards when exiting insert state. +If non-nil, the cursor moves \"backwards\" when exiting insert state, +so that it ends up on the character to the left. Otherwise it remains +in place, on the character to the right." + :type 'boolean + :group 'evil) + +(defcustom evil-move-beyond-eol nil + "Whether the cursor can move past the end of the line. +If non-nil, the cursor is allowed to move one character past the +end of the line, as in Emacs." + :type 'boolean + :group 'evil) + +(defcustom evil-respect-visual-line-mode nil + "\\<evil-motion-state-map> +Whether movement commands respect `visual-line-mode'. +If non-nil, `visual-line-mode' is generally respected when it is +on. In this case, motions such as \\[evil-next-line] and +\\[evil-previous-line] navigate by visual lines (on the screen) rather +than \"physical\" lines (defined by newline characters). If nil, +the setting of `visual-line-mode' is ignored. + +This variable must be set before Evil is loaded." + :type 'boolean + :group 'evil) + +(defcustom evil-repeat-find-to-skip-next t + "Whether a repeat of t or T should skip an adjacent character." + :type 'boolean + :group 'evil) + +(defcustom evil-kbd-macro-suppress-motion-error nil + "\\<evil-motion-state-map> +Whether left/right motions signal errors in keyboard macros. +This variable only affects beginning-of-line or end-of-line errors +regarding the motions \\[evil-backward-char] and \\[evil-forward-char] +respectively. This may be desired since such errors cause macro +definition or execution to be terminated. There are four +possibilities: + +- `record': errors are suppressed when recording macros, but not when + replaying them. +- `replay': errors are suppressed when replaying macros, but not when + recording them. +- `t': errors are suppressed in both cases. +- `nil': errors are never suppressed." + :type '(radio (const :tag "No" :value nil) + (const :tag "Record" :value record) + (const :tag "Replay" :value replay) + (const :tag "Both" :value t)) + :group 'evil) + +(defcustom evil-track-eol t + "\\<evil-motion-state-map> +Whether \\[evil-end-of-line] \"sticks\" the cursor to the end of the line. +If non-nil, vertical motions after \\[evil-end-of-line] maintain the cursor at the +end of the line, even if the target line is longer. This is analogous +to `track-eol', but respects Evil's interpretation of end-of-line." + :type 'boolean + :group 'evil) + +(defcustom evil-mode-line-format 'before + "The position of the state tag in the mode line. +If set to `before' or `after', the tag is placed at the beginning +or the end of the mode-line, respectively. If nil, there is no +tag. Otherwise it should be a cons cell (WHERE . WHICH), where +WHERE is either `before' or `after', and WHICH is a symbol in +`mode-line-format'. The tag is then placed before or after that +symbol, respectively." + :type '(radio :value 'before + (const before) + (const after) + (cons :tag "Next to symbol" + (choice :value after + (const before) + (const after)) + symbol)) + :group 'evil) + +(defcustom evil-mouse-word 'evil-word + "The thing-at-point symbol for double click selection. +The double-click starts visual state in a special word selection +mode. This symbol is used to determine the words to be +selected. Possible values are `evil-word' or `evil-WORD'." + :type 'symbol + :group 'evil) + +(defcustom evil-bigword "^ \t\r\n" + "The set of characters to be interpreted as WORD boundaries. +This is enclosed with square brackets and used as a regular +expression. By default, whitespace characters are considered +WORD boundaries." + :type 'string + :group 'evil) +(make-variable-buffer-local 'evil-bigword) + +(defcustom evil-want-fine-undo nil + "Whether actions are undone in several steps. +There are two possible choices: nil (\"no\") means that all +changes made during insert state, including a possible delete +after a change operation, are collected in a single undo step. +Non-nil (\"yes\") means that undo steps are determined according +to Emacs heuristics, and no attempt is made to aggregate changes. + +For backward compatibility purposes, the value `fine' is +interpreted as `nil'. This option was removed because it did not +work consistently." + :type '(radio (const :tag "No" :value nil) + (const :tag "Fine (obsolete)" :value fine) + (const :tag "Yes" :value t)) + :group 'evil) + +(defcustom evil-regexp-search t + "\\<evil-motion-state-map> +Whether to use regular expressions for searching in \ +\\[evil-search-forward] and \\[evil-search-backward]." + :type 'boolean + :group 'evil) + +(defcustom evil-search-wrap t + "\\<evil-motion-state-map> +Whether search with \\[evil-search-forward] and \ +\\[evil-search-backward] wraps around the buffer. +If this is non-nil, search stops at the buffer boundaries." + :type 'boolean + :group 'evil) + +(defcustom evil-flash-delay 2 + "\\<evil-motion-state-map> +Time in seconds to flash search matches after \\[evil-search-next] and \ +\\[evil-search-previous]." + :type 'number + :group 'evil) + +(defcustom evil-auto-balance-windows t + "If non-nil window creation and deletion trigger rebalancing." + :type 'boolean + :group 'evil) + +(defcustom evil-split-window-below nil + "If non-nil split windows are created below." + :type 'boolean + :group 'evil) + +(defcustom evil-vsplit-window-right nil + "If non-nil vertically split windows with are created to the right." + :type 'boolean + :group 'evil) + +(defcustom evil-esc-delay 0.01 + "The time, in seconds, to wait for another key after escape. +If no further event arrives during this time, the event is +translated to `ESC'. Otherwise, it is translated according to +`input-decode-map'. This does not apply in Emacs state, and may +also be inhibited by setting `evil-inhibit-esc'." + :type 'number + :group 'evil) + +(defvar evil-esc-mode nil + "Non-nil if `evil-esc-mode' is enabled.") + +(defvar evil-esc-map nil + "Original ESC prefix map in `input-decode-map'. +Used by `evil-esc-mode'.") + +(defvar evil-inhibit-esc nil + "If non-nil, the \\e event will never be translated to 'escape.") + +(defcustom evil-intercept-esc 'always + "Whether Evil should intercept the escape key. +In the terminal, escape and a meta key sequence both generate the +same event. In order to distingush these, Evil uses +`input-decode-map'. It is not necessary to do this in a graphical +Emacs session. However, if you prefer to use `C-[' as escape (which +is identical to the terminal escape key code), this interception must +also happen in graphical Emacs sessions. Set this variable to +`always', t (only in the terminal) or nil (never intercept)." + :type '(radio (const :tag "Never" :value nil) + (const :tag "In terminal only" :value t) + (const :tag "Always" :value always)) + :group 'evil) + +(defcustom evil-show-paren-range 0 + "The minimal distance between point and a parenthesis +which causes the parenthesis to be highlighted." + :type 'integer + :group 'evil) + +(defcustom evil-ex-hl-update-delay 0.02 + "Time in seconds of idle before updating search highlighting. +Setting this to a period shorter than that of keyboard's repeat +rate allows highlights to update while scrolling." + :type 'number + :group 'evil) + +(defcustom evil-highlight-closing-paren-at-point-states + '(not emacs insert replace) + "The states in which the closing parenthesis at point should be highlighted. +All states listed here highlight the closing parenthesis at +point (which is Vim's default behavior). All others highlight the +parenthesis before point (which is Emacs default behavior). If +this list contains the symbol `not' then its meaning is inverted, +i.e. all states listed here highlight the closing parenthesis +before point." + :type '(repeat symbol) + :group 'evil) + +(defcustom evil-kill-on-visual-paste t + "Whether pasting in visual state adds the replaced text to the +kill ring, making it the default for the next paste. The default, +replicates the default Vim behavior." + :type 'boolean + :group 'evil) + +(defcustom evil-want-C-i-jump t + "Whether `C-i' jumps forward in the jump list (like Vim). +Otherwise, `C-i' inserts a tab character." + :type 'boolean + :group 'evil + :set #'(lambda (sym value) + (set-default sym value) + (when (boundp 'evil-motion-state-map) + (cond + ((and (not value) + (eq (lookup-key evil-motion-state-map (kbd "C-i")) + 'evil-jump-forward)) + (define-key evil-motion-state-map (kbd "C-i") nil)) + ((and value + (not (lookup-key evil-motion-state-map (kbd "C-i")))) + (define-key evil-motion-state-map (kbd "C-i") 'evil-jump-forward)))))) + +(defcustom evil-want-C-u-scroll nil + "Whether `C-u' scrolls up (like Vim). +Otherwise, `C-u' applies a prefix argument. The binding of +`C-u' mirrors Emacs behaviour by default due to the relative +ubiquity of prefix arguments." + :type 'boolean + :group 'evil + :set #'(lambda (sym value) + (set-default sym value) + (when (boundp 'evil-motion-state-map) + (cond + ((and (not value) + (eq (lookup-key evil-motion-state-map (kbd "C-u")) + 'evil-scroll-up)) + (define-key evil-motion-state-map (kbd "C-u") nil)) + ((and value + (not (lookup-key evil-motion-state-map (kbd "C-u")))) + (define-key evil-motion-state-map (kbd "C-u") 'evil-scroll-up)))))) + +(defcustom evil-want-C-d-scroll t + "Whether `C-d' scrolls down (like Vim)." + :type 'boolean + :group 'evil + :set #'(lambda (sym value) + (set-default sym value) + (when (boundp 'evil-motion-state-map) + (cond + ((and (not value) + (eq (lookup-key evil-motion-state-map (kbd "C-d")) + 'evil-scroll-down)) + (define-key evil-motion-state-map (kbd "C-d") nil)) + ((and value + (not (lookup-key evil-motion-state-map (kbd "C-d")))) + (define-key evil-motion-state-map (kbd "C-d") 'evil-scroll-down)))))) + +(defcustom evil-want-C-u-delete nil + "Whether `C-u' deletes back to indentation in insert state. +Otherwise, `C-u' applies a prefix argument. The binding of +`C-u' mirrors Emacs behaviour by default due to the relative +ubiquity of prefix arguments." + :type 'boolean + :group 'evil + :set #'(lambda (sym value) + (set-default sym value) + (when (boundp 'evil-insert-state-map) + (cond + ((and (not value) + (eq (lookup-key evil-insert-state-map (kbd "C-u")) + 'evil-delete-back-to-indentation)) + (define-key evil-insert-state-map (kbd "C-u") nil)) + ((and value + (not (lookup-key evil-insert-state-map (kbd "C-u")))) + (define-key evil-insert-state-map (kbd "C-u") 'evil-delete-back-to-indentation)))))) + +(defcustom evil-want-C-w-delete t + "Whether `C-w' deletes a word in Insert state." + :type 'boolean + :group 'evil + :set #'(lambda (sym value) + (set-default sym value) + (when (boundp 'evil-insert-state-map) + (cond + ((and (not value) + (eq (lookup-key evil-insert-state-map (kbd "C-w")) + 'evil-delete-backward-word)) + (define-key evil-insert-state-map (kbd "C-w") 'evil-window-map)) + ((and value + (eq (lookup-key evil-insert-state-map (kbd "C-w")) + 'evil-window-map)) + (define-key evil-insert-state-map (kbd "C-w") 'evil-delete-backward-word)))))) + +(defcustom evil-want-C-g-bindings nil + "Whether `C-g' postfix can be used in bindings." + :type 'boolean + :group 'evil) + +(defcustom evil-want-C-w-in-emacs-state nil + "Whether `C-w' prefixes windows commands in Emacs state." + :type 'boolean + :group 'evil + :set #'(lambda (sym value) + (set-default sym value) + (when (boundp 'evil-emacs-state-map) + (cond + ((and (not value) + (eq (lookup-key evil-emacs-state-map (kbd "C-w")) + 'evil-window-map)) + (define-key evil-emacs-state-map (kbd "C-w") nil)) + ((and value + (not (lookup-key evil-emacs-state-map (kbd "C-w")))) + (define-key evil-emacs-state-map (kbd "C-w") 'evil-window-map)))))) + +(defcustom evil-want-change-word-to-end t + "Whether `cw' behaves like `ce'." + :type 'boolean + :group 'evil) + +(defcustom evil-want-Y-yank-to-eol nil + "Whether `Y' yanks to the end of the line. +The default behavior is to yank the whole line, like Vim." + :group 'evil + :type 'boolean + :initialize #'evil-custom-initialize-pending-reset + :set #'(lambda (sym value) + (set-default sym value) + (evil-add-command-properties + 'evil-yank-line + :motion (if value + 'evil-end-of-line-or-visual-line + 'evil-line-or-visual-line)))) + +(defcustom evil-disable-insert-state-bindings nil + "Whether insert state bindings should be used. +Bindings for escape, delete and `evil-toggle-key' are always +available. If this is non-nil, default Emacs bindings are by and +large accessible in insert state." + :group 'evil + :type 'boolean + :initialize #'evil-custom-initialize-pending-reset + :set #'(lambda (sym value) + (set-default sym value) + (evil-update-insert-state-bindings sym value))) + +(defcustom evil-echo-state t + "Whether to signal the current state in the echo area." + :type 'boolean + :group 'evil) + +(defcustom evil-complete-all-buffers t + "\\<evil-insert-state-map> +Whether completion looks for matches in all buffers. +This applies to \\[evil-complete-next] and \\[evil-complete-previous] \ +in insert state." + :type 'boolean + :group 'evil) + +(defvar dabbrev-search-these-buffers-only) +(defvar dabbrev-case-distinction) +(defcustom evil-complete-next-func + #'(lambda (arg) + (require 'dabbrev) + (let ((dabbrev-search-these-buffers-only + (unless evil-complete-all-buffers + (list (current-buffer)))) + dabbrev-case-distinction) + (condition-case nil + (if (eq last-command this-command) + (dabbrev-expand nil) + (dabbrev-expand (- (abs (or arg 1))))) + (error (dabbrev-expand nil))))) + "Completion function used by \ +\\<evil-insert-state-map>\\[evil-complete-next]." + :type 'function + :group 'evil) + +(defcustom evil-complete-previous-func + #'(lambda (arg) + (require 'dabbrev) + (let ((dabbrev-search-these-buffers-only + (unless evil-complete-all-buffers + (list (current-buffer)))) + dabbrev-case-distinction) + (dabbrev-expand arg))) + "Completion function used by \ +\\<evil-insert-state-map>\\[evil-complete-previous]." + :type 'function + :group 'evil) + +(defcustom evil-complete-next-minibuffer-func 'minibuffer-complete + "Minibuffer completion function used by \ +\\<evil-insert-state-map>\\[evil-complete-next]." + :type 'function + :group 'evil) + +(defcustom evil-complete-previous-minibuffer-func 'minibuffer-complete + "Minibuffer completion function used by \ +\\<evil-insert-state-map>\\[evil-complete-previous]." + :type 'function + :group 'evil) + +(defcustom evil-complete-next-line-func + #'(lambda (arg) + (let ((hippie-expand-try-functions-list + '(try-expand-line + try-expand-line-all-buffers))) + (hippie-expand arg))) + "Minibuffer completion function used by \ +\\<evil-insert-state-map>\\[evil-complete-next-line]." + :type 'function + :group 'evil) + +(defcustom evil-complete-previous-line-func + evil-complete-next-line-func + "Minibuffer completion function used by \ +\\<evil-insert-state-map>\\[evil-complete-previous-line]." + :type 'function + :group 'evil) + +(defcustom evil-lookup-func #'woman + "Lookup function used by \ +\"\\<evil-motion-state-map>\\[evil-lookup]\"." + :type 'function + :group 'evil) + +(defcustom evil-toggle-key "C-z" + "The key used to change to and from Emacs state. +Must be readable by `read-kbd-macro'. For example: \"C-z\"." + :type 'string + :group 'evil + :set #'(lambda (sym value) + (evil-set-toggle-key value) + (set-default sym value))) + +(defcustom evil-default-state 'normal + "The default Evil state. +This is the state a buffer starts in when it is not otherwise +configured (see `evil-set-initial-state' and +`evil-buffer-regexps'). The value may be one of `normal', +`insert', `visual', `replace', `operator', `motion' and `emacs'." + :type 'symbol + :group 'evil) + +(defcustom evil-buffer-regexps + '(("^ \\*load\\*" . nil)) + "Regular expressions determining the initial state for a buffer. +Entries have the form (REGEXP . STATE), where REGEXP is a regular +expression matching the buffer's name and STATE is one of `normal', +`insert', `visual', `replace', `operator', `motion', `emacs' and +`nil'. If STATE is `nil', Evil is disabled in the buffer." + :type '(alist :key-type string :value-type symbol) + :group 'evil) + +(defcustom evil-emacs-state-modes + '(5x5-mode + archive-mode + bbdb-mode + biblio-selection-mode + blackbox-mode + bookmark-bmenu-mode + bookmark-edit-annotation-mode + browse-kill-ring-mode + bs-mode + bubbles-mode + bzr-annotate-mode + calc-mode + cfw:calendar-mode + completion-list-mode + Custom-mode + custom-theme-choose-mode + debugger-mode + delicious-search-mode + desktop-menu-blist-mode + desktop-menu-mode + doc-view-mode + dun-mode + dvc-bookmarks-mode + dvc-diff-mode + dvc-info-buffer-mode + dvc-log-buffer-mode + dvc-revlist-mode + dvc-revlog-mode + dvc-status-mode + dvc-tips-mode + ediff-mode + ediff-meta-mode + efs-mode + Electric-buffer-menu-mode + emms-browser-mode + emms-mark-mode + emms-metaplaylist-mode + emms-playlist-mode + ess-help-mode + etags-select-mode + fj-mode + gc-issues-mode + gdb-breakpoints-mode + gdb-disassembly-mode + gdb-frames-mode + gdb-locals-mode + gdb-memory-mode + gdb-registers-mode + gdb-threads-mode + gist-list-mode + git-rebase-mode + gnus-article-mode + gnus-browse-mode + gnus-group-mode + gnus-server-mode + gnus-summary-mode + gomoku-mode + google-maps-static-mode + ibuffer-mode + jde-javadoc-checker-report-mode + magit-cherry-mode + magit-diff-mode + magit-log-mode + magit-log-select-mode + magit-popup-mode + magit-popup-sequence-mode + magit-process-mode + magit-reflog-mode + magit-refs-mode + magit-revision-mode + magit-stash-mode + magit-stashes-mode + magit-status-mode + mh-folder-mode + monky-mode + mpuz-mode + mu4e-main-mode + mu4e-headers-mode + mu4e-view-mode + notmuch-hello-mode + notmuch-search-mode + notmuch-show-mode + notmuch-tree-mode + occur-mode + org-agenda-mode + package-menu-mode + pdf-outline-buffer-mode + pdf-view-mode + proced-mode + rcirc-mode + rebase-mode + recentf-dialog-mode + reftex-select-bib-mode + reftex-select-label-mode + reftex-toc-mode + sldb-mode + slime-inspector-mode + slime-thread-control-mode + slime-xref-mode + snake-mode + solitaire-mode + sr-buttons-mode + sr-mode + sr-tree-mode + sr-virtual-mode + tar-mode + tetris-mode + tla-annotate-mode + tla-archive-list-mode + tla-bconfig-mode + tla-bookmarks-mode + tla-branch-list-mode + tla-browse-mode + tla-category-list-mode + tla-changelog-mode + tla-follow-symlinks-mode + tla-inventory-file-mode + tla-inventory-mode + tla-lint-mode + tla-logs-mode + tla-revision-list-mode + tla-revlog-mode + tla-tree-lint-mode + tla-version-list-mode + twittering-mode + urlview-mode + vc-annotate-mode + vc-dir-mode + vc-git-log-view-mode + vc-hg-log-view-mode + vc-svn-log-view-mode + vm-mode + vm-summary-mode + w3m-mode + wab-compilation-mode + xgit-annotate-mode + xgit-changelog-mode + xgit-diff-mode + xgit-revlog-mode + xhg-annotate-mode + xhg-log-mode + xhg-mode + xhg-mq-mode + xhg-mq-sub-mode + xhg-status-extra-mode) + "Modes that should come up in Emacs state." + :type '(repeat symbol) + :group 'evil) + +(defcustom evil-insert-state-modes + '(comint-mode + erc-mode + eshell-mode + geiser-repl-mode + gud-mode + inferior-apl-mode + inferior-caml-mode + inferior-emacs-lisp-mode + inferior-j-mode + inferior-python-mode + inferior-scheme-mode + inferior-sml-mode + internal-ange-ftp-mode + prolog-inferior-mode + reb-mode + shell-mode + slime-repl-mode + term-mode + wdired-mode) + "Modes that should come up in Insert state." + :type '(repeat symbol) + :group 'evil) + +(defcustom evil-motion-state-modes + '(apropos-mode + Buffer-menu-mode + calendar-mode + color-theme-mode + command-history-mode + compilation-mode + dictionary-mode + ert-results-mode + help-mode + Info-mode + Man-mode + speedbar-mode + undo-tree-visualizer-mode + woman-mode) + "Modes that should come up in Motion state." + :type '(repeat symbol) + :group 'evil) + +(defvar evil-pending-overriding-maps nil + "An alist of pending overriding maps.") + +(defvar evil-pending-intercept-maps nil + "An alist of pending intercept maps.") + +(defcustom evil-overriding-maps + '((Buffer-menu-mode-map . nil) + (color-theme-mode-map . nil) + (comint-mode-map . nil) + (compilation-mode-map . nil) + (grep-mode-map . nil) + (dictionary-mode-map . nil) + (ert-results-mode-map . motion) + (Info-mode-map . motion) + (speedbar-key-map . nil) + (speedbar-file-key-map . nil) + (speedbar-buffers-key-map . nil)) + "Keymaps that should override Evil maps. +Entries have the form (MAP-VAR . STATE), where MAP-VAR is +a keymap variable and STATE is the state whose bindings +should be overridden. If STATE is nil, all states are +overridden." + :type '(alist :key-type symbol :value-type symbol) + :group 'evil + :set #'(lambda (var values) + (set-default var values) + (evil-set-custom-state-maps 'evil-overriding-maps + 'evil-pending-overriding-maps + 'override-state + 'evil-make-overriding-map + values)) + :initialize 'evil-custom-initialize-pending-reset) + +(add-hook 'after-load-functions #'evil-update-pending-maps) + +(defcustom evil-intercept-maps + '((edebug-mode-map . nil)) + "Keymaps that should intercept Evil maps. +Entries have the form (MAP-VAR . STATE), where MAP-VAR is +a keymap variable and STATE is the state whose bindings +should be intercepted. If STATE is nil, all states are +intercepted." + :type '(alist :key-type symbol :value-type symbol) + :group 'evil + :set #'(lambda (var values) + (set-default var values) + (evil-set-custom-state-maps 'evil-intercept-maps + 'evil-pending-intercept-maps + 'intercept-state + 'evil-make-intercept-map + values)) + :initialize 'evil-custom-initialize-pending-reset) + +(defcustom evil-motions + '(back-to-indentation + backward-char + backward-list + backward-paragraph + backward-sentence + backward-sexp + backward-up-list + backward-word + beginning-of-buffer + beginning-of-defun + beginning-of-line + beginning-of-visual-line + c-beginning-of-defun + c-end-of-defun + diff-file-next + diff-file-prev + diff-hunk-next + diff-hunk-prev + down-list + end-of-buffer + end-of-defun + end-of-line + end-of-visual-line + exchange-point-and-mark + forward-char + forward-list + forward-paragraph + forward-sentence + forward-sexp + forward-word + goto-last-change + ibuffer-backward-line + ibuffer-forward-line + isearch-abort + isearch-cancel + isearch-complete + isearch-del-char + isearch-delete-char + isearch-edit-string + isearch-exit + isearch-highlight-regexp + isearch-occur + isearch-other-control-char + isearch-other-meta-char + isearch-printing-char + isearch-query-replace + isearch-query-replace-regexp + isearch-quote-char + isearch-repeat-backward + isearch-repeat-forward + isearch-ring-advance + isearch-ring-retreat + isearch-toggle-case-fold + isearch-toggle-input-method + isearch-toggle-regexp + isearch-toggle-specified-input-method + isearch-toggle-word + isearch-yank-char + isearch-yank-kill + isearch-yank-line + isearch-yank-word-or-char + keyboard-quit + left-char + left-word + mouse-drag-region + mouse-save-then-kill + mouse-set-point + mouse-set-region + mwheel-scroll + move-beginning-of-line + move-end-of-line + next-error + next-line + paredit-backward + paredit-backward-down + paredit-backward-up + paredit-forward + paredit-forward-down + paredit-forward-up + pop-global-mark + pop-tag-mark + pop-to-mark-command + previous-error + previous-line + right-char + right-word + scroll-down + scroll-down-command + scroll-up + scroll-up-command + sgml-skip-tag-backward + sgml-skip-tag-forward + up-list) + "Non-Evil commands to initialize to motions." + :type '(repeat symbol) + :group 'evil + :set 'evil-set-custom-motions + :initialize 'evil-custom-initialize-pending-reset) + +(defcustom evil-visual-newline-commands + '(LaTeX-section + TeX-font) + "Commands excluding the trailing newline of a Visual Line selection. +These commands work better without this newline." + :type '(repeat symbol) + :group 'evil + :set 'evil-set-visual-newline-commands + :initialize 'evil-custom-initialize-pending-reset) + +(defcustom evil-want-visual-char-semi-exclusive nil + "Visual character selection to beginning/end of line is exclusive. +If non nil then an inclusive visual character selection which +ends at the beginning or end of a line is turned into an +exclusive selection. Thus if the selected (inclusive) range ends +at the beginning of a line it is changed to not include the first +character of that line, and if the selected range ends at the end +of a line it is changed to not include the newline character of +that line." + :type 'boolean + :group 'evil) + +(defcustom evil-text-object-change-visual-type t + "Text objects change the current visual state type. +If non-nil then a text-object changes the type of the visual state to +its default selection type (e.g. a word object always changes to +charwise visual state). Otherwise the current visual state type is +preserved." + :type 'boolean + :group 'evil) + +(defgroup evil-cjk nil + "CJK support" + :prefix "evil-cjk-" + :group 'evil) + +(defcustom evil-cjk-emacs-word-boundary nil + "Determine word boundary exactly the same way as Emacs does." + :type 'boolean + :group 'evil-cjk) + +(defcustom evil-cjk-word-separating-categories + '(;; Kanji + (?C . ?H) (?C . ?K) (?C . ?k) (?C . ?A) (?C . ?G) + ;; Hiragana + (?H . ?C) (?H . ?K) (?H . ?k) (?H . ?A) (?H . ?G) + ;; Katakana + (?K . ?C) (?K . ?H) (?K . ?k) (?K . ?A) (?K . ?G) + ;; half-width Katakana + (?k . ?C) (?k . ?H) (?k . ?K) ; (?k . ?A) (?k . ?G) + ;; full-width alphanumeric + (?A . ?C) (?A . ?H) (?A . ?K) ; (?A . ?k) (?A . ?G) + ;; full-width Greek + (?G . ?C) (?G . ?H) (?G . ?K) ; (?G . ?k) (?G . ?A) + ) + "List of pair (cons) of categories to determine word boundary +used in `evil-cjk-word-boundary-p'. See the documentation of +`word-separating-categories'. Use `describe-categories' to see +the list of categories." + :type '(alist :key-type (choice character (const nil)) + :value-type (choice character (const nil))) + :group 'evil-cjk) + +(defcustom evil-cjk-word-combining-categories + '(;; default value in word-combining-categories + (nil . ?^) (?^ . nil) + ;; Roman + (?r . ?k) (?r . ?A) (?r . ?G) + ;; half-width Katakana + (?k . ?r) (?k . ?A) (?k . ?G) + ;; full-width alphanumeric + (?A . ?r) (?A . ?k) (?A . ?G) + ;; full-width Greek + (?G . ?r) (?G . ?k) (?G . ?A) + ) + "List of pair (cons) of categories to determine word boundary +used in `evil-cjk-word-boundary-p'. See the documentation of +`word-combining-categories'. Use `describe-categories' to see the +list of categories." + :type '(alist :key-type (choice character (const nil)) + :value-type (choice character (const nil))) + :group 'evil-cjk) + +(defcustom evil-ex-complete-emacs-commands 'in-turn + "TAB-completion for Emacs commands in ex command line. +This variable determines when Emacs commands are considered for +completion, always, never, or only if no Evil ex command is +available for completion." + :group 'evil + :type '(radio (const :tag "Only if no ex-command." :value in-turn) + (const :tag "Never" :value nil) + (const :tag "Always" :value t))) + +(defface evil-ex-commands '(( nil + :underline t + :slant italic)) + "Face for the Evil command in completion in ex mode." + :group 'evil) + +(defface evil-ex-info '(( ((supports :slant)) + :slant italic + :foreground "red")) + "Face for the info message in ex mode." + :group 'evil) + +(defcustom evil-ex-visual-char-range nil + "Type of default ex range in visual char state. +If non-nil the default range when starting an ex command from +character visual state is `<,`> otherwise it is '<,'>. In the +first case the ex command will be passed a region covering only +the visual selection. In the second case the passed region will +be extended to contain full lines." + :group 'evil + :type 'boolean) + +;; Searching +(defcustom evil-symbol-word-search nil + "If nil then * and # search for words otherwise for symbols." + :group 'evil + :type 'boolean) +(make-variable-buffer-local 'evil-symbol-word-search) + +(defcustom evil-magic t + "Meaning which characters in a pattern are magic. +The meaning of those values is the same as in Vim. Note that it +only has influence if the Evil search module is chosen in +`evil-search-module'." + :group 'evil + :type '(radio (const :tag "Very magic." :value very-magic) + (const :tag "Magic" :value t) + (const :tag "Nomagic" :value nil) + (const :tag "Very nomagic" :value very-nomagic))) + +(defcustom evil-ex-search-vim-style-regexp nil + "If non-nil Vim-style backslash codes are supported in search patterns. +See `evil-transform-vim-style-regexp' for the supported backslash +codes. Note that this only affects the search command if +`evil-search-module' is set to 'evil-search. The isearch module +always uses plain Emacs regular expressions." + :type 'boolean + :group 'evil) + +(defcustom evil-ex-interactive-search-highlight 'all-windows + "Determine in which windows the interactive highlighting should be shown." + :type '(radio (const :tag "All windows." all-windows) + (const :tag "Selected window." selected-window) + (const :tag "Disable highlighting." nil)) + :group 'evil) + +(defcustom evil-ex-search-persistent-highlight t + "If non-nil matches remain highlighted when the search ends." + :type 'boolean + :group 'evil) + +(defcustom evil-ex-search-case 'smart + "The case behaviour of the search command. +Smart case means that the pattern is case sensitive if and only +if it contains an upper case letter, otherwise it is case +insensitive." + :type '(radio (const :tag "Case sensitive." sensitive) + (const :tag "Case insensitive." insensitive) + (const :tag "Smart case." smart)) + :group 'evil) + +(defcustom evil-ex-substitute-case nil + "The case behaviour of the search command. +Smart case means that the pattern is case sensitive if and only +if it contains an upper case letter, otherwise it is case +insensitive. If nil then the setting of `evil-ex-search-case' is +used." + :type '(radio (const :tag "Same as interactive search." nil) + (const :tag "Case sensitive." sensitive) + (const :tag "Case insensitive." insensitive) + (const :tag "Smart case." smart)) + :group 'evil) + +(defcustom evil-ex-search-interactive t + "If t search is interactive." + :type 'boolean + :group 'evil) + +(defcustom evil-ex-search-highlight-all t + "If t and interactive search is enabled, all matches are +highlighted." + :type 'boolean + :group 'evil) + +(defcustom evil-ex-substitute-highlight-all t + "If t all matches for the substitute pattern are highlighted." + :type 'boolean + :group 'evil) + +(defcustom evil-ex-substitute-interactive-replace t + "If t and substitute patterns are highlighted, +the replacement is shown interactively." + :type 'boolean + :group 'evil) + +(defcustom evil-ex-substitute-global nil + "If non-nil substitute patterns are global by default. +Usually (if this variable is nil) a substitution works only on +the first match of a pattern in a line unless the 'g' flag is +given, in which case the substitution happens on all matches in a +line. If this option is non-nil, this behaviour is reversed: the +substitution works on all matches unless the 'g' pattern is +specified, then is works only on the first match." + :type 'boolean + :group 'evil) + +(defface evil-ex-search '((t :inherit isearch)) + "Face for interactive search." + :group 'evil) + +(defface evil-ex-lazy-highlight '((t :inherit lazy-highlight)) + "Face for highlighting all matches in interactive search." + :group 'evil) + +(defface evil-ex-substitute-matches '((t :inherit lazy-highlight)) + "Face for interactive substitute matches." + :group 'evil) + +(defface evil-ex-substitute-replacement '((((supports :underline)) + :underline t + :foreground "red")) + "Face for interactive replacement text." + :group 'evil) + +(defcustom evil-command-window-height 8 + "Height (in lines) of the command line window. +Set to 0 to use the default height for `split-window'." + :type 'integer + :group 'evil) + +(defcustom evil-display-shell-error-in-message nil + "Show error output of a shell command in the error buffer. +If this variable is non-nil the error output of a shell command +goes to the messages buffer instead of being mixed with the +regular output. This happens only if the exit status of the +command is non-zero." + :type 'boolean + :group 'evil) + +(defcustom evil-want-abbrev-expand-on-insert-exit t + "If non-nil abbrevs will be expanded when leaving insert state +like in Vim, if `abbrev-mode' is on." + :type 'boolean + :group 'evil) + +;;; Variables + +(defmacro evil-define-local-var (symbol &optional initvalue docstring) + "Define SYMBOL as permanent buffer local variable, and return SYMBOL. +The parameters are the same as for `defvar', but the variable +SYMBOL is made permanent buffer local." + (declare (indent defun) + (doc-string 3) + (debug (symbolp &optional form stringp))) + `(progn + (defvar ,symbol ,initvalue ,docstring) + (make-variable-buffer-local ',symbol) + (put ',symbol 'permanent-local t))) + +(evil-define-local-var evil-scroll-count 0 + "Holds last used prefix for `evil-scroll-up' +and `evil-scroll-down'. +Determines how many lines should be scrolled. +Default value is 0 - scroll half the screen.") + +(evil-define-local-var evil-state nil + "The current Evil state. +To change the state, use `evil-change-state' +or call the state function (e.g., `evil-normal-state').") + +;; these may be used inside `evil-define-state' +(evil-define-local-var evil-next-state nil + "The Evil state being switched to.") + +(evil-define-local-var evil-previous-state-alist nil + "For Each evil state the Evil state being switched from.") + +(evil-define-local-var evil-previous-state nil + "The Evil state being switched from.") + +(defvar evil-execute-in-emacs-state-buffer nil + "The buffer of the latest `evil-execute-in-emacs-state'. +When this command is being executed the current buffer is stored +in this variable. This is necessary in case the Emacs-command to +be called changes the current buffer.") + +(evil-define-local-var evil-mode-line-tag nil + "Mode-Line indicator for the current state.") +(put 'evil-mode-line-tag 'risky-local-variable t) + +(defvar evil-global-keymaps-alist nil + "Association list of keymap variables. +Entries have the form (MODE . KEYMAP), where KEYMAP +is the variable containing the keymap for MODE.") + +(defvar evil-local-keymaps-alist nil + "Association list of keymap variables that must be +reinitialized in each buffer. Entries have the form +\(MODE . KEYMAP), where KEYMAP is the variable containing +the keymap for MODE.") + +(defvar evil-minor-mode-keymaps-alist nil + "Association list of Evil states to minor-mode keymap alists. +Entries have the form (STATE . MODE-MAP-ALIST), where +MODE-MAP-ALIST is an alist taking the form of +`minor-mode-map-alist'.") + +(defvar evil-state-properties nil + "Specifications made by `evil-define-state'. +Entries have the form (STATE . PLIST), where PLIST is a property +list specifying various aspects of the state. To access a property, +use `evil-state-property'.") + +(evil-define-local-var evil-mode-map-alist nil + "Association list of keymaps to use for Evil modes. +Elements have the form (MODE . KEYMAP), with the first keymaps +having higher priority.") + +(defvar evil-command-properties nil + "Specifications made by `evil-define-command'.") + +(defvar evil-change-commands '(evil-change) + "Commands that wrap or replace `evil-change'. +This list exists to apply an inconsistency with vim's change command +to commands that wrap or redefine it. See emacs-evil/evil#916.") + +(defvar evil-transient-vars '(cua-mode transient-mark-mode select-active-regions) + "List of variables pertaining to Transient Mark mode.") + +(defvar evil-transient-vals nil + "Association list of old values for Transient Mark mode variables. +Entries have the form (VARIABLE VALUE LOCAL), where LOCAL is +whether the variable was previously buffer-local.") + +(evil-define-local-var evil-no-display nil + "If non-nil, various Evil displays are inhibited. +Use the macro `evil-without-display' to set this variable.") + +(defvar evil-type-properties nil + "Specifications made by `evil-define-type'. +Entries have the form (TYPE . PLIST), where PLIST is a property +list specifying functions for handling the type: expanding it, +describing it, etc.") + +(defvar evil-interactive-alist nil + "Association list of Evil-specific interactive codes.") + +(evil-define-local-var evil-motion-marker nil + "Marker for storing the starting position of a motion.") + +(evil-define-local-var evil-this-type nil + "Current motion type.") + +(evil-define-local-var evil-this-type-modified nil + "Non-nil iff current motion type has been modified by the user. +If the type has been modified, this variable contains the new +type.") + +(evil-define-local-var evil-this-register nil + "Current register.") + +(defvar evil-last-=-register-input nil + "Most recent input from the `=' register. A string.") + +(defvar evil-this-macro nil + "Current macro register.") + +(evil-define-local-var evil-this-operator nil + "Current operator.") + +(evil-define-local-var evil-this-motion nil + "Current motion.") + +(evil-define-local-var evil-this-motion-count nil + "Current motion count.") + +(defvar evil-last-register nil + "The last executed register.") + +(defvar evil-inhibit-operator nil + "Inhibit current operator. +If an operator calls a motion and the motion sets this variable +to t, the operator code is not executed.") + +(defvar evil-inhibit-operator-value nil + "This variable is used to transfer the value +of `evil-inhibit-operator' from one local scope to another.") + +;; used by `evil-define-operator' +(defvar evil-operator-range-beginning nil + "Beginning of `evil-operator-range'.") + +(defvar evil-operator-range-end nil + "End of `evil-operator-range'.") + +(defvar evil-operator-range-type nil + "Type of `evil-operator-range'.") + +(defvar evil-operator-range-motion nil + "Motion of `evil-operator-range'.") + +(defvar evil-restriction-stack nil + "List of previous restrictions. +Using `evil-with-restriction' stores the previous values of +`point-min' and `point-max' as a pair in this list.") + +(evil-define-local-var evil-markers-alist + '((?\( . evil-backward-sentence) + (?\) . evil-forward-sentence) + (?{ . evil-backward-paragraph) + (?} . evil-forward-paragraph) + (?' . evil-jump-backward-swap) + (?` . evil-jump-backward-swap) + (?< . evil-visual-beginning) + (?> . evil-visual-goto-end) + (?. . (lambda () + (let (last-command) + (goto-last-change nil))))) + "Association list for markers. +Entries have the form (CHAR . DATA), where CHAR is the marker's +name and DATA is either a marker object as returned by `make-marker', +a variable, a movement function, or a cons cell (STRING NUMBER), +where STRING is a file path and NUMBER is a buffer position. +The global value of this variable holds markers available from +every buffer, while the buffer-local value holds markers available +only in the current buffer.") + +(defconst evil-suppress-map (make-keymap) + "Full keymap disabling default bindings to `self-insert-command'.") +(suppress-keymap evil-suppress-map t) + +(defvar evil-read-key-map (make-sparse-keymap) + "Keymap active during `evil-read-key'. +This keymap can be used to bind some commands during the +execution of `evil-read-key' which is usually used to read a +character argument for some commands, e.g. `evil-replace'.") + +;; TODO: customize size of ring +(defvar evil-repeat-ring (make-ring 10) + "A ring of repeat-informations to repeat the last command.") + +(defvar evil-repeat-types + '((t . evil-repeat-keystrokes) + (change . evil-repeat-changes) + (motion . evil-repeat-motion) + (insert-at-point . evil-repeat-insert-at-point) + (ignore . nil)) + "An alist of defined repeat-types.") + +(defvar evil-recording-repeat nil + "Whether we are recording a repeat.") + +(defvar evil-recording-current-command nil + "Whether we are recording the current command for repeat.") + +(defvar evil-repeat-changes nil + "Accumulated buffer changes for changed-based commands.") + +(defvar evil-repeat-info nil + "Information accumulated during current repeat.") + +(defvar evil-repeat-buffer nil + "The buffer in which the repeat started. +If the buffer is changed, the repeat is cancelled.") + +(defvar evil-repeat-pos nil + "The position of point at the beginning of an change-tracking + editing command.") + +(defvar evil-repeat-keys nil + "The keys that invoked the current command.") + +(defvar evil-last-repeat nil + "Information about the latest repeat command. +This is a list of three elements (POINT COUNT UNDO-POINTER), +where POINT is the position of point before the latest repeat, +COUNT the count-argument of the latest repeat command and +UNDO-POINTER the head of the undo-list before the last command +has been repeated.") + +(defvar evil-repeat-count nil + "The explicit count when repeating a command.") + +(defvar evil-maybe-remove-spaces nil + "Flag to determine if newly inserted spaces should be removed. +See the function `evil-maybe-remove-spaces'.") + +(evil-define-local-var evil-insert-count nil + "The explicit count passed to an command starting Insert state.") + +(evil-define-local-var evil-insert-vcount nil + "The information about the number of following lines the +insertion should be repeated. This is list (LINE COLUMN COUNT) +where LINE is the line-number where the original insertion +started and COLUMN is either a number or function determining the +column where the repeated insertions should take place. COUNT is +number of repeats (including the original insertion).") + +(defvar evil-insert-skip-empty-lines nil + "Non-nil of the current insertion should not take place on + lines at which the insertion point is behind the end of the + line.") + +(evil-define-local-var evil-insert-lines nil + "Non-nil if the current insertion command is a line-insertion +command o or O.") + +(evil-define-local-var evil-insert-repeat-info nil + "Repeat information accumulated during an insertion.") + +(evil-define-local-var evil-replace-alist nil + "Association list of characters overwritten in Replace state. +The format is (POS . CHAR).") + +(evil-define-local-var evil-echo-area-message nil + "Previous value of `current-message'.") + +(defvar evil-write-echo-area nil + "If set to t inside `evil-save-echo-area', then the echo area +is not restored.") + +(defvar evil-last-find nil + "A pair (FUNCTION . CHAR) describing the lastest character + search command.") + +(defvar evil-last-paste nil + "Information about the latest paste. +This should be a list (CMD COUNT POINT BEG END FIRSTVISUAL) where +CMD is the last paste-command (`evil-paste-before', +`evil-paste-after' or `evil-visual-paste'), COUNT is the repeat +count of the paste, POINT is the position of point before the +paste, BEG end END are the region of the inserted +text. FIRSTVISUAL is t if and only if the previous command was +the first visual paste (i.e. before any paste-pop).") + +(evil-define-local-var evil-last-undo-entry nil + "Information about the latest undo entry in the buffer. +This should be a pair (OBJ . CONS) where OBJ is the entry as an +object, and CONS is a copy of the entry.") + +(evil-define-local-var evil-current-insertion nil + "Information about the latest insertion in insert state. +This should be a pair (BEG . END) that describes the +buffer-region of the newly inserted text.") + +(defvar evil-last-insertion nil + "The last piece of inserted text.") + +(defvar evil-last-small-deletion nil + "The last piece of deleted text. +The text should be less than a line.") + +(defvar evil-was-yanked-without-register t + "Whether text being saved to the numbered-register ring was +not deleted and not yanked to a specific register.") + +(defvar evil-paste-count nil + "The count argument of the current paste command.") + +(defvar evil-temporary-undo nil + "When undo is disabled in current buffer. +Certain commands depending on undo use this variable +instead of `buffer-undo-list'.") + +(evil-define-local-var evil-undo-list-pointer nil + "Everything up to this mark is united in the undo-list.") + +(defvar evil-in-single-undo nil + "Set to non-nil if the current undo steps are connected.") + +(defvar evil-flash-timer nil + "Timer for flashing search results.") + +(defvar evil-search-prompt nil + "String to use for search prompt.") + +(defvar evil-search-forward-history nil + "History of forward searches.") + +(defvar evil-search-backward-history nil + "History of backward searches.") + +(defvar evil-inner-text-objects-map (make-sparse-keymap) + "Keymap for inner text objects.") + +(defvar evil-outer-text-objects-map (make-sparse-keymap) + "Keymap for outer text objects.") + +(defvar evil-window-map (make-sparse-keymap) + "Keymap for window-related commands.") + +(evil-define-local-var evil-input-method nil + "Input method used in Insert state and Emacs state.") + +;;; Visual state + +(evil-define-local-var evil-visual-beginning nil + "The beginning of the Visual selection, a marker.") + +(evil-define-local-var evil-visual-end nil + "The end of the Visual selection, a marker.") + +(evil-define-local-var evil-visual-point nil + "The position of point in Visual state, a marker.") + +(evil-define-local-var evil-visual-mark nil + "The position of mark in Visual state, a marker.") + +(evil-define-local-var evil-visual-previous-mark nil + "The position of mark before Visual state, a marker.") + +(evil-define-local-var evil-visual-selection nil + "The kind of Visual selection. +This is a selection as defined by `evil-define-visual-selection'.") + +;; we could infer the direction by comparing `evil-visual-mark' +;; and `evil-visual-point', but destructive operations may +;; displace the markers +(evil-define-local-var evil-visual-direction 0 + "Whether point follows mark in Visual state. +Negative if point precedes mark, otherwise positive. +See also the function `evil-visual-direction'.") + +(evil-define-local-var evil-visual-properties nil + "Property list of miscellaneous Visual properties.") + +(evil-define-local-var evil-visual-region-expanded nil + "Whether the region matches the Visual selection. +That is, whether the positions of point and mark have been +expanded to coincide with the selection's boundaries. +This makes the selection available to functions acting +on Emacs' region.") + +(evil-define-local-var evil-visual-overlay nil + "Overlay for highlighting the Visual selection. +Not used for blockwise selections, in which case +see `evil-visual-block-overlays'.") + +(evil-define-local-var evil-visual-block-overlays nil + "Overlays for Visual Block selection, one for each line. +They are reused to minimize flicker.") + +(defvar evil-visual-alist nil + "Association list of Visual selection functions. +Elements have the form (NAME . FUNCTION).") + +(evil-define-local-var evil-visual-x-select-timer nil + "Timer for updating the X selection in visual state.") + +(defvar evil-visual-x-select-timeout 0.1 + "Time in seconds for the update of the X selection.") + +(declare-function origami-open-all-nodes "ext:origami.el") +(declare-function origami-close-all-nodes "ext:origami.el") +(declare-function origami-toggle-node "ext:origami.el") +(declare-function origami-open-node "ext:origami.el") +(declare-function origami-open-node-recursively "ext:origami.el") +(declare-function origami-close-node "ext:origami.el") + +(defvar evil-fold-list + `(((vdiff-mode) + :open-all vdiff-open-all-folds + :close-all vdiff-close-all-folds + :toggle ,(lambda () (call-interactively 'vdiff-toggle-fold)) + :open ,(lambda () (call-interactively 'vdiff-open-fold)) + :open-rec ,(lambda () (call-interactively 'vdiff-open-fold)) + :close ,(lambda () (call-interactively 'vdiff-close-fold))) + ((vdiff-3way-mode) + :open-all vdiff-open-all-folds + :close-all vdiff-close-all-folds + :toggle ,(lambda () (call-interactively 'vdiff-toggle-fold)) + :open ,(lambda () (call-interactively 'vdiff-open-fold)) + :open-rec ,(lambda () (call-interactively 'vdiff-open-fold)) + :close ,(lambda () (call-interactively 'vdiff-close-fold))) + ((hs-minor-mode) + :open-all hs-show-all + :close-all hs-hide-all + :toggle hs-toggle-hiding + :open hs-show-block + :open-rec nil + :close hs-hide-block) + ((hide-ifdef-mode) + :open-all show-ifdefs + :close-all hide-ifdefs + :toggle nil + :open show-ifdef-block + :open-rec nil + :close hide-ifdef-block) + ((outline-mode + outline-minor-mode + org-mode + markdown-mode) + :open-all show-all + :close-all ,(lambda () + (with-no-warnings (hide-sublevels 1))) + :toggle outline-toggle-children + :open ,(lambda () + (with-no-warnings + (show-entry) + (show-children))) + :open-rec show-subtree + :close hide-subtree) + ((origami-mode) + :open-all ,(lambda () (origami-open-all-nodes (current-buffer))) + :close-all ,(lambda () (origami-close-all-nodes (current-buffer))) + :toggle ,(lambda () (origami-toggle-node (current-buffer) (point))) + :open ,(lambda () (origami-open-node (current-buffer) (point))) + :open-rec ,(lambda () (origami-open-node-recursively (current-buffer) (point))) + :close ,(lambda () (origami-close-node (current-buffer) (point))))) + "Actions to be performed for various folding operations. + +The value should be a list of fold handlers, were a fold handler has +the format: + + ((MODES) PROPERTIES) + +MODES acts as a predicate, containing the symbols of all major or +minor modes for which the handler should match. For example: + + '((outline-minor-mode org-mode) ...) + +would match for either outline-minor-mode or org-mode, even though the +former is a minor mode and the latter is a major. + +PROPERTIES specifies possible folding actions and the functions to be +applied in the event of a match on one (or more) of the MODES; the +supported properties are: + + - `:open-all' + Open all folds. + - `:close-all' + Close all folds. + - `:toggle' + Toggle the display of the fold at point. + - `:open' + Open the fold at point. + - `:open-rec' + Open the fold at point recursively. + - `:close' + Close the fold at point. + +Each value must be a function. A value of `nil' will cause the action +to be ignored for that respective handler. For example: + + `((org-mode) + :close-all nil + :open ,(lambda () + (show-entry) + (show-children)) + :close hide-subtree) + +would ignore `:close-all' actions and invoke the provided functions on +`:open' or `:close'.") + +;;; Ex + +(defvar evil-ex-map (make-sparse-keymap) + "Keymap for Ex. +Key sequences bound in this map are immediately executed.") + +(defvar evil-ex-completion-map (make-sparse-keymap) + "Completion keymap for Ex.") + +(defvar evil-ex-initial-input nil + "Additional initial content of the ex command line. +This content of this variable is appended to the ex command line +if ex is started interactively.") + +(defvar evil-ex-shell-argument-initialized nil + "This variable is set to t if shell command completion has been initialized. +See `evil-ex-init-shell-argument-completion'.") + +(defvar evil-ex-commands nil + "Association list of command bindings and functions.") + +(defvar evil-ex-history nil + "History of Ex commands.") + +(defvar evil-ex-current-buffer nil + "The buffer from which Ex was started.") + +(defvar evil-ex-expression nil + "The evaluation tree.") + +(defvar evil-ex-tree nil + "The syntax tree.") + +(defvar evil-ex-command nil + "The current Ex command.") + +(defvar evil-ex-previous-command nil + "The previously executed Ex command.") + +(defvar evil-ex-cmd nil + "The current Ex command string.") + +(defvar evil-ex-point nil + "The position of `point' when the ex command has been called.") + +(defvar evil-ex-range nil + "The current range of the Ex command.") + +(defvar evil-ex-bang nil + "The \"!\" argument of the current Ex command.") + +(defvar evil-ex-argument nil + "The current argument of the Ex command.") + +(defvar evil-ex-argument-handler nil + "The argument handler for the current Ex command.") + +(defvar evil-ex-argument-types nil + "Association list of argument handlers.") + +(defvar evil-previous-shell-command nil + "The last shell command.") + +;; Eval +(defvar evil-eval-history nil + "History of eval input, from the `=' register.") + +(defvar evil-eval-map (make-sparse-keymap) + "Keymap for eval input.") + +;; Searching +(defvar evil-ex-search-history nil + "The history for the search command.") + +(defvar evil-ex-search-direction nil + "The direction of the current search, either 'forward or 'backward.") + +(defvar evil-ex-search-count nil + "The count if the current search.") + +(defvar evil-ex-search-start-point nil + "The point where the search started.") + +(defvar evil-ex-search-overlay nil + "The overlay for the current search result.") + +(defvar evil-ex-search-pattern nil + "The last search pattern.") + +(defvar evil-ex-search-offset nil + "The last search offset.") + +(defvar evil-ex-search-match-beg nil + "The beginning position of the last match.") + +(defvar evil-ex-search-match-end nil + "The end position of the last match.") + +(defvar evil-ex-substitute-pattern nil + "The last substitute pattern.") + +(defvar evil-ex-substitute-replacement nil + "The last substitute replacement.") + +(defvar evil-ex-substitute-flags nil + "The last substitute flags.") + +(defvar evil-ex-substitute-current-replacement nil + "The actual replacement.") + +(defvar evil-ex-last-was-search nil + "Non-nil if the previous was a search. +Otherwise the previous command is assumed as substitute.") + +;;; Command line window + +(defvar evil-command-window-current-buffer nil + "The buffer from which the command line window was called.") + +(evil-define-local-var evil-command-window-execute-fn nil + "The command to execute when exiting the command line window.") + +(evil-define-local-var evil-command-window-cmd-key nil + "The key for the command that opened the command line window (:, /, or ?).") + +;; The lazy-highlighting framework. +(evil-define-local-var evil-ex-active-highlights-alist nil + "An alist of currently active highlights.") + +(evil-define-local-var evil-ex-hl-update-timer nil + "Time used for updating highlights.") + +(defvar evil-ex-search-keymap (make-sparse-keymap) + "Keymap used in ex-search-mode.") +(define-key evil-ex-search-keymap [escape] 'abort-recursive-edit) +(set-keymap-parent evil-ex-search-keymap minibuffer-local-map) + +(defconst evil-version + (eval-when-compile + (with-temp-buffer + (let ((dir (file-name-directory (or load-file-name + byte-compile-current-file)))) + ;; git repository + (if (and (file-exists-p (concat dir "/.git")) + (ignore-errors + (zerop (call-process "git" nil '(t nil) nil + "rev-parse" + "--short" "HEAD")))) + (progn + (goto-char (point-min)) + (concat "evil-git-" + (buffer-substring (point-min) + (line-end-position)))) + ;; no repo, use plain version + "1.14.0")))) + "The current version of Evil") + +(defcustom evil-want-integration t + "Whether to load evil-integration.el. +This variable must be set before Evil is loaded." + :type 'boolean + :group 'evil) + +(defcustom evil-want-keybinding t + "Whether to load evil-keybindings.el. + +This loads a set of keybindings for evil in other modes as well as +setting the initial evil state in those modes. + +This variable must be set before evil is loaded." + :type 'boolean + :group 'evil) + +(defcustom evil-want-minibuffer nil + "Whether to enable Evil in minibuffer(s)." + :type 'boolean + :group 'evil + :set #'(lambda (sym value) + (set-default sym value) + (if value + (add-hook 'minibuffer-setup-hook 'evil-initialize) + (remove-hook 'minibuffer-setup-hook 'evil-initialize)))) + +(defun evil--redo-placeholder (_count) + (user-error "Customize `evil-undo-system' for redo functionality.")) + +(defvar evil-undo-function 'undo + "Function to be used by `evil-undo'. +Customized via `evil-undo-system'.") + +(defvar evil-redo-function 'evil--redo-placeholder + "Function to be used by 'evil-redo'. +Customized via `evil-undo-system'.") + +(defun evil-set-undo-system (system) + "Set `evil-undo-function' and `evil-redo-function` by SYSTEM." + (cond + ((not system) + (setq evil-undo-function 'undo + evil-redo-function 'evil--redo-placeholder)) + ((eq system 'undo-redo) + (setq evil-undo-function 'undo-only + evil-redo-function 'undo-redo)) + ((eq system 'undo-tree) + (setq evil-undo-function 'undo-tree-undo + evil-redo-function 'undo-tree-redo)) + ((eq system 'undo-fu) + (setq evil-undo-function 'undo-fu-only-undo + evil-redo-function 'undo-fu-only-redo)) + (t + (error "Unknown undo system %s" system)))) + +(defcustom evil-undo-system nil + "Undo system Evil should use. If equal to `undo-tree' or +`undo-fu', those packages must be installed. If equal to +`undo-tree', `undo-tree-mode' must also be activated. If equal +to `undo-redo', Evil uses commands natively available in Emacs 28." + :type '(choice (const :tag "Vanilla undo" nil) + (const undo-redo) + (const undo-tree) + (const undo-fu)) + :group 'evil + :set #'(lambda (sym value) + (evil-set-undo-system value) + (set-default sym value))) + +(defun evil-version () + (interactive) + (message "Evil version %s" evil-version)) + +(provide 'evil-vars) + +;;; evil-vars.el ends here diff --git a/.emacs.d/elpa/evil-20210527.2107/evil-vars.elc b/.emacs.d/elpa/evil-20210527.2107/evil-vars.elc new file mode 100644 index 0000000..b20ecc8 Binary files /dev/null and b/.emacs.d/elpa/evil-20210527.2107/evil-vars.elc differ diff --git a/.emacs.d/elpa/evil-20210527.2107/evil.el b/.emacs.d/elpa/evil-20210527.2107/evil.el new file mode 100644 index 0000000..e584b31 --- /dev/null +++ b/.emacs.d/elpa/evil-20210527.2107/evil.el @@ -0,0 +1,148 @@ +;;; evil.el --- extensible vi layer + +;; The following list of authors was kept up to date until the beginning of +;; 2017, when evil moved under new maintainers. For authors since then, please +;; consult the git logs. + +;; Alessandro Piras <laynor at gmail.com> +;; Alexander Baier <alexander.baier at mailbox.org> +;; Antono Vasiljev <antono.vasiljev at gmail.com> +;; Bailey Ling <bling at live.ca> +;; Barry O'Reilly <gundaetiapo at gmail.com> +;; Christoph Lange <langec at web.de> +;; Daniel Reiter <danieltreiter at gmail.com> +;; Eivind Fonn <evfonn at gmail.com> +;; Emanuel Evans <emanuel.evans at gmail.com> +;; Eric Siegel <siegel.eric at gmail.com> +;; Eugene Yaremenko <w3techplayground at gmail.com> +;; Frank Fischer <frank-fischer at shadow-soft.de> +;; Frank Terbeck <ft at bewatermyfriend.org> +;; Gordon Gustafson <gordon3.14 at gmail.com> +;; Herbert Jones <jones.herbert at gmail.com> +;; Jonas Bernoulli <jonas at bernoul.li> +;; Jonathan Claggett <jclaggett at lonocloud.com> +;; José A. Romero L. <escherdragon at gmail.com> +;; Justin Burkett <justin at burkett.cc> +;; Lars Andersen <expez at expez.com> +;; Lintaro Ina <tarao.gnn at gmail.com> +;; Lukasz Wrzosek <wrzoski at mail.com> +;; Marian Schubert <maio at netsafe.cz> +;; Matthew Malcomson <> +;; Michael Markert <markert.michael at googlemail.com> +;; Mike Gerwitz <mikegerwitz at gnu.org> +;; Nikolai Weibull <now at bitwi.se> +;; phaebz <phaebz at gmail.com> +;; ralesi <scio62 at gmail.com> +;; Rodrigo Setti <rodrigosetti at gmail.com> +;; Sanel Zukan <sanelz at gmail.com> +;; Sarah Brofeldt <sarah at thinkmonster.(none)> +;; Simon Hafner <hafnersimon at gmail.com> +;; Stefan Wehr <mail at stefanwehr.de> +;; Sune Simonsen <sune.simonsen at jayway.com> +;; Thomas Hisch <thomas at opentech.at> +;; Tim Harper <timcharper at gmail.com> +;; Tom Willemse <tom at ryuslash.org> +;; Trevor Murphy <trevor.m.murphy at gmail.com> +;; Ulrich Müller <ulm at gentoo.org> +;; Vasilij Schneidermann <v.schneidermann at gmail.com> +;; Vegard Øye <vegard_oye at hotmail.com> +;; Winfred Lu <winfred.lu at gmail.com> +;; Wolfgang Jenkner <wjenkner at inode.at> +;; Xiao Hanyu <xiaohanyu1988 at gmail.com> +;; York Zhao <yzhao at telecor.com> + +;; Maintainers: The emacs-evil team. <https://github.com/orgs/emacs-evil/people> +;; To get in touch, please use the bug tracker or the +;; mailing list (see below). +;; Created: 2011-03-01 +;; Version: 1.14.0 +;; Keywords: emulation, vim +;; URL: https://github.com/emacs-evil/evil +;; Repository: https://github.com/emacs-evil/evil.git +;; EmacsWiki: http://www.emacswiki.org/emacs/Evil +;; Bug tracker: https://github.com/emacs-evil/evil/issues +;; If you have bug reports, suggestions or patches, please +;; create an issue at the bug tracker (open for everyone). +;; Other discussions (tips, extensions) go to the mailing list. +;; Mailing list: <implementations-list at lists.ourproject.org> +;; Subscribe: http://tinyurl.com/implementations-list +;; Newsgroup: nntp://news.gmane.org/gmane.emacs.vim-emulation +;; Archives: http://dir.gmane.org/gmane.emacs.vim-emulation +;; You don't have to subscribe to post; we usually reply +;; within a few days and CC our replies back to you. +;; +;; This file is NOT part of GNU Emacs. + +;;; License: + +;; This file is part of Evil. +;; +;; Evil is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; Evil is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with Evil. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: + +;; Evil is an extensible vi layer for Emacs. It emulates the main +;; features of Vim, and provides facilities for writing custom +;; extensions. +;; +;; Evil lives in a Git repository. To obtain Evil, do +;; +;; git clone git://github.com/emacs-evil/evil.git +;; +;; Move Evil to ~/.emacs.d/evil (or somewhere else in the `load-path'). +;; Then add the following lines to ~/.emacs: +;; +;; (add-to-list 'load-path "~/.emacs.d/evil") +;; (require 'evil) +;; (evil-mode 1) +;; +;; Evil requires undo-redo (Emacs 28), undo-fu or undo-tree for redo +;; functionality. Otherwise, Evil uses regular Emacs undo. +;; +;; Evil requires `goto-last-change' and `goto-last-change-reverse' +;; function for the corresponding motions g; g, as well as the +;; last-change-register `.'. One package providing these functions is +;; goto-chg.el: +;; +;; http://www.emacswiki.org/emacs/GotoChg +;; +;; Without this package the corresponding motions will raise an error. + +;;; Code: + +(require 'evil-vars) +(require 'evil-common) +(require 'evil-core) +(require 'evil-states) +(require 'evil-repeat) +(require 'evil-macros) +(require 'evil-search) +(require 'evil-ex) +(require 'evil-digraphs) +(require 'evil-types) +(require 'evil-commands) +(require 'evil-jumps) +(require 'evil-maps) + +(when evil-want-integration + (require 'evil-integration)) + +(when evil-want-keybinding + (require 'evil-keybindings)) + +(run-hooks 'evil-after-load-hook) + +(provide 'evil) + +;;; evil.el ends here diff --git a/.emacs.d/elpa/evil-20210527.2107/evil.elc b/.emacs.d/elpa/evil-20210527.2107/evil.elc new file mode 100644 index 0000000..f050da3 Binary files /dev/null and b/.emacs.d/elpa/evil-20210527.2107/evil.elc differ diff --git a/.emacs.d/elpa/evil-20210527.2107/evil.info b/.emacs.d/elpa/evil-20210527.2107/evil.info new file mode 100644 index 0000000..fc0a7c3 --- /dev/null +++ b/.emacs.d/elpa/evil-20210527.2107/evil.info @@ -0,0 +1,2191 @@ +This is evil.info, produced by makeinfo version 6.7 from evil.texi. + + Evil 1.14.0, Oct 14, 2020 + + Eivind Fonn, Frank Fischer, Vegard Øye + + Copyright © 2011-2019, Eivind Fonn, Frank Fischer, Vegard Øye + +INFO-DIR-SECTION Emacs +START-INFO-DIR-ENTRY +* evil: (evil.info). Extensible vi layer for Emacs +END-INFO-DIR-ENTRY + + + Generated by Sphinx 3.2.1. + + +File: evil.info, Node: Top, Next: Overview, Up: (dir) + +Evil documentation +****************** + + Evil 1.14.0, Oct 14, 2020 + + Eivind Fonn, Frank Fischer, Vegard Øye + + Copyright © 2011-2019, Eivind Fonn, Frank Fischer, Vegard Øye + +* Menu: + +* Overview:: +* Settings:: +* Keymaps:: +* Hooks:: +* Extension:: +* Frequently Asked Questions:: +* Internals:: +* The GNU Free Documentation License:: +* Emacs lisp functions and variables:: + + — The Detailed Node Listing — + +Overview + +* Installation via package.el: Installation via package el. +* Manual installation:: +* Modes and states:: + +Settings + +* The initial state:: +* Keybindings and other behaviour:: +* Search:: +* Indentation:: +* Cursor movement:: +* Cursor display:: +* Window management:: +* Parenthesis highlighting:: +* Miscellaneous:: + +Keymaps + +* evil-define-key:: +* Leader keys:: + +Extension + +* Motions:: +* Operators:: +* Text objects:: +* Range types:: +* States:: + +Frequently Asked Questions + +* Problems with the escape key in the terminal:: +* Underscore is not a word character:: + +Internals + +* Command properties:: + + + +File: evil.info, Node: Overview, Next: Settings, Prev: Top, Up: Top + +1 Overview +********** + +Evil is an extensible vi layer for Emacs. It emulates the main features +of Vim, (1) turning Emacs into a modal editor. Like Emacs in general, +Evil is extensible in Emacs Lisp. + +* Menu: + +* Installation via package.el: Installation via package el. +* Manual installation:: +* Modes and states:: + + ---------- Footnotes ---------- + + (1) (1) Vim is the most popular version of `vi', a modal text editor +with many implementations. Vim also adds some functions of its own, +like visual selection and text objects. For more information see the +official Vim website (https://vim.org). + + +File: evil.info, Node: Installation via package el, Next: Manual installation, Up: Overview + +1.1 Installation via package.el +=============================== + +Evil is available as a package from MELPA stable and MELPA unstable. +This is the recommended way of installing Evil. + +To set up ‘package.el’ to work with one of these repositories, you can +follow the instructions on melpa.org(1). + +Once that is done, you can execute the following commands: + + M-x package-refresh-contents + M-x package-install RET evil RET + +Finally, add the following lines to your Emacs init file: + + (require 'evil) + (evil-mode 1) + + ---------- Footnotes ---------- + + (1) https://melpa.org/#/getting-started + + +File: evil.info, Node: Manual installation, Next: Modes and states, Prev: Installation via package el, Up: Overview + +1.2 Manual installation +======================= + +First, install ‘goto-chg’ and ‘cl-lib’. If you have an Emacs version of +24.3 or newer, you should already have ‘cl-lib’. + +Evil lives in a git repository. To download Evil, do: + + git clone --depth 1 https://github.com/emacs-evil/evil.git + +Then add the following lines to your Emacs init file: + + (add-to-list 'load-path "path/to/evil") + (require 'evil) + (evil-mode 1) + +Ensure that your replace ‘path/to/evil’ with the actual path to where +you cloned Evil. + + +File: evil.info, Node: Modes and states, Prev: Manual installation, Up: Overview + +1.3 Modes and states +==================== + +The next time Emacs is started, it will come up in `normal state', +denoted by ‘<N>’ in the mode line. This is where the main vi bindings +are defined. Note that you can always disable normal state with ‘C-z’, +which switches to an “Emacs state” (denoted by ‘<E>’) in which vi keys +are completely disabled. Press ‘C-z’ again to switch back to normal +state. + +state + + Evil uses the term `state' for what is called a “mode” in regular + vi usage, because `modes' are understood in Emacs terms to mean + something else. + +Evil defines a number of states by default: + +normal state (‘<N>’) + + This is the default “resting state” of Evil, in which the main body + of vi bindings are defined. + +insert state (‘<I>’) + + This is the state for insertion of text, where non-modified keys + will insert the corresponding character in the buffer. + +visual state (‘<V>’) + + A state for selecting text regions. Motions are available for + modifying the selected region, and operators are available for + acting on it. + +replace state (‘<R>’) + + A special state mostly similar to insert state, except it replaces + text instead of inserting. + +operator-pending state (‘<O>’) + + A special state entered after launching an operator, but before + specifying the corresponding motion or text object. + +motion state (‘<M>’) + + A special state useful for buffers that are read-only, where + motions are available but editing operations are not. + +Emacs state (‘<E>’) + + A state that as closely as possible mimics default Emacs behaviour, + by eliminating all vi bindings, except for ‘C-z’, to re-enter + normal state. + + +File: evil.info, Node: Settings, Next: Keymaps, Prev: Overview, Up: Top + +2 Settings +********** + +Evil’s behaviour can be adjusted by setting some variables. The list of +all available variables and their current values can be inspected by +doing: + + M-x customize-group RET evil RET + +To change the value of a variable, you can use this interface, or add a +‘setq’ form to your Emacs init file, preferably before Evil is loaded. +(1) + + (setq evil-shift-width 0) + ;; Load Evil + (require 'evil) + +What follows is a non-exhaustive list of the most relevant customization +options. + +* Menu: + +* The initial state:: +* Keybindings and other behaviour:: +* Search:: +* Indentation:: +* Cursor movement:: +* Cursor display:: +* Window management:: +* Parenthesis highlighting:: +* Miscellaneous:: + + ---------- Footnotes ---------- + + (1) (1) Strictly speaking, the order only matters if the variable +affects the way Evil is loaded. This is the case with some variables. + + +File: evil.info, Node: The initial state, Next: Keybindings and other behaviour, Up: Settings + +2.1 The initial state +===================== + +The initial state of a buffer is determined by its major mode. Evil +maintains an association between major modes and their corresponding +states, which is most easily modified using the function *note +evil-set-initial-state: 30. + + -- Emacs Lisp Autofunction: (evil-set-initial-state MODE STATE) + + Set the initial state for major mode `MODE' to `STATE'. This is the + state the buffer comes up in. + +If no state can be found, Evil uses the default initial state. + + -- Emacs Lisp Autovariable: evil-default-state + + The default Evil state. This is the state a buffer starts in when + it is not otherwise configured (see *note evil-set-initial-state: + 30. and *note evil-buffer-regexps: 5.). The value may be one of + ‘normal’, ‘insert’, ‘visual’, ‘replace’, ‘operator’, ‘motion’ and + ‘emacs’. + + Default: ‘normal’ + +Alternatively, it is possible to select the initial state based on the +buffer `name' rather than its major mode. This is checked first, so it +takes precedence over the other methods for setting the state. + + -- Emacs Lisp Autovariable: evil-buffer-regexps + + Regular expressions determining the initial state for a buffer. + Entries have the form ‘(REGEXP . STATE)’, where `REGEXP' is a + regular expression matching the buffer’s name and `STATE' is one of + ‘normal’, ‘insert’, ‘visual’, ‘replace’, ‘operator’, ‘motion’, + ‘emacs’ and ‘nil’. If `STATE' is ‘nil’, Evil is disabled in the + buffer. + + Default: ‘(("^ \\*load\\*"))’ + + +File: evil.info, Node: Keybindings and other behaviour, Next: Search, Prev: The initial state, Up: Settings + +2.2 Keybindings and other behaviour +=================================== + +Evil comes with a rich system for modifying its key bindings *note +Keymaps: 4d. For the most common tweaks, the following variables are +available. + + -- Emacs Lisp Autovariable: evil-toggle-key + + The key used to change to and from Emacs state. Must be readable + by ‘read-kbd-macro’. For example: “C-z”. + + Default: ‘"C-z"’ + + -- Emacs Lisp Autovariable: evil-want-C-i-jump + + Whether ‘C-i’ jumps forward in the jump list (like Vim). + Otherwise, ‘C-i’ inserts a tab character. + + Default: ‘t’ + + -- Emacs Lisp Autovariable: evil-want-C-u-delete + + Whether ‘C-u’ deletes back to indentation in insert state. + Otherwise, ‘C-u’ applies a prefix argument. The binding of ‘C-u’ + mirrors Emacs behaviour by default due to the relative ubiquity of + prefix arguments. + + Default: ‘nil’ + + -- Emacs Lisp Autovariable: evil-want-C-u-scroll + + Whether ‘C-u’ scrolls up (like Vim). Otherwise, ‘C-u’ applies a + prefix argument. The binding of ‘C-u’ mirrors Emacs behaviour by + default due to the relative ubiquity of prefix arguments. + + Default: ‘nil’ + + -- Emacs Lisp Autovariable: evil-want-C-d-scroll + + Whether ‘C-d’ scrolls down (like Vim). + + Default: ‘t’ + + -- Emacs Lisp Autovariable: evil-want-C-w-delete + + Whether ‘C-w’ deletes a word in Insert state. + + Default: ‘t’ + + -- Emacs Lisp Autovariable: evil-want-C-w-in-emacs-state + + Whether ‘C-w’ prefixes windows commands in Emacs state. + + Default: ‘nil’ + + -- Emacs Lisp Autovariable: evil-want-Y-yank-to-eol + + Whether ‘Y’ yanks to the end of the line. The default behavior is + to yank the whole line, like Vim. + + Default: ‘nil’ + + -- Emacs Lisp Autovariable: evil-disable-insert-state-bindings + + Whether insert state bindings should be used. Bindings for escape, + delete and *note evil-toggle-key: 36. are always available. If + this is non-nil, default Emacs bindings are by and large accessible + in insert state. + + Default: ‘nil’ + + +File: evil.info, Node: Search, Next: Indentation, Prev: Keybindings and other behaviour, Up: Settings + +2.3 Search +========== + + -- Emacs Lisp Autovariable: evil-search-module + + The search module to be used. May be either ‘isearch’, for Emacs’ + isearch module, or ‘evil-search’, for Evil’s own interactive search + module. + + Default: ‘isearch’ + + -- Emacs Lisp Autovariable: evil-regexp-search + + Whether to use regular expressions for searching in ‘/’ and ‘?’. + + Default: ‘t’ + + -- Emacs Lisp Autovariable: evil-search-wrap + + Whether search with ‘/’ and ‘?’ wraps around the buffer. If this + is non-nil, search stops at the buffer boundaries. + + Default: ‘t’ + + -- Emacs Lisp Autovariable: evil-flash-delay + + Time in seconds to flash search matches after ‘n’ and ‘N’. + + Default: ‘2’ + + -- Emacs Lisp Autovariable: evil-ex-hl-update-delay + + Time in seconds of idle before updating search highlighting. + Setting this to a period shorter than that of keyboard’s repeat + rate allows highlights to update while scrolling. + + Default: ‘0.02’ + + +File: evil.info, Node: Indentation, Next: Cursor movement, Prev: Search, Up: Settings + +2.4 Indentation +=============== + + -- Emacs Lisp Autovariable: evil-auto-indent + + Whether to auto-indent when opening lines with ‘o’ and ‘O’. + + Default: ‘t’, buffer-local + + -- Emacs Lisp Autovariable: evil-shift-width + + The number of columns by which a line is shifted. This applies to + the shifting operators ‘>’ and ‘<’. + + Default: ‘4’, buffer-local + + -- Emacs Lisp Autovariable: evil-shift-round + + Whether shifting rounds to the nearest multiple. If non-nil, ‘>’ + and ‘<’ adjust line indentation to the nearest multiple of *note + evil-shift-width: 33. + + Default: ‘t’, buffer-local + + -- Emacs Lisp Autovariable: evil-indent-convert-tabs + + If non-nil, the ‘=’ operator converts between leading tabs and + spaces. Whether tabs are converted to spaces or vice versa depends + on the value of ‘indent-tabs-mode’. + + Default: ‘t’ + + +File: evil.info, Node: Cursor movement, Next: Cursor display, Prev: Indentation, Up: Settings + +2.5 Cursor movement +=================== + +In standard Emacs terms, the cursor is generally understood to be +located between two characters. In Vim, and therefore also Evil, this +is the case in insert state, but in other states the cursor is +understood to be `on' a character, and that this character is not a +newline. + +Forcing this behaviour in Emacs is the source of some potentially +surprising results (especially for traditional Emacs users—users used to +Vim may find the default behavior to their satisfaction). Many of them +can be tweaked using the following variables. + + -- Emacs Lisp Autovariable: evil-repeat-move-cursor + + Whether repeating commands with ‘.’ may move the cursor. If nil, + the original cursor position is preserved, even if the command + normally would have moved the cursor. + + Default: ‘t’ + + -- Emacs Lisp Autovariable: evil-move-cursor-back + + Whether the cursor is moved backwards when exiting insert state. + If non-nil, the cursor moves “backwards” when exiting insert state, + so that it ends up on the character to the left. Otherwise it + remains in place, on the character to the right. + + Default: ‘t’ + + -- Emacs Lisp Autovariable: evil-move-beyond-eol + + Whether the cursor can move past the end of the line. If non-nil, + the cursor is allowed to move one character past the end of the + line, as in Emacs. + + Default: ‘nil’ + + -- Emacs Lisp Autovariable: evil-cross-lines + + Whether horizontal motions may move to other lines. If non-nil, + certain motions that conventionally operate in a single line may + move the cursor to other lines. Otherwise, they are restricted to + the current line. This applies to ‘h’, ‘SPC’, ‘f’, ‘F’, ‘t’, ‘T’, + ‘~’. + + Default: ‘nil’ + + -- Emacs Lisp Autovariable: evil-respect-visual-line-mode + + Whether movement commands respect ‘visual-line-mode’. If non-nil, + ‘visual-line-mode’ is generally respected when it is on. In this + case, motions such as ‘j’ and ‘k’ navigate by visual lines (on the + screen) rather than “physical” lines (defined by newline + characters). If nil, the setting of ‘visual-line-mode’ is ignored. + + This variable must be set before Evil is loaded. + + Default: ‘nil’ + + -- Emacs Lisp Autovariable: evil-track-eol + + Whether ‘$’ “sticks” the cursor to the end of the line. If + non-nil, vertical motions after ‘$’ maintain the cursor at the end + of the line, even if the target line is longer. This is analogous + to ‘track-eol’, but respects Evil’s interpretation of end-of-line. + + Default: ‘t’ + + +File: evil.info, Node: Cursor display, Next: Window management, Prev: Cursor movement, Up: Settings + +2.6 Cursor display +================== + +A state may change the appearance of the cursor. Use the variable *note +evil-default-cursor: c. to set the default cursor, and the variables +‘evil-normal-state-cursor’, ‘evil-insert-state-cursor’ etc. to set the +cursors for specific states. The acceptable values for all of them are +the same. + + -- Emacs Lisp Autovariable: evil-default-cursor + + The default cursor. May be a cursor type as per ‘cursor-type’, a + color string as passed to ‘set-cursor-color’, a zero-argument + function for changing the cursor, or a list of the above. + + Default: ‘t’ + + +File: evil.info, Node: Window management, Next: Parenthesis highlighting, Prev: Cursor display, Up: Settings + +2.7 Window management +===================== + + -- Emacs Lisp Autovariable: evil-auto-balance-windows + + If non-nil window creation and deletion trigger rebalancing. + + Default: ‘t’ + + -- Emacs Lisp Autovariable: evil-split-window-below + + If non-nil split windows are created below. + + Default: ‘nil’ + + -- Emacs Lisp Autovariable: evil-vsplit-window-right + + If non-nil vertically split windows with are created to the right. + + Default: ‘nil’ + + +File: evil.info, Node: Parenthesis highlighting, Next: Miscellaneous, Prev: Window management, Up: Settings + +2.8 Parenthesis highlighting +============================ + +These settings concern the integration between Evil and +‘show-paren-mode’. They take no effect if this mode is not enabled. + + -- Emacs Lisp Autovariable: evil-show-paren-range + + The minimal distance between point and a parenthesis which causes + the parenthesis to be highlighted. + + Default: ‘0’ + + -- Emacs Lisp Autovariable: + evil-highlight-closing-paren-at-point-states + + The states in which the closing parenthesis at point should be + highlighted. All states listed here highlight the closing + parenthesis at point (which is Vim’s default behavior). All others + highlight the parenthesis before point (which is Emacs default + behavior). If this list contains the symbol ‘not’ then its meaning + is inverted, i.e. all states listed here highlight the closing + parenthesis before point. + + Default: ‘(not emacs insert replace)’ + + +File: evil.info, Node: Miscellaneous, Prev: Parenthesis highlighting, Up: Settings + +2.9 Miscellaneous +================= + + -- Emacs Lisp Autovariable: evil-want-fine-undo + + Whether actions are undone in several steps. There are two + possible choices: nil (“no”) means that all changes made during + insert state, including a possible delete after a change operation, + are collected in a single undo step. Non-nil (“yes”) means that + undo steps are determined according to Emacs heuristics, and no + attempt is made to aggregate changes. + + For backward compatibility purposes, the value ‘fine’ is + interpreted as ‘nil’. This option was removed because it did not + work consistently. + + Default: ‘nil’ + + -- Emacs Lisp Autovariable: evil-undo-system + + Undo system Evil should use. If equal to ‘undo-tree’ or ‘undo-fu’, + those packages must be installed. If equal to ‘undo-tree’, + ‘undo-tree-mode’ must also be activated. If equal to ‘undo-redo’, + Evil uses commands natively available in Emacs 28. + + Default: ‘nil’ + + -- Emacs Lisp Autovariable: evil-backspace-join-lines + + Whether backward delete in insert state may join lines. + + Default: ‘t’ + + -- Emacs Lisp Autovariable: evil-kbd-macro-suppress-motion-error + + Whether left/right motions signal errors in keyboard macros. This + variable only affects beginning-of-line or end-of-line errors + regarding the motions ‘h’ and ‘SPC’ respectively. This may be + desired since such errors cause macro definition or execution to be + terminated. There are four possibilities: + + - ‘record’: errors are suppressed when recording macros, but not + when replaying them. + + - ‘replay’: errors are suppressed when replaying macros, but not + when recording them. + + - ‘t’: errors are suppressed in both cases. + + - ‘nil’: errors are never suppressed. + + Default: ‘nil’ + + -- Emacs Lisp Autovariable: evil-mode-line-format + + The position of the state tag in the mode line. If set to ‘before’ + or ‘after’, the tag is placed at the beginning or the end of the + mode-line, respectively. If nil, there is no tag. Otherwise it + should be a cons cell ‘(WHERE . WHICH)’, where `WHERE' is either + ‘before’ or ‘after’, and `WHICH' is a symbol in ‘mode-line-format’. + The tag is then placed before or after that symbol, respectively. + + Default: ‘before’ + + -- Emacs Lisp Autovariable: evil-mouse-word + + The `thing-at-point' symbol for double click selection. The + double-click starts visual state in a special word selection mode. + This symbol is used to determine the words to be selected. + Possible values are ‘evil-word’ or ‘evil-WORD’. + + Default: ‘evil-word’ + + -- Emacs Lisp Autovariable: evil-bigword + + The set of characters to be interpreted as WORD boundaries. This + is enclosed with square brackets and used as a regular expression. + By default, whitespace characters are considered WORD boundaries. + + Default: ‘"^ \t\r\n"’, buffer-local + + -- Emacs Lisp Autovariable: evil-esc-delay + + The time, in seconds, to wait for another key after escape. If no + further event arrives during this time, the event is translated to + ‘ESC’. Otherwise, it is translated according to + ‘input-decode-map’. This does not apply in Emacs state, and may + also be inhibited by setting ‘evil-inhibit-esc’. + + Default: ‘0.01’ + + -- Emacs Lisp Autovariable: evil-intercept-esc + + Whether Evil should intercept the escape key. In the terminal, + escape and a meta key sequence both generate the same event. In + order to distingush these, Evil uses ‘input-decode-map’. It is not + necessary to do this in a graphical Emacs session. However, if you + prefer to use ‘C-[’ as escape (which is identical to the terminal + escape key code), this interception must also happen in graphical + Emacs sessions. Set this variable to ‘always’, t (only in the + terminal) or nil (never intercept). + + Default: ‘always’ + + -- Emacs Lisp Autovariable: evil-kill-on-visual-paste + + Whether pasting in visual state adds the replaced text to the kill + ring, making it the default for the next paste. The default, + replicates the default Vim behavior. + + Default: ‘t’ + + -- Emacs Lisp Autovariable: evil-echo-state + + Whether to signal the current state in the echo area. + + Default: ‘t’ + + -- Emacs Lisp Autovariable: evil-complete-all-buffers + + Whether completion looks for matches in all buffers. This applies + to ‘C-n’ and ‘C-p’ in insert state. + + Default: ‘t’ + + +File: evil.info, Node: Keymaps, Next: Hooks, Prev: Settings, Up: Top + +3 Keymaps +********* + +Evil’s key bindings are stored in a number of different keymaps. Each +state has a `global keymap', where the default bindings for that state +are stored. They are named ‘evil-normal-state-map’, +‘evil-insert-state-map’, and so on. The bindings in these maps are +visible in all buffers currently in the corresponding state. + +These keymaps function like ordinary Emacs keymaps and may be modified +using the Emacs function ‘define-key’: + + (define-key evil-normal-state-map (kbd "w") 'some-function) + +This binds the key ‘w’ to the command ‘some-function’ in normal state. +The use of ‘kbd’ is optional for simple key sequences, like this one, +but recommended in general. + +Most of Evil’s bindings are defined in the file ‘evil-maps.el’. + +To facilitate shared keybindings between states, some states may +activate keybindings from other states as well. For example, motion +state bindings are visible in normal and visual state, and normal state +bindings are also visible in visual state. + +Each state also has a `buffer-local keymap' which is specific to the +current buffer, and which takes precedence over the global keymap. +These maps are most suitably modified by a mode hook. They are named +‘evil-normal-state-local-map’, ‘evil-insert-state-local-map’, and so on. + + (add-hook 'some-mode-hook + (lambda () + (define-key evil-normal-state-local-map + (kbd "w") 'some-function))) + +For convenience, the functions *note evil-global-set-key: 1c. and *note +evil-local-set-key: 22. are available for setting global and local state +keys. + + -- Emacs Lisp Autofunction: (evil-global-set-key STATE KEY DEF) + + Bind `KEY' to `DEF' in `STATE'. + + -- Emacs Lisp Autofunction: (evil-local-set-key STATE KEY DEF) + + Bind `KEY' to `DEF' in `STATE' in the current buffer. + +The above examples could therefore have been written as follows: + + (evil-global-set-key 'normal (kbd "w") 'some-function) + + (add-hook 'some-mode-hook + (lambda () + (evil-local-set-key 'normal (kbd "w") 'some-function))) + +* Menu: + +* evil-define-key:: +* Leader keys:: + + +File: evil.info, Node: evil-define-key, Next: Leader keys, Up: Keymaps + +3.1 evil-define-key +=================== + +Evil provides the macro *note evil-define-key: f. for adding state +bindings to ordinary keymaps. It is quite powerful, and is the +preferred method for fine-tuning bindings to activate in specific +circumstances. + + -- Emacs Lisp Autofunction: (evil-define-key STATE KEYMAP KEY DEF + [BINDINGS...]) + + Create a `STATE' binding from `KEY' to `DEF' for `KEYMAP'. `STATE' + is one of ‘normal’, ‘insert’, ‘visual’, ‘replace’, ‘operator’, + ‘motion’, ‘emacs’, or a list of one or more of these. Omitting a + state by using ‘nil’ corresponds to a standard Emacs binding using + ‘define-key’. The remaining arguments are like those of + ‘define-key’. For example: + + (evil-define-key 'normal foo-map "a" 'bar) + + This creates a binding from ‘a’ to ‘bar’ in normal state, which is + active whenever ‘foo-map’ is active. Using nil for the state, the + following lead to identical bindings: + + (evil-define-key nil foo-map "a" 'bar) + (define-key foo-map "a" 'bar) + + It is possible to specify multiple states and/or bindings at once: + + (evil-define-key '(normal visual) foo-map + "a" 'bar + "b" 'foo) + + If ‘foo-map’ has not been initialized yet, this macro adds an entry + to ‘after-load-functions’, delaying execution as necessary. + + `KEYMAP' may also be a quoted symbol. If the symbol is ‘global’, + the global evil keymap corresponding to the state(s) is used, + meaning the following lead to identical bindings: + + (evil-define-key 'normal 'global "a" 'bar) + (evil-global-set-key 'normal "a" 'bar) + + The symbol ‘local’ may also be used, which corresponds to using + *note evil-local-set-key: 22. If a quoted symbol is used that is + not ‘global’ or ‘local’, it is assumed to be the name of a minor + mode, in which case ‘evil-define-minor-mode-key’ is used. + +There follows a brief overview of the main functions of this macro. + + - Define a binding in a given state + + (evil-define-key 'state 'global (kbd "key") 'target) + + - Define a binding in a given state in the current buffer + + (evil-define-key 'state 'local (kbd "key") 'target) + + - Define a binding in a given state under the `foo-mode' major mode. + + (evil-define-key 'state foo-mode-map (kbd "key") 'target) + + Note that ‘foo-mode-map’ is unquoted, and that this form is safe + before ‘foo-mode-map’ is loaded. + + - Define a binding in a given state under the `bar-mode' minor mode. + + (evil-define-key 'state 'bar-mode (kbd "key") 'target) + + Note that ‘bar-mode’ is quoted, and that this form is safe before + ‘bar-mode’ is loaded. + +The macro *note evil-define-key: f. can be used to augment existing +modes with state bindings, as well as creating packages with custom +bindings. For example, the following will create a minor mode +‘foo-mode’ with normal state bindings for the keys ‘w’ and ‘e’: + + (define-minor-mode foo-mode + "Foo mode." + :keymap (make-sparse-keymap)) + + (evil-define-key 'normal 'foo-mode "w" 'bar) + (evil-define-key 'normal 'foo-mode "e" 'baz) + +This minor mode can then be enabled in any buffers where the custom +bindings are desired: + + (add-hook 'text-mode-hook 'foo-mode) ; enable alongside text-mode + + +File: evil.info, Node: Leader keys, Prev: evil-define-key, Up: Keymaps + +3.2 Leader keys +=============== + +Evil supports a simple implementation of Vim’s `leader' keys. To bind a +function to a leader key you can use the expression ‘<leader>’ in a key +mapping, e.g. + + (evil-define-key 'normal 'global (kbd "<leader>fs") 'save-buffer) + +Likewise, you can use the expression ‘<localleader>’ to mimic Vim’s +local leader, which is designed for mode-specific key bindings. + +You can use the function *note evil-set-leader: 31. to designate which +key acts as the leader and the local leader. + + -- Emacs Lisp Autofunction: (evil-set-leader STATE KEY [LOCALLEADER]) + + Set `KEY' to trigger leader bindings in `STATE'. `KEY' should be in + the form produced by ‘kbd’. `STATE' is one of ‘normal’, ‘insert’, + ‘visual’, ‘replace’, ‘operator’, ‘motion’, ‘emacs’, a list of one + or more of these, or ‘nil’, which means all of the above. If + `LOCALLEADER' is non-nil, set the local leader instead. + + +File: evil.info, Node: Hooks, Next: Extension, Prev: Keymaps, Up: Top + +4 Hooks +******* + +A `hook' is a list of functions that are executed when certain events +happen. Hooks are modified with the Emacs function ‘add-hook’. Evil +provides entry and exit hooks for all its states. For example, when +switching from normal state to insert state, all functions in +‘evil-normal-state-exit-hook’ and ‘evil-insert-state-entry-hook’ are +executed. + +It is guaranteed that the exit hook will be executed before the entry +hook on all state switches. + +During the hook execution, the variables ‘evil-next-state’ and +‘evil-previous-state’ contain information about the states being +switched to and from, respectively. + + +File: evil.info, Node: Extension, Next: Frequently Asked Questions, Prev: Hooks, Up: Top + +5 Extension +*********** + +The main functionality of Evil is implemented in terms of reusable +macros. Package writers can use these to define new commands. + +* Menu: + +* Motions:: +* Operators:: +* Text objects:: +* Range types:: +* States:: + + +File: evil.info, Node: Motions, Next: Operators, Up: Extension + +5.1 Motions +=========== + +A `motion' is a command which moves the cursor, such as ‘w’ or ‘e’. +Motions are defined with the macro *note evil-define-motion: 10. +Motions not defined in this way should be declared with *note +evil-declare-motion: 9. + + -- Emacs Lisp Autofunction: (evil-declare-motion COMMAND) + + Declare `COMMAND' to be a movement function. This ensures that it + behaves correctly in visual state. + + -- Emacs Lisp Autofunction: (evil-define-motion MOTION (COUNT ARGS...) + DOC [[KEY VALUE]...] BODY...) + + Define a motion command `MOTION'. `ARGS' is a list of arguments. + Motions can have any number of arguments, but the first (if any) + has the predefined meaning of count. `BODY' must execute the + motion by moving point. + + Optional keyword arguments are: + + - ‘:type’ - determines how the motion works after an operator + (one of ‘inclusive’, ‘line’, ‘block’ and ‘exclusive’, or a + self-defined motion type) + + - ‘:jump’ - if non-nil, the previous position is stored in the + jump list, so that it can be restored with ‘C-o’ + +For example, this is a motion that moves the cursor forward by a number +of characters: + + (evil-define-motion foo-forward (count) + "Move to the right by COUNT characters." + :type inclusive + (forward-char (or count 1))) + +The `type' of a motion determines how it works when used together with +an operator. Inclusive motions include the endpoint in the range being +operated on, while exclusive motions do not. Line motions extend the +whole range to linewise positions, effectively behaving as if the +endpoint were really at the end of the line. Blockwise ranges behave as +a “rectangle” on screen rather than a contiguous range of characters. + + +File: evil.info, Node: Operators, Next: Text objects, Prev: Motions, Up: Extension + +5.2 Operators +============= + +An operator is a command that acts on the text moved over by a motion, +such as ‘c’ (change), ‘d’ (delete) or ‘y’ (yank or copy, not to be +confused with “yank” in Emacs terminology which means `paste'). + + -- Emacs Lisp Autofunction: (evil-define-operator OPERATOR (BEG END + ARGS...) DOC [[KEY VALUE]...] BODY...) + + Define an operator command `OPERATOR'. The operator acts on the + range of characters `BEG' through `END'. `BODY' must execute the + operator by potentially manipulating the buffer contents, or + otherwise causing side effects to happen. + + Optional keyword arguments are: + + - ‘:type’ - force the input range to be of a given type + (‘inclusive’, ‘line’, ‘block’, and ‘exclusive’, or a + self-defined motion type). + + - ‘:motion’ - use a predetermined motion instead of waiting for + one from the keyboard. This does not affect the behavior in + visual state, where selection boundaries are always used. + + - ‘:repeat’ - if non-nil (default), then ‘.’ will repeat the + operator. + + - ‘:move-point’ - if non-nil (default), the cursor will be moved + to the beginning of the range before the body executes + + - ‘:keep-visual’ - if non-nil, the selection is not disabled + when the operator is executed in visual state. By default, + visual state is exited automatically. + +For example, this is an operator that performs ROT13 encryption on the +text under consideration: + + (evil-define-operator evil-rot13 (beg end) + "ROT13 encrypt text." + (rot13-region beg end)) + +Binding this to ‘g?’ (where it is by default) will cause a key sequence +such as ‘g?w’ to encrypt from the current cursor to the end of the word. + + +File: evil.info, Node: Text objects, Next: Range types, Prev: Operators, Up: Extension + +5.3 Text objects +================ + +Text objects are like motions in that they define a range over which an +operator may act. Unlike motions, text objects can set both a beginning +and an endpoint. In visual state, text objects alter both ends of the +selection. + +Text objects are not directly usable in normal state. Instead, they are +bound in the two keymaps ‘evil-inner-text-ojects-map’ and +‘evil-outer-text-objects-map’, which are available in visual and +operator-pending state under the keys ‘i’ and ‘a’ respectively. + + -- Emacs Lisp Autofunction: (evil-define-text-object OBJECT (COUNT) DOC + [[KEY VALUE]...] BODY...) + + Define a text object command `OBJECT'. `BODY' should return a range + ‘(BEG END)’ to the right of point if `COUNT' is positive, and to + the left of it if negative. + + Optional keyword arguments: + + - ‘:type’ - determines how the range applies after an operator + (‘inclusive’, ‘line’, ‘block’, and ‘exclusive’, or a + self-defined motion type). + + - ‘:extend-selection’ - if non-nil (default), the text object + always enlarges the current selection. Otherwise, it replaces + the current selection. + +For eample, this is a text object which selects the next three +characters after the current location: + + (evil-define-text-object foo (count) + "Select three characters." + (list (point) (+ 3 (point)))) + +For convenience, Evil provides several functions returning a list of +positions which can be used for defining text objects. All of them +follow the convention that a positive `count' selects text after the +current location, while negative `count' selects text before it. + + Note: The `thingatpt' library is used quite extensively in Evil to + define text objects, and this dependency leaks through in the + following functions. A `thing' in this context is any symbol for + which there is a function called ‘forward-THING’ (1) which moves + past a number of `things'. + + -- Emacs Lisp Autofunction: (evil-select-inner-object THING BEG END + TYPE [COUNT LINE]) + + Return an inner text object range of `COUNT' objects. If `COUNT' + is positive, return objects following point; if `COUNT' is + negative, return objects preceding point. If one is unspecified, + the other is used with a negative argument. `THING' is a symbol + understood by `thing-at-point'. `BEG', `END' and `TYPE' specify + the current selection. If `LINE' is non-nil, the text object + should be linewise, otherwise it is character wise. + + -- Emacs Lisp Autofunction: (evil-select-an-object THING BEG END TYPE + COUNT [LINE]) + + Return an outer text object range of `COUNT' objects. If `COUNT' + is positive, return objects following point; if `COUNT' is + negative, return objects preceding point. If one is unspecified, + the other is used with a negative argument. `THING' is a symbol + understood by `thing-at-point'. `BEG', `END' and `TYPE' specify + the current selection. If `LINE' is non-nil, the text object + should be linewise, otherwise it is character wise. + + -- Emacs Lisp Autofunction: (evil-select-paren OPEN CLOSE BEG END TYPE + COUNT [INCLUSIVE]) + + Return a range ‘(BEG END)’ of `COUNT' delimited text objects. + `OPEN' and `CLOSE' specify the opening and closing delimiter, + respectively. `BEG' `END' `TYPE' are the currently selected + (visual) range. If `INCLUSIVE' is non-nil, `OPEN' and `CLOSE' are + included in the range; otherwise they are excluded. + + The types of `OPEN' and `CLOSE' specify which kind of THING is used + for parsing with ‘evil-select-block’. If `OPEN' and `CLOSE' are + characters ‘evil-up-paren’ is used. Otherwise `OPEN' and `CLOSE' + must be regular expressions and ‘evil-up-block’ is used. + + If the selection is exclusive, whitespace at the end or at the + beginning of the selection until the end-of-line or + beginning-of-line is ignored. + + ---------- Footnotes ---------- + + (1) (1) There are many more ways that a `thing' can be defined, but +the definition of ‘forward-THING’ is perhaps the most straightforward +way to go about it. + + +File: evil.info, Node: Range types, Next: States, Prev: Text objects, Up: Extension + +5.4 Range types +=============== + +A `type' is a transformation acting on a pair of buffer positions. Evil +defines the types ‘inclusive’, ‘line’, ‘block’ and ‘exclusive’, which +are used for motion ranges and visual selection. New types may be +defined with the macro `evil-define-type'. + + -- Emacs Lisp Autofunction: (evil-define-type TYPE DOC [[KEY FUNC]...]) + + Define type `TYPE'. `DOC' is a general description and shows up in + all docstrings. + + Optional keyword arguments: + + - ‘:expand’ - expansion function. This function should accept + two positions in the current buffer, BEG and END,and return a + pair of expanded buffer positions. + + - ‘:contract’ - the opposite of ‘:expand’. Optional. + + - ‘:one-to-one’ - non-nil if expansion is one-to-one. This + means that ‘:expand’ followed by ‘:contract’ always return the + original range. + + - ‘:normalize’ - normalization function. This function should + accept two unexpanded positions and adjust them before + expansion. May be used to deal with buffer boundaries. + + - ‘:string’ - description function. Takes two buffer positions + and returns a human-readable string. For example “2 lines” + + If further keywords and functions are specified, they are assumed + to be transformations on buffer positions, like ‘:expand’ and + ‘:contract’. + + +File: evil.info, Node: States, Prev: Range types, Up: Extension + +5.5 States +========== + +States are defined with the macro *note evil-define-state: 12, which +takes care to define the necessary hooks, keymaps and variables, as well +as a toggle function ‘evil-NAME-state’ and a predicate function +‘evil-NAME-state-p’ for checking whether the state is active. + + -- Emacs Lisp Autofunction: (evil-define-state STATE DOC [[KEY VAL]...] + BODY...) + + Define an Evil state `STATE'. `DOC' is a general description and + shows up in all docstrings; the first line of the string should be + the full name of the state. + + `BODY' is executed each time the state is enabled or disabled. + + Optional keyword arguments: + + - ‘:tag’ - the mode line indicator, e.g. “<T>”. + + - ‘:message’ - string shown in the echo area when the state is + activated. + + - ‘:cursor’ - default cursor specification. + + - ‘:enable’ - list of other state keymaps to enable when in this + state. + + - ‘:entry-hook’ - list of functions to run when entering this + state. + + - ‘:exit-hook’ - list of functions to run when exiting this + state. + + - ‘:suppress-keymap’ - if non-nil, effectively disables bindings + to ‘self-insert-command’ by making ‘evil-suppress-map’ the + parent of the global state keymap. + + The global keymap of this state will be ‘evil-test-state-map’, the + local keymap will be ‘evil-test-state-local-map’, and so on. + +For example: + + (evil-define-state test + "Test state." + :tag " <T> " + (message (if (evil-test-state-p) + "Enabling test state." + "Disabling test state."))) + + +File: evil.info, Node: Frequently Asked Questions, Next: Internals, Prev: Extension, Up: Top + +6 Frequently Asked Questions +**************************** + +* Menu: + +* Problems with the escape key in the terminal:: +* Underscore is not a word character:: + + +File: evil.info, Node: Problems with the escape key in the terminal, Next: Underscore is not a word character, Up: Frequently Asked Questions + +6.1 Problems with the escape key in the terminal +================================================ + +A common problem when using Evil in terminal mode is a certain delay +after pressing the escape key. Even more, when pressing the escape key +followed quickly by another key the command is recognized as ‘M-<key>’ +instead of two separate keys: ‘ESC’ followed by ‘<key>’. In fact, it is +perfectly valid to simulate ‘M-<key>’ by pressing ‘ESC <key>’ quickly +(but see below). + +The reason for this is that in terminal mode a key sequence involving +the meta key (or alt key) always generates a so called “escape +sequence”, i.e. a sequence of two events sent to Emacs, the first being +‘ESC’ and the second the key pressed simultaneously. The problem is +that pressing the escape key itself also generates the ‘ESC’ event. +Thus, if Emacs (and therefore Evil) receives an ‘ESC’ event there is no +way to tell whether the escape key has been pressed (and no further +event will arrive) or a ‘M-<key>’ combination has been pressed (and the +‘<key>’ event will arrive soon). In order to distinguish both +situations Evil does the following. After receiving an ‘ESC’ event Evil +waits for a short time period (specified by the variable *note +evil-esc-delay: 17. which defaults to 0.01 seconds) for another event. +If no other event arrives Evil assumes that the plain escape key has +been pressed, otherwise it assumes a ‘M-<key>’ combination has been +pressed and combines the ‘ESC’ event with the second one. Because a +‘M-<key>’ sequence usually generates both events in very quick +succession, 0.01 seconds are usually enough and the delay is hardly +noticeable by the user. + +If you use a terminal multiplexer like `tmux' or `screen' the situation +may be worse. These multiplexers have exactly the same problem +recognizing ‘M-<key>’ sequences and often introduce their own delay for +the ‘ESC’ key. There is no way for Evil to influence this delay. In +order to reduce it you must reconfigure your terminal multiplexer. + +Note that this problem should not arise when using Evil in graphical +mode. The reason is that in this case the escape key itself generates a +different command, namely ‘escape’ (a symbol) and hence Evil can +distinguish whether the escape key or a ‘M-<key>’ combination has been +pressed. But this also implies that pressing ‘ESC’ followed by <key> +cannot be used to simulate ‘M-<key>’ in graphical mode! + + +File: evil.info, Node: Underscore is not a word character, Prev: Problems with the escape key in the terminal, Up: Frequently Asked Questions + +6.2 Underscore is not a word character +====================================== + +An underscore ‘_’ is a word character in Vim. This means that word +motions like ‘w’ skip over underlines in a sequence of letters as if it +was a letter itself. In contrast, in Evil the underscore is often a +non-word character like operators, e.g. ‘+’. + +The reason is that Evil uses Emacs’ definition of a word and this +definition does often not include the underscore. In Emacs word +characters are determined by the syntax-class of the buffer. The +syntax-class usually depends on the major-mode of this buffer. This has +the advantage that the definition of a “word” may be adapted to the +particular type of document being edited. Evil uses Emacs’ definition +and does not simply use Vim’s definition in order to be consistent with +other Emacs functions. For example, word characters are exactly those +characters that are matched by the regular expression character class +‘[:word:]’. + +If you want the underscore to be recognised as word character, you can +modify its entry in the syntax-table: + + (modify-syntax-entry ?_ "w") + +This gives the underscore the ‘word’ syntax class. You can use a +mode-hook to modify the syntax-table in all buffers of some mode, e.g.: + + (add-hook 'c-mode-common-hook + (lambda () (modify-syntax-entry ?_ "w"))) + +This gives the underscore the word syntax-class in all C-like buffers. + +Alternatively, many find that motion by `symbols' is more convenient +than motion by `words'. One way to make word motions operate as symbol +motions is to alias the ‘evil-word’ `thing' (1) to the ‘evil-symbol’ +thing: + + (defalias 'forward-evil-word 'forward-evil-symbol) + + ---------- Footnotes ---------- + + (1) (1) Many of Evil’s text objects and motions are defined in terms +of the `thingatpt' library, which in this case are defined entirely in +terms of ‘forward-THING’ functions. Thus aliasing one to another should +make all motions and text objects implemented in terms of that `thing' +behave the same. + + +File: evil.info, Node: Internals, Next: The GNU Free Documentation License, Prev: Frequently Asked Questions, Up: Top + +7 Internals +*********** + +* Menu: + +* Command properties:: + + +File: evil.info, Node: Command properties, Up: Internals + +7.1 Command properties +====================== + +Evil defines `command properties' to store information about commands +(1), such as whether they should be repeated. A command property is a +‘:keyword’ with an associated value, e.g. ‘:repeat nil’. + + -- Emacs Lisp Autofunction: (evil-add-command-properties COMMAND + [PROPERTIES...]) + + Add `PROPERTIES' to `COMMAND'. `PROPERTIES' should be a property + list. To replace all properties at once, use *note + evil-set-command-properties: 2f. + + -- Emacs Lisp Autofunction: (evil-set-command-properties COMMAND + [PROPERTIES...]) + + Replace all of `COMMAND'’s properties with `PROPERTIES'. + `PROPERTIES' should be a property list. This erases all previous + properties; to only add properties, use + ‘evil-set-command-property’. + + -- Emacs Lisp Autofunction: (evil-get-command-properties COMMAND) + + Return all Evil properties of `COMMAND'. See also *note + evil-get-command-property: 1b. + + -- Emacs Lisp Autofunction: (evil-get-command-property COMMAND PROPERTY + [DEFAULT]) + + Return the value of Evil `PROPERTY' of `COMMAND'. If the command + does not have the property, return `DEFAULT'. See also *note + evil-get-command-properties: 1a. + + -- Emacs Lisp Autofunction: (evil-define-command COMMAND (ARGS...) DOC + [[KEY VALUE]...] BODY...) + + Define a command `COMMAND'. + +For setting repeat properties, use the following functions: + + -- Emacs Lisp Autofunction: (evil-declare-repeat COMMAND) + + Declare `COMMAND' to be repeatable. + + -- Emacs Lisp Autofunction: (evil-declare-not-repeat COMMAND) + + Declare `COMMAND' to be nonrepeatable. + + -- Emacs Lisp Autofunction: (evil-declare-change-repeat COMMAND) + + Declare `COMMAND' to be repeatable by buffer changes rather than + keystrokes. + + ---------- Footnotes ---------- + + (1) (1) In this context, a `command' may mean any Evil motion, text +object, operator or indeed other Emacs commands, which have not been +defined through the Evil machinery. + + +File: evil.info, Node: The GNU Free Documentation License, Next: Emacs lisp functions and variables, Prev: Internals, Up: Top + +8 The GNU Free Documentation License +************************************ + +Version 1.3, 3 November 2008 + + Copyright (c) 2000, 2001, 2002, 2007, 2008 Free Software + Foundation, Inc. ‘http://fsf.org/’ + + Everyone is permitted to copy and distribute verbatim copies of + this license document, but changing it is not allowed. + + 0. PREAMBLE + + The purpose of this License is to make a manual, textbook, or other + functional and useful document `free' in the sense of freedom: to + assure everyone the effective freedom to copy and redistribute it, + with or without modifying it, either commercially or + noncommercially. Secondarily, this License preserves for the + author and publisher a way to get credit for their work, while not + being considered responsible for modifications made by others. + + This License is a kind of “copyleft”, which means that derivative + works of the document must themselves be free in the same sense. + It complements the GNU General Public License, which is a copyleft + license designed for free software. + + We have designed this License in order to use it for manuals for + free software, because free software needs free documentation: a + free program should come with manuals providing the same freedoms + that the software does. But this License is not limited to + software manuals; it can be used for any textual work, regardless + of subject matter or whether it is published as a printed book. We + recommend this License principally for works whose purpose is + instruction or reference. + + 1. APPLICABILITY AND DEFINITIONS + + This License applies to any manual or other work, in any medium, + that contains a notice placed by the copyright holder saying it can + be distributed under the terms of this License. Such a notice + grants a world-wide, royalty-free license, unlimited in duration, + to use that work under the conditions stated herein. The + “Document”, below, refers to any such manual or work. Any member + of the public is a licensee, and is addressed as “you”. You accept + the license if you copy, modify or distribute the work in a way + requiring permission under copyright law. + + A “Modified Version” of the Document means any work containing the + Document or a portion of it, either copied verbatim, or with + modifications and/or translated into another language. + + A “Secondary Section” is a named appendix or a front-matter section + of the Document that deals exclusively with the relationship of the + publishers or authors of the Document to the Document’s overall + subject (or to related matters) and contains nothing that could + fall directly within that overall subject. (Thus, if the Document + is in part a textbook of mathematics, a Secondary Section may not + explain any mathematics.) The relationship could be a matter of + historical connection with the subject or with related matters, or + of legal, commercial, philosophical, ethical or political position + regarding them. + + The “Invariant Sections” are certain Secondary Sections whose + titles are designated, as being those of Invariant Sections, in the + notice that says that the Document is released under this License. + If a section does not fit the above definition of Secondary then it + is not allowed to be designated as Invariant. The Document may + contain zero Invariant Sections. If the Document does not identify + any Invariant Sections then there are none. + + The “Cover Texts” are certain short passages of text that are + listed, as Front-Cover Texts or Back-Cover Texts, in the notice + that says that the Document is released under this License. A + Front-Cover Text may be at most 5 words, and a Back-Cover Text may + be at most 25 words. + + A “Transparent” copy of the Document means a machine-readable copy, + represented in a format whose specification is available to the + general public, that is suitable for revising the document + straightforwardly with generic text editors or (for images composed + of pixels) generic paint programs or (for drawings) some widely + available drawing editor, and that is suitable for input to text + formatters or for automatic translation to a variety of formats + suitable for input to text formatters. A copy made in an otherwise + Transparent file format whose markup, or absence of markup, has + been arranged to thwart or discourage subsequent modification by + readers is not Transparent. An image format is not Transparent if + used for any substantial amount of text. A copy that is not + “Transparent” is called “Opaque”. + + Examples of suitable formats for Transparent copies include plain + ASCII without markup, Texinfo input format, LaTeX input format, + SGML or XML using a publicly available DTD, and standard-conforming + simple HTML, PostScript or PDF designed for human modification. + Examples of transparent image formats include PNG, XCF and JPG. + Opaque formats include proprietary formats that can be read and + edited only by proprietary word processors, SGML or XML for which + the DTD and/or processing tools are not generally available, and + the machine-generated HTML, PostScript or PDF produced by some word + processors for output purposes only. + + The “Title Page” means, for a printed book, the title page itself, + plus such following pages as are needed to hold, legibly, the + material this License requires to appear in the title page. For + works in formats which do not have any title page as such, “Title + Page” means the text near the most prominent appearance of the + work’s title, preceding the beginning of the body of the text. + + The “publisher” means any person or entity that distributes copies + of the Document to the public. + + A section “Entitled XYZ” means a named subunit of the Document + whose title either is precisely XYZ or contains XYZ in parentheses + following text that translates XYZ in another language. (Here XYZ + stands for a specific section name mentioned below, such as + “Acknowledgements”, “Dedications”, “Endorsements”, or “History”.) + To “Preserve the Title” of such a section when you modify the + Document means that it remains a section “Entitled XYZ” according + to this definition. + + The Document may include Warranty Disclaimers next to the notice + which states that this License applies to the Document. These + Warranty Disclaimers are considered to be included by reference in + this License, but only as regards disclaiming warranties: any other + implication that these Warranty Disclaimers may have is void and + has no effect on the meaning of this License. + + 2. VERBATIM COPYING + + You may copy and distribute the Document in any medium, either + commercially or noncommercially, provided that this License, the + copyright notices, and the license notice saying this License + applies to the Document are reproduced in all copies, and that you + add no other conditions whatsoever to those of this License. You + may not use technical measures to obstruct or control the reading + or further copying of the copies you make or distribute. However, + you may accept compensation in exchange for copies. If you + distribute a large enough number of copies you must also follow the + conditions in section 3. + + You may also lend copies, under the same conditions stated above, + and you may publicly display copies. + + 3. COPYING IN QUANTITY + + If you publish printed copies (or copies in media that commonly + have printed covers) of the Document, numbering more than 100, and + the Document’s license notice requires Cover Texts, you must + enclose the copies in covers that carry, clearly and legibly, all + these Cover Texts: Front-Cover Texts on the front cover, and + Back-Cover Texts on the back cover. Both covers must also clearly + and legibly identify you as the publisher of these copies. The + front cover must present the full title with all words of the title + equally prominent and visible. You may add other material on the + covers in addition. Copying with changes limited to the covers, as + long as they preserve the title of the Document and satisfy these + conditions, can be treated as verbatim copying in other respects. + + If the required texts for either cover are too voluminous to fit + legibly, you should put the first ones listed (as many as fit + reasonably) on the actual cover, and continue the rest onto + adjacent pages. + + If you publish or distribute Opaque copies of the Document + numbering more than 100, you must either include a machine-readable + Transparent copy along with each Opaque copy, or state in or with + each Opaque copy a computer-network location from which the general + network-using public has access to download using public-standard + network protocols a complete Transparent copy of the Document, free + of added material. If you use the latter option, you must take + reasonably prudent steps, when you begin distribution of Opaque + copies in quantity, to ensure that this Transparent copy will + remain thus accessible at the stated location until at least one + year after the last time you distribute an Opaque copy (directly or + through your agents or retailers) of that edition to the public. + + It is requested, but not required, that you contact the authors of + the Document well before redistributing any large number of copies, + to give them a chance to provide you with an updated version of the + Document. + + 4. MODIFICATIONS + + You may copy and distribute a Modified Version of the Document + under the conditions of sections 2 and 3 above, provided that you + release the Modified Version under precisely this License, with the + Modified Version filling the role of the Document, thus licensing + distribution and modification of the Modified Version to whoever + possesses a copy of it. In addition, you must do these things in + the Modified Version: + + A. Use in the Title Page (and on the covers, if any) a title + distinct from that of the Document, and from those of previous + versions (which should, if there were any, be listed in the + History section of the Document). You may use the same title + as a previous version if the original publisher of that + version gives permission. + + B. List on the Title Page, as authors, one or more persons or + entities responsible for authorship of the modifications in + the Modified Version, together with at least five of the + principal authors of the Document (all of its principal + authors, if it has fewer than five), unless they release you + from this requirement. + + C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. + + D. Preserve all the copyright notices of the Document. + + E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. + + F. Include, immediately after the copyright notices, a license + notice giving the public permission to use the Modified + Version under the terms of this License, in the form shown in + the Addendum below. + + G. Preserve in that license notice the full lists of Invariant + Sections and required Cover Texts given in the Document’s + license notice. + + H. Include an unaltered copy of this License. + + I. Preserve the section Entitled “History”, Preserve its Title, + and add to it an item stating at least the title, year, new + authors, and publisher of the Modified Version as given on the + Title Page. If there is no section Entitled “History” in the + Document, create one stating the title, year, authors, and + publisher of the Document as given on its Title Page, then add + an item describing the Modified Version as stated in the + previous sentence. + + J. Preserve the network location, if any, given in the Document + for public access to a Transparent copy of the Document, and + likewise the network locations given in the Document for + previous versions it was based on. These may be placed in the + “History” section. You may omit a network location for a work + that was published at least four years before the Document + itself, or if the original publisher of the version it refers + to gives permission. + + K. For any section Entitled “Acknowledgements” or “Dedications”, + Preserve the Title of the section, and preserve in the section + all the substance and tone of each of the contributor + acknowledgements and/or dedications given therein. + + L. Preserve all the Invariant Sections of the Document, unaltered + in their text and in their titles. Section numbers or the + equivalent are not considered part of the section titles. + + M. Delete any section Entitled “Endorsements”. Such a section + may not be included in the Modified Version. + + N. Do not retitle any existing section to be Entitled + “Endorsements” or to conflict in title with any Invariant + Section. + + O. Preserve any Warranty Disclaimers. + + If the Modified Version includes new front-matter sections or + appendices that qualify as Secondary Sections and contain no + material copied from the Document, you may at your option designate + some or all of these sections as invariant. To do this, add their + titles to the list of Invariant Sections in the Modified Version’s + license notice. These titles must be distinct from any other + section titles. + + You may add a section Entitled “Endorsements”, provided it contains + nothing but endorsements of your Modified Version by various + parties—for example, statements of peer review or that the text has + been approved by an organization as the authoritative definition of + a standard. + + You may add a passage of up to five words as a Front-Cover Text, + and a passage of up to 25 words as a Back-Cover Text, to the end of + the list of Cover Texts in the Modified Version. Only one passage + of Front-Cover Text and one of Back-Cover Text may be added by (or + through arrangements made by) any one entity. If the Document + already includes a cover text for the same cover, previously added + by you or by arrangement made by the same entity you are acting on + behalf of, you may not add another; but you may replace the old + one, on explicit permission from the previous publisher that added + the old one. + + The author(s) and publisher(s) of the Document do not by this + License give permission to use their names for publicity for or to + assert or imply endorsement of any Modified Version. + + 5. COMBINING DOCUMENTS + + You may combine the Document with other documents released under + this License, under the terms defined in section 4 above for + modified versions, provided that you include in the combination all + of the Invariant Sections of all of the original documents, + unmodified, and list them all as Invariant Sections of your + combined work in its license notice, and that you preserve all + their Warranty Disclaimers. + + The combined work need only contain one copy of this License, and + multiple identical Invariant Sections may be replaced with a single + copy. If there are multiple Invariant Sections with the same name + but different contents, make the title of each such section unique + by adding at the end of it, in parentheses, the name of the + original author or publisher of that section if known, or else a + unique number. Make the same adjustment to the section titles in + the list of Invariant Sections in the license notice of the + combined work. + + In the combination, you must combine any sections Entitled + “History” in the various original documents, forming one section + Entitled “History”; likewise combine any sections Entitled + “Acknowledgements”, and any sections Entitled “Dedications”. You + must delete all sections Entitled “Endorsements.” + + 6. COLLECTIONS OF DOCUMENTS + + You may make a collection consisting of the Document and other + documents released under this License, and replace the individual + copies of this License in the various documents with a single copy + that is included in the collection, provided that you follow the + rules of this License for verbatim copying of each of the documents + in all other respects. + + You may extract a single document from such a collection, and + distribute it individually under this License, provided you insert + a copy of this License into the extracted document, and follow this + License in all other respects regarding verbatim copying of that + document. + + 7. AGGREGATION WITH INDEPENDENT WORKS + + A compilation of the Document or its derivatives with other + separate and independent documents or works, in or on a volume of a + storage or distribution medium, is called an “aggregate” if the + copyright resulting from the compilation is not used to limit the + legal rights of the compilation’s users beyond what the individual + works permit. When the Document is included in an aggregate, this + License does not apply to the other works in the aggregate which + are not themselves derivative works of the Document. + + If the Cover Text requirement of section 3 is applicable to these + copies of the Document, then if the Document is less than one half + of the entire aggregate, the Document’s Cover Texts may be placed + on covers that bracket the Document within the aggregate, or the + electronic equivalent of covers if the Document is in electronic + form. Otherwise they must appear on printed covers that bracket + the whole aggregate. + + 8. TRANSLATION + + Translation is considered a kind of modification, so you may + distribute translations of the Document under the terms of section + 4. Replacing Invariant Sections with translations requires special + permission from their copyright holders, but you may include + translations of some or all Invariant Sections in addition to the + original versions of these Invariant Sections. You may include a + translation of this License, and all the license notices in the + Document, and any Warranty Disclaimers, provided that you also + include the original English version of this License and the + original versions of those notices and disclaimers. In case of a + disagreement between the translation and the original version of + this License or a notice or disclaimer, the original version will + prevail. + + If a section in the Document is Entitled “Acknowledgements”, + “Dedications”, or “History”, the requirement (section 4) to + Preserve its Title (section 1) will typically require changing the + actual title. + + 9. TERMINATION + + You may not copy, modify, sublicense, or distribute the Document + except as expressly provided under this License. Any attempt + otherwise to copy, modify, sublicense, or distribute it is void, + and will automatically terminate your rights under this License. + + However, if you cease all violation of this License, then your + license from a particular copyright holder is reinstated (a) + provisionally, unless and until the copyright holder explicitly and + finally terminates your license, and (b) permanently, if the + copyright holder fails to notify you of the violation by some + reasonable means prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is + reinstated permanently if the copyright holder notifies you of the + violation by some reasonable means, this is the first time you have + received notice of violation of this License (for any work) from + that copyright holder, and you cure the violation prior to 30 days + after your receipt of the notice. + + Termination of your rights under this section does not terminate + the licenses of parties who have received copies or rights from you + under this License. If your rights have been terminated and not + permanently reinstated, receipt of a copy of some or all of the + same material does not give you any rights to use it. + + 10. FUTURE REVISIONS OF THIS LICENSE + + The Free Software Foundation may publish new, revised versions of + the GNU Free Documentation License from time to time. Such new + versions will be similar in spirit to the present version, but may + differ in detail to address new problems or concerns. See + ‘http://www.gnu.org/copyleft’. + + Each version of the License is given a distinguishing version + number. If the Document specifies that a particular numbered + version of this License “or any later version” applies to it, you + have the option of following the terms and conditions either of + that specified version or of any later version that has been + published (not as a draft) by the Free Software Foundation. If the + Document does not specify a version number of this License, you may + choose any version ever published (not as a draft) by the Free + Software Foundation. If the Document specifies that a proxy can + decide which future versions of this License can be used, that + proxy’s public statement of acceptance of a version permanently + authorizes you to choose that version for the Document. + + 11. RELICENSING + + “Massive Multiauthor Collaboration Site” (or “MMC Site”) means any + World Wide Web server that publishes copyrightable works and also + provides prominent facilities for anybody to edit those works. A + public wiki that anybody can edit is an example of such a server. + A “Massive Multiauthor Collaboration” (or “MMC”) contained in the + site means any set of copyrightable works thus published on the MMC + site. + + “CC-BY-SA” means the Creative Commons Attribution-Share Alike 3.0 + license published by Creative Commons Corporation, a not-for-profit + corporation with a principal place of business in San Francisco, + California, as well as future copyleft versions of that license + published by that same organization. + + “Incorporate” means to publish or republish a Document, in whole or + in part, as part of another Document. + + An MMC is “eligible for relicensing” if it is licensed under this + License, and if all works that were first published under this + License somewhere other than this MMC, and subsequently + incorporated in whole or in part into the MMC, (1) had no cover + texts or invariant sections, and (2) were thus incorporated prior + to November 1, 2008. + + The operator of an MMC Site may republish an MMC contained in the + site under CC-BY-SA on the same site at any time before August 1, + 2009, provided the MMC is eligible for relicensing. + + +File: evil.info, Node: Emacs lisp functions and variables, Prev: The GNU Free Documentation License, Up: Top + +Emacs lisp functions and variables +********************************** + +* Menu: + +* evil-add-command-properties: 0. +* evil-auto-balance-windows: 1. +* evil-auto-indent: 2. +* evil-backspace-join-lines: 3. +* evil-bigword: 4. +* evil-buffer-regexps: 5. +* evil-complete-all-buffers: 6. +* evil-cross-lines: 7. +* evil-declare-change-repeat: 8. +* evil-declare-motion: 9. +* evil-declare-not-repeat: a. +* evil-declare-repeat: b. +* evil-default-cursor: c. +* evil-default-state: d. +* evil-define-command: e. +* evil-define-key: f. +* evil-define-motion: 10. +* evil-define-operator: 11. +* evil-define-state: 12. +* evil-define-text-object: 13. +* evil-define-type: 14. +* evil-disable-insert-state-bindings: 15. +* evil-echo-state: 16. +* evil-esc-delay: 17. +* evil-ex-hl-update-delay: 18. +* evil-flash-delay: 19. +* evil-get-command-properties: 1a. +* evil-get-command-property: 1b. +* evil-global-set-key: 1c. +* evil-highlight-closing-paren-at-point-states: 1d. +* evil-indent-convert-tabs: 1e. +* evil-intercept-esc: 1f. +* evil-kbd-macro-suppress-motion-error: 20. +* evil-kill-on-visual-paste: 21. +* evil-local-set-key: 22. +* evil-mode-line-format: 23. +* evil-mouse-word: 24. +* evil-move-beyond-eol: 25. +* evil-move-cursor-back: 26. +* evil-regexp-search: 27. +* evil-repeat-move-cursor: 28. +* evil-respect-visual-line-mode: 29. +* evil-search-module: 2a. +* evil-search-wrap: 2b. +* evil-select-an-object: 2c. +* evil-select-inner-object: 2d. +* evil-select-paren: 2e. +* evil-set-command-properties: 2f. +* evil-set-initial-state: 30. +* evil-set-leader: 31. +* evil-shift-round: 32. +* evil-shift-width: 33. +* evil-show-paren-range: 34. +* evil-split-window-below: 35. +* evil-toggle-key: 36. +* evil-track-eol: 37. +* evil-undo-system: 38. +* evil-vsplit-window-right: 39. +* evil-want-C-d-scroll: 3a. +* evil-want-C-i-jump: 3b. +* evil-want-C-u-delete: 3c. +* evil-want-C-u-scroll: 3d. +* evil-want-C-w-delete: 3e. +* evil-want-C-w-in-emacs-state: 3f. +* evil-want-fine-undo: 40. +* evil-want-Y-yank-to-eol: 41. + + + +Tag Table: +Node: Top364 +Ref: index doc611 +Ref: 42611 +Node: Overview1443 +Ref: overview doc1518 +Ref: 431518 +Ref: overview evil1518 +Ref: 441518 +Ref: overview overview1518 +Ref: 451518 +Ref: Overview-Footnote-11871 +Node: Installation via package el2123 +Ref: overview installation-via-package-el2221 +Ref: 462221 +Ref: Installation via package el-Footnote-12790 +Node: Manual installation2834 +Ref: overview manual-installation2957 +Ref: 472957 +Node: Modes and states3495 +Ref: overview modes-and-states3582 +Ref: 483582 +Node: Settings5333 +Ref: settings doc5412 +Ref: 495412 +Ref: settings settings5412 +Ref: 4a5412 +Ref: Settings-Footnote-16171 +Node: The initial state6312 +Ref: settings the-initial-state6412 +Ref: 4b6412 +Ref: settings elispobj-evil-set-initial-state6687 +Ref: 306687 +Ref: settings elispobj-evil-default-state6926 +Ref: d6926 +Ref: settings elispobj-evil-buffer-regexps7537 +Ref: 57537 +Node: Keybindings and other behaviour8030 +Ref: settings keybindings-and-other-behaviour8145 +Ref: 4c8145 +Ref: settings elispobj-evil-toggle-key8367 +Ref: 368367 +Ref: settings elispobj-evil-want-C-i-jump8567 +Ref: 3b8567 +Ref: settings elispobj-evil-want-C-u-delete8757 +Ref: 3c8757 +Ref: settings elispobj-evil-want-C-u-scroll9076 +Ref: 3d9076 +Ref: settings elispobj-evil-want-C-d-scroll9369 +Ref: 3a9369 +Ref: settings elispobj-evil-want-C-w-delete9492 +Ref: 3e9492 +Ref: settings elispobj-evil-want-C-w-in-emacs-state9622 +Ref: 3f9622 +Ref: settings elispobj-evil-want-Y-yank-to-eol9772 +Ref: 419772 +Ref: settings elispobj-evil-disable-insert-state-bindings9967 +Ref: 159967 +Node: Search10295 +Ref: settings search10404 +Ref: 4e10404 +Ref: settings elispobj-evil-search-module10427 +Ref: 2a10427 +Ref: settings elispobj-evil-regexp-search10676 +Ref: 2710676 +Ref: settings elispobj-evil-search-wrap10827 +Ref: 2b10827 +Ref: settings elispobj-evil-flash-delay11033 +Ref: 1911033 +Ref: settings elispobj-evil-ex-hl-update-delay11176 +Ref: 1811176 +Node: Indentation11449 +Ref: settings indentation11542 +Ref: 4f11542 +Ref: settings elispobj-evil-auto-indent11575 +Ref: 211575 +Ref: settings elispobj-evil-shift-width11733 +Ref: 3311733 +Ref: settings elispobj-evil-shift-round11939 +Ref: 3211939 +Ref: settings elispobj-evil-indent-convert-tabs12200 +Ref: 1e12200 +Node: Cursor movement12469 +Ref: settings cursor-movement12570 +Ref: 5012570 +Ref: settings elispobj-evil-repeat-move-cursor13149 +Ref: 2813149 +Ref: settings elispobj-evil-move-cursor-back13413 +Ref: 2613413 +Ref: settings elispobj-evil-move-beyond-eol13758 +Ref: 2513758 +Ref: settings elispobj-evil-cross-lines14000 +Ref: 714000 +Ref: settings elispobj-evil-respect-visual-line-mode14395 +Ref: 2914395 +Ref: settings elispobj-evil-track-eol14910 +Ref: 3714910 +Node: Cursor display15278 +Ref: settings cursor-display15385 +Ref: 5115385 +Ref: settings elispobj-evil-default-cursor15729 +Ref: c15729 +Node: Window management16012 +Ref: settings window-management16128 +Ref: 5216128 +Ref: settings elispobj-evil-auto-balance-windows16173 +Ref: 116173 +Ref: settings elispobj-evil-split-window-below16319 +Ref: 3516319 +Ref: settings elispobj-evil-vsplit-window-right16448 +Ref: 3916448 +Node: Parenthesis highlighting16601 +Ref: settings parenthesis-highlighting16716 +Ref: 5316716 +Ref: settings elispobj-evil-show-paren-range16905 +Ref: 3416905 +Ref: settings elispobj-evil-highlight-closing-paren-at-point-states17092 +Ref: 1d17092 +Node: Miscellaneous17678 +Ref: settings miscellaneous17767 +Ref: 5417767 +Ref: settings elispobj-evil-want-fine-undo17804 +Ref: 4017804 +Ref: settings elispobj-evil-undo-system18443 +Ref: 3818443 +Ref: settings elispobj-evil-backspace-join-lines18802 +Ref: 318802 +Ref: settings elispobj-evil-kbd-macro-suppress-motion-error18943 +Ref: 2018943 +Ref: settings elispobj-evil-mode-line-format19698 +Ref: 2319698 +Ref: settings elispobj-evil-mouse-word20230 +Ref: 2420230 +Ref: settings elispobj-evil-bigword20571 +Ref: 420571 +Ref: settings elispobj-evil-esc-delay20875 +Ref: 1720875 +Ref: settings elispobj-evil-intercept-esc21281 +Ref: 1f21281 +Ref: settings elispobj-evil-kill-on-visual-paste21907 +Ref: 2121907 +Ref: settings elispobj-evil-echo-state22168 +Ref: 1622168 +Ref: settings elispobj-evil-complete-all-buffers22297 +Ref: 622297 +Node: Keymaps22498 +Ref: keymaps doc22574 +Ref: 5522574 +Ref: keymaps chapter-keymaps22574 +Ref: 4d22574 +Ref: keymaps keymaps22574 +Ref: 5622574 +Ref: keymaps elispobj-evil-global-set-key24226 +Ref: 1c24226 +Ref: keymaps elispobj-evil-local-set-key24330 +Ref: 2224330 +Node: evil-define-key24759 +Ref: keymaps evil-define-key24836 +Ref: 5724836 +Ref: keymaps elispobj-evil-define-key25090 +Ref: f25090 +Node: Leader keys28287 +Ref: keymaps leader-keys28364 +Ref: 5828364 +Ref: keymaps elispobj-evil-set-leader28891 +Ref: 3128891 +Node: Hooks29344 +Ref: hooks doc29421 +Ref: 5929421 +Ref: hooks hooks29421 +Ref: 5a29421 +Node: Extension30073 +Ref: extension doc30169 +Ref: 5b30169 +Ref: extension extension30169 +Ref: 5c30169 +Node: Motions30405 +Ref: extension motions30474 +Ref: 5d30474 +Ref: extension elispobj-evil-declare-motion30727 +Ref: 930727 +Ref: extension elispobj-evil-define-motion30900 +Ref: 1030900 +Node: Operators32291 +Ref: extension operators32381 +Ref: 5e32381 +Ref: extension elispobj-evil-define-operator32629 +Ref: 1132629 +Node: Text objects34234 +Ref: extension text-objects34328 +Ref: 5f34328 +Ref: extension elispobj-evil-define-text-object34868 +Ref: 1334868 +Ref: extension elispobj-evil-select-inner-object36372 +Ref: 2d36372 +Ref: extension elispobj-evil-select-an-object36942 +Ref: 2c36942 +Ref: extension elispobj-evil-select-paren37509 +Ref: 2e37509 +Ref: Text objects-Footnote-138431 +Node: Range types38597 +Ref: extension range-types38688 +Ref: 6038688 +Ref: extension elispobj-evil-define-type38991 +Ref: 1438991 +Node: States40160 +Ref: extension states40230 +Ref: 6140230 +Ref: extension elispobj-evil-define-state40530 +Ref: 1240530 +Node: Frequently Asked Questions41959 +Ref: faq doc42059 +Ref: 6242059 +Ref: faq frequently-asked-questions42059 +Ref: 6342059 +Node: Problems with the escape key in the terminal42216 +Ref: faq problems-with-the-escape-key-in-the-terminal42364 +Ref: 6442364 +Node: Underscore is not a word character44858 +Ref: faq underscore-is-not-a-word-character45006 +Ref: 6545006 +Ref: Underscore is not a word character-Footnote-146774 +Node: Internals47085 +Ref: internals doc47210 +Ref: 6647210 +Ref: internals internals47210 +Ref: 6747210 +Node: Command properties47268 +Ref: internals command-properties47330 +Ref: 6847330 +Ref: internals elispobj-evil-add-command-properties47585 +Ref: 047585 +Ref: internals elispobj-evil-set-command-properties47845 +Ref: 2f47845 +Ref: internals elispobj-evil-get-command-properties48158 +Ref: 1a48158 +Ref: internals elispobj-evil-get-command-property48324 +Ref: 1b48324 +Ref: internals elispobj-evil-define-command48594 +Ref: e48594 +Ref: internals elispobj-evil-declare-repeat48798 +Ref: b48798 +Ref: internals elispobj-evil-declare-not-repeat48900 +Ref: a48900 +Ref: internals elispobj-evil-declare-change-repeat49009 +Ref: 849009 +Ref: Command properties-Footnote-149200 +Node: The GNU Free Documentation License49377 +Ref: license doc49510 +Ref: 6949510 +Ref: license the-gnu-free-documentation-license49510 +Ref: 6a49510 +Node: Emacs lisp functions and variables73318 + +End Tag Table + + +Local Variables: +coding: utf-8 +End: diff --git a/.emacs.d/elpa/f-20191110.1357/f-autoloads.el b/.emacs.d/elpa/f-20191110.1357/f-autoloads.el new file mode 100644 index 0000000..366a50c --- /dev/null +++ b/.emacs.d/elpa/f-20191110.1357/f-autoloads.el @@ -0,0 +1,22 @@ +;;; f-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "f" "f.el" (0 0 0 0)) +;;; Generated autoloads from f.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "f" '("f-"))) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; f-autoloads.el ends here diff --git a/.emacs.d/elpa/f-20191110.1357/f-pkg.el b/.emacs.d/elpa/f-20191110.1357/f-pkg.el new file mode 100644 index 0000000..828fb67 --- /dev/null +++ b/.emacs.d/elpa/f-20191110.1357/f-pkg.el @@ -0,0 +1,2 @@ +;;; Generated package description from f.el -*- no-byte-compile: t -*- +(define-package "f" "20191110.1357" "Modern API for working with files and directories" '((s "1.7.0") (dash "2.2.0")) :commit "c4dbf8c8e83df834f5d6f72cd5649b9d8a8812ec" :authors '(("Johan Andersson" . "johan.rejeep@gmail.com")) :maintainer '("Johan Andersson" . "johan.rejeep@gmail.com") :keywords '("files" "directories") :url "http://github.com/rejeep/f.el") diff --git a/.emacs.d/elpa/f-20191110.1357/f.el b/.emacs.d/elpa/f-20191110.1357/f.el new file mode 100644 index 0000000..b62b1bf --- /dev/null +++ b/.emacs.d/elpa/f-20191110.1357/f.el @@ -0,0 +1,625 @@ +;;; f.el --- Modern API for working with files and directories -*- lexical-binding: t; -*- + +;; Copyright (C) 2013 Johan Andersson + +;; Author: Johan Andersson <johan.rejeep@gmail.com> +;; Maintainer: Johan Andersson <johan.rejeep@gmail.com> +;; Version: 0.20.0 +;; Package-Version: 20191110.1357 +;; Package-Commit: c4dbf8c8e83df834f5d6f72cd5649b9d8a8812ec +;; Keywords: files, directories +;; URL: http://github.com/rejeep/f.el +;; Package-Requires: ((s "1.7.0") (dash "2.2.0")) + +;; This file is NOT part of GNU Emacs. + +;;; License: + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3, or (at your option) +;; any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. + +;;; Code: + + + +(require 's) +(require 'dash) + +(put 'f-guard-error 'error-conditions '(error f-guard-error)) +(put 'f-guard-error 'error-message "Destructive operation outside sandbox") + +(defvar f--guard-paths nil + "List of allowed paths to modify when guarded. + +Do not modify this variable.") + +(defmacro f--destructive (path &rest body) + "If PATH is allowed to be modified, yield BODY. + +If PATH is not allowed to be modified, throw error." + (declare (indent 1)) + `(if f--guard-paths + (if (--any? (or (f-same? it ,path) + (f-ancestor-of? it ,path)) f--guard-paths) + (progn ,@body) + (signal 'f-guard-error (list ,path f--guard-paths))) + ,@body)) + + +;;;; Paths + +(defun f-join (&rest args) + "Join ARGS to a single path." + (let (path (relative (f-relative? (car args)))) + (-map + (lambda (arg) + (setq path (f-expand arg path))) + args) + (if relative (f-relative path) path))) + +(defun f-split (path) + "Split PATH and return list containing parts." + (let ((parts (s-split (f-path-separator) path 'omit-nulls))) + (if (f-absolute? path) + (push (f-path-separator) parts) + parts))) + +(defun f-expand (path &optional dir) + "Expand PATH relative to DIR (or `default-directory'). +PATH and DIR can be either a directory names or directory file +names. Return a directory name if PATH is a directory name, and +a directory file name otherwise. File name handlers are +ignored." + (let (file-name-handler-alist) + (expand-file-name path dir))) + +(defun f-filename (path) + "Return the name of PATH." + (file-name-nondirectory (directory-file-name path))) + +(defalias 'f-parent 'f-dirname) +(defun f-dirname (path) + "Return the parent directory to PATH." + (let ((parent (file-name-directory + (directory-file-name (f-expand path default-directory))))) + (unless (f-same? path parent) + (if (f-relative? path) + (f-relative parent) + (directory-file-name parent))))) + +(defun f-common-parent (paths) + "Return the deepest common parent directory of PATHS." + (cond + ((not paths) nil) + ((not (cdr paths)) (f-parent (car paths))) + (:otherwise + (let* ((paths (-map 'f-split paths)) + (common (caar paths)) + (re nil)) + (while (and (not (null (car paths))) (--all? (equal (car it) common) paths)) + (setq paths (-map 'cdr paths)) + (push common re) + (setq common (caar paths))) + (cond + ((null re) "") + ((and (= (length re) 1) (f-root? (car re))) + (f-root)) + (:otherwise + (concat (apply 'f-join (nreverse re)) "/"))))))) + +(defun f-ext (path) + "Return the file extension of PATH. + +The extension, in a file name, is the part that follows the last +'.', excluding version numbers and backup suffixes." + (file-name-extension path)) + +(defun f-no-ext (path) + "Return everything but the file extension of PATH." + (file-name-sans-extension path)) + +(defun f-swap-ext (path ext) + "Return PATH but with EXT as the new extension. +EXT must not be nil or empty." + (if (s-blank? ext) + (error "Extension cannot be empty or nil") + (concat (f-no-ext path) "." ext))) + +(defun f-base (path) + "Return the name of PATH, excluding the extension of file." + (f-no-ext (f-filename path))) + +(defun f-relative (path &optional dir) + "Return PATH relative to DIR." + (file-relative-name path dir)) + +(defalias 'f-abbrev 'f-short) +(defun f-short (path) + "Return abbrev of PATH. See `abbreviate-file-name'." + (abbreviate-file-name path)) + +(defun f-long (path) + "Return long version of PATH." + (f-expand path)) + +(defun f-canonical (path) + "Return the canonical name of PATH." + (file-truename path)) + +(defun f-slash (path) + "Append slash to PATH unless one already. + +Some functions, such as `call-process' requires there to be an +ending slash." + (if (f-dir? path) + (file-name-as-directory path) + path)) + +(defun f-full (path) + "Return absolute path to PATH, with ending slash." + (f-slash (f-long path))) + +(defun f--uniquify (paths) + "Helper for `f-uniquify' and `f-uniquify-alist'." + (let* ((files-length (length paths)) + (uniq-filenames (--map (cons it (f-filename it)) paths)) + (uniq-filenames-next (-group-by 'cdr uniq-filenames))) + (while (/= files-length (length uniq-filenames-next)) + (setq uniq-filenames-next + (-group-by 'cdr + (--mapcat + (let ((conf-files (cdr it))) + (if (> (length conf-files) 1) + (--map (cons (car it) (concat (f-filename (s-chop-suffix (cdr it) (car it))) (f-path-separator) (cdr it))) conf-files) + conf-files)) + uniq-filenames-next)))) + uniq-filenames-next)) + +(defun f-uniquify (files) + "Return unique suffixes of FILES. + +This function expects no duplicate paths." + (-map 'car (f--uniquify files))) + +(defun f-uniquify-alist (files) + "Return alist mapping FILES to unique suffixes of FILES. + +This function expects no duplicate paths." + (-map 'cadr (f--uniquify files))) + + +;;;; I/O + +(defun f-read-bytes (path) + "Read binary data from PATH. + +Return the binary data as unibyte string." + (with-temp-buffer + (set-buffer-multibyte nil) + (setq buffer-file-coding-system 'binary) + (insert-file-contents-literally path) + (buffer-substring-no-properties (point-min) (point-max)))) + +(defalias 'f-read 'f-read-text) +(defun f-read-text (path &optional coding) + "Read text with PATH, using CODING. + +CODING defaults to `utf-8'. + +Return the decoded text as multibyte string." + (decode-coding-string (f-read-bytes path) (or coding 'utf-8))) + +(defalias 'f-write 'f-write-text) +(defun f-write-text (text coding path) + "Write TEXT with CODING to PATH. + +TEXT is a multibyte string. CODING is a coding system to encode +TEXT with. PATH is a file name to write to." + (f-write-bytes (encode-coding-string text coding) path)) + +(defun f-unibyte-string-p (s) + "Determine whether S is a unibyte string." + (not (multibyte-string-p s))) + +(defun f-write-bytes (data path) + "Write binary DATA to PATH. + +DATA is a unibyte string. PATH is a file name to write to." + (f--write-bytes data path nil)) + +(defalias 'f-append 'f-append-text) +(defun f-append-text (text coding path) + "Append TEXT with CODING to PATH. + +If PATH does not exist, it is created." + (f-append-bytes (encode-coding-string text coding) path)) + +(defun f-append-bytes (data path) + "Append binary DATA to PATH. + +If PATH does not exist, it is created." + (f--write-bytes data path :append)) + +(defun f--write-bytes (data filename append) + "Write binary DATA to FILENAME. +If APPEND is non-nil, append the DATA to the existing contents." + (f--destructive filename + (unless (f-unibyte-string-p data) + (signal 'wrong-type-argument (list 'f-unibyte-string-p data))) + (let ((coding-system-for-write 'binary) + (write-region-annotate-functions nil) + (write-region-post-annotation-function nil)) + (write-region data nil filename append :silent) + nil))) + + +;;;; Destructive + +(defun f-mkdir (&rest dirs) + "Create directories DIRS." + (let (path) + (-each + dirs + (lambda (dir) + (setq path (f-expand dir path)) + (unless (f-directory? path) + (f--destructive path (make-directory path))))))) + +(defun f-delete (path &optional force) + "Delete PATH, which can be file or directory. + +If FORCE is t, a directory will be deleted recursively." + (f--destructive path + (if (or (f-file? path) (f-symlink? path)) + (delete-file path) + (delete-directory path force)))) + +(defun f-symlink (source path) + "Create a symlink to SOURCE from PATH." + (f--destructive path (make-symbolic-link source path))) + +(defun f-move (from to) + "Move or rename FROM to TO. +If TO is a directory name, move FROM into TO." + (f--destructive to (rename-file from to t))) + +(defun f-copy (from to) + "Copy file or directory FROM to TO. +If FROM names a directory and TO is a directory name, copy FROM +into TO as a subdirectory." + (f--destructive to + (if (f-file? from) + (copy-file from to) + ;; The behavior of `copy-directory' differs between Emacs 23 and + ;; 24 in that in Emacs 23, the contents of `from' is copied to + ;; `to', while in Emacs 24 the directory `from' is copied to + ;; `to'. We want the Emacs 24 behavior. + (if (> emacs-major-version 23) + (copy-directory from to) + (if (f-dir? to) + (progn + (apply 'f-mkdir (f-split to)) + (let ((new-to (f-expand (f-filename from) to))) + (copy-directory from new-to))) + (copy-directory from to)))))) + +(defun f-copy-contents (from to) + "Copy contents in directory FROM, to directory TO." + (unless (f-exists? to) + (error "Cannot copy contents to non existing directory %s" to)) + (unless (f-dir? from) + (error "Cannot copy contents as %s is a file" from)) + (--each (f-entries from) + (f-copy it (file-name-as-directory to)))) + +(defun f-touch (path) + "Update PATH last modification date or create if it does not exist." + (f--destructive path + (if (f-file? path) + (set-file-times path) + (f-write-bytes "" path)))) + + +;;;; Predicates + +(defun f-exists? (path) + "Return t if PATH exists, false otherwise." + (file-exists-p path)) + +(defalias 'f-exists-p 'f-exists?) + +(defalias 'f-dir? 'f-directory?) +(defalias 'f-dir-p 'f-dir?) + +(defun f-directory? (path) + "Return t if PATH is directory, false otherwise." + (file-directory-p path)) + +(defalias 'f-directory-p 'f-directory?) + +(defun f-file? (path) + "Return t if PATH is file, false otherwise." + (file-regular-p path)) + +(defalias 'f-file-p 'f-file?) + +(defun f-symlink? (path) + "Return t if PATH is symlink, false otherwise." + (not (not (file-symlink-p path)))) + +(defalias 'f-symlink-p 'f-symlink?) + +(defun f-readable? (path) + "Return t if PATH is readable, false otherwise." + (file-readable-p path)) + +(defalias 'f-readable-p 'f-readable?) + +(defun f-writable? (path) + "Return t if PATH is writable, false otherwise." + (file-writable-p path)) + +(defalias 'f-writable-p 'f-writable?) + +(defun f-executable? (path) + "Return t if PATH is executable, false otherwise." + (file-executable-p path)) + +(defalias 'f-executable-p 'f-executable?) + +(defun f-absolute? (path) + "Return t if PATH is absolute, false otherwise." + (file-name-absolute-p path)) + +(defalias 'f-absolute-p 'f-absolute?) + +(defun f-relative? (path) + "Return t if PATH is relative, false otherwise." + (not (f-absolute? path))) + +(defalias 'f-relative-p 'f-relative?) + +(defun f-root? (path) + "Return t if PATH is root directory, false otherwise." + (not (f-parent path))) + +(defalias 'f-root-p 'f-root?) + +(defun f-ext? (path &optional ext) + "Return t if extension of PATH is EXT, false otherwise. + +If EXT is nil or omitted, return t if PATH has any extension, +false otherwise. + +The extension, in a file name, is the part that follows the last +'.', excluding version numbers and backup suffixes." + (if ext + (string= (f-ext path) ext) + (not (eq (f-ext path) nil)))) + +(defalias 'f-ext-p 'f-ext?) + +(defalias 'f-equal? 'f-same?) +(defalias 'f-equal-p 'f-equal?) + +(defun f-same? (path-a path-b) + "Return t if PATH-A and PATH-B are references to same file." + (when (and (f-exists? path-a) + (f-exists? path-b)) + (equal + (f-canonical (directory-file-name (f-expand path-a))) + (f-canonical (directory-file-name (f-expand path-b)))))) + +(defalias 'f-same-p 'f-same?) + +(defun f-parent-of? (path-a path-b) + "Return t if PATH-A is parent of PATH-B." + (--when-let (f-parent path-b) + (f-same? path-a it))) + +(defalias 'f-parent-of-p 'f-parent-of?) + +(defun f-child-of? (path-a path-b) + "Return t if PATH-A is child of PATH-B." + (--when-let (f-parent path-a) + (f-same? it path-b))) + +(defalias 'f-child-of-p 'f-child-of?) + +(defun f-ancestor-of? (path-a path-b) + "Return t if PATH-A is ancestor of PATH-B." + (unless (f-same? path-a path-b) + (s-starts-with? (f-full path-a) + (f-full path-b)))) + +(defalias 'f-ancestor-of-p 'f-ancestor-of?) + +(defun f-descendant-of? (path-a path-b) + "Return t if PATH-A is desendant of PATH-B." + (unless (f-same? path-a path-b) + (s-starts-with? (f-full path-b) + (f-full path-a)))) + +(defalias 'f-descendant-of-p 'f-descendant-of?) + +(defun f-hidden? (path) + "Return t if PATH is hidden, nil otherwise." + (unless (f-exists? path) + (error "Path does not exist: %s" path)) + (string= (substring path 0 1) ".")) + +(defalias 'f-hidden-p 'f-hidden?) + +(defun f-empty? (path) + "If PATH is a file, return t if the file in PATH is empty, nil otherwise. +If PATH is directory, return t if directory has no files, nil otherwise." + (if (f-directory? path) + (equal (f-files path nil t) nil) + (= (f-size path) 0))) + +(defalias 'f-empty-p 'f-empty?) + + +;;;; Stats + +(defun f-size (path) + "Return size of PATH. + +If PATH is a file, return size of that file. If PATH is +directory, return sum of all files in PATH." + (if (f-directory? path) + (-sum (-map 'f-size (f-files path nil t))) + (nth 7 (file-attributes path)))) + +(defun f-depth (path) + "Return the depth of PATH. + +At first, PATH is expanded with `f-expand'. Then the full path is used to +detect the depth. +'/' will be zero depth, '/usr' will be one depth. And so on." + (- (length (f-split (f-expand path))) 1)) + + +;;;; Misc + +(defun f-this-file () + "Return path to this file." + (cond + (load-in-progress load-file-name) + ((and (boundp 'byte-compile-current-file) byte-compile-current-file) + byte-compile-current-file) + (:else (buffer-file-name)))) + +(defvar f--path-separator nil + "A variable to cache result of `f-path-separator'.") + +(defun f-path-separator () + "Return path separator." + (or f--path-separator + (setq f--path-separator (substring (f-join "x" "y") 1 2)))) + +(defun f-glob (pattern &optional path) + "Find PATTERN in PATH." + (file-expand-wildcards + (f-join (or path default-directory) pattern))) + +(defun f--collect-entries (path recursive) + (let (result + (entries + (-reject + (lambda (file) + (or + (equal (f-filename file) ".") + (equal (f-filename file) ".."))) + (directory-files path t)))) + (cond (recursive + (-map + (lambda (entry) + (if (f-file? entry) + (setq result (cons entry result)) + (when (f-directory? entry) + (setq result (cons entry result)) + (setq result (append result (f--collect-entries entry recursive)))))) + entries)) + (t (setq result entries))) + result)) + +(defmacro f--entries (path body &optional recursive) + "Anaphoric version of `f-entries'." + `(f-entries + ,path + (lambda (path) + (let ((it path)) + ,body)) + ,recursive)) + +(defun f-entries (path &optional fn recursive) + "Find all files and directories in PATH. + +FN - called for each found file and directory. If FN returns a thruthy +value, file or directory will be included. +RECURSIVE - Search for files and directories recursive." + (let ((entries (f--collect-entries path recursive))) + (if fn (-select fn entries) entries))) + +(defmacro f--directories (path body &optional recursive) + "Anaphoric version of `f-directories'." + `(f-directories + ,path + (lambda (path) + (let ((it path)) + ,body)) + ,recursive)) + +(defun f-directories (path &optional fn recursive) + "Find all directories in PATH. See `f-entries'." + (let ((directories (-select 'f-directory? (f--collect-entries path recursive)))) + (if fn (-select fn directories) directories))) + +(defmacro f--files (path body &optional recursive) + "Anaphoric version of `f-files'." + `(f-files + ,path + (lambda (path) + (let ((it path)) + ,body)) + ,recursive)) + +(defun f-files (path &optional fn recursive) + "Find all files in PATH. See `f-entries'." + (let ((files (-select 'f-file? (f--collect-entries path recursive)))) + (if fn (-select fn files) files))) + +(defmacro f--traverse-upwards (body &optional path) + "Anaphoric version of `f-traverse-upwards'." + `(f-traverse-upwards + (lambda (dir) + (let ((it dir)) + ,body)) + ,path)) + +(defun f-traverse-upwards (fn &optional path) + "Traverse up as long as FN return nil, starting at PATH. + +If FN returns a non-nil value, the path sent as argument to FN is +returned. If no function callback return a non-nil value, nil is +returned." + (unless path + (setq path default-directory)) + (when (f-relative? path) + (setq path (f-expand path))) + (if (funcall fn path) + path + (unless (f-root? path) + (f-traverse-upwards fn (f-parent path))))) + +(defun f-root () + "Return absolute root." + (f-traverse-upwards 'f-root?)) + +(defmacro f-with-sandbox (path-or-paths &rest body) + "Only allow PATH-OR-PATHS and descendants to be modified in BODY." + (declare (indent 1)) + `(let ((paths (if (listp ,path-or-paths) + ,path-or-paths + (list ,path-or-paths)))) + (unwind-protect + (let ((f--guard-paths paths)) + ,@body) + (setq f--guard-paths nil)))) + +(provide 'f) + +;;; f.el ends here diff --git a/.emacs.d/elpa/f-20191110.1357/f.elc b/.emacs.d/elpa/f-20191110.1357/f.elc new file mode 100644 index 0000000..48bf0c0 Binary files /dev/null and b/.emacs.d/elpa/f-20191110.1357/f.elc differ diff --git a/.emacs.d/elpa/format-all-20210608.2033/format-all-autoloads.el b/.emacs.d/elpa/format-all-20210608.2033/format-all-autoloads.el new file mode 100644 index 0000000..f3adbe1 --- /dev/null +++ b/.emacs.d/elpa/format-all-20210608.2033/format-all-autoloads.el @@ -0,0 +1,75 @@ +;;; format-all-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "format-all" "format-all.el" (0 0 0 0)) +;;; Generated autoloads from format-all.el + +(autoload 'format-all-buffer "format-all" "\ +Auto-format the source code in the current buffer. + +No disk files are touched - the buffer doesn't even need to be +saved. If you don't like the results of the formatting, you can +use ordinary undo to get your code back to its previous state. + +You will need to install external programs to do the formatting. +If the command can't find the program that it needs, it will try +to tell you how you might be able to install it on your operating +system. Only BibTeX, Emacs Lisp and Ledger are formatted without an +external program. + +A suitable formatter is selected according to the `major-mode' of +the buffer. Many popular programming languages are supported. +It is fairly easy to add new languages that have an external +formatter. When called interactively or PROMPT-P is non-nil, a +missing formatter is prompted in the minibuffer. + +If PROMPT is non-nil (or the function is called as an interactive +command), a missing formatter is prompted in the minibuffer. If +PROMPT is the symbol `always' (or a prefix argument is given), +the formatter is prompted for even if one has already been set. + +If any errors or warnings were encountered during formatting, +they are shown in a buffer called *format-all-errors*. + +\(fn &optional PROMPT)" t nil) + +(autoload 'format-all-mode "format-all" "\ +Toggle automatic source code formatting before save. + +When this minor mode (FmtAll) is enabled, `format-all-buffer' is +automatically called to format your code each time before you +save the buffer. + +The mode is buffer-local and needs to be enabled separately each +time a file is visited. You may want to use `add-hook' in your +`user-init-file' to enable the mode based on buffer modes. E.g.: + + (add-hook 'prog-mode-hook 'format-all-mode) + +To use a default formatter for projects that don't have one, add +this too: + + (add-hook 'prog-mode-hook 'format-all-ensure-formatter) + +When `format-all-mode' is called as a Lisp function, the mode is +toggled if ARG is ‘toggle’, disabled if ARG is a negative integer +or zero, and enabled otherwise. + +\(fn &optional ARG)" t nil) + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "format-all" '("atsfmt" "auctex" "beautysh" "black" "brittany" "bsrefmt" "buildifier" "cabal-fmt" "cmake-format" "crystal" "dartfmt" "define-format-all-formatter" "dfmt" "dhall" "dockfmt" "elm-format" "emacs-" "fish-indent" "fprettify" "gleam" "hindent" "html-tidy" "istyle-verilog" "jsonnetfmt" "ktlint" "latexindent" "ledger-mode" "lua-fmt" "mix-format" "nix" "ocp-indent" "ormolu" "perltidy" "pgformatter" "prettier" "purty" "rescript" "scalafmt" "shfmt" "snakefmt" "sqlformat" "swiftformat" "terraform-fmt" "yapf"))) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; format-all-autoloads.el ends here diff --git a/.emacs.d/elpa/format-all-20210608.2033/format-all-pkg.el b/.emacs.d/elpa/format-all-20210608.2033/format-all-pkg.el new file mode 100644 index 0000000..2aa0291 --- /dev/null +++ b/.emacs.d/elpa/format-all-20210608.2033/format-all-pkg.el @@ -0,0 +1,2 @@ +;;; Generated package description from format-all.el -*- no-byte-compile: t -*- +(define-package "format-all" "20210608.2033" "Auto-format C, C++, JS, Python, Ruby and 50 other languages" '((emacs "24.3") (inheritenv "0.1") (language-id "0.12")) :commit "3a15ba2e99c01a054560542d7350fb54da64fbb4" :authors '(("Lassi Kortela" . "lassi@lassi.io")) :maintainer '("Lassi Kortela" . "lassi@lassi.io") :keywords '("languages" "util") :url "https://github.com/lassik/emacs-format-all-the-code") diff --git a/.emacs.d/elpa/format-all-20210608.2033/format-all.el b/.emacs.d/elpa/format-all-20210608.2033/format-all.el new file mode 100644 index 0000000..d015aad --- /dev/null +++ b/.emacs.d/elpa/format-all-20210608.2033/format-all.el @@ -0,0 +1,1330 @@ +;;; format-all.el --- Auto-format C, C++, JS, Python, Ruby and 50 other languages -*- lexical-binding: t -*- +;; +;; Author: Lassi Kortela <lassi@lassi.io> +;; URL: https://github.com/lassik/emacs-format-all-the-code +;; Package-Version: 20210608.2033 +;; Package-Commit: 3a15ba2e99c01a054560542d7350fb54da64fbb4 +;; Version: 0.4.0 +;; Package-Requires: ((emacs "24.3") (inheritenv "0.1") (language-id "0.12")) +;; Keywords: languages util +;; SPDX-License-Identifier: MIT +;; +;; This file is not part of GNU Emacs. +;; +;;; Commentary: +;; +;; Lets you auto-format source code in many languages using the same +;; command for all languages, instead of learning a different Emacs +;; package and formatting command for each language. +;; +;; Just do M-x format-all-buffer and it will try its best to do the +;; right thing. To auto-format code on save, use the minor mode +;; format-all-mode. Please see the documentation for that function +;; for instructions. +;; +;; Supported languages: +;; +;; - Angular/Vue (prettier) +;; - Assembly (asmfmt) +;; - ATS (atsfmt) +;; - Bazel Starlark (buildifier) +;; - BibTeX (Emacs) +;; - C/C++/Objective-C (clang-format, astyle) +;; - C# (clang-format, astyle) +;; - Cabal (cabal-fmt) +;; - Clojure/ClojureScript (node-cljfmt) +;; - CMake (cmake-format) +;; - Crystal (crystal tool format) +;; - CSS/Less/SCSS (prettier) +;; - D (dfmt) +;; - Dart (dartfmt) +;; - Dhall (dhall format) +;; - Dockerfile (dockfmt) +;; - Elixir (mix format) +;; - Elm (elm-format) +;; - Emacs Lisp (Emacs) +;; - Fish Shell (fish_indent) +;; - Fortran 90 (fprettify) +;; - Gleam (gleam format) +;; - GLSL (clang-format) +;; - Go (gofmt, goimports) +;; - GraphQL (prettier) +;; - Haskell (brittany, fourmolu, hindent, ormolu, stylish-haskell) +;; - HTML/XHTML/XML (tidy) +;; - Java (clang-format, astyle) +;; - JavaScript/JSON/JSX (prettier, standard) +;; - Jsonnet (jsonnetfmt) +;; - Kotlin (ktlint) +;; - LaTeX (latexindent, auctex) +;; - Ledger (ledger-mode) +;; - Lua (lua-fmt, prettier plugin-lua) +;; - Markdown (prettier) +;; - Nix (nixpkgs-fmt, nixfmt) +;; - OCaml (ocp-indent) +;; - Perl (perltidy) +;; - PHP (prettier plugin-php) +;; - Protocol Buffers (clang-format) +;; - PureScript (purty) +;; - Python (black, yapf) +;; - R (styler) +;; - Reason (bsrefmt) +;; - ReScript (rescript) +;; - Ruby (rubocop, rufo, standardrb) +;; - Rust (rustfmt) +;; - Scala (scalafmt) +;; - Shell script (beautysh, shfmt) +;; - Snakemake (snakefmt) +;; - Solidity (prettier prettier-plugin-solidity) +;; - SQL (pgformatter, sqlformat) +;; - Swift (swiftformat) +;; - Terraform (terraform fmt) +;; - TOML (prettier prettier-plugin-toml) +;; - TypeScript/TSX (prettier) +;; - Verilog (iStyle) +;; - YAML (prettier) +;; +;; You will need to install external programs to do the formatting. +;; If `format-all-buffer` can't find the right program, it will try to +;; tell you how to install it. +;; +;; Many of the external formatters support configuration files in the +;; source code directory to control their formatting. Please see the +;; documentation for each formatter. +;; +;; New external formatters can be added easily if they can read code +;; from standard input and format it to standard output. Feel free to +;; submit a pull request or ask for help in GitHub issues. +;; +;;; Code: + +(require 'cl-lib) +(require 'inheritenv) +(require 'language-id) + +(defgroup format-all nil + "Lets you auto-format source code." + :group 'format-all) + +(defcustom format-all-debug nil + "When non-nil, troubleshooting info is written into the *Messages* buffer." + :type 'boolean + :group 'format-all) + +(defcustom format-all-default-formatters + '(("Assembly" asmfmt) + ("ATS" atsfmt) + ("Bazel" buildifier) + ("BibTeX" emacs-bibtex) + ("C" clang-format) + ("C#" clang-format) + ("C++" clang-format) + ("Cabal Config" cabal-fmt) + ("Clojure" cljfmt) + ("CMake" cmake-format) + ("Crystal" crystal) + ("CSS" prettier) + ("D" dfmt) + ("Dart" dartfmt) + ("Dhall" dhall) + ("Dockerfile" dockfmt) + ("Elixir" mix-format) + ("Elm" elm-format) + ("Emacs Lisp" emacs-lisp) + ("Fish" fish-indent) + ("GLSL" clang-format) + ("Go" gofmt) + ("GraphQL" prettier) + ("Haskell" brittany) + ("HTML" html-tidy) + ("Java" clang-format) + ("JavaScript" prettier) + ("JSON" prettier) + ("Jsonnet" jsonnetfmt) + ("JSX" prettier) + ("Kotlin" ktlint) + ("LaTeX" latexindent) + ("Less" prettier) + ("Literate Haskell" brittany) + ("Lua" lua-fmt) + ("Markdown" prettier) + ("Nix" nixpkgs-fmt) + ("Objective-C" clang-format) + ("OCaml" ocp-indent) + ("Perl" perltidy) + ("PHP" prettier) + ("Protocol Buffer" clang-format) + ("PureScript" purty) + ("Python" black) + ("R" styler) + ("Reason" bsrefmt) + ("ReScript" rescript) + ("Ruby" rufo) + ("Rust" rustfmt) + ("Scala" scalafmt) + ("SCSS" prettier) + ("Shell" shfmt) + ("Solidity" prettier) + ("SQL" sqlformat) + ("Swift" swiftformat) + ("Terraform" terraform-fmt) + ("TOML" prettier) + ("TSX" prettier) + ("TypeScript" prettier) + ("Verilog" istyle-verilog) + ("Vue" prettier) + ("XML" html-tidy) + ("YAML" prettier) + + ("_Angular" prettier) + ("_Flow" prettier) + ("_Fortran 90" fprettify) + ("_Gleam" gleam) + ("_Ledger" ledger-mode) + ("_Snakemake" snakefmt)) + "Default formatter to use for each language." + :type '(repeat (list string symbol)) + :group 'format-all) + +(defcustom format-all-show-errors 'errors + "When to show formatting errors or warnings." + :type '(choice (const :tag "Always" always) + (const :tag "Errors" errors) + (const :tag "Warnings" warnings) + (const :tag "Never" never)) + :group 'format-all) + +(defvar format-all-after-format-functions nil + "Hook run after each time `format-all-buffer' has formatted a buffer. + +The value is a list of hook functions. Use `add-hook' to add a +function. The function is called with two arguments: (FORMATTER +STATUS). FORMATTER is a symbol naming the formatter, as given to +`define-format-all-formatter'. STATUS is one of the following +keywords: + +* :reformatted -- The formatter made changes to the buffer. + +* :already-formatted -- The buffer was already formatted + correctly so the formatter didn't make any changes to it. + +* :error -- The formatter encountered an error (usually a syntax + error). The buffer contents are the same as before formatting. + +The current buffer is the buffer that was just formatted. Point +is not guaranteed to be in any particular place, so `goto-char' +before editing the buffer. Narrowing may be in effect unless +STATUS is :reformatted.") + +(defvar format-all--user-args nil + "Internal variable to temporarily store arguments for formatters.") + +(defvar-local format-all-formatters nil + "Rules to select which formatter format-all uses. + +The value is an association list. + +The first item of each association is the name of a programming +language. (GitHub Linguist names are used.) + +The remaining items are one or more formatters to use for that +language. Each formatter is either: + +* a symbol (e.g. black, clang-format, rufo) + +* a list whose first item is that symbol, and any remaining items + are extra command line arguments to pass to the formatter + +If more than one formatter is given for the same language, all of +them are run as a chain, with the code from each formatter passed +to the next. The final code is from the last formatter. In case +any formatter in the chain is missing or fails to format the +code, the entire chain fails and the old code before formatting +is preserved. + +You'll probably want to set this in a \".dir-locals.el\" file or +in a hook function. Any number of buffers can share the same +association list. Using \".dir-locals.el\" is convenient since +the rules for an entire source tree can be given in one file.") + +(defun format-all--proper-list-p (object) + "Return t if OBJECT is a proper list, nil otherwise." + ;; If we could depend on Emacs 27.1 this function would be built in. + (and (listp object) (not (null (cl-list-length object))))) + +(defun format-all--normalize-formatter (formatter) + "Internal function to convert FORMATTER spec into normal form." + (let ((formatter (if (listp formatter) formatter (list formatter)))) + (when (cdr (last formatter)) + (error "Formatter is not a proper list: %S" formatter)) + (when (null formatter) + (error "Formatter name missing")) + (unless (symbolp (car formatter)) + (error "Formatter name is not a symbol: %S" (car formatter))) + (unless (cl-every #'stringp (cdr formatter)) + (error "Formatter command line arguments are not all strings: %S" + formatter)) + formatter)) + +(defun format-all--normalize-chain (chain) + "Internal function to convert CHAIN spec into normal form." + (when (or (not (listp chain)) (cdr (last chain))) + (error "Formatter chain is not a proper list: %S" chain)) + (mapcar #'format-all--normalize-formatter chain)) + +(defun format-all-valid-formatters-p (formatters) + "Return t if FORMATTERS is a valid value for `format-all-formatters'." + (and (format-all--proper-list-p formatters) + (cl-every + (lambda (chain) + (and (not (null chain)) + (format-all--proper-list-p chain) + (stringp (car chain)) + (cl-every + (lambda (formatter) + (and (not (null formatter)) + (or (symbolp formatter) + (and (format-all--proper-list-p formatter) + (and (symbolp (car formatter)) + (not (null (car formatter)))) + (cl-every #'stringp (cdr formatter)))))) + (cdr chain)))) + formatters))) + +(put 'format-all-formatters 'safe-local-variable + 'format-all-valid-formatters-p) + +(eval-and-compile + (defconst format-all--system-type + (cl-case system-type + (windows-nt 'windows) + (cygwin 'windows) + (darwin 'macos) + (gnu/linux 'linux) + (berkeley-unix + (save-match-data + (let ((case-fold-search t)) + (cond ((string-match "freebsd" system-configuration) 'freebsd) + ((string-match "openbsd" system-configuration) 'openbsd) + ((string-match "netbsd" system-configuration) 'netbsd)))))) + "Current operating system according to the format-all package.")) + +(eval-and-compile + (defun format-all--resolve-system (choices) + "Get first choice matching `format-all--system-type' from CHOICES." + (cl-dolist (choice choices) + (cond ((atom choice) + (cl-return choice)) + ((eql format-all--system-type (car choice)) + (cl-return (cadr choice))))))) + +(defun format-all--fix-trailing-whitespace () + "Fix trailing whitespace since some formatters don't do that." + (save-match-data + (goto-char (point-min)) + (while (re-search-forward "[ \t]+$" nil t) + (replace-match "")) + (goto-char (point-max)) + (delete-region + (if (re-search-backward "[^ \t\n]" nil t) (match-end 0) (point-min)) + (point-max)) + (unless (= (point-min) (point-max)) + (goto-char (point-max)) + (insert "\n")))) + +(defun format-all--remove-ansi-color (string) + "Internal helper function to remove terminal color codes from STRING." + (save-match-data (replace-regexp-in-string "\x1b\\[[0-9]+m" "" string t))) + +(defun format-all--flatten-once (list) + "Internal helper function to remove nested lists in LIST." + (cl-mapcan (lambda (x) (if (listp x) x (list x))) + list)) + +(defun format-all--buffer-extension-p (&rest extensions) + "Internal helper function to test file name EXTENSIONS." + (and (buffer-file-name) + (save-match-data + (let ((case-fold-search t)) + (cl-some (lambda (ext) + (string-match (concat "\\." (regexp-quote ext) "\\'") + (buffer-file-name))) + extensions))))) + +(defun format-all--buffer-thunk (thunk) + "Internal helper function to implement formatters. + +THUNK is a function that implements a particular formatter. It +takes INPUT (the unformatted source code as a string). THUNK is +invoked such that the current buffer is an empty temp buffer. It +should call the formatter on INPUT and write the formatted source +code output to the temp buffer. It should return (ERRORP +ERROR-OUTPUT). ERRORP is a boolean indicating whether the formatter +caused an error and hence the contents of the temp buffer should +be discarded. ERROR-OUTPUT is a string containing all error/warning +output from the formatter. + +Note that in some cases we can use the output of the formatter +even if it produced warnings. Not all warnings are errors." + (save-excursion + (save-restriction + (widen) + (let ((inbuf (current-buffer)) + (input (buffer-string))) + (inheritenv + (with-temp-buffer + (cl-destructuring-bind (errorp error-output) (funcall thunk input) + (let* ((no-chg (or errorp + (= 0 (let ((case-fold-search nil)) + (compare-buffer-substrings + inbuf nil nil nil nil nil))))) + (output (cond (errorp nil) + (no-chg t) + (t (buffer-string))))) + (list output error-output))))))))) + +(defun format-all--buffer-native (mode &rest funcs) + "Internal helper function to implement formatters. + +In a new temp buffer, switches to MODE then calls FUNCS in order +to format the code. MODE and FUNCS should be symbols instead of +functions to avoid warnings from the Emacs byte compiler." + (format-all--buffer-thunk + (lambda (input) + (funcall mode) + (insert input) + (mapc #'funcall funcs) + (format-all--fix-trailing-whitespace) + (list nil "")))) + +(defun format-all--locate-file (filename) + "Internal helper to locate dominating copy of FILENAME for current buffer." + (let* ((dir (and (buffer-file-name) + (locate-dominating-file (buffer-file-name) filename)))) + (when dir (expand-file-name (concat dir filename))))) + +(defun format-all--locate-default-directory (root-files) + "Internal helper function to find working directory for formatter. + +ROOT-FILES is a list of strings which are the filenames to look +for using `locate-dominating-file'. Details in documentation for +`format-all--buffer-hard'." + (let ((found-dirs + (when (and root-files (buffer-file-name)) + (mapcan (lambda (root-file) + (let ((found-file (locate-dominating-file + (buffer-file-name) root-file))) + (when found-file + (list (file-name-directory found-file))))) + root-files)))) + (or (car (sort found-dirs (lambda (a b) (> (length a) (length b))))) + (and (buffer-file-name) (file-name-directory (buffer-file-name))) + default-directory))) + +(defun format-all--buffer-hard + (ok-statuses error-regexp root-files executable &rest args) + "Internal helper function to implement formatters. + +Runs the external program EXECUTABLE. The program shall read +unformatted code from stdin, write its formatted equivalent to +stdout, and write errors/warnings to stderr. + +The program should exit with status zero for the formatting to be +considered successful. If a list of OK-STATUSES is given, all of +those are actually considered successful. But if ERROR-REGEXP is +given, and the program's stderr contains that regexp, then the +formatting is considered failed even if the exit status is in +OK-STATUSES. OK-STATUSES and ERROR-REGEXP are hacks to work +around formatter programs that don't make sensible use of their +exit status. + +If ARGS are given, those are arguments to EXECUTABLE. They should +not be shell-quoted. + +If ROOT-FILES are given, the working directory of the formatter +will be the deepest directory (starting from the file being +formatted) containing one of these files. If ROOT-FILES is nil, +or none of ROOT-FILES are found in any parent directories, the +working directory will be the one where the formatted file is. +ROOT-FILES is ignored for buffers that are not visiting a file." + (let ((ok-statuses (or ok-statuses '(0))) + (args (append format-all--user-args (format-all--flatten-once args))) + (default-directory (format-all--locate-default-directory root-files))) + (when format-all-debug + (message "Format-All: Running: %s" + (mapconcat #'shell-quote-argument (cons executable args) " ")) + (message "Format-All: Directory: %s" default-directory)) + (format-all--buffer-thunk + (lambda (input) + (let* ((errfile (make-temp-file "format-all-")) + (status (apply #'call-process-region input nil + executable nil (list t errfile) + nil args)) + (error-output (with-temp-buffer + (insert-file-contents errfile) + (delete-file errfile) + (buffer-string))) + (errorp (or (not (member status ok-statuses)) + (and error-regexp + (save-match-data + (string-match error-regexp error-output)))))) + (list errorp error-output)))))) + +(defun format-all--buffer-easy (executable &rest args) + "Internal helper function to implement formatters. + +Runs the external program EXECUTABLE. The program shall read +unformatted code from stdin, write its formatted equivalent to +stdout, write errors/warnings to stderr, and exit zero/non-zero +on success/failure. + +If ARGS are given, those are arguments to EXECUTABLE. They don't +need to be shell-quoted." + (apply 'format-all--buffer-hard nil nil nil executable args)) + +(defun format-all--ruby-gem-bundled-p (gem-name) + "Internal helper function to check if GEM-NAME is listed in the current project's Gemfile.lock." + (let* ((lockfile "Gemfile.lock") + (dir (locate-dominating-file (buffer-file-name) lockfile))) + (and dir + (with-temp-buffer + (insert-file-contents (expand-file-name lockfile dir)) + (re-search-forward (format "^ %s " (regexp-quote gem-name)) nil t)) + t))) + +(defun format-all--buffer-hard-ruby + (gem-name ok-statuses error-regexp root-files executable &rest args) + "Internal helper function to implement ruby based formatters. + +GEM-NAME is the name of a Ruby gem required to run EXECUTABLE. + +For OK-STATUSES, ERROR-REGEXP, ROOT-FILES, EXECUTABLE and ARGS, see `format-all--buffer-hard'." + (let* ((error-regexp + (apply #'regexp-or + "Bundler::GemNotFound" + (concat "bundler: failed to load command: " + (regexp-quote executable)) + (concat (regexp-or "bundle" (regexp-quote executable)) + ": command not found") + (if error-regexp (list error-regexp)))) + (command-args + (append (if (format-all--ruby-gem-bundled-p gem-name) + '("bundle" "exec")) + (cons executable (format-all--flatten-once args))))) + (format-all--buffer-hard + ok-statuses error-regexp root-files + (car command-args) + (cdr command-args)))) + +(defvar format-all--executable-table (make-hash-table) + "Internal table of formatter executable names for format-all.") + +(defvar format-all--install-table (make-hash-table) + "Internal table of formatter install commands for format-all.") + +(defvar format-all--language-table (make-hash-table :test 'equal) + "Internal table of major mode formatter lists for format-all.") + +(defvar format-all--format-table (make-hash-table) + "Internal table of formatter formatting functions for format-all.") + +(defun format-all--pushhash (key value table) + "Push VALUE onto the list under KEY in hash table TABLE." + (puthash key (cons value (remove value (gethash key table))) table)) + +(defmacro define-format-all-formatter (formatter &rest body) + "Define a new source code formatter for use with format-all. + +FORMATTER is a symbol naming the formatter. The name of the +command used to run the formatter is usually a good choice. + +Consult the existing formatters for examples of BODY." + (let (executable install languages format) + (cl-assert + (equal (mapcar 'car body) '(:executable :install :languages :format))) + (cl-dolist (part body) + (cl-ecase (car part) + (:executable + (setq executable + (unless (null (cdr part)) + (or (format-all--resolve-system (cdr part)) + (error "Executable not specified for %S system %S" + formatter format-all--system-type))))) + (:install + (setq install (format-all--resolve-system (cdr part)))) + (:languages + (setq languages + (mapcar (lambda (language) + `(format-all--pushhash + ',language ',formatter format-all--language-table)) + (cdr part)))) + (:format + (setq format `(lambda (executable language) + (ignore language ,@(unless executable '(executable))) + ,(cadr part)))))) + `(progn (puthash ',formatter ,executable format-all--executable-table) + (puthash ',formatter ,install format-all--install-table) + ,@languages + (puthash ',formatter ,format format-all--format-table) + ',formatter))) + +(define-format-all-formatter asmfmt + (:executable "asmfmt") + (:install) + (:languages "Assembly") + (:format (format-all--buffer-easy executable))) + +(define-format-all-formatter astyle + (:executable "astyle") + (:install (macos "brew install astyle")) + (:languages "C" "C++" "C#" "Java") + (:format (format-all--buffer-easy + executable + (let ((astylerc (format-all--locate-file ".astylerc"))) + (when astylerc (concat "--options=" astylerc)))))) + +(define-format-all-formatter atsfmt + (:executable "atsfmt") + (:install "cabal new-install ats-format --happy-options='-gcsa' -O2") + (:languages "ATS") + (:format (format-all--buffer-easy executable))) + +(define-format-all-formatter auctex + (:executable) + (:install) + (:languages "LaTeX") + (:format (format-all--buffer-native + 'latex-mode + (lambda () + (let ((f (symbol-function 'LaTeX-fill-buffer))) + (when f (funcall f nil))))))) + +(define-format-all-formatter beautysh + (:executable "beautysh") + (:install "pip install beautysh") + (:languages "Shell") + (:format (format-all--buffer-easy executable "-"))) + +(define-format-all-formatter black + (:executable "black") + (:install "pip install black") + (:languages "Python") + (:format (format-all--buffer-easy + executable "-q" + (when (format-all--buffer-extension-p "pyi") "--pyi") + "-"))) + +(define-format-all-formatter brittany + (:executable "brittany") + (:install "stack install brittany") + (:languages "Haskell" "Literate Haskell") + (:format (format-all--buffer-easy executable))) + +(define-format-all-formatter bsrefmt + (:executable "bsrefmt") + (:install "npm install --global bs-platform") + (:languages "Reason") + (:format (format-all--buffer-easy executable))) + +(define-format-all-formatter buildifier + (:executable "buildifier") + (:install + (macos "brew install buildifier") + "go get github.com/bazelbuild/buildtools/buildifier") + (:languages "Bazel") + (:format (format-all--buffer-easy executable))) + +(define-format-all-formatter cabal-fmt + (:executable "cabal-fmt") + (:install "cabal install cabal-fmt") + (:languages "Cabal Config") + (:format (format-all--buffer-easy executable))) + +(define-format-all-formatter clang-format + (:executable "clang-format") + (:install + (macos "brew install clang-format") + (windows "scoop install llvm")) + (:languages "C" "C#" "C++" "GLSL" "Java" "Objective-C" "Protocol Buffer") + (:format + (format-all--buffer-easy + executable + (concat "-assume-filename=" + (or (buffer-file-name) + (cdr (assoc language + '(("C" . ".c") + ("C#" . ".cs") + ("C++" . ".cpp") + ("GLSL" . ".glsl") + ("Java" . ".java") + ("Objective-C" . ".m") + ("Protocol Buffer" . ".proto"))))))))) + +(define-format-all-formatter cljfmt + (:executable "cljfmt") + (:install "npm install --global node-cljfmt") + (:languages "Clojure") + (:format (format-all--buffer-easy executable))) + +(define-format-all-formatter cmake-format + (:executable "cmake-format") + (:install "pip install cmake-format") + (:languages "CMake") + (:format (format-all--buffer-easy executable "-"))) + +(define-format-all-formatter crystal + (:executable "crystal") + (:install (macos "brew install crystal")) + (:languages "Crystal") + (:format (format-all--buffer-easy executable "tool" "format" "-"))) + +(define-format-all-formatter dartfmt + (:executable "dartfmt") + (:install (macos "brew tap dart-lang/dart && brew install dart")) + (:languages "Dart") + (:format + (format-all--buffer-easy + executable + (when (buffer-file-name) + (list "--stdin-name" (buffer-file-name)))))) + +(define-format-all-formatter dfmt + (:executable "dfmt") + (:install (macos "brew install dfmt")) + (:languages "D") + (:format + (format-all--buffer-hard nil (regexp-quote "[error]") nil executable))) + +(define-format-all-formatter dhall + (:executable "dhall") + (:install (macos "brew install dhall")) + (:languages "Dhall") + (:format (format-all--buffer-easy executable "format"))) + +(define-format-all-formatter dockfmt + (:executable "dockfmt") + (:install "go get github.com/jessfraz/dockfmt") + (:languages "Dockerfile") + (:format (format-all--buffer-easy executable "fmt"))) + +(define-format-all-formatter elm-format + (:executable "elm-format") + (:install (macos "brew install elm")) + (:languages "Elm") + (:format + (cl-destructuring-bind (output error-output) + (format-all--buffer-hard nil nil '("elm.json" "elm-package.json") + executable "--yes" "--stdin") + (let ((error-output (format-all--remove-ansi-color error-output))) + (list output error-output))))) + +(define-format-all-formatter emacs-bibtex + (:executable) + (:install) + (:languages "BibTeX") + (:format (format-all--buffer-native 'bibtex-mode 'bibtex-reformat))) + +(define-format-all-formatter emacs-bibtex-sort + (:executable) + (:install) + (:languages "BibTeX") + (:format (format-all--buffer-native 'bibtex-mode 'bibtex-sort-buffer))) + +(define-format-all-formatter emacs-lisp + (:executable) + (:install) + (:languages "Emacs Lisp") + (:format + (format-all--buffer-native + 'emacs-lisp-mode + (lambda () (indent-region (point-min) (point-max)))))) + +(define-format-all-formatter fish-indent + (:executable "fish_indent") + (:install (macos "brew install fish OR port install fish")) + (:languages "Fish") + (:format (format-all--buffer-easy executable))) + +(define-format-all-formatter fourmolu + (:executable "fourmolu") + (:install "stack install fourmolu") + (:languages "Haskell" "Literate Haskell") + (:format (format-all--buffer-easy executable))) + +(define-format-all-formatter fprettify + (:executable "fprettify") + (:install "pip install fprettify") + (:languages "_Fortran 90") + (:format (format-all--buffer-easy executable "--silent"))) + +(define-format-all-formatter gleam + (:executable "gleam") + (:install (macos "brew install gleam")) + (:languages "_Gleam") + (:format (format-all--buffer-easy executable "format" "--stdin"))) + +(define-format-all-formatter gofmt + (:executable "gofmt") + (:install + (macos "brew install go") + (windows "scoop install go")) + (:languages "Go") + (:format (format-all--buffer-easy executable))) + +(define-format-all-formatter goimports + (:executable "goimports") + (:install "go get golang.org/x/tools/cmd/goimports") + (:languages "Go") + (:format (format-all--buffer-easy executable))) + +(define-format-all-formatter hindent + (:executable "hindent") + (:install "stack install hindent") + (:languages "Haskell" "Literate Haskell") + (:format (format-all--buffer-easy executable))) + +(define-format-all-formatter html-tidy + (:executable "tidy") + (:install + (macos "brew install tidy-html5") + (windows "scoop install tidy")) + (:languages "HTML" "XML") + (:format + (format-all--buffer-hard + '(0 1) nil nil + executable + "-q" + "--tidy-mark" "no" + "-indent" + (when (equal language "XML") "-xml")))) + +(define-format-all-formatter istyle-verilog + (:executable "iStyle") + (:install) + (:languages "Verilog") + (:format (format-all--buffer-easy executable))) + +(define-format-all-formatter jsonnetfmt + (:executable "jsonnetfmt") + (:install (macos "brew install jsonnet")) + (:languages "Jsonnet") + (:format (format-all--buffer-easy executable "-"))) + +(define-format-all-formatter ktlint + (:executable "ktlint") + (:install (macos "brew install ktlint")) + (:languages "Kotlin") + (:format (format-all--buffer-easy executable "--format" "--stdin"))) + +(define-format-all-formatter latexindent + (:executable "latexindent") + (:install) + (:languages "LaTeX") + (:format (format-all--buffer-easy executable))) + +(define-format-all-formatter ledger-mode + (:executable) + (:install) + (:languages "_Ledger") + (:format + (format-all--buffer-native 'ledger-mode 'ledger-mode-clean-buffer))) + +(define-format-all-formatter lua-fmt + (:executable "luafmt") + (:install "npm install --global lua-fmt") + (:languages "Lua") + (:format (format-all--buffer-easy executable "--stdin"))) + +(define-format-all-formatter mix-format + (:executable "mix") + (:install (macos "brew install elixir")) + (:languages "Elixir") + (:format + (format-all--buffer-hard + nil nil '("mix.exs") + executable + "format" + (let ((config-file (format-all--locate-file ".formatter.exs"))) + (when config-file (list "--dot-formatter" config-file))) + "-"))) + +(define-format-all-formatter nixfmt + (:executable "nixfmt") + (:install "nix-env -f https://github.com/serokell/nixfmt/archive/master.tar.gz -i") + (:languages "Nix") + (:format (format-all--buffer-easy executable))) + +(define-format-all-formatter nixpkgs-fmt + (:executable "nixpkgs-fmt") + (:install "nix-env -f https://github.com/nix-community/nixpkgs-fmt/archive/master.tar.gz -i") + (:languages "Nix") + (:format (format-all--buffer-easy executable))) + +(define-format-all-formatter ocp-indent + (:executable "ocp-indent") + (:install "opam install ocp-indent") + (:languages "OCaml") + (:format (format-all--buffer-easy executable))) + +(define-format-all-formatter ormolu + (:executable "ormolu") + (:install "stack install ormolu") + (:languages "Haskell" "Literate Haskell") + (:format (format-all--buffer-easy executable))) + +(define-format-all-formatter perltidy + (:executable "perltidy") + (:install "cpan install Perl::Tidy") + (:languages "Perl") + (:format (format-all--buffer-easy executable))) + +(define-format-all-formatter pgformatter + (:executable "pg_format") + (:install) + (:languages "SQL") + (:format (format-all--buffer-easy executable))) + +(define-format-all-formatter prettier + (:executable "prettier") + (:install "npm install --global prettier @prettier/plugin-lua @prettier/plugin-php prettier-plugin-solidity prettier-plugin-toml") + (:languages + "CSS" "GraphQL" "HTML" "JavaScript" "JSON" "JSX" "Less" "Lua" "Markdown" + "PHP" "SCSS" "Solidity" "TOML" "TSX" "TypeScript" "Vue" "YAML" + "_Angular" "_Flow") + (:format + (format-all--buffer-easy + executable + "--parser" (let ((pair (assoc language + '(("_Angular" . "angular") + ("_Flow" . "flow") + ("JavaScript" . "babel") + ("JSX" . "babel") + ("Solidity" . "solidity-parse") + ("TSX" . "typescript"))))) + (if pair (cdr pair) (downcase language))) + (when (buffer-file-name) (list "--stdin-filepath" (buffer-file-name))) + (let ((ignore-file (format-all--locate-file ".prettierignore"))) + (when ignore-file (list "--ignore-path" ignore-file)))))) + +(define-format-all-formatter purty + (:executable "purty") + (:install "npm install --global purty") + (:languages "PureScript") + (:format (format-all--buffer-easy executable "-"))) + +(define-format-all-formatter rescript + (:executable "rescript") + (:install "npm install --global rescript") + (:languages "ReScript") + (:format + (format-all--buffer-easy + executable "format" "-stdin" + (let ((ext (if (not (buffer-file-name)) "" + (file-name-extension (buffer-file-name))))) + (concat "." (if (equal ext "") "res" ext)))))) + +(define-format-all-formatter rufo + (:executable "rufo") + (:install "gem install rufo") + (:languages "Ruby") + (:format + (format-all--buffer-hard-ruby + "rufo" nil nil nil + "rufo" + "--simple-exit" + (when (buffer-file-name) + (list "--filename" (buffer-file-name)))))) + +(define-format-all-formatter rubocop + (:executable "rubocop") + (:install "gem install rubocop:'>=1.4.0'") + (:languages "Ruby") + (:format + (format-all--buffer-hard-ruby + "rubocop" '(0 1) nil nil + "rubocop" + "--auto-correct" + "--format" "quiet" + "--stderr" + "--stdin" (or (buffer-file-name) (buffer-name))))) + +(define-format-all-formatter rustfmt + (:executable "rustfmt") + (:install "rustup component add rustfmt") + (:languages "Rust") + (:format (format-all--buffer-easy executable))) + +(define-format-all-formatter scalafmt + (:executable "scalafmt") + (:install "coursier bootstrap org.scalameta:scalafmt-cli_2.12:2.4.0-RC1 -r sonatype:snapshots -o /usr/local/bin/scalafmt --standalone --main org.scalafmt.cli.Cli") + (:languages "Scala") + (:format + (format-all--buffer-easy + executable "--stdin" "--non-interactive" "--quiet"))) + +(define-format-all-formatter shfmt + (:executable "shfmt") + (:install + (macos "brew install shfmt") + (windows "scoop install shfmt")) + (:languages "Shell") + (:format + (format-all--buffer-easy + executable + (if (buffer-file-name) + (list "-filename" (buffer-file-name)) + (list "-ln" (cl-case (and (eql major-mode 'sh-mode) + (boundp 'sh-shell) + (symbol-value 'sh-shell)) + (bash "bash") + (mksh "mksh") + (t "posix"))))))) + +(define-format-all-formatter snakefmt + (:executable "snakefmt") + (:install) + (:languages "_Snakemake") + (:format (format-all--buffer-easy executable "-"))) + +(define-format-all-formatter sqlformat + (:executable "sqlformat") + (:install "pip install sqlparse") + (:languages "SQL") + (:format + (let* ((ic (car default-process-coding-system)) + (oc (cdr default-process-coding-system)) + (ienc (symbol-name (or (coding-system-get ic :mime-charset) + 'utf-8))) + (oenc (symbol-name (or (coding-system-get oc :mime-charset) + 'utf-8))) + (process-environment (cons (concat "PYTHONIOENCODING=" oenc) + process-environment))) + (format-all--buffer-easy executable "--encoding" ienc "-")))) + +(define-format-all-formatter standard + (:executable "standard") + (:install "npm install --global standard") + (:languages "JavaScript" "JSX") + (:format + ;; `standard --stdin` properly uses zero vs non-zero exit codes to + ;; indicate success vs error. However, it checks for quite a broad + ;; range of errors, all the way up to undeclared identifiers and + ;; such. To catch only syntax errors, we need to look specifically + ;; for the text "Parsing error:". + (format-all--buffer-hard + '(0 1) ".*?:.*?:[0-9]+:[0-9]+: Parsing error:" nil + executable "--fix" "--stdin"))) + +(define-format-all-formatter standardrb + (:executable "standardrb") + (:install "gem install standard:'>=0.13.0'") + (:languages "Ruby") + (:format + (format-all--buffer-hard-ruby + "standard" '(0 1) nil nil + "standardrb" + "--fix" + "--stdin" (or (buffer-file-name) (buffer-name))))) + +(define-format-all-formatter styler + (:executable "Rscript") + (:install "Rscript -e \"install.packages('styler')\"") + (:languages "R") + (:format + (format-all--buffer-easy + executable "--vanilla" + "-e" (concat + "options(styler.colored_print.vertical=FALSE);" + " con <- file('stdin');" + " out <- styler::style_text(readLines(con));" + " close(con);" + " out")))) + +(define-format-all-formatter stylish-haskell + (:executable "stylish-haskell") + (:install "stack install stylish-haskell") + (:languages "Haskell") + (:format (format-all--buffer-easy executable))) + +(define-format-all-formatter swiftformat + (:executable "swiftformat") + (:install (macos "brew install swiftformat")) + (:languages "Swift") + (:format + (format-all--buffer-easy + executable "--quiet" + (let ((config (format-all--locate-file ".swiftformat"))) + (when config (list "--config" config)))))) + +(define-format-all-formatter terraform-fmt + (:executable "terraform") + (:install (macos "brew install terraform")) + (:languages "Terraform") + (:format (format-all--buffer-easy executable "fmt" "-no-color" "-"))) + +(define-format-all-formatter yapf + (:executable "yapf") + (:install "pip install yapf") + (:languages "Python") + (:format (format-all--buffer-easy executable))) + +(defun format-all--language-id-buffer () + "Return the language used in the current buffer, or NIL. + +Prefer getting the ID from the language-id library. Some +languages do not yet have official GitHub Linguist identifiers, +yet format-all needs to know about them anyway. That's why we +have this custom language-id function in format-all. The +unofficial languages IDs are prefixed with \"_\"." + (or (and (or (equal major-mode 'angular-html-mode) + (and (equal major-mode 'web-mode) + (equal (symbol-value 'web-mode-content-type) "html") + (equal (symbol-value 'web-mode-engine) "angular"))) + "_Angular") + (and (member major-mode '(js-mode js2-mode js3-mode)) + (boundp 'flow-minor-mode) + (not (null (symbol-value 'flow-minor-mode))) + "_Flow") + (and (equal major-mode 'f90-mode) "_Fortran 90") + (and (equal major-mode 'gleam-mode) "_Gleam") + (and (equal major-mode 'ledger-mode) "_Ledger") + (and (equal major-mode 'snakemake-mode) "_Snakemake") + (language-id-buffer))) + +(defun format-all--please-install (executable installer) + "Internal helper function for error about missing EXECUTABLE and INSTALLER." + (concat (format "You need the %S command." executable) + (if (not installer) "" + (format " You may be able to install it via %S." installer)))) + +(defun format-all--formatter-executable (formatter) + "Internal helper function to get the external program for FORMATTER." + (let ((executable (gethash formatter format-all--executable-table))) + (when executable + (or (executable-find executable) + (signal 'format-all-executable-not-found + (format-all--please-install + executable + (gethash formatter format-all--install-table))))))) + +(defun format-all--show-errors-buffer (error-output show-errors-p) + "Internal shorthand function to update and show error output. + +ERROR-OUTPUT come from the formatter. SHOW-ERRORS-P determines +whether or not to display the errors buffer." + (save-selected-window + (with-current-buffer (get-buffer-create "*format-all-errors*") + (erase-buffer) + (insert error-output) + (if show-errors-p + (display-buffer (current-buffer)) + (let ((error-window (get-buffer-window (current-buffer)))) + (when error-window (quit-window nil error-window))))))) + +(defun format-all--update-errors-buffer (status error-output) + "Internal helper function to update *format-all-errors*. + +STATUS and ERROR-OUTPUT come from the formatter." + (let* ((has-warnings-p (not (= 0 (length error-output)))) + (has-errors-p (eq status :error)) + (show-errors-p (cl-case format-all-show-errors + (never nil) + (always t) + (warnings (or has-errors-p has-warnings-p)) + (errors has-errors-p)))) + (format-all--show-errors-buffer error-output show-errors-p))) + +(defun format-all--save-line-number (thunk) + "Internal helper function to run THUNK and go back to the same line." + (let ((old-line-number (line-number-at-pos)) + (old-column (current-column))) + (funcall thunk) + (goto-char (point-min)) + (forward-line (1- old-line-number)) + (let ((line-length (- (point-at-eol) (point-at-bol)))) + (goto-char (+ (point) (min old-column line-length)))))) + +(defun format-all--run-chain (language chain) + "Internal function to run a formatter CHAIN on the current buffer. + +LANGUAGE is the language ID of the current buffer, from +`format-all--language-id-buffer`." + (let* ((chain (format-all--normalize-chain chain)) + (chain-tail chain) + (error-output "") + (reformatted-by '())) + (format-all--save-line-number + (lambda () + (cl-loop + (unless (and chain-tail (= 0 (length error-output))) + (cl-return)) + (let* ((formatter (car chain-tail)) + (f-name (car formatter)) + (f-args (cdr formatter)) + (f-function (gethash f-name format-all--format-table)) + (f-executable (format-all--formatter-executable f-name))) + (when format-all-debug + (message + "Format-All: Formatting %s as %s using %S%s" + (buffer-name) language f-name + (with-temp-buffer + (dolist (arg f-args) (insert " " (shell-quote-argument arg))) + (buffer-string)))) + (cl-destructuring-bind (f-output f-error-output) + (let ((format-all--user-args f-args)) + (funcall f-function f-executable language)) + (let ((f-status :already-formatted)) + (cond ((null f-output) + (setq error-output f-error-output) + (setq f-status :error)) + ((not (equal f-output t)) + (setq reformatted-by + (append reformatted-by (list f-name))) + (let ((inhibit-read-only t)) + (erase-buffer) + (insert f-output)) + (setq f-status :reformatted))) + (run-hook-with-args 'format-all-after-format-functions + f-name f-status) + (format-all--update-errors-buffer f-status f-error-output)))) + (setq chain-tail (cdr chain-tail))) + (message "%s" + (cond ((not (= 0 (length error-output))) "Formatting error") + ((not reformatted-by) "Already formatted") + (t "Reformatted!"))))))) + +(defun format-all--get-default-chain (language) + "Internal function to get the default formatter chain for LANGUAGE." + (when language (cdr (assoc language format-all-default-formatters)))) + +(defun format-all--get-chain (language) + "Internal function to get LANGUAGE formatter chain for current buffer." + (when language (cdr (assoc language format-all-formatters)))) + +(defun format-all--set-chain (language chain) + "Internal function to set LANGUAGE formatter CHAIN for current buffer." + (cl-assert (stringp language)) + (cl-assert (listp chain)) + (setq format-all-formatters + (append (cl-remove-if (lambda (pair) (equal language (car pair))) + format-all-formatters) + (when chain (list (cons language chain)))))) + +(defun format-all--prompt-for-formatter (language) + "Internal function to choose a formatter for LANGUAGE." + (let ((f-names (gethash language format-all--language-table))) + (cond ((null f-names) + (error "No supported formatters for %s" + (or language "this language"))) + ((null (cdr f-names)) + (car f-names)) + (t + (let ((f-string (completing-read + (format "Formatter for %s: " language) + (mapcar #'list f-names) nil t))) + (and (not (= 0 (length f-string))) + (intern f-string))))))) + +(defun format-all--buffer-from-hook () + "Internal helper function to auto-format current buffer from a hook. + +Format-All installs this function into `before-save-hook' to +format buffers on save. This is a lenient version of +`format-all-buffer' that silently succeeds instead of signaling +an error if the current buffer has no formatter." + (let ((language (format-all--language-id-buffer))) + (format-all--run-chain language (format-all--get-chain language)))) + +;;;###autoload +(defun format-all-buffer (&optional prompt) + "Auto-format the source code in the current buffer. + +No disk files are touched - the buffer doesn't even need to be +saved. If you don't like the results of the formatting, you can +use ordinary undo to get your code back to its previous state. + +You will need to install external programs to do the formatting. +If the command can't find the program that it needs, it will try +to tell you how you might be able to install it on your operating +system. Only BibTeX, Emacs Lisp and Ledger are formatted without an +external program. + +A suitable formatter is selected according to the `major-mode' of +the buffer. Many popular programming languages are supported. +It is fairly easy to add new languages that have an external +formatter. When called interactively or PROMPT-P is non-nil, a +missing formatter is prompted in the minibuffer. + +If PROMPT is non-nil (or the function is called as an interactive +command), a missing formatter is prompted in the minibuffer. If +PROMPT is the symbol `always' (or a prefix argument is given), +the formatter is prompted for even if one has already been set. + +If any errors or warnings were encountered during formatting, +they are shown in a buffer called *format-all-errors*." + (interactive (list (if current-prefix-arg 'always t))) + (let* ((language (format-all--language-id-buffer)) + (chain (format-all--get-chain language))) + (when (or (equal 'always prompt) (and prompt (not chain))) + (let ((f-name (format-all--prompt-for-formatter language))) + (when f-name + (message "Setting formatter to %S" f-name) + (setq chain (list f-name)) + (format-all--set-chain language chain)))) + (unless chain (error "No formatter")) + (format-all--run-chain language chain))) + +(defun format-all-ensure-formatter () + "Ensure current buffer has a formatter, using default if not." + (interactive) + (let ((language (format-all--language-id-buffer))) + (unless (format-all--get-chain language) + (cond ((not language) + (message "No formatter for this language")) + ((not (gethash language format-all--language-table)) + (message "No formatter for %s" language)) + (t + (let ((default (format-all--get-default-chain language))) + (cond ((not default) + (message "No default formatter for %s" language)) + (t + (message "Using default formatter%s" + (with-temp-buffer + (dolist (formatter default (buffer-string)) + (insert (format " %S" formatter))))) + (format-all--set-chain language default))))))))) + +;;;###autoload +(define-minor-mode format-all-mode + "Toggle automatic source code formatting before save. + +When this minor mode (FmtAll) is enabled, `format-all-buffer' is +automatically called to format your code each time before you +save the buffer. + +The mode is buffer-local and needs to be enabled separately each +time a file is visited. You may want to use `add-hook' in your +`user-init-file' to enable the mode based on buffer modes. E.g.: + + (add-hook 'prog-mode-hook 'format-all-mode) + +To use a default formatter for projects that don't have one, add +this too: + + (add-hook 'prog-mode-hook 'format-all-ensure-formatter) + +When `format-all-mode' is called as a Lisp function, the mode is +toggled if ARG is ‘toggle’, disabled if ARG is a negative integer +or zero, and enabled otherwise." + :lighter " FmtAll" + :global nil + (if format-all-mode + (add-hook 'before-save-hook + 'format-all--buffer-from-hook + nil 'local) + (remove-hook 'before-save-hook + 'format-all--buffer-from-hook + 'local))) + +(provide 'format-all) + +;;; format-all.el ends here diff --git a/.emacs.d/elpa/format-all-20210608.2033/format-all.elc b/.emacs.d/elpa/format-all-20210608.2033/format-all.elc new file mode 100644 index 0000000..e98abea Binary files /dev/null and b/.emacs.d/elpa/format-all-20210608.2033/format-all.elc differ diff --git a/.emacs.d/elpa/gnupg/pubring.kbx b/.emacs.d/elpa/gnupg/pubring.kbx new file mode 100644 index 0000000..6420530 Binary files /dev/null and b/.emacs.d/elpa/gnupg/pubring.kbx differ diff --git a/.emacs.d/elpa/gnupg/pubring.kbx~ b/.emacs.d/elpa/gnupg/pubring.kbx~ new file mode 100644 index 0000000..87cef4a Binary files /dev/null and b/.emacs.d/elpa/gnupg/pubring.kbx~ differ diff --git a/.emacs.d/elpa/gnupg/trustdb.gpg b/.emacs.d/elpa/gnupg/trustdb.gpg new file mode 100644 index 0000000..de27c83 Binary files /dev/null and b/.emacs.d/elpa/gnupg/trustdb.gpg differ diff --git a/.emacs.d/elpa/goto-chg-20210508.1632/goto-chg-autoloads.el b/.emacs.d/elpa/goto-chg-20210508.1632/goto-chg-autoloads.el new file mode 100644 index 0000000..2443f71 --- /dev/null +++ b/.emacs.d/elpa/goto-chg-20210508.1632/goto-chg-autoloads.el @@ -0,0 +1,55 @@ +;;; goto-chg-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "goto-chg" "goto-chg.el" (0 0 0 0)) +;;; Generated autoloads from goto-chg.el + +(autoload 'goto-last-change "goto-chg" "\ +Go to the point where the last edit was made in the current buffer. +Repeat the command to go to the second last edit, etc. + +To go back to more recent edit, the reverse of this command, use \\[goto-last-change-reverse] +or precede this command with \\[universal-argument] - (minus). + +It does not go to the same point twice even if there has been many edits +there. I call the minimal distance between distinguishable edits \"span\". +Set variable `glc-default-span' to control how close is \"the same point\". +Default span is 8. +The span can be changed temporarily with \\[universal-argument] right before \\[goto-last-change]: +\\[universal-argument] <NUMBER> set current span to that number, +\\[universal-argument] (no number) multiplies span by 4, starting with default. +The so set span remains until it is changed again with \\[universal-argument], or the consecutive +repetition of this command is ended by any other command. + +When span is zero (i.e. \\[universal-argument] 0) subsequent \\[goto-last-change] visits each and +every point of edit and a message shows what change was made there. +In this case it may go to the same point twice. + +This command uses undo information. If undo is disabled, so is this command. +At times, when undo information becomes too large, the oldest information is +discarded. See variable `undo-limit'. + +\(fn ARG)" t nil) + +(autoload 'goto-last-change-reverse "goto-chg" "\ +Go back to more recent changes after \\[goto-last-change] have been used. +See `goto-last-change' for use of prefix argument. + +\(fn ARG)" t nil) + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "goto-chg" '("glc-"))) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; goto-chg-autoloads.el ends here diff --git a/.emacs.d/elpa/goto-chg-20210508.1632/goto-chg-pkg.el b/.emacs.d/elpa/goto-chg-20210508.1632/goto-chg-pkg.el new file mode 100644 index 0000000..a59528f --- /dev/null +++ b/.emacs.d/elpa/goto-chg-20210508.1632/goto-chg-pkg.el @@ -0,0 +1,2 @@ +;;; Generated package description from goto-chg.el -*- no-byte-compile: t -*- +(define-package "goto-chg" "20210508.1632" "Go to last change" '((emacs "24.1")) :commit "3ce1389fea12edde4e343bc7d54c8da97a1a6136" :authors '(("David Andersson <l.david.andersson(at)sverige.nu>")) :maintainer '("Vasilij Schneidermann" . "mail@vasilij.de") :keywords '("convenience" "matching") :url "https://github.com/emacs-evil/goto-chg") diff --git a/.emacs.d/elpa/goto-chg-20210508.1632/goto-chg.el b/.emacs.d/elpa/goto-chg-20210508.1632/goto-chg.el new file mode 100644 index 0000000..527addf --- /dev/null +++ b/.emacs.d/elpa/goto-chg-20210508.1632/goto-chg.el @@ -0,0 +1,388 @@ +;;; goto-chg.el --- Go to last change +;;-------------------------------------------------------------------- +;; +;; Copyright (C) 2002-2008,2013 David Andersson +;; +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License as +;; published by the Free Software Foundation; either version 2 of +;; the License, or (at your option) any later version. +;; +;; This program is distributed in the hope that it will be +;; useful, but WITHOUT ANY WARRANTY; without even the implied +;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +;; PURPOSE. See the GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public +;; License along with this program; if not, write to the Free +;; Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301 USA +;; +;;------------------------------------------------------------------- +;; +;; Author: David Andersson <l.david.andersson(at)sverige.nu> +;; Maintainer: Vasilij Schneidermann <mail@vasilij.de> +;; Created: 16 May 2002 +;; Version: 1.7.4 +;; Package-Version: 20210508.1632 +;; Package-Commit: 3ce1389fea12edde4e343bc7d54c8da97a1a6136 +;; Package-Requires: ((emacs "24.1")) +;; Keywords: convenience, matching +;; URL: https://github.com/emacs-evil/goto-chg +;; +;;; Commentary: +;; +;; Goto Last Change +;; +;; Goto the point of the most recent edit in the buffer. +;; When repeated, goto the second most recent edit, etc. +;; Negative argument, C-u -, for reverse direction. +;; Works by looking into buffer-undo-list to find points of edit. +;; +;; You would probably like to bind this command to a key. +;; For example in your ~/.emacs: +;; +;; (require 'goto-chg) +;; +;; (global-set-key [(control ?.)] 'goto-last-change) +;; (global-set-key [(control ?,)] 'goto-last-change-reverse) +;; +;; Works with emacs-19.29, 19.31, 20.3, 20.7, 21.1, 21.4, 22.1 and 23.1 +;; Works with XEmacs-20.4 and 21.4 (but see todo about `last-command' below) +;; +;;-------------------------------------------------------------------- +;; History +;; +;; Ver 1.7.4 2020-10-08 Vasilij Schneidermann +;; Remove hard dependency on undo-tree +;; Ver 1.7.3 2019-01-07 Vasilij Schneidermann +;; Fix errors when used with persistent undo +;; Ver 1.7.2 2018-01-05 Vasilij Schneidermann +;; Fix byte-compiler warnings again +;; Ver 1.7.1 2017-12-31 Vasilij Schneidermann +;; Fix byte-compiler warnings +;; Ver 1.7 2017-09-17 Vasilij Schneidermann +;; Make it work with undo-tree-mode (see +;; <https://github.com/martinp26/goto-chg>) +;; Ver 1.6 2013-12-12 David Andersson +;; Add keywords; Cleanup comments +;; Ver 1.5 2013-12-11 David Andersson +;; Autoload and document `goto-last-change-reverse' +;; Ver 1.4 2008-09-20 David Andersson +;; Improved property change description; Update comments. +;; Ver 1.3 2007-03-14 David Andersson +;; Added `goto-last-change-reverse' +;; Ver 1.2 2003-04-06 David Andersson +;; Don't let repeating error depthen glc-probe-depth. +;; Ver 1.1 2003-04-06 David Andersson +;; Zero arg describe changes. Negative arg go back. +;; Autoload. Remove message using nil in stead of an empty string. +;; Ver 1.0 2002-05-18 David Andersson +;; Initial version +;; +;;-------------------------------------------------------------------- +;; +;;todo: Rename "goto-chg.el" -> "gotochange.el" or "goto-chgs" ? +;;todo: Rename function goto-last-change -> goto-last-edit ? +;;todo: Rename adjective "-last-" -> "-latest-" or "-most-recent-" ? +;;todo: There are some, maybe useful, funcs for region undo +;; in simple.el in emacs 20. Take a look. +;;todo: Add functionality to visit changed point in text order, not only in +;; chronological order. (Naa, highlight-changes-mode does that). +;;todo: Inverse indication that a change has been saved or not +;;todo: Highlight the range of text involved in the last change? +;;todo: See session-jump-to-last-change in session.el? +;;todo: Unhide invisible text (e.g. outline mode) like isearch do. +;;todo: XEmacs sets last-command to `t' after an error, so you cannot reverse +;; after "No furter change info". Should we bother? +;;todo: Try distinguish "No further change info" (end of truncated undo list) +;; and "No further changes" (end of a complete undo list). +;; +;;-------------------------------------------------------------------- + +;;; Code: + +(require 'undo-tree nil t) + +(defvar glc-default-span 8 "*goto-last-change don't visit the same point twice. glc-default-span tells how far around a visited point not to visit again.") +(defvar glc-current-span 8 "Internal for goto-last-change.\nA copy of glc-default-span or the ARG passed to goto-last-change.") +(defvar glc-probe-depth 0 "Internal for goto-last-change.\nIt is non-zero between successive goto-last-change.") +(defvar glc-direction 1 "Direction goto-last-change moves towards.") + +;;todo: Find begin and end of line, then use it somewhere + +(defun glc-fixup-edit (e) + "Convert an Emacs 27.1-style combined change to a regular edit." + (when (and (consp e) + (eq (car e) 'apply) + (not (functionp (cadr e))) + (eq (nth 4 e) 'undo--wrap-and-run-primitive-undo)) + (let ((args (last e))) + (when (and (consp args) (= (length args) 1) + (consp (car args)) (= (length (car args)) 1) + (consp (caar args)) (numberp (car (caar args))) (numberp (cdr (caar args)))) + (setq e (caar args))))) + e) + +(defun glc-center-ellipsis (str maxlen &optional ellipsis) + "Truncate STRING in the middle to length MAXLEN. +If STRING is max MAXLEN just return the string. +Optional third argument is the replacement, which defaults to \"...\"." + (if (<= (length str) maxlen) + str + ;; else + (let* ((lipsis (or ellipsis "...")) + (i (/ (- maxlen (length lipsis)) 2))) + (concat (substring str 0 i) + lipsis + (substring str (- i)))))) + +(defun glc-adjust-pos2 (pos p1 p2 adj) + ;; Helper function to glc-adjust-pos + ;; p1, p2: interval where an edit occured + ;; adj: amount of text added (positive) or removed (negativ) by the edit + ;; Return pos if well before p1, or pos+adj if well after p2, or nil if too close + (cond ((<= pos (- p1 glc-current-span)) + pos) + ((> pos (+ p2 glc-current-span)) + (+ pos adj)) + ((zerop glc-current-span) + p1) + (t + nil))) + +(defun glc-adjust-pos (pos e) + "Given POS, a buffer position before the edit E, compute and return +the \"same\" buffer position after E happened. +Exception: return nil if POS is closer than `glc-current-span' to the edit E. +\nInsertion edits before POS returns a larger value. +Deletion edits before POS returns a smaller value. +\nThe edit E is an entry from the `buffer-undo-list'. See for details." + (setq e (glc-fixup-edit e)) + (cond ((atom e) ; nil==cmd boundary, or, num==changed pos + pos) + ((numberp (car e)) ; (beg . end)==insertion + (glc-adjust-pos2 pos (car e) (car e) (- (cdr e) (car e)))) + ((stringp (car e)) ; (string . pos)==deletion + (glc-adjust-pos2 pos (abs (cdr e)) (+ (abs (cdr e)) (length (car e))) (- (length (car e))))) + ((null (car e)) ; (nil prop val beg . end)==prop change + (glc-adjust-pos2 pos (nth 3 e) (nthcdr 4 e) 0)) + (t ; (marker . dist)==marker moved + pos))) + +;; If recursive in stead of iterative (while), it tends to fill the call stack. +;; (Isn't it tail optimized?) +(defun glc-adjust-list (r) + "R is list of edit entries in chronological order. +Pick the point of the first edit entry and update that point with +the second, third, etc, edit entries. Return the final updated point, +or nil if the point was closer than `glc-current-span' to some edit in R. +\nR is basically a reversed slice from the buffer-undo-list." + (if r + ;; Get pos + (let ((pos (glc-get-pos (car r)))) + (setq r (cdr r)) + ;; Walk back in reverse list + (while (and r pos) + (setq pos (glc-adjust-pos pos (car r)) + r (cdr r))) + pos) + ;; else + nil)) + +(defun glc-get-pos (e) + "If E represents an edit, return a position value in E, the position +where the edit took place. Return nil if E represents no real change. +\nE is an entry in the buffer-undo-list." + (setq e (glc-fixup-edit e)) + (cond ((numberp e) e) ; num==changed position + ((atom e) nil) ; nil==command boundary + ((numberp (car e)) (cdr e)) ; (beg . end)==insertion + ((stringp (car e)) (abs (cdr e))) ; (string . pos)==deletion + ((null (car e)) (nthcdr 4 e)) ; (nil ...)==text property change + ((atom (car e)) nil) ; (t ...)==file modification time + (t nil))) ; (marker ...)==marker moved + +(defun glc-get-descript (e &optional n) + "If E represents an edit, return a short string describing E. +Return nil if E represents no real change. +\nE is an entry in the buffer-undo-list." + (setq e (glc-fixup-edit e)) + (let ((nn (or (format "T-%d: " n) ""))) + (cond ((numberp e) "New position") ; num==changed position + ((atom e) nil) ; nil==command boundary + ((numberp (car e)) ; (beg . end)==insertion + (if (and n (< n 2)) + (format "%sInserted %d chars \"%s\"" nn (- (cdr e) (car e)) + (glc-center-ellipsis (buffer-substring (car e) (cdr e)) 60)) + ;; else + ;; An older insert. The inserted text cannot easily be computed. + ;; Just show the char count. + (format "%sInserted %d chars" nn (- (cdr e) (car e))))) + ((stringp (car e)) ; (string . pos)==deletion + (format "%sDeleted \"%s\"" nn (glc-center-ellipsis (car e) 60))) + ((null (car e)) ; (nil ...)==text property change + (format "%sProperty change" nn)) + ((atom (car e)) nil) ; (t ...)==file modification time + (t nil)))) ; (marker ...)==marker moved + +(defun glc-is-positionable (e) + "Return non-nil if E is an insertion, deletion or text property change. +\nE is an entry in the buffer-undo-list." + (and (not (numberp e)) (glc-get-pos e))) + +(defun glc-is-filetime (e) + "Return t if E indicates a buffer became \"modified\", +that is, it was previously saved or unchanged. Nil otherwise." + (and (listp e) (eq (car e) t))) + +(declare-function undo-tree-current "ext:undo-tree") +(declare-function undo-tree-node-previous "ext:undo-tree") +(declare-function undo-tree-node-undo "ext:undo-tree") +(declare-function undo-list-transfer-to-tree "ext:undo-tree") +(defvar buffer-undo-tree) + +;;;###autoload +(defun goto-last-change (arg) +"Go to the point where the last edit was made in the current buffer. +Repeat the command to go to the second last edit, etc. +\nTo go back to more recent edit, the reverse of this command, use \\[goto-last-change-reverse] +or precede this command with \\[universal-argument] - (minus). +\nIt does not go to the same point twice even if there has been many edits +there. I call the minimal distance between distinguishable edits \"span\". +Set variable `glc-default-span' to control how close is \"the same point\". +Default span is 8. +The span can be changed temporarily with \\[universal-argument] right before \\[goto-last-change]: +\\[universal-argument] <NUMBER> set current span to that number, +\\[universal-argument] (no number) multiplies span by 4, starting with default. +The so set span remains until it is changed again with \\[universal-argument], or the consecutive +repetition of this command is ended by any other command. +\nWhen span is zero (i.e. \\[universal-argument] 0) subsequent \\[goto-last-change] visits each and +every point of edit and a message shows what change was made there. +In this case it may go to the same point twice. +\nThis command uses undo information. If undo is disabled, so is this command. +At times, when undo information becomes too large, the oldest information is +discarded. See variable `undo-limit'." + (interactive "P") + (cond ((not (eq this-command last-command)) + ;; Start a glc sequence + ;; Don't go to current point if last command was an obvious edit + ;; (yank or self-insert, but not kill-region). Makes it easier to + ;; jump back and forth when copying seleced lines. + (setq glc-probe-depth (if (memq last-command '(yank self-insert-command)) 1 0) + glc-direction 1 + glc-current-span glc-default-span) + (if (< (prefix-numeric-value arg) 0) + (error "Negative arg: Cannot reverse as the first operation")))) + (cond ((and (null buffer-undo-list) + (or (not (boundp 'buffer-undo-tree)) + (null buffer-undo-tree))) + (error "Buffer has not been changed")) + ((eq buffer-undo-list t) + (error "No change info (undo is disabled)"))) + (cond ((numberp arg) ; Numeric arg sets span + (setq glc-current-span (abs arg))) + ((consp arg) ; C-u's multiply previous span by 4 + (setq glc-current-span (* (abs (car arg)) glc-default-span)) + (message "Current span is %d chars" glc-current-span))) ;todo: keep message with "waiting" and "is saved" + (cond ((< (prefix-numeric-value arg) 0) + (setq glc-direction -1)) + (t + (setq glc-direction 1))) + (let (rev ; Reversed (and filtered) undo list + pos ; The pos we look for, nil until found + (n 0) ; Steps in undo list (length of 'rev') + (l buffer-undo-list) + (passed-save-entry (not (buffer-modified-p))) + (new-probe-depth glc-probe-depth) + (undo-tree-p (bound-and-true-p undo-tree-mode)) + glc-seen-canary) + ;; Walk back and forth in the buffer-undo-list, each time one step deeper, + ;; until we can walk back the whole list with a 'pos' that is not coming + ;; too close to another edit. + (while (null pos) + (setq new-probe-depth (+ new-probe-depth glc-direction)) + (if (< glc-direction 0) + (setq rev () + n 0 + l buffer-undo-list + passed-save-entry (not (buffer-modified-p)))) + (if (< new-probe-depth 1) + (error "No later change info")) + (if (> n 150) + (message "working...")) + ;; Walk forward in buffer-undo-list, glc-probe-depth steps. + ;; Build reverse list along the way + (if (not undo-tree-p) + (while (< n new-probe-depth) + (cond ((null l) + ;(setq this-command t) ; Disrupt repeat sequence + (error "No further change info")) + ((glc-is-positionable (car l)) + (setq n (1+ n) + rev (cons (car l) rev))) + ((or passed-save-entry (glc-is-filetime (car l))) + (setq passed-save-entry t))) + (setq l (cdr l))) + (undo-list-transfer-to-tree) + (when (not glc-seen-canary) + (while (and (not (null l)) (not glc-seen-canary) (< n new-probe-depth)) + (cond ((eq 'undo-tree-canary (car l)) ; used by buffer-undo-tree + (message "Canary found...") + (setq l (undo-tree-current buffer-undo-tree) + glc-seen-canary t)) + ((glc-is-positionable (car l)) + (setq n (1+ n) + rev (cons (car l) rev))) + ((or passed-save-entry (glc-is-filetime (car l))) + (setq passed-save-entry t))) + (when (not glc-seen-canary) + (setq l (cdr l))))) + (when glc-seen-canary + (while (and (< n new-probe-depth) (eval '(undo-tree-node-p l))) + (cond ((null l) + ;(setq this-command t) ; Disrupt repeat sequence + (error "No further change info")) + ((glc-is-positionable (car (undo-tree-node-undo l))) + (setq n (1+ n) + rev (cons (car (undo-tree-node-undo l)) rev))) + ((or passed-save-entry (glc-is-filetime (car (undo-tree-node-undo l)))) + (setq passed-save-entry t))) + (setq l (undo-tree-node-previous l)))) + (when (null l) + (error "No further change info"))) + ;; Walk back in reverse list, from older to newer edits. + ;; Adjusting pos along the way. + (setq pos (glc-adjust-list rev))) + ;; Found a place not previously visited, in 'pos'. + ;; (An error have been issued if nothing (more) found.) + (if (> n 150) + (message nil)) ; remove message "working..." + (if (and (= glc-current-span 0) (glc-get-descript (car rev) n)) + (message "%s" (glc-get-descript (car rev) n)) + ;; else + (if passed-save-entry + (message "(This change is saved)"))) + (setq glc-probe-depth new-probe-depth) + (goto-char pos))) + +;;;###autoload +(defun goto-last-change-reverse (arg) + "Go back to more recent changes after \\[goto-last-change] have been used. +See `goto-last-change' for use of prefix argument." + (interactive "P") + ;; Negate arg, all kinds + (cond ((eq arg nil) (setq arg '-)) + ((eq arg '-) (setq arg nil)) + ((listp arg) (setq arg (list (- (car arg))))) + (t (setq arg (- arg)))) + ;; Make 'goto-last-change-reverse' look like 'goto-last-change' + (cond ((eq last-command this-command) + (setq last-command 'goto-last-change))) + (setq this-command 'goto-last-change) + ;; Call 'goto-last-change' to do the job + (goto-last-change arg)) + +(provide 'goto-chg) + +;;; goto-chg.el ends here diff --git a/.emacs.d/elpa/goto-chg-20210508.1632/goto-chg.elc b/.emacs.d/elpa/goto-chg-20210508.1632/goto-chg.elc new file mode 100644 index 0000000..d0656b2 Binary files /dev/null and b/.emacs.d/elpa/goto-chg-20210508.1632/goto-chg.elc differ diff --git a/.emacs.d/elpa/inheritenv-20210204.354/inheritenv-autoloads.el b/.emacs.d/elpa/inheritenv-20210204.354/inheritenv-autoloads.el new file mode 100644 index 0000000..36dabcf --- /dev/null +++ b/.emacs.d/elpa/inheritenv-20210204.354/inheritenv-autoloads.el @@ -0,0 +1,34 @@ +;;; inheritenv-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "inheritenv" "inheritenv.el" (0 0 0 0)) +;;; Generated autoloads from inheritenv.el + +(autoload 'inheritenv-apply "inheritenv" "\ +Apply FUNC such that the environment it sees will match the current value. +This is useful if FUNC creates a temp buffer, because that will +not inherit any buffer-local values of variables `exec-path' and +`process-environment'. + +This function is designed for convenient use as an \"around\" advice. + +ARGS is as for ORIG. + +\(fn FUNC &rest ARGS)" nil nil) + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "inheritenv" '("inheritenv"))) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; inheritenv-autoloads.el ends here diff --git a/.emacs.d/elpa/inheritenv-20210204.354/inheritenv-pkg.el b/.emacs.d/elpa/inheritenv-20210204.354/inheritenv-pkg.el new file mode 100644 index 0000000..e432349 --- /dev/null +++ b/.emacs.d/elpa/inheritenv-20210204.354/inheritenv-pkg.el @@ -0,0 +1,2 @@ +;;; Generated package description from inheritenv.el -*- no-byte-compile: t -*- +(define-package "inheritenv" "20210204.354" "Make temp buffers inherit buffer-local environment variables" '((emacs "24.4")) :commit "7e4c8b0d0a43b6f1c6c4d6dbd2f3bf5ce7f20067" :authors '(("Steve Purcell" . "steve@sanityinc.com")) :maintainer '("Steve Purcell" . "steve@sanityinc.com") :keywords '("unix") :url "https://github.com/purcell/inheritenv") diff --git a/.emacs.d/elpa/inheritenv-20210204.354/inheritenv.el b/.emacs.d/elpa/inheritenv-20210204.354/inheritenv.el new file mode 100644 index 0000000..64c02af --- /dev/null +++ b/.emacs.d/elpa/inheritenv-20210204.354/inheritenv.el @@ -0,0 +1,89 @@ +;;; inheritenv.el --- Make temp buffers inherit buffer-local environment variables -*- lexical-binding: t; -*- + +;; Copyright (C) 2021 Steve Purcell + +;; Author: Steve Purcell <steve@sanityinc.com> +;; URL: https://github.com/purcell/inheritenv +;; Package-Version: 20210204.354 +;; Package-Commit: 7e4c8b0d0a43b6f1c6c4d6dbd2f3bf5ce7f20067 +;; Package-Requires: ((emacs "24.4")) +;; Version: 0.1-pre +;; Keywords: unix + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see <https://www.gnu.org/licenses/>. + +;;; Commentary: + +;; Environment variables in Emacs can be set buffer-locally, like many +;; Emacs preferences, which allows users to have different buffer-local +;; paths for executables in different projects, specified by a +;; ".dir-locals.el" file or via a "direnv" integration like +;; envrc (see https://github.com/purcell/envrc). + +;; However, there's a fairly common pitfall when Emacs libraries run +;; background processes on behalf of a user: many such libraries run +;; processes in temporary buffers that do not inherit the calling +;; buffer's environment. This can result in executables not being found, +;; or the wrong versions of executables being picked up. + +;; An example is the Emacs built-in command +;; `shell-command-to-string'. Whatever buffer-local `process-environment' +;; (or `exec-path') the user has set, that command will always use the +;; Emacs-wide default. This is *specified* behaviour, but not *expected* +;; or *helpful*. + +;; `inheritenv' provides a couple of tools for dealing with this +;; issue: + +;; 1. Library authors can wrap code that plans to execute processes in +;; temporary buffers with the `inheritenv' macro. +;; 2. End users can modify commands like `shell-command-to-string' using +;; the `inheritenv-add-advice' macro. + +;;; Code: + +(require 'cl-lib) + +;;;###autoload +(defun inheritenv-apply (func &rest args) + "Apply FUNC such that the environment it sees will match the current value. +This is useful if FUNC creates a temp buffer, because that will +not inherit any buffer-local values of variables `exec-path' and +`process-environment'. + +This function is designed for convenient use as an \"around\" advice. + +ARGS is as for ORIG." + (cl-letf* (((default-value 'process-environment) process-environment) + ((default-value 'exec-path) exec-path)) + (apply func args))) + + +(defmacro inheritenv (&rest body) + "Wrap BODY so that the environment it sees will match the current value. +This is useful if BODY creates a temp buffer, because that will +not inherit any buffer-local values of variables `exec-path' and +`process-environment'." + `(inheritenv-apply (lambda () ,@body))) + + +(defmacro inheritenv-add-advice (func) + "Advise function FUNC with `inheritenv-apply'. +This will ensure that any buffers (including temporary buffers) +created by FUNC will inherit the caller's environment." + `(advice-add ,func :around 'inheritenv-apply)) + + +(provide 'inheritenv) +;;; inheritenv.el ends here diff --git a/.emacs.d/elpa/inheritenv-20210204.354/inheritenv.elc b/.emacs.d/elpa/inheritenv-20210204.354/inheritenv.elc new file mode 100644 index 0000000..600a9ab Binary files /dev/null and b/.emacs.d/elpa/inheritenv-20210204.354/inheritenv.elc differ diff --git a/.emacs.d/elpa/language-id-20210411.1332/language-id-autoloads.el b/.emacs.d/elpa/language-id-20210411.1332/language-id-autoloads.el new file mode 100644 index 0000000..f9ea5e7 --- /dev/null +++ b/.emacs.d/elpa/language-id-20210411.1332/language-id-autoloads.el @@ -0,0 +1,22 @@ +;;; language-id-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "language-id" "language-id.el" (0 0 0 0)) +;;; Generated autoloads from language-id.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "language-id" '("language-id-"))) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; language-id-autoloads.el ends here diff --git a/.emacs.d/elpa/language-id-20210411.1332/language-id-pkg.el b/.emacs.d/elpa/language-id-20210411.1332/language-id-pkg.el new file mode 100644 index 0000000..03a9e8a --- /dev/null +++ b/.emacs.d/elpa/language-id-20210411.1332/language-id-pkg.el @@ -0,0 +1,2 @@ +;;; Generated package description from language-id.el -*- no-byte-compile: t -*- +(define-package "language-id" "20210411.1332" "Library to work with programming language identifiers" '((emacs "24") (cl-lib "0.5")) :commit "30a5bc267af7de167d0a835ead828016e6e7e14c" :authors '(("Lassi Kortela" . "lassi@lassi.io")) :maintainer '("Lassi Kortela" . "lassi@lassi.io") :keywords '("languages" "util") :url "https://github.com/lassik/emacs-language-id") diff --git a/.emacs.d/elpa/language-id-20210411.1332/language-id.el b/.emacs.d/elpa/language-id-20210411.1332/language-id.el new file mode 100644 index 0000000..3dbddf7 --- /dev/null +++ b/.emacs.d/elpa/language-id-20210411.1332/language-id.el @@ -0,0 +1,207 @@ +;;; language-id.el --- Library to work with programming language identifiers -*- lexical-binding: t -*- +;; +;; Author: Lassi Kortela <lassi@lassi.io> +;; URL: https://github.com/lassik/emacs-language-id +;; Package-Version: 20210411.1332 +;; Package-Commit: 30a5bc267af7de167d0a835ead828016e6e7e14c +;; Version: 0.12 +;; Package-Requires: ((emacs "24") (cl-lib "0.5")) +;; Keywords: languages util +;; SPDX-License-Identifier: ISC +;; +;; This file is not part of GNU Emacs. +;; +;;; Commentary: +;; +;; language-id is a small, focused library that helps other Emacs +;; packages identify the programming languages and markup languages +;; used in Emacs buffers. The main point is that it contains an +;; evolving table of language definitions that doesn't need to be +;; replicated in other packages. +;; +;; Right now there is only one public function, `language-id-buffer'. +;; It looks at the major mode and other variables and returns the +;; language's GitHub Linguist identifier. We can add support for +;; other kinds of identifiers if there is demand. +;; +;; This library does not do any statistical text matching to guess the +;; language. +;; +;;; Code: + +(defvar language-id--file-name-extension nil + "Internal variable for file name extension during lookup.") + +;; <https://raw.githubusercontent.com/github/linguist/master/lib/linguist/languages.yml> +(defconst language-id--definitions + '( + + ;;; Definitions that need special attention to precedence order. + + ;; json-mode is derived from javascript-mode. + ("JSON" + json-mode + (web-mode (web-mode-content-type "json") (web-mode-engine "none"))) + + ;; php-mode is derived from c-mode. + ("PHP" php-mode) + + ;; scss-mode is derived from css-mode. + ("SCSS" scss-mode) + + ;; terraform-mode is derived from hcl-mode. + ("Terraform" terraform-mode) + + ;; TypeScript/TSX need to come before JavaScript/JSX because in + ;; web-mode we can tell them apart by file name extension only. + ;; + ;; This implies that we inconsistently classify unsaved temp + ;; buffers using TypeScript/TSX as JavaScript/JSX. + ("TSX" + typescript-tsx-mode + (web-mode + (web-mode-content-type "jsx") + (web-mode-engine "none") + (language-id--file-name-extension ".tsx"))) + ("TypeScript" + typescript-mode + (web-mode + (web-mode-content-type "javascript") + (web-mode-engine "none") + (language-id--file-name-extension ".ts"))) + + ;; ReScript needs to come before Reason because in reason-mode + ;; we can tell them apart by file name extension only. + ("ReScript" + (reason-mode + (language-id--file-name-extension ".res"))) + ("ReScript" + (reason-mode + (language-id--file-name-extension ".resi"))) + ("Reason" reason-mode) + + ;; vue-html-mode is derived from html-mode. + ("Vue" + vue-mode + vue-html-mode + (web-mode (web-mode-content-type "html") (web-mode-engine "vue"))) + + ;;; The rest of the definitions are in alphabetical order. + + ("Assembly" asm-mode nasm-mode) + ("ATS" ats-mode) + ("Bazel" bazel-mode) + ("BibTeX" bibtex-mode) + ("C" c-mode) + ("C#" csharp-mode) + ("C++" c++-mode) + ("Cabal Config" haskell-cabal-mode) + ("Clojure" clojurescript-mode clojurec-mode clojure-mode) + ("CMake" cmake-mode) + ("Common Lisp" lisp-mode) + ("Crystal" crystal-mode) + ("CSS" + css-mode + (web-mode (web-mode-content-type "css") (web-mode-engine "none"))) + ("D" d-mode) + ("Dart" dart-mode) + ("Dhall" dhall-mode) + ("Dockerfile" dockerfile-mode) + ("Elixir" elixir-mode) + ("Elm" elm-mode) + ("Emacs Lisp" emacs-lisp-mode) + ("Fish" fish-mode) + ("GLSL" glsl-mode) + ("Go" go-mode) + ("GraphQL" graphql-mode) + ("Haskell" haskell-mode) + ("HCL" hcl-mode) + ("HTML" + html-helper-mode mhtml-mode html-mode nxhtml-mode + (web-mode (web-mode-content-type "html") (web-mode-engine "none"))) + ("Java" java-mode) + ("JavaScript" + (js-mode (flow-minor-mode nil)) + (js2-mode (flow-minor-mode nil)) + (js3-mode (flow-minor-mode nil)) + (web-mode (web-mode-content-type "javascript") (web-mode-engine "none"))) + ("JSON" + json-mode + (web-mode (web-mode-content-type "json") (web-mode-engine "none"))) + ("Jsonnet" jsonnet-mode) + ("JSX" + js2-jsx-mode jsx-mode rjsx-mode react-mode + (web-mode (web-mode-content-type "jsx") (web-mode-engine "none"))) + ("Kotlin" kotlin-mode) + ("LaTeX" latex-mode) + ("Less" less-css-mode) + ("Literate Haskell" literate-haskell-mode) + ("Lua" lua-mode) + ("Markdown" gfm-mode markdown-mode) + ("Nix" nix-mode) + ("Objective-C" objc-mode) + ("OCaml" caml-mode tuareg-mode) + ("Perl" cperl-mode perl-mode) + ("Protocol Buffer" protobuf-mode) + ("PureScript" purescript-mode) + ("Python" python-mode) + ("R" ess-r-mode (ess-mode (ess-dialect "R"))) + ("Racket" racket-mode) + ("Ruby" enh-ruby-mode ruby-mode) + ("Rust" rust-mode rustic-mode) + ("Scala" scala-mode) + ("Scheme" scheme-mode) + ("Shell" sh-mode) + ("Solidity" solidity-mode) + ("SQL" sql-mode) + ("Swift" swift-mode swift3-mode) + ("TOML" toml-mode conf-toml-mode) + ("Verilog" verilog-mode) + ("XML" + nxml-mode xml-mode + (web-mode (web-mode-content-type "xml") (web-mode-engine "none"))) + ("YAML" yaml-mode)) + "Internal table of programming language definitions.") + +(defun language-id--mode-match-p (mode) + "Interal helper to match current buffer against MODE." + (let ((mode (if (listp mode) mode (list mode)))) + (cl-destructuring-bind (wanted-major-mode . variables) mode + (and (derived-mode-p wanted-major-mode) + (cl-every + (lambda (variable) + (cl-destructuring-bind (symbol wanted-value) variable + (equal wanted-value + (if (boundp symbol) (symbol-value symbol) nil)))) + variables))))) + +(defun language-id-buffer () + "Get GitHub Linguist language name for current buffer. + +Return the name of the programming language or markup language +used in the current buffer. The name is a string from the GitHub +Linguist language list. The language is determined by looking at +the active `major-mode'. Some major modes support more than one +language. In that case minor modes and possibly other variables +are consulted to disambiguate the language. + +In addition to the modes bundled with GNU Emacs, many third-party +modes are recognized. No statistical text matching or other +heuristics are used in detecting the language. + +The language definitions live inside the language-id library and +are updated in new releases of the library. + +If the language is not unambiguously recognized, the function +returns nil." + (let ((language-id--file-name-extension + (downcase (file-name-extension (or (buffer-file-name) "") t)))) + (cl-some (lambda (definition) + (cl-destructuring-bind (language-id . modes) definition + (when (cl-some #'language-id--mode-match-p modes) + language-id))) + language-id--definitions))) + +(provide 'language-id) + +;;; language-id.el ends here diff --git a/.emacs.d/elpa/language-id-20210411.1332/language-id.elc b/.emacs.d/elpa/language-id-20210411.1332/language-id.elc new file mode 100644 index 0000000..1595334 Binary files /dev/null and b/.emacs.d/elpa/language-id-20210411.1332/language-id.elc differ diff --git a/.emacs.d/elpa/page-break-lines-20210104.2224/page-break-lines-autoloads.el b/.emacs.d/elpa/page-break-lines-20210104.2224/page-break-lines-autoloads.el new file mode 100644 index 0000000..ae10e45 --- /dev/null +++ b/.emacs.d/elpa/page-break-lines-20210104.2224/page-break-lines-autoloads.el @@ -0,0 +1,65 @@ +;;; page-break-lines-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "page-break-lines" "page-break-lines.el" (0 +;;;;;; 0 0 0)) +;;; Generated autoloads from page-break-lines.el + +(autoload 'page-break-lines-mode "page-break-lines" "\ +Toggle Page Break Lines mode. + +If called interactively, enable Page-Break-Lines mode if ARG is +positive, and disable it if ARG is zero or negative. If called +from Lisp, also enable the mode if ARG is omitted or nil, and +toggle it if ARG is `toggle'; disable the mode otherwise. + +In Page Break mode, page breaks (^L characters) are displayed as a +horizontal line of `page-break-lines-char' characters. + +\(fn &optional ARG)" t nil) + +(autoload 'page-break-lines-mode-maybe "page-break-lines" "\ +Enable `page-break-lines-mode' in the current buffer if desired. +When `major-mode' is listed in `page-break-lines-modes', then +`page-break-lines-mode' will be enabled." nil nil) + +(put 'global-page-break-lines-mode 'globalized-minor-mode t) + +(defvar global-page-break-lines-mode nil "\ +Non-nil if Global Page-Break-Lines mode is enabled. +See the `global-page-break-lines-mode' command +for a description of this minor mode. +Setting this variable directly does not take effect; +either customize it (see the info node `Easy Customization') +or call the function `global-page-break-lines-mode'.") + +(custom-autoload 'global-page-break-lines-mode "page-break-lines" nil) + +(autoload 'global-page-break-lines-mode "page-break-lines" "\ +Toggle Page-Break-Lines mode in all buffers. +With prefix ARG, enable Global Page-Break-Lines mode if ARG is positive; +otherwise, disable it. If called from Lisp, enable the mode if +ARG is omitted or nil. + +Page-Break-Lines mode is enabled in all buffers where +`page-break-lines-mode-maybe' would do it. +See `page-break-lines-mode' for more information on Page-Break-Lines mode. + +\(fn &optional ARG)" t nil) + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "page-break-lines" '("page-break-lines-"))) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; page-break-lines-autoloads.el ends here diff --git a/.emacs.d/elpa/page-break-lines-20210104.2224/page-break-lines-pkg.el b/.emacs.d/elpa/page-break-lines-20210104.2224/page-break-lines-pkg.el new file mode 100644 index 0000000..ea159a6 --- /dev/null +++ b/.emacs.d/elpa/page-break-lines-20210104.2224/page-break-lines-pkg.el @@ -0,0 +1,2 @@ +;;; Generated package description from page-break-lines.el -*- no-byte-compile: t -*- +(define-package "page-break-lines" "20210104.2224" "Display ^L page breaks as tidy horizontal lines" '((emacs "24.4")) :commit "3b8549cd414d4d7ee0168ab9917124133566d3db" :authors '(("Steve Purcell" . "steve@sanityinc.com")) :maintainer '("Steve Purcell" . "steve@sanityinc.com") :keywords '("convenience" "faces") :url "https://github.com/purcell/page-break-lines") diff --git a/.emacs.d/elpa/page-break-lines-20210104.2224/page-break-lines.el b/.emacs.d/elpa/page-break-lines-20210104.2224/page-break-lines.el new file mode 100644 index 0000000..248402b --- /dev/null +++ b/.emacs.d/elpa/page-break-lines-20210104.2224/page-break-lines.el @@ -0,0 +1,179 @@ +;;; page-break-lines.el --- Display ^L page breaks as tidy horizontal lines -*- lexical-binding: t -*- + +;; Copyright (C) 2012-2015 Steve Purcell + +;; Author: Steve Purcell <steve@sanityinc.com> +;; URL: https://github.com/purcell/page-break-lines +;; Package-Commit: 3b8549cd414d4d7ee0168ab9917124133566d3db +;; Package-Version: 20210104.2224 +;; Package-X-Original-Version: 0 +;; Package-Requires: ((emacs "24.4")) +;; Keywords: convenience, faces + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: + +;; This library provides a global mode which displays form feed +;; characters as horizontal rules. + +;; Install from Melpa or Marmalade, or add to `load-path' and use +;; (require 'page-break-lines). + +;; Use `page-break-lines-mode' to enable the mode in specific buffers, +;; or customize `page-break-lines-modes' and enable the mode globally with +;; `global-page-break-lines-mode'. + +;; Issues and limitations: + +;; If `page-break-lines-char' is displayed at a different width to +;; regular characters, the rule may be either too short or too long: +;; rules may then wrap if `truncate-lines' is nil. On some systems, +;; Emacs may erroneously choose a different font for the page break +;; symbol, which choice can be overridden using code such as: + +;; (set-fontset-font "fontset-default" +;; (cons page-break-lines-char page-break-lines-char) +;; (face-attribute 'default :family)) + +;; Use `describe-char' on a page break char to determine whether this +;; is the case. + +;; Additionally, the use of `text-scale-increase' or +;; `text-scale-decrease' will cause the rule width to be incorrect, +;; because the reported window width (in characters) will continue to +;; be the width in the frame's default font, not the scaled font used to +;; display the rule. + +;; Adapted from code http://www.emacswiki.org/emacs/PageBreaks + +;;; Code: + +(defgroup page-break-lines nil + "Display ugly ^L page breaks as tidy horizontal lines." + :prefix "page-break-lines-" + :group 'faces) + +(defcustom page-break-lines-char ?─ + "Character used to render page break lines." + :type 'character + :group 'page-break-lines) + +(defcustom page-break-lines-lighter " PgLn" + "Mode-line indicator for `page-break-lines-mode'." + :type '(choice (const :tag "No lighter" "") string) + :group 'page-break-lines) + +(defcustom page-break-lines-max-width nil + "If non-nil, maximum width (in characters) of page break indicator. +If nil, indicator will span the width of the frame." + :type '(choice integer (const :tag "Full width" nil)) + :group 'page-break-lines) + +(defcustom page-break-lines-modes + '(emacs-lisp-mode lisp-mode scheme-mode compilation-mode outline-mode help-mode) + "Modes in which to enable `page-break-lines-mode'." + :type '(repeat symbol) + :group 'page-break-lines) + +(defface page-break-lines + '((t :inherit font-lock-comment-face :bold nil :italic nil)) + "Face used to colorize page break lines. +If using :bold or :italic, please ensure `page-break-lines-char' +is available in that variant of your font, otherwise it may be +displayed as a junk character." + :group 'page-break-lines) + + + +;;;###autoload +(define-minor-mode page-break-lines-mode + "Toggle Page Break Lines mode. + +In Page Break mode, page breaks (^L characters) are displayed as a +horizontal line of `page-break-lines-char' characters." + :lighter page-break-lines-lighter + :group 'page-break-lines + (page-break-lines--update-display-tables)) + +(dolist (hook '(window-configuration-change-hook + window-size-change-functions + after-setting-font-hook + display-line-numbers-mode-hook)) + (add-hook hook 'page-break-lines--update-display-tables)) + + + +(defun page-break-lines--update-display-table (window) + "Modify a display-table that displays page-breaks prettily. +If the buffer inside WINDOW has `page-break-lines-mode' enabled, +its display table will be modified as necessary." + (with-current-buffer (window-buffer window) + (with-selected-window window + (if page-break-lines-mode + (progn + (unless buffer-display-table + (setq buffer-display-table (make-display-table))) + (let ((default-height (face-attribute 'default :height nil 'default))) + (set-face-attribute 'page-break-lines nil :height default-height) + (let* ((cwidth (char-width page-break-lines-char)) + (wwidth-pix (- (window-width nil t) + (if (and (bound-and-true-p display-line-numbers) + (fboundp 'line-number-display-width)) + (line-number-display-width t) + 0))) + (width (- (/ wwidth-pix (frame-char-width) cwidth) + (if (display-graphic-p) 0 1))) + (width (if page-break-lines-max-width + (min width page-break-lines-max-width) + width)) + (glyph (make-glyph-code page-break-lines-char 'page-break-lines)) + (new-display-entry (vconcat (make-list width glyph)))) + (unless (equal new-display-entry (elt buffer-display-table ?\^L)) + (aset buffer-display-table ?\^L new-display-entry))))) + (when (and (apply 'derived-mode-p page-break-lines-modes) + buffer-display-table) + (aset buffer-display-table ?\^L nil)))))) + +(defun page-break-lines--update-display-tables (&optional frame) + "Function called for updating display table in windows of FRAME." + (unless (minibufferp) + (mapc 'page-break-lines--update-display-table (window-list frame 'no-minibuffer)))) + + + +;;;###autoload +(defun page-break-lines-mode-maybe () + "Enable `page-break-lines-mode' in the current buffer if desired. +When `major-mode' is listed in `page-break-lines-modes', then +`page-break-lines-mode' will be enabled." + (if (and (not (minibufferp)) + (apply 'derived-mode-p page-break-lines-modes)) + (page-break-lines-mode 1))) + +;;;###autoload +(define-global-minor-mode global-page-break-lines-mode + page-break-lines-mode page-break-lines-mode-maybe + :require 'page-break-lines + :group 'page-break-lines) + + +(provide 'page-break-lines) + +;; Local Variables: +;; coding: utf-8 +;; checkdoc-minor-mode: t +;; End: + +;;; page-break-lines.el ends here diff --git a/.emacs.d/elpa/page-break-lines-20210104.2224/page-break-lines.elc b/.emacs.d/elpa/page-break-lines-20210104.2224/page-break-lines.elc new file mode 100644 index 0000000..2eeb34a Binary files /dev/null and b/.emacs.d/elpa/page-break-lines-20210104.2224/page-break-lines.elc differ diff --git a/.emacs.d/elpa/pkg-info-20150517.1143/pkg-info-autoloads.el b/.emacs.d/elpa/pkg-info-20150517.1143/pkg-info-autoloads.el new file mode 100644 index 0000000..44ce6b5 --- /dev/null +++ b/.emacs.d/elpa/pkg-info-20150517.1143/pkg-info-autoloads.el @@ -0,0 +1,127 @@ +;;; pkg-info-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "pkg-info" "pkg-info.el" (0 0 0 0)) +;;; Generated autoloads from pkg-info.el + +(autoload 'pkg-info-library-original-version "pkg-info" "\ +Get the original version in the header of LIBRARY. + +The original version is stored in the X-Original-Version header. +This header is added by the MELPA package archive to preserve +upstream version numbers. + +LIBRARY is either a symbol denoting a named feature, or a library +name as string. + +If SHOW is non-nil, show the version in the minibuffer. + +Return the version from the header of LIBRARY as list. Signal an +error if the LIBRARY was not found or had no X-Original-Version +header. + +See Info node `(elisp)Library Headers' for more information +about library headers. + +\(fn LIBRARY &optional SHOW)" t nil) + +(autoload 'pkg-info-library-version "pkg-info" "\ +Get the version in the header of LIBRARY. + +LIBRARY is either a symbol denoting a named feature, or a library +name as string. + +If SHOW is non-nil, show the version in the minibuffer. + +Return the version from the header of LIBRARY as list. Signal an +error if the LIBRARY was not found or had no proper header. + +See Info node `(elisp)Library Headers' for more information +about library headers. + +\(fn LIBRARY &optional SHOW)" t nil) + +(autoload 'pkg-info-defining-library-original-version "pkg-info" "\ +Get the original version of the library defining FUNCTION. + +The original version is stored in the X-Original-Version header. +This header is added by the MELPA package archive to preserve +upstream version numbers. + +If SHOW is non-nil, show the version in mini-buffer. + +This function is mainly intended to find the version of a major +or minor mode, i.e. + + (pkg-info-defining-library-version 'flycheck-mode) + +Return the version of the library defining FUNCTION. Signal an +error if FUNCTION is not a valid function, if its defining +library was not found, or if the library had no proper version +header. + +\(fn FUNCTION &optional SHOW)" t nil) + +(autoload 'pkg-info-defining-library-version "pkg-info" "\ +Get the version of the library defining FUNCTION. + +If SHOW is non-nil, show the version in mini-buffer. + +This function is mainly intended to find the version of a major +or minor mode, i.e. + + (pkg-info-defining-library-version 'flycheck-mode) + +Return the version of the library defining FUNCTION. Signal an +error if FUNCTION is not a valid function, if its defining +library was not found, or if the library had no proper version +header. + +\(fn FUNCTION &optional SHOW)" t nil) + +(autoload 'pkg-info-package-version "pkg-info" "\ +Get the version of an installed PACKAGE. + +If SHOW is non-nil, show the version in the minibuffer. + +Return the version as list, or nil if PACKAGE is not installed. + +\(fn PACKAGE &optional SHOW)" t nil) + +(autoload 'pkg-info-version-info "pkg-info" "\ +Obtain complete version info for LIBRARY and PACKAGE. + +LIBRARY is a symbol denoting a named feature, or a library name +as string. PACKAGE is a symbol denoting an ELPA package. If +omitted or nil, default to LIBRARY. + +If SHOW is non-nil, show the version in the minibuffer. + +When called interactively, prompt for LIBRARY. When called +interactively with prefix argument, prompt for PACKAGE as well. + +Return a string with complete version information for LIBRARY. +This version information contains the version from the headers of +LIBRARY, and the version of the installed PACKAGE, the LIBRARY is +part of. If PACKAGE is not installed, or if the PACKAGE version +is the same as the LIBRARY version, do not include a package +version. + +\(fn LIBRARY &optional PACKAGE SHOW)" t nil) + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "pkg-info" '("pkg-info-"))) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; pkg-info-autoloads.el ends here diff --git a/.emacs.d/elpa/pkg-info-20150517.1143/pkg-info-pkg.el b/.emacs.d/elpa/pkg-info-20150517.1143/pkg-info-pkg.el new file mode 100644 index 0000000..e8c9cc0 --- /dev/null +++ b/.emacs.d/elpa/pkg-info-20150517.1143/pkg-info-pkg.el @@ -0,0 +1,2 @@ +;;; Generated package description from pkg-info.el -*- no-byte-compile: t -*- +(define-package "pkg-info" "20150517.1143" "Information about packages" '((epl "0.8")) :commit "76ba7415480687d05a4353b27fea2ae02b8d9d61" :authors '(("Sebastian Wiesner" . "swiesner@lunaryorn.com")) :maintainer '("Sebastian Wiesner" . "swiesner@lunaryorn.com") :keywords '("convenience") :url "https://github.com/lunaryorn/pkg-info.el") diff --git a/.emacs.d/elpa/pkg-info-20150517.1143/pkg-info.el b/.emacs.d/elpa/pkg-info-20150517.1143/pkg-info.el new file mode 100644 index 0000000..1017a37 --- /dev/null +++ b/.emacs.d/elpa/pkg-info-20150517.1143/pkg-info.el @@ -0,0 +1,332 @@ +;;; pkg-info.el --- Information about packages -*- lexical-binding: t; -*- + +;; Copyright (C) 2013-2015 Sebastian Wiesner <swiesner@lunaryorn.com> + +;; Author: Sebastian Wiesner <swiesner@lunaryorn.com> +;; URL: https://github.com/lunaryorn/pkg-info.el +;; Package-Version: 20150517.1143 +;; Package-Commit: 76ba7415480687d05a4353b27fea2ae02b8d9d61 +;; Keywords: convenience +;; Version: 0.7-cvs +;; Package-Requires: ((epl "0.8")) + +;; This file is not part of GNU Emacs. + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: + +;; This library extracts information from installed packages. + +;;;; Functions: + +;; `pkg-info-library-version' extracts the version from the header of a library. +;; +;; `pkg-info-defining-library-version' extracts the version from the header of a +;; library defining a function. +;; +;; `pkg-info-package-version' gets the version of an installed package. +;; +;; `pkg-info-format-version' formats a version list as human readable string. +;; +;; `pkg-info-version-info' returns complete version information for a specific +;; package. +;; +;; `pkg-info-get-melpa-recipe' gets the MELPA recipe for a package. +;; +;; `pkg-info-get-melpa-fetcher' gets the fetcher used to build a package on +;; MELPA. +;; +;; `pkg-info-wiki-package-p' determines whether a package was build from +;; EmacsWiki on MELPA. + +;;; Code: + +(require 'epl) + +(require 'lisp-mnt) +(require 'find-func) +(require 'json) ; `json-read' +(require 'url-http) ; `url-http-parse-response' + +(defvar url-http-end-of-headers) + + +;;; Version information +(defun pkg-info-format-version (version) + "Format VERSION as human-readable string. + +Return a human-readable string representing VERSION." + ;; XXX: Find a better, more flexible way of formatting? + (package-version-join version)) + +(defsubst pkg-info--show-version-and-return (version show) + "Show and return VERSION. + +When SHOW is non-nil, show VERSION in minibuffer. + +Return VERSION." + (when show + (message (if (listp version) (pkg-info-format-version version) version))) + version) + +(defun pkg-info--read-library () + "Read a library from minibuffer." + (completing-read "Load library: " + (apply-partially 'locate-file-completion-table + load-path + (get-load-suffixes)))) + +(defun pkg-info--read-function () + "Read a function name from minibuffer." + (let ((input (completing-read "Function: " obarray #'boundp :require-match))) + (if (string= input "") nil (intern input)))) + +(defun pkg-info--read-package () + "Read a package name from minibuffer." + (let* ((installed (epl-installed-packages)) + (names (sort (mapcar (lambda (pkg) + (symbol-name (epl-package-name pkg))) + installed) + #'string<)) + (default (car names))) + (completing-read "Installed package: " names nil 'require-match + nil nil default))) + +(defun pkg-info-library-source (library) + "Get the source file of LIBRARY. + +LIBRARY is either a symbol denoting a named feature, or a library +name as string. + +Return the source file of LIBRARY as string." + (find-library-name (if (symbolp library) (symbol-name library) library))) + +(defun pkg-info-defining-library (function) + "Get the source file of the library defining FUNCTION. + +FUNCTION is a function symbol. + +Return the file name of the library as string. Signal an error +if the library does not exist, or if the definition of FUNCTION +was not found." + (unless (functionp function) + (signal 'wrong-type-argument (list 'functionp function))) + (let ((library (symbol-file function 'defun))) + (unless library + (error "Can't find definition of %s" function)) + library)) + +(defun pkg-info-x-original-version (file) + "Read the X-Original-Version header from FILE. + +Return the value as version list, or return nil if FILE lacks +this header. Signal an error, if the value of the header is not +a valid version." + (let ((version-str (with-temp-buffer + (insert-file-contents file) + (lm-header "X-Original-Version")))) + (when version-str + (version-to-list version-str)))) + +;;;###autoload +(defun pkg-info-library-original-version (library &optional show) + "Get the original version in the header of LIBRARY. + +The original version is stored in the X-Original-Version header. +This header is added by the MELPA package archive to preserve +upstream version numbers. + +LIBRARY is either a symbol denoting a named feature, or a library +name as string. + +If SHOW is non-nil, show the version in the minibuffer. + +Return the version from the header of LIBRARY as list. Signal an +error if the LIBRARY was not found or had no X-Original-Version +header. + +See Info node `(elisp)Library Headers' for more information +about library headers." + (interactive (list (pkg-info--read-library) t)) + (let ((version (pkg-info-x-original-version + (pkg-info-library-source library)))) + (if version + (pkg-info--show-version-and-return version show) + (error "Library %s has no original version" library)))) + +;;;###autoload +(defun pkg-info-library-version (library &optional show) + "Get the version in the header of LIBRARY. + +LIBRARY is either a symbol denoting a named feature, or a library +name as string. + +If SHOW is non-nil, show the version in the minibuffer. + +Return the version from the header of LIBRARY as list. Signal an +error if the LIBRARY was not found or had no proper header. + +See Info node `(elisp)Library Headers' for more information +about library headers." + (interactive (list (pkg-info--read-library) t)) + (let* ((source (pkg-info-library-source library)) + (version (epl-package-version (epl-package-from-file source)))) + (pkg-info--show-version-and-return version show))) + +;;;###autoload +(defun pkg-info-defining-library-original-version (function &optional show) + "Get the original version of the library defining FUNCTION. + +The original version is stored in the X-Original-Version header. +This header is added by the MELPA package archive to preserve +upstream version numbers. + +If SHOW is non-nil, show the version in mini-buffer. + +This function is mainly intended to find the version of a major +or minor mode, i.e. + + (pkg-info-defining-library-version 'flycheck-mode) + +Return the version of the library defining FUNCTION. Signal an +error if FUNCTION is not a valid function, if its defining +library was not found, or if the library had no proper version +header." + (interactive (list (pkg-info--read-function) t)) + (pkg-info-library-original-version (pkg-info-defining-library function) show)) + +;;;###autoload +(defun pkg-info-defining-library-version (function &optional show) + "Get the version of the library defining FUNCTION. + +If SHOW is non-nil, show the version in mini-buffer. + +This function is mainly intended to find the version of a major +or minor mode, i.e. + + (pkg-info-defining-library-version 'flycheck-mode) + +Return the version of the library defining FUNCTION. Signal an +error if FUNCTION is not a valid function, if its defining +library was not found, or if the library had no proper version +header." + (interactive (list (pkg-info--read-function) t)) + (pkg-info-library-version (pkg-info-defining-library function) show)) + +;;;###autoload +(defun pkg-info-package-version (package &optional show) + "Get the version of an installed PACKAGE. + +If SHOW is non-nil, show the version in the minibuffer. + +Return the version as list, or nil if PACKAGE is not installed." + (interactive (list (pkg-info--read-package) t)) + (let* ((name (if (stringp package) (intern package) package)) + (package (car (epl-find-installed-packages name)))) + (unless package + (error "Can't find installed package %s" name)) + (pkg-info--show-version-and-return (epl-package-version package) show))) + +;;;###autoload +(defun pkg-info-version-info (library &optional package show) + "Obtain complete version info for LIBRARY and PACKAGE. + +LIBRARY is a symbol denoting a named feature, or a library name +as string. PACKAGE is a symbol denoting an ELPA package. If +omitted or nil, default to LIBRARY. + +If SHOW is non-nil, show the version in the minibuffer. + +When called interactively, prompt for LIBRARY. When called +interactively with prefix argument, prompt for PACKAGE as well. + +Return a string with complete version information for LIBRARY. +This version information contains the version from the headers of +LIBRARY, and the version of the installed PACKAGE, the LIBRARY is +part of. If PACKAGE is not installed, or if the PACKAGE version +is the same as the LIBRARY version, do not include a package +version." + (interactive (list (pkg-info--read-library) + (when current-prefix-arg + (pkg-info--read-package)) + t)) + (let* ((package (or package (if (stringp library) (intern library) library))) + (orig-version (condition-case nil + (pkg-info-library-original-version library) + (error nil))) + ;; If we have X-Original-Version, we assume that MELPA replaced the + ;; library version with its generated version, so we use the + ;; X-Original-Version header instead, and ignore the library version + ;; header + (lib-version (or orig-version (pkg-info-library-version library))) + (pkg-version (condition-case nil + (pkg-info-package-version package) + (error nil))) + (version (if (and pkg-version + (not (version-list-= lib-version pkg-version))) + (format "%s (package: %s)" + (pkg-info-format-version lib-version) + (pkg-info-format-version pkg-version)) + (pkg-info-format-version lib-version)))) + (pkg-info--show-version-and-return version show))) + +(defconst pkg-info-melpa-recipe-url "http://melpa.org/recipes.json" + "The URL from which to fetch MELPA recipes.") + +(defvar pkg-info-melpa-recipes nil + "An alist of MELPA recipes.") + +(defun pkg-info-retrieve-melpa-recipes () + "Retrieve MELPA recipes from MELPA archive." + (let ((buffer (url-retrieve-synchronously pkg-info-melpa-recipe-url))) + (with-current-buffer buffer + (unwind-protect + (let ((response-code (url-http-parse-response))) + (unless (equal response-code 200) + (error "Failed to retrieve MELPA recipes from %s (code %s)" + pkg-info-melpa-recipe-url response-code)) + (goto-char url-http-end-of-headers) + (json-read)) + (when (and buffer (buffer-live-p buffer)) + (kill-buffer buffer)))))) + +(defun pkg-info-get-melpa-recipes () + "Get MELPA recipes." + (setq pkg-info-melpa-recipes + (or pkg-info-melpa-recipes + (pkg-info-retrieve-melpa-recipes)))) + +(defun pkg-info-get-melpa-recipe (package) + "Get the MELPA recipe for PACKAGE. + +Return nil if PACKAGE is not on MELPA." + (cdr (assq package (pkg-info-get-melpa-recipes)))) + +(defun pkg-info-get-melpa-fetcher (package) + "Get the MELPA fetcher for PACKAGE." + (cdr (assq 'fetcher (pkg-info-get-melpa-recipe package)))) + +(defun pkg-info-wiki-package-p (package) + "Determine whether PACKAGE is build from the EmacsWiki." + (equal (pkg-info-get-melpa-fetcher package) "wiki")) + +(provide 'pkg-info) + +;; Local Variables: +;; indent-tabs-mode: nil +;; coding: utf-8 +;; End: + +;;; pkg-info.el ends here diff --git a/.emacs.d/elpa/pkg-info-20150517.1143/pkg-info.elc b/.emacs.d/elpa/pkg-info-20150517.1143/pkg-info.elc new file mode 100644 index 0000000..5849937 Binary files /dev/null and b/.emacs.d/elpa/pkg-info-20150517.1143/pkg-info.elc differ diff --git a/.emacs.d/elpa/popup-20210317.138/popup-autoloads.el b/.emacs.d/elpa/popup-20210317.138/popup-autoloads.el new file mode 100644 index 0000000..8389b0a --- /dev/null +++ b/.emacs.d/elpa/popup-20210317.138/popup-autoloads.el @@ -0,0 +1,22 @@ +;;; popup-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "popup" "popup.el" (0 0 0 0)) +;;; Generated autoloads from popup.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "popup" '("popup-"))) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; popup-autoloads.el ends here diff --git a/.emacs.d/elpa/popup-20210317.138/popup-pkg.el b/.emacs.d/elpa/popup-20210317.138/popup-pkg.el new file mode 100644 index 0000000..c1d73ba --- /dev/null +++ b/.emacs.d/elpa/popup-20210317.138/popup-pkg.el @@ -0,0 +1,2 @@ +;;; Generated package description from popup.el -*- no-byte-compile: t -*- +(define-package "popup" "20210317.138" "Visual Popup User Interface" '((emacs "24.3")) :commit "866a091b83369873b4d1c5d62a590fbb0a150bd0" :authors '(("Tomohiro Matsuyama" . "m2ym.pub@gmail.com")) :maintainer '("Shen, Jen-Chieh" . "jcs090218@gmail.com") :keywords '("lisp") :url "https://github.com/auto-complete/popup-el") diff --git a/.emacs.d/elpa/popup-20210317.138/popup.el b/.emacs.d/elpa/popup-20210317.138/popup.el new file mode 100644 index 0000000..26a7f89 --- /dev/null +++ b/.emacs.d/elpa/popup-20210317.138/popup.el @@ -0,0 +1,1438 @@ +;;; popup.el --- Visual Popup User Interface + +;; Copyright (C) 2009-2015 Tomohiro Matsuyama +;; Copyright (c) 2020-2021 Jen-Chieh Shen + +;; Author: Tomohiro Matsuyama <m2ym.pub@gmail.com> +;; Maintainer: Shen, Jen-Chieh <jcs090218@gmail.com> +;; URL: https://github.com/auto-complete/popup-el +;; Package-Version: 20210317.138 +;; Package-Commit: 866a091b83369873b4d1c5d62a590fbb0a150bd0 +;; Keywords: lisp +;; Version: 0.5.8 +;; Package-Requires: ((emacs "24.3")) + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: + +;; popup.el is a visual popup user interface library for Emacs. This +;; provides a basic API and common UI widgets such as popup tooltips +;; and popup menus. +;; See README.markdown for more information. + +;;; Code: + +(require 'cl-lib) + +(defconst popup-version "0.5.8") + + + +;;; Utilities + +(defun popup-calculate-max-width (max-width) + "Determines whether the width with MAX-WIDTH desired is character or window \ +proportion based, And return the result." + (cl-typecase max-width + (integer max-width) + (float (* (ceiling (/ (round (* max-width (window-width))) 10.0)) 10)))) + +(defvar popup-use-optimized-column-computation t + "Use the optimized column computation routine. +If there is a problem, please set it nil.") + +(defmacro popup-aif (test then &rest else) + "Anaphoric if." + (declare (indent 2)) + `(let ((it ,test)) + (if it ,then ,@else))) + +(defmacro popup-awhen (test &rest body) + "Anaphoric when." + (declare (indent 1)) + `(let ((it ,test)) + (when it ,@body))) + +(defun popup-x-to-string (x) + "Convert any object to string efficiently. +This is faster than `prin1-to-string' in many cases." + (cl-typecase x + (string x) + (symbol (symbol-name x)) + (integer (number-to-string x)) + (float (number-to-string x)) + (t (format "%s" x)))) + +(defun popup-substring-by-width (string width) + "Return a cons cell of substring and remaining string by +splitting with WIDTH." + ;; Expand tabs into 4 spaces + (setq string (replace-regexp-in-string "\t" " " string)) + (cl-loop with len = (length string) + with w = 0 + for l from 0 + for c in (append string nil) + while (<= (cl-incf w (char-width c)) width) + finally return + (if (< l len) + (cons (substring string 0 l) (substring string l)) + (list string)))) + +(defun popup-fill-string (string &optional width max-width justify squeeze) + "Split STRING into fixed width strings and return a cons cell +like \(WIDTH . ROWS). Here, the car WIDTH indicates the actual +maxim width of ROWS. + +The argument WIDTH specifies the width of filling each +paragraph. WIDTH nil means don't perform any justification and +word wrap. Note that this function doesn't add any padding +characters at the end of each row. + +MAX-WIDTH, if WIDTH is nil, specifies the maximum number of +columns. + +The optional fourth argument JUSTIFY specifies which kind of +justification to do: `full', `left', `right', `center', or +`none' (equivalent to nil). A value of t means handle each +paragraph as specified by its text properties. + +SQUEEZE nil means leave whitespaces other than line breaks +untouched." + (if (eq width 0) + (error "Can't fill string with 0 width")) + (if width + (setq max-width width)) + (with-temp-buffer + (let ((tab-width 4) + (fill-column width) + (left-margin 0) + (kinsoku-limit 1) + indent-tabs-mode + row rows) + (insert string) + (untabify (point-min) (point-max)) + (if width + (fill-region (point-min) (point-max) justify (not squeeze))) + (goto-char (point-min)) + (setq width 0) + (while (prog2 + (let ((line (buffer-substring + (point) (progn (end-of-line) (point))))) + (if max-width + (while (progn + (setq row (truncate-string-to-width line max-width) + width (max width (string-width row))) + (push row rows) + (if (not (= (length row) (length line))) + (setq line (substring line (length row)))))) + (setq width (max width (string-width line))) + (push line rows))) + (< (point) (point-max)) + (beginning-of-line 2))) + (cons width (nreverse rows))))) + +(defmacro popup-save-buffer-state (&rest body) + (declare (indent 0)) + `(save-excursion + (let ((buffer-undo-list t) + (inhibit-read-only t) + (modified (buffer-modified-p))) + (unwind-protect + (progn ,@body) + (set-buffer-modified-p modified))))) + +(defun popup-vertical-motion (column direction) + "A portable version of `vertical-motion'." + (when (bound-and-true-p display-line-numbers-mode) + (setq column (- column (line-number-display-width 'columns)))) + (if (>= emacs-major-version 23) + (vertical-motion (cons column direction)) + (vertical-motion direction) + (move-to-column (+ (current-column) column)))) + +(defun popup-last-line-of-buffer-p () + "Return non-nil if the cursor is at the last line of the +buffer." + (save-excursion (end-of-line) (/= (forward-line) 0))) + +(defun popup-lookup-key-by-event (function event) + (or (funcall function (vector event)) + (if (symbolp event) + (popup-aif (get event 'event-symbol-element-mask) + (funcall function + (vector (logior (or (get (car it) 'ascii-character) + 0) + (cadr it)))))))) + + + +;;; Core + +(defgroup popup nil + "Visual Popup User Interface" + :group 'lisp + :prefix "popup-") + +(defface popup-face + '((t (:inherit default :background "lightgray" :foreground "black"))) + "Face for popup." + :group 'popup) + +(defface popup-summary-face + '((t (:inherit popup-face :foreground "dimgray"))) + "Face for popup summary." + :group 'popup) + +(defface popup-scroll-bar-foreground-face + '((t (:background "black"))) + "Foreground face for scroll-bar." + :group 'popup) + +(defface popup-scroll-bar-background-face + '((t (:background "gray"))) + "Background face for scroll-bar." + :group 'popup) + +(defvar popup-instances nil + "Popup instances.") + +(defvar popup-scroll-bar-foreground-char + (propertize " " 'face 'popup-scroll-bar-foreground-face) + "Foreground character for scroll-bar.") + +(defvar popup-scroll-bar-background-char + (propertize " " 'face 'popup-scroll-bar-background-face) + "Background character for scroll-bar.") + +(cl-defstruct popup + point row column width height min-height direction overlays keymap + parent depth + face mouse-face selection-face summary-face + margin-left margin-right margin-left-cancel scroll-bar symbol + cursor offset scroll-top current-height list newlines + pattern original-list invis-overlays) + +(defun popup-item-propertize (item &rest properties) + "Same as `propertize' except that this avoids overriding +existed value with `nil' property." + (cl-loop for (k v) on properties by 'cddr + if v append (list k v) into props + finally return + (apply 'propertize + (popup-x-to-string item) + props))) + +(defun popup-item-property (item property) + "Same as `get-text-property' except that this returns nil if +ITEM is not string." + (if (stringp item) + (get-text-property 0 property item))) + +(cl-defun popup-make-item (name + &key + value + face + mouse-face + selection-face + sublist + document + symbol + summary) + "Utility function to make popup item. See also +`popup-item-propertize'." + (popup-item-propertize name + 'value value + 'popup-face face + 'popup-mouse-face mouse-face + 'selection-face selection-face + 'document document + 'symbol symbol + 'summary summary + 'sublist sublist)) + +(defsubst popup-item-value (item) (popup-item-property item 'value)) +(defsubst popup-item-value-or-self (item) (or (popup-item-value item) item)) +(defsubst popup-item-face (item) (popup-item-property item 'popup-face)) +(defsubst popup-item-mouse-face (item) (popup-item-property item 'popup-mouse-face)) +(defsubst popup-item-selection-face (item) (popup-item-property item 'selection-face)) +(defsubst popup-item-document (item) (popup-item-property item 'document)) +(defsubst popup-item-summary (item) (popup-item-property item 'summary)) +(defsubst popup-item-symbol (item) (popup-item-property item 'symbol)) +(defsubst popup-item-sublist (item) (popup-item-property item 'sublist)) + +(defun popup-item-documentation (item) + (let ((doc (popup-item-document item))) + (if (functionp doc) + (setq doc (funcall doc (popup-item-value-or-self item)))) + doc)) + +(defun popup-item-show-help-1 (item) + (let ((doc (popup-item-documentation item))) + (when doc + (with-current-buffer (get-buffer-create " *Popup Help*") + (erase-buffer) + (insert doc) + (goto-char (point-min)) + (display-buffer (current-buffer))) + t))) + +(defun popup-item-show-help-with-event-loop (item) + (save-window-excursion + (when (popup-item-show-help-1 item) + (cl-loop do (clear-this-command-keys) + for key = (read-key-sequence-vector nil) + do + (cl-case (key-binding key) + (scroll-other-window + (scroll-other-window)) + (scroll-other-window-down + (scroll-other-window-down nil)) + (otherwise + (setq unread-command-events (append key unread-command-events)) + (cl-return))))))) + +(defun popup-item-show-help (item &optional persist) + "Display the documentation of ITEM with `display-buffer'. If +PERSIST is nil, the documentation buffer will be closed +automatically, meaning interal event loop ensures the buffer to +be closed. Otherwise, the buffer will be just displayed as +usual." + (when item + (if (not persist) + (popup-item-show-help-with-event-loop item) + (popup-item-show-help-1 item)))) + +(defun popup-set-list (popup list) + (popup-set-filtered-list popup list) + (setf (popup-pattern popup) nil) + (setf (popup-original-list popup) list)) + +(defun popup-set-filtered-list (popup list) + (let ((offset + (if (> (popup-direction popup) 0) + 0 + (max (- (popup-height popup) (length list)) 0)))) + (setf (popup-list popup) list + (popup-offset popup) offset))) + +(defun popup-selected-item (popup) + (nth (popup-cursor popup) (popup-list popup))) + +(defun popup-selected-line (popup) + (- (popup-cursor popup) (popup-scroll-top popup))) + +(defun popup-line-overlay (popup line) + (aref (popup-overlays popup) line)) + +(defun popup-selected-line-overlay (popup) + (popup-line-overlay popup (popup-selected-line popup))) + +(defun popup-hide-line (popup line) + (let ((overlay (popup-line-overlay popup line))) + (overlay-put overlay 'display nil) + (overlay-put overlay 'after-string nil))) + +(defun popup-line-hidden-p (popup line) + (let ((overlay (popup-line-overlay popup line))) + (and (eq (overlay-get overlay 'display) nil) + (eq (overlay-get overlay 'after-string) nil)))) + +(cl-defun popup-set-line-item (popup + line + &key + item + face + mouse-face + margin-left + margin-right + scroll-bar-char + symbol + summary + summary-face + keymap) + (let* ((overlay (popup-line-overlay popup line)) + (content (popup-create-line-string popup (popup-x-to-string item) + :margin-left margin-left + :margin-right margin-right + :symbol symbol + :summary summary + :summary-face summary-face)) + (start 0) + (prefix (overlay-get overlay 'prefix)) + (postfix (overlay-get overlay 'postfix)) + end) + (put-text-property 0 (length content) 'popup-item item content) + (put-text-property 0 (length content) 'keymap keymap content) + ;; Overlap face properties + (when (get-text-property start 'face content) + (setq start (next-single-property-change start 'face content))) + (while (and start (setq end (next-single-property-change start 'face content))) + (put-text-property start end 'face face content) + (setq start (next-single-property-change end 'face content))) + (when start + (put-text-property start (length content) 'face face content)) + (when mouse-face + (put-text-property 0 (length content) 'mouse-face mouse-face content)) + (let ((prop (if (overlay-get overlay 'dangle) + 'after-string + 'display))) + (overlay-put overlay + prop + (concat prefix + content + scroll-bar-char + postfix))))) + +(cl-defun popup-create-line-string (popup + string + &key + margin-left + margin-right + symbol + summary + summary-face) + (let* ((popup-width (popup-width popup)) + (summary-width (string-width summary)) + (content-width (max + (min popup-width (string-width string)) + (- popup-width + (if (> summary-width 0) + (+ summary-width 2) + 0)))) + (string (car (popup-substring-by-width string content-width))) + (string-width (string-width string)) + (spacing (max (- popup-width string-width summary-width) + (if (> popup-width string-width) 1 0))) + (truncated-summary + (car (popup-substring-by-width + summary (max (- popup-width string-width spacing) 0))))) + (when summary-face + (put-text-property 0 (length truncated-summary) + 'face summary-face truncated-summary)) + (concat margin-left + string + (make-string spacing ? ) + truncated-summary + symbol + margin-right))) + +(defun popup-live-p (popup) + "Return non-nil if POPUP is alive." + (and popup (popup-overlays popup) t)) + +(defun popup-child-point (popup &optional offset) + (overlay-end + (popup-line-overlay + popup + (or offset + (popup-selected-line popup))))) + +(defun popup-calculate-direction (height row) + "Return a proper direction when displaying a popup on this +window. HEIGHT is the a height of the popup, and ROW is a line +number at the point." + (let* ((remaining-rows (- (max 1 (- (window-text-height) + (if mode-line-format 1 0) + (if header-line-format 1 0))) + (count-lines (window-start) (point)))) + (enough-space-above (> row height)) + (enough-space-below (<= height remaining-rows))) + (if (and enough-space-above + (not enough-space-below)) + -1 + 1))) + +(cl-defun popup-create (point + width + height + &key + min-height + max-width + around + (face 'popup-face) + mouse-face + (selection-face face) + (summary-face 'popup-summary-face) + scroll-bar + margin-left + margin-right + symbol + parent + parent-offset + keymap) + "Create a popup instance at POINT with WIDTH and HEIGHT. + +MIN-HEIGHT is a minimal height of the popup. The default value is +0. + +MAX-WIDTH is the maximum width of the popup. The default value is +nil (no limit). If a floating point, the value refers to the ratio of +the window. If an integer, limit is in characters. + +If AROUND is non-nil, the popup will be displayed around the +point but not at the point. + +FACE is a background face of the popup. The default value is POPUP-FACE. + +SELECTION-FACE is a foreground (selection) face of the popup The +default value is POPUP-FACE. + +If SCROLL-BAR is non-nil, the popup will have a scroll bar at the +right. + +If MARGIN-LEFT is non-nil, the popup will have a margin at the +left. + +If MARGIN-RIGHT is non-nil, the popup will have a margin at the +right. + +SYMBOL is a single character which indicates a kind of the item. + +PARENT is a parent popup instance. If PARENT is omitted, the +popup will be a root instance. + +PARENT-OFFSET is a row offset from the parent popup. + +KEYMAP is a keymap that will be put on the popup contents." + (or margin-left (setq margin-left 0)) + (or margin-right (setq margin-right 0)) + (unless point + (setq point + (if parent (popup-child-point parent parent-offset) (point)))) + (when max-width + (setq width (min width (popup-calculate-max-width max-width)))) + (save-excursion + (goto-char point) + (let* ((col-row (posn-col-row (posn-at-point))) + (row (cdr col-row)) + (column (car col-row)) + (overlays (make-vector height nil)) + (popup-width (+ width + (if scroll-bar 1 0) + margin-left + margin-right + (if symbol 2 0))) + margin-left-cancel + (window (selected-window)) + (window-start (window-start)) + (window-hscroll (window-hscroll)) + (window-width (window-width)) + (right (+ column popup-width)) + (overflow (and (> right window-width) + (>= right popup-width))) + (foldable (and (null parent) + (>= column popup-width))) + (direction (or + ;; Currently the direction of cascade popup won't be changed + (and parent (popup-direction parent)) + + ;; Calculate direction + (popup-calculate-direction height row))) + (depth (if parent (1+ (popup-depth parent)) 0)) + (newlines (max 0 (+ (- height (count-lines point (point-max))) (if around 1 0)))) + invis-overlays + current-column) + ;; Case: no newlines at the end of the buffer + (when (> newlines 0) + (popup-save-buffer-state + (goto-char (point-max)) + (insert (make-string newlines ?\n)))) + + ;; Case: the popup overflows + (if overflow + (if foldable + (progn + (cl-decf column (- popup-width margin-left margin-right)) + (unless around (move-to-column column))) + (when (not truncate-lines) + ;; Truncate. + (let ((d (1+ (- popup-width (- window-width column))))) + (cl-decf popup-width d) + (cl-decf width d))) + (cl-decf column margin-left)) + (cl-decf column margin-left)) + + ;; Case: no space at the left + (when (and (null parent) + (< column 0)) + ;; Cancel margin left + (setq column 0) + (cl-decf popup-width margin-left) + (setq margin-left-cancel t)) + + (dotimes (i height) + (let (overlay begin w (dangle t) (prefix "") (postfix "")) + (when around + (popup-vertical-motion column direction)) + (cl-loop for ov in (overlays-in (save-excursion + (beginning-of-visual-line) + (point)) + (save-excursion + (end-of-visual-line) + (point))) + when (and (not (overlay-get ov 'popup)) + (not (overlay-get ov 'popup-item)) + (or (overlay-get ov 'invisible) + (overlay-get ov 'display))) + do (progn + (push (list ov (overlay-get ov 'display)) invis-overlays) + (overlay-put ov 'display ""))) + (setq around t) + (setq current-column (car (posn-col-row (posn-at-point)))) + + (when (< current-column column) + ;; Extend short buffer lines by popup prefix (line of spaces) + (setq prefix (make-string + (+ (if (= current-column 0) + (- window-hscroll current-column) + 0) + (- column current-column)) + ? ))) + + (setq begin (point)) + (setq w (+ popup-width (length prefix))) + (while (and (not (eolp)) (> w 0)) + (setq dangle nil) + (cl-decf w (char-width (char-after))) + (forward-char)) + (if (< w 0) + (setq postfix (make-string (- w) ? ))) + + (setq overlay (make-overlay begin (point))) + (overlay-put overlay 'popup t) + (overlay-put overlay 'window window) + (overlay-put overlay 'dangle dangle) + (overlay-put overlay 'prefix prefix) + (overlay-put overlay 'postfix postfix) + (overlay-put overlay 'width width) + (aset overlays + (if (> direction 0) i (- height i 1)) + overlay))) + (cl-loop for p from (- 10000 (* depth 1000)) + for overlay in (nreverse (append overlays nil)) + do (overlay-put overlay 'priority p)) + (let ((it (make-popup :point point + :row row + :column column + :width width + :height height + :min-height min-height + :direction direction + :parent parent + :depth depth + :face face + :mouse-face mouse-face + :selection-face selection-face + :summary-face summary-face + :margin-left margin-left + :margin-right margin-right + :margin-left-cancel margin-left-cancel + :scroll-bar scroll-bar + :symbol symbol + :cursor 0 + :offset 0 + :scroll-top 0 + :current-height 0 + :list nil + :newlines newlines + :overlays overlays + :invis-overlays invis-overlays + :keymap keymap))) + (push it popup-instances) + it)))) + +(defun popup-delete (popup) + "Delete POPUP instance." + (when (popup-live-p popup) + (popup-hide popup) + (mapc 'delete-overlay (popup-overlays popup)) + (setf (popup-overlays popup) nil) + (setq popup-instances (delq popup popup-instances)) + ;; Restore newlines state + (let ((newlines (popup-newlines popup))) + (when (> newlines 0) + (popup-save-buffer-state + (goto-char (point-max)) + (dotimes (i newlines) + (if (and (char-before) + (= (char-before) ?\n)) + (delete-char -1))))))) + nil) + +(defun popup-draw (popup) + "Draw POPUP." + (cl-loop for (ov olddisplay) in (popup-invis-overlays popup) + do (overlay-put ov 'display "")) + + (cl-loop with height = (popup-height popup) + with min-height = (popup-min-height popup) + with popup-face = (popup-face popup) + with mouse-face = (popup-mouse-face popup) + with selection-face = (popup-selection-face popup) + with summary-face-0 = (popup-summary-face popup) + with list = (popup-list popup) + with length = (length list) + with thum-size = (max (/ (* height height) (max length 1)) 1) + with page-size = (/ (+ 0.0 (max length 1)) height) + with scroll-bar = (popup-scroll-bar popup) + with margin-left = (make-string (if (popup-margin-left-cancel popup) 0 (popup-margin-left popup)) ? ) + with margin-right = (make-string (popup-margin-right popup) ? ) + with symbol = (popup-symbol popup) + with cursor = (popup-cursor popup) + with scroll-top = (popup-scroll-top popup) + with offset = (popup-offset popup) + with keymap = (popup-keymap popup) + for o from offset + for i from scroll-top + while (< o height) + for item in (nthcdr scroll-top list) + for page-index = (* thum-size (/ o thum-size)) + for face = (if (= i cursor) + (or (popup-item-selection-face item) selection-face) + (or (popup-item-face item) popup-face)) + for summary-face = (unless (= i cursor) summary-face-0) + for empty-char = (propertize " " 'face face) + for scroll-bar-char = (if scroll-bar + (cond + ((and (not (eq scroll-bar :always)) + (<= page-size 1)) + empty-char) + ((and (> page-size 1) + (>= cursor (* page-index page-size)) + (< cursor (* (+ page-index thum-size) page-size))) + popup-scroll-bar-foreground-char) + (t + popup-scroll-bar-background-char)) + "") + for sym = (if symbol + (concat " " (or (popup-item-symbol item) " ")) + "") + for summary = (or (popup-item-summary item) "") + + do + ;; Show line and set item to the line + (popup-set-line-item popup o + :item item + :face face + :mouse-face mouse-face + :margin-left margin-left + :margin-right margin-right + :scroll-bar-char scroll-bar-char + :symbol sym + :summary summary + :summary-face summary-face + :keymap keymap) + + finally + ;; Remember current height + (setf (popup-current-height popup) (- o offset)) + + ;; Hide remaining lines + (let ((scroll-bar-char (if scroll-bar (propertize " " 'face popup-face) "")) + (symbol (if symbol " " ""))) + (if (> (popup-direction popup) 0) + (progn + (when min-height + (while (< o min-height) + (popup-set-line-item popup o + :item "" + :face popup-face + :margin-left margin-left + :margin-right margin-right + :scroll-bar-char scroll-bar-char + :symbol symbol + :summary "") + (cl-incf o))) + (while (< o height) + (popup-hide-line popup o) + (cl-incf o))) + (cl-loop with h = (if min-height (- height min-height) offset) + for o from 0 below offset + if (< o h) + do (popup-hide-line popup o) + if (>= o h) + do (popup-set-line-item popup o + :item "" + :face popup-face + :margin-left margin-left + :margin-right margin-right + :scroll-bar-char scroll-bar-char + :symbol symbol + :summary "")))))) + +(defun popup-hide (popup) + "Hide POPUP." + (cl-loop for (ov olddisplay) in (popup-invis-overlays popup) + do (overlay-put ov 'display olddisplay)) + (dotimes (i (popup-height popup)) + (popup-hide-line popup i))) + +(defun popup-hidden-p (popup) + "Return non-nil if POPUP is hidden." + (let ((hidden t)) + (when (popup-live-p popup) + (dotimes (i (popup-height popup)) + (unless (popup-line-hidden-p popup i) + (setq hidden nil)))) + hidden)) + +(defun popup-jump (popup cursor) + "Jump to a position specified by CURSOR of POPUP and draw." + (let ((scroll-top (popup-scroll-top popup))) + ;; Do not change page as much as possible. + (unless (and (<= scroll-top cursor) + (< cursor (+ scroll-top (popup-height popup)))) + (setf (popup-scroll-top popup) cursor)) + (setf (popup-cursor popup) cursor) + (popup-draw popup))) + +(defun popup-select (popup i) + "Select the item at I of POPUP and draw." + (setq i (+ i (popup-offset popup))) + (when (and (<= 0 i) (< i (popup-height popup))) + (setf (popup-cursor popup) i) + (popup-draw popup) + t)) + +(defun popup-next (popup) + "Select the next item of POPUP and draw." + (let ((height (popup-height popup)) + (cursor (1+ (popup-cursor popup))) + (scroll-top (popup-scroll-top popup)) + (length (length (popup-list popup)))) + (cond + ((>= cursor length) + ;; Back to first page + (setq cursor 0 + scroll-top 0)) + ((= cursor (+ scroll-top height)) + ;; Go to next page + (setq scroll-top (min (1+ scroll-top) (max (- length height) 0))))) + (setf (popup-cursor popup) cursor + (popup-scroll-top popup) scroll-top) + (popup-draw popup))) + +(defun popup-previous (popup) + "Select the previous item of POPUP and draw." + (let ((height (popup-height popup)) + (cursor (1- (popup-cursor popup))) + (scroll-top (popup-scroll-top popup)) + (length (length (popup-list popup)))) + (cond + ((< cursor 0) + ;; Go to last page + (setq cursor (1- length) + scroll-top (max (- length height) 0))) + ((= cursor (1- scroll-top)) + ;; Go to previous page + (cl-decf scroll-top))) + (setf (popup-cursor popup) cursor + (popup-scroll-top popup) scroll-top) + (popup-draw popup))) + +(defun popup-page-next (popup) + "Select next item of POPUP per `popup-height' range. +Pages down through POPUP." + (dotimes (counter (1- (popup-height popup))) + (popup-next popup))) + +(defun popup-page-previous (popup) + "Select previous item of POPUP per `popup-height' range. +Pages up through POPUP." + (dotimes (counter (1- (popup-height popup))) + (popup-previous popup))) + +(defun popup-scroll-down (popup &optional n) + "Scroll down N of POPUP and draw." + (let ((scroll-top (min (+ (popup-scroll-top popup) (or n 1)) + (- (length (popup-list popup)) (popup-height popup))))) + (setf (popup-cursor popup) scroll-top + (popup-scroll-top popup) scroll-top) + (popup-draw popup))) + +(defun popup-scroll-up (popup &optional n) + "Scroll up N of POPUP and draw." + (let ((scroll-top (max (- (popup-scroll-top popup) (or n 1)) + 0))) + (setf (popup-cursor popup) scroll-top + (popup-scroll-top popup) scroll-top) + (popup-draw popup))) + + + +;;; Popup Incremental Search + +(defface popup-isearch-match + '((t (:inherit default :background "sky blue"))) + "Popup isearch match face." + :group 'popup) + +(defvar popup-isearch-cursor-color "blue") + +(defvar popup-isearch-keymap + (let ((map (make-sparse-keymap))) + ;;(define-key map "\r" 'popup-isearch-done) + (define-key map "\C-g" 'popup-isearch-cancel) + (define-key map "\C-b" 'popup-isearch-close) + (define-key map [left] 'popup-isearch-close) + (define-key map "\C-h" 'popup-isearch-delete) + (define-key map (kbd "DEL") 'popup-isearch-delete) + (define-key map (kbd "C-y") 'popup-isearch-yank) + map)) + +(defvar popup-menu-show-quick-help-function 'popup-menu-show-quick-help + "Function used for showing quick help by `popup-menu*'.") + +(defcustom popup-isearch-regexp-builder-function #'regexp-quote + "Function used to construct a regexp from a pattern. You may for instance + provide a function that replaces spaces by '.+' if you like helm or ivy style + of completion." + :type 'function) + +(defsubst popup-isearch-char-p (char) + (and (integerp char) + (<= 32 char) + (<= char 126))) + +(defun popup-isearch-filter-list (pattern list) + (cl-loop with regexp = (funcall popup-isearch-regexp-builder-function pattern) + for item in list + do + (unless (stringp item) + (setq item (popup-item-propertize (popup-x-to-string item) + 'value item))) + if (string-match regexp item) + collect + (let ((beg (match-beginning 0)) + (end (match-end 0))) + (alter-text-property 0 (length item) 'face + (lambda (prop) + (unless (eq prop 'popup-isearch-match) + prop)) + item) + (put-text-property beg end + 'face 'popup-isearch-match + item) + item))) + +(defun popup-isearch-prompt (popup pattern) + (format "Pattern: %s" (if (= (length (popup-list popup)) 0) + (propertize pattern 'face 'isearch-fail) + pattern))) + +(defun popup-isearch-update (popup filter pattern &optional callback) + (setf (popup-cursor popup) 0 + (popup-scroll-top popup) 0 + (popup-pattern popup) pattern) + (let ((list (funcall filter pattern (popup-original-list popup)))) + (popup-set-filtered-list popup list) + (if callback + (funcall callback list))) + (popup-draw popup)) + +(cl-defun popup-isearch (popup + &key + (filter 'popup-isearch-filter-list) + (cursor-color popup-isearch-cursor-color) + (keymap popup-isearch-keymap) + callback + help-delay) + "Start isearch on POPUP. This function is synchronized, meaning +event loop waits for quiting of isearch. + +FILTER is function with two argumenst to perform popup items filtering. + +CURSOR-COLOR is a cursor color during isearch. The default value +is `popup-isearch-cursor-color'. + +KEYMAP is a keymap which is used when processing events during +event loop. The default value is `popup-isearch-keymap'. + +CALLBACK is a function taking one argument. `popup-isearch' calls +CALLBACK, if specified, after isearch finished or isearch +canceled. The arguments is whole filtered list of items. + +HELP-DELAY is a delay of displaying helps." + (let ((list (popup-original-list popup)) + (pattern (or (popup-pattern popup) "")) + (old-cursor-color (frame-parameter (selected-frame) 'cursor-color)) + prompt key binding) + (unwind-protect + (cl-block nil + (if cursor-color + (set-cursor-color cursor-color)) + (while t + (setq prompt (popup-isearch-prompt popup pattern)) + (setq key (popup-menu-read-key-sequence keymap prompt help-delay)) + (if (null key) + (unless (funcall popup-menu-show-quick-help-function popup nil :prompt prompt) + (clear-this-command-keys) + (push (read-event prompt) unread-command-events)) + (setq binding (lookup-key keymap key)) + (cond + ((and (stringp key) + (popup-isearch-char-p (aref key 0))) + (setq pattern (concat pattern key))) + ((eq binding 'popup-isearch-done) + (cl-return nil)) + ((eq binding 'popup-isearch-cancel) + (popup-isearch-update popup filter "" callback) + (cl-return t)) + ((eq binding 'popup-isearch-close) + (popup-isearch-update popup filter "" callback) + (setq unread-command-events + (append (listify-key-sequence key) unread-command-events)) + (cl-return nil)) + ((eq binding 'popup-isearch-delete) + (if (> (length pattern) 0) + (setq pattern (substring pattern 0 (1- (length pattern)))))) + ((eq binding 'popup-isearch-yank) + (popup-isearch-update popup filter (car kill-ring) callback) + (cl-return nil)) + (t + (setq unread-command-events + (append (listify-key-sequence key) unread-command-events)) + (cl-return nil))) + (popup-isearch-update popup filter pattern callback)))) + (if old-cursor-color + (set-cursor-color old-cursor-color))))) + + + +;;; Popup Tip + +(defface popup-tip-face + '((t (:background "khaki1" :foreground "black"))) + "Face for popup tip." + :group 'popup) + +(defvar popup-tip-max-width 80) + +(cl-defun popup-tip (string + &key + point + (around t) + width + (height 15) + min-height + max-width + truncate + margin + margin-left + margin-right + scroll-bar + parent + parent-offset + nowait + nostrip + prompt + &aux tip lines) + "Show a tooltip of STRING at POINT. This function is +synchronized unless NOWAIT specified. Almost all arguments are +the same as in `popup-create', except for TRUNCATE, NOWAIT, and +PROMPT. + +If TRUNCATE is non-nil, the tooltip can be truncated. + +If NOWAIT is non-nil, this function immediately returns the +tooltip instance without entering event loop. + +If `NOSTRIP` is non-nil, `STRING` properties are not stripped. + +PROMPT is a prompt string when reading events during event loop." + (if (bufferp string) + (setq string (with-current-buffer string (buffer-string)))) + + (unless nostrip + ;; TODO strip text (mainly face) properties + (setq string (substring-no-properties string))) + + (and (eq margin t) (setq margin 1)) + (or margin-left (setq margin-left margin)) + (or margin-right (setq margin-right margin)) + + (let ((it (popup-fill-string string width popup-tip-max-width))) + (setq width (car it) + lines (cdr it))) + + (setq tip (popup-create point width height + :min-height min-height + :max-width max-width + :around around + :margin-left margin-left + :margin-right margin-right + :scroll-bar scroll-bar + :face 'popup-tip-face + :parent parent + :parent-offset parent-offset)) + + (unwind-protect + (when (> (popup-width tip) 0) ; not to be corrupted + (when (and (not (eq width (popup-width tip))) ; truncated + (not truncate)) + ;; Refill once again to lines be fitted to popup width + (setq width (popup-width tip)) + (setq lines (cdr (popup-fill-string string width width)))) + + (popup-set-list tip lines) + (popup-draw tip) + (if nowait + tip + (clear-this-command-keys) + (push (read-event prompt) unread-command-events) + t)) + (unless nowait + (popup-delete tip)))) + + + +;;; Popup Menu + +(defface popup-menu-face + '((t (:inherit popup-face))) + "Face for popup menu." + :group 'popup) + +(defface popup-menu-mouse-face + '((t (:background "blue" :foreground "white"))) + "Face for popup menu." + :group 'popup) + +(defface popup-menu-selection-face + '((t (:inherit default :background "steelblue" :foreground "white"))) + "Face for popup menu selection." + :group 'popup) + +(defface popup-menu-summary-face + '((t (:inherit popup-summary-face))) + "Face for popup summary." + :group 'popup) + +(defvar popup-menu-show-tip-function 'popup-tip + "Function used for showing tooltip by `popup-menu-show-quick-help'.") + +(defun popup-menu-show-help (menu &optional persist item) + (popup-item-show-help (or item (popup-selected-item menu)) persist)) + +(defun popup-menu-documentation (menu &optional item) + (popup-item-documentation (or item (popup-selected-item menu)))) + +(defun popup-menu-show-quick-help (menu &optional item &rest args) + (let* ((point (plist-get args :point)) + (height (or (plist-get args :height) (popup-height menu))) + (min-height (min height (popup-current-height menu))) + (around nil) + (parent-offset (popup-offset menu)) + (doc (popup-menu-documentation menu item))) + (when (stringp doc) + (if (popup-hidden-p menu) + (setq around t + menu nil + parent-offset nil) + (setq point nil)) + (let ((popup-use-optimized-column-computation nil)) ; To avoid wrong positioning + (apply popup-menu-show-tip-function + doc + :point point + :height height + :min-height min-height + :around around + :parent menu + :parent-offset parent-offset + args))))) + +(defun popup-menu-item-of-mouse-event (event) + (when (and (consp event) + (memq (cl-first event) '(mouse-1 mouse-2 mouse-3 mouse-4 mouse-5))) + (let* ((position (cl-second event)) + (object (elt position 4))) + (when (consp object) + (get-text-property (cdr object) 'popup-item (car object)))))) + +(defun popup-menu-read-key-sequence (keymap &optional prompt timeout) + (catch 'timeout + (let ((timer (and timeout + (run-with-timer timeout nil + (lambda () + (if (zerop (length (this-command-keys))) + (throw 'timeout nil)))))) + (old-global-map (current-global-map)) + (temp-global-map (make-sparse-keymap)) + (overriding-terminal-local-map (make-sparse-keymap))) + (substitute-key-definition 'keyboard-quit 'keyboard-quit + temp-global-map old-global-map) + (define-key temp-global-map [menu-bar] (lookup-key old-global-map [menu-bar])) + (define-key temp-global-map [tool-bar] (lookup-key old-global-map [tool-bar])) + (set-keymap-parent overriding-terminal-local-map keymap) + (if (current-local-map) + (define-key overriding-terminal-local-map [menu-bar] + (lookup-key (current-local-map) [menu-bar]))) + (unwind-protect + (progn + (use-global-map temp-global-map) + (clear-this-command-keys) + (with-temp-message prompt + (read-key-sequence nil))) + (use-global-map old-global-map) + (if timer (cancel-timer timer)))))) + +(defun popup-menu-fallback (event default)) + +(cl-defun popup-menu-event-loop (menu + keymap + fallback + &key + prompt + help-delay + isearch + isearch-filter + isearch-cursor-color + isearch-keymap + isearch-callback + &aux key binding) + (cl-block nil + (while (popup-live-p menu) + (and isearch + (popup-isearch menu + :filter isearch-filter + :cursor-color isearch-cursor-color + :keymap isearch-keymap + :callback isearch-callback + :help-delay help-delay) + (keyboard-quit)) + (setq key (popup-menu-read-key-sequence keymap prompt help-delay)) + (setq binding (and key (lookup-key keymap key))) + (cond + ((or (null key) (zerop (length key))) + (unless (funcall popup-menu-show-quick-help-function menu nil :prompt prompt) + (clear-this-command-keys) + (push (read-event prompt) unread-command-events))) + ((eq (lookup-key (current-global-map) key) 'keyboard-quit) + (keyboard-quit) + (cl-return)) + ((eq binding 'popup-close) + (if (popup-parent menu) + (cl-return))) + ((memq binding '(popup-select popup-open)) + (let* ((item (or (popup-menu-item-of-mouse-event (elt key 0)) + (popup-selected-item menu))) + (index (cl-position item (popup-list menu))) + (sublist (popup-item-sublist item))) + (unless index (cl-return)) + (if sublist + (popup-aif (let (popup-use-optimized-column-computation) + (popup-cascade-menu sublist + :around nil + :margin-left (popup-margin-left menu) + :margin-right (popup-margin-right menu) + :scroll-bar (popup-scroll-bar menu) + :parent menu + :parent-offset index + :help-delay help-delay + :isearch isearch + :isearch-filter isearch-filter + :isearch-cursor-color isearch-cursor-color + :isearch-keymap isearch-keymap + :isearch-callback isearch-callback)) + (and it (cl-return it))) + (if (eq binding 'popup-select) + (cl-return (popup-item-value-or-self item)))))) + ((eq binding 'popup-next) + (popup-next menu)) + ((eq binding 'popup-previous) + (popup-previous menu)) + ((eq binding 'popup-page-next) + (popup-page-next menu)) + ((eq binding 'popup-page-previous) + (popup-page-previous menu)) + ((eq binding 'popup-help) + (popup-menu-show-help menu)) + ((eq binding 'popup-isearch) + (popup-isearch menu + :filter isearch-filter + :cursor-color isearch-cursor-color + :keymap isearch-keymap + :callback isearch-callback + :help-delay help-delay)) + ((commandp binding) + (call-interactively binding)) + (t + (funcall fallback key (key-binding key))))))) + +(defun popup-preferred-width (list) + "Return the preferred width to show LIST beautifully." + (cl-loop with tab-width = 4 + for item in list + for summary = (popup-item-summary item) + maximize (string-width (popup-x-to-string item)) into width + if (stringp summary) + maximize (+ (string-width summary) 2) into summary-width + finally return + (let ((total (+ (or width 0) (or summary-width 0)))) + (* (ceiling (/ total 10.0)) 10)))) + +(defvar popup-menu-keymap + (let ((map (make-sparse-keymap))) + (define-key map "\r" 'popup-select) + (define-key map "\C-f" 'popup-open) + (define-key map [right] 'popup-open) + (define-key map "\C-b" 'popup-close) + (define-key map [left] 'popup-close) + + (define-key map "\C-n" 'popup-next) + (define-key map [down] 'popup-next) + (define-key map "\C-p" 'popup-previous) + (define-key map [up] 'popup-previous) + + (define-key map [next] 'popup-page-next) + (define-key map [prior] 'popup-page-previous) + + (define-key map [f1] 'popup-help) + (define-key map (kbd "\C-?") 'popup-help) + + (define-key map "\C-s" 'popup-isearch) + + (define-key map [mouse-1] 'popup-select) + (define-key map [mouse-4] 'popup-previous) + (define-key map [mouse-5] 'popup-next) + map)) + +(cl-defun popup-menu* (list + &key + point + (around t) + (width (popup-preferred-width list)) + (height 15) + max-width + margin + margin-left + margin-right + scroll-bar + symbol + parent + parent-offset + cursor + (keymap popup-menu-keymap) + (fallback 'popup-menu-fallback) + help-delay + nowait + prompt + isearch + (isearch-filter 'popup-isearch-filter-list) + (isearch-cursor-color popup-isearch-cursor-color) + (isearch-keymap popup-isearch-keymap) + isearch-callback + initial-index + &aux menu event) + "Show a popup menu of LIST at POINT. This function returns a +value of the selected item. Almost all arguments are the same as in +`popup-create', except for KEYMAP, FALLBACK, HELP-DELAY, PROMPT, +ISEARCH, ISEARCH-FILTER, ISEARCH-CURSOR-COLOR, ISEARCH-KEYMAP, and +ISEARCH-CALLBACK. + +If KEYMAP is a keymap which is used when processing events during +event loop. + +If FALLBACK is a function taking two arguments; a key and a +command. FALLBACK is called when no special operation is found on +the key. The default value is `popup-menu-fallback', which does +nothing. + +HELP-DELAY is a delay of displaying helps. + +If NOWAIT is non-nil, this function immediately returns the menu +instance without entering event loop. + +PROMPT is a prompt string when reading events during event loop. + +If ISEARCH is non-nil, do isearch as soon as displaying the popup +menu. + +ISEARCH-FILTER is a filtering function taking two arguments: +search pattern and list of items. Returns a list of matching items. + +ISEARCH-CURSOR-COLOR is a cursor color during isearch. The +default value is `popup-isearch-cursor-color'. + +ISEARCH-KEYMAP is a keymap which is used when processing events +during event loop. The default value is `popup-isearch-keymap'. + +ISEARCH-CALLBACK is a function taking one argument. `popup-menu' +calls ISEARCH-CALLBACK, if specified, after isearch finished or +isearch canceled. The arguments is whole filtered list of items. + +If `INITIAL-INDEX' is non-nil, this is an initial index value for +`popup-select'. Only positive integer is valid." + (and (eq margin t) (setq margin 1)) + (or margin-left (setq margin-left margin)) + (or margin-right (setq margin-right margin)) + (if (and scroll-bar + (integerp margin-right) + (> margin-right 0)) + ;; Make scroll-bar space as margin-right + (cl-decf margin-right)) + (setq menu (popup-create point width height + :max-width max-width + :around around + :face 'popup-menu-face + :mouse-face 'popup-menu-mouse-face + :selection-face 'popup-menu-selection-face + :summary-face 'popup-menu-summary-face + :margin-left margin-left + :margin-right margin-right + :scroll-bar scroll-bar + :symbol symbol + :parent parent + :parent-offset parent-offset)) + (unwind-protect + (progn + (popup-set-list menu list) + (if cursor + (popup-jump menu cursor) + (popup-draw menu)) + (when initial-index + (dotimes (_i (min (- (length list) 1) initial-index)) + (popup-next menu))) + (if nowait + menu + (popup-menu-event-loop menu keymap fallback + :prompt prompt + :help-delay help-delay + :isearch isearch + :isearch-filter isearch-filter + :isearch-cursor-color isearch-cursor-color + :isearch-keymap isearch-keymap + :isearch-callback isearch-callback))) + (unless nowait + (popup-delete menu)))) + +(defun popup-cascade-menu (list &rest args) + "Same as `popup-menu' except that an element of LIST can be +also a sub-menu if the element is a cons cell formed (ITEM +. SUBLIST) where ITEM is an usual item and SUBLIST is a list of +the sub menu." + (apply 'popup-menu* + (mapcar (lambda (item) + (if (consp item) + (popup-make-item (car item) + :sublist (cdr item) + :symbol ">") + item)) + list) + :symbol t + args)) + +(provide 'popup) +;;; popup.el ends here diff --git a/.emacs.d/elpa/popup-20210317.138/popup.elc b/.emacs.d/elpa/popup-20210317.138/popup.elc new file mode 100644 index 0000000..c89ae6e Binary files /dev/null and b/.emacs.d/elpa/popup-20210317.138/popup.elc differ diff --git a/.emacs.d/elpa/pos-tip-20191227.1356/pos-tip-autoloads.el b/.emacs.d/elpa/pos-tip-20191227.1356/pos-tip-autoloads.el new file mode 100644 index 0000000..a3db701 --- /dev/null +++ b/.emacs.d/elpa/pos-tip-20191227.1356/pos-tip-autoloads.el @@ -0,0 +1,22 @@ +;;; pos-tip-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "pos-tip" "pos-tip.el" (0 0 0 0)) +;;; Generated autoloads from pos-tip.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "pos-tip" '("pos-tip-"))) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; pos-tip-autoloads.el ends here diff --git a/.emacs.d/elpa/pos-tip-20191227.1356/pos-tip-pkg.el b/.emacs.d/elpa/pos-tip-20191227.1356/pos-tip-pkg.el new file mode 100644 index 0000000..8a232e4 --- /dev/null +++ b/.emacs.d/elpa/pos-tip-20191227.1356/pos-tip-pkg.el @@ -0,0 +1,2 @@ +;;; Generated package description from pos-tip.el -*- no-byte-compile: t -*- +(define-package "pos-tip" "20191227.1356" "Show tooltip at point" 'nil :commit "179cc126b363f72ca12fab1e0dc462ce0ee79742" :authors '(("S. Irie")) :maintainer '("S. Irie") :keywords '("tooltip")) diff --git a/.emacs.d/elpa/pos-tip-20191227.1356/pos-tip.el b/.emacs.d/elpa/pos-tip-20191227.1356/pos-tip.el new file mode 100644 index 0000000..190a401 --- /dev/null +++ b/.emacs.d/elpa/pos-tip-20191227.1356/pos-tip.el @@ -0,0 +1,982 @@ +;;; pos-tip.el --- Show tooltip at point -*- coding: utf-8 -*- + +;; Copyright (C) 2010 S. Irie + +;; Author: S. Irie +;; Maintainer: S. Irie +;; Keywords: Tooltip +;; Package-Version: 20191227.1356 +;; Package-Commit: 179cc126b363f72ca12fab1e0dc462ce0ee79742 + +(defconst pos-tip-version "0.4.6") + +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License as +;; published by the Free Software Foundation; either version 2, or +;; (at your option) any later version. + +;; It is distributed in the hope that it will be useful, but WITHOUT +;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +;; License for more details. + +;; You should have received a copy of the GNU General Public +;; License along with this program; if not, write to the Free +;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +;; MA 02110-1301 USA + +;;; Commentary: + +;; The standard library tooltip.el provides the function for displaying +;; a tooltip at mouse position which allows users to easily show it. +;; However, locating tooltip at arbitrary buffer position in window +;; is not easy. This program provides such function to be used by other +;; frontend programs. + +;; This program is tested on GNU Emacs 22, 23 under X window system and +;; Emacs 23 for MS-Windows. + +;; +;; Installation: +;; +;; First, save this file as pos-tip.el and byte-compile in +;; a directory that is listed in load-path. +;; +;; Put the following in your .emacs file: +;; +;; (require 'pos-tip) +;; +;; To use the full features of this program on MS-Windows, +;; put the additional setting in .emacs file: +;; +;; (pos-tip-w32-max-width-height) ; Maximize frame temporarily +;; +;; or +;; +;; (pos-tip-w32-max-width-height t) ; Keep frame maximized + +;; +;; Examples: +;; +;; We can display a tooltip at the current position by the following: +;; +;; (pos-tip-show "foo bar") +;; +;; If you'd like to specify the tooltip color, use an expression as: +;; +;; (pos-tip-show "foo bar" '("white" . "red")) +;; +;; Here, "white" and "red" are the foreground color and background +;; color, respectively. + + +;;; History: +;; 2013-07-16 P. Kalinowski +;; * Adjusted `pos-tip-show' to correctly set tooltip text foreground +;; color when using custom color themes. +;; * Version 0.4.6 +;; +;; 2010-09-27 S. Irie +;; * Simplified implementation of `pos-tip-window-system' +;; * Version 0.4.5 +;; +;; 2010-08-20 S. Irie +;; * Changed to use `window-line-height' to calculate tooltip position +;; * Changed `pos-tip-string-width-height' to ignore last empty line +;; * Version 0.4.4 +;; +;; 2010-07-25 S. Irie +;; * Bug fix +;; * Version 0.4.3 +;; +;; 2010-06-09 S. Irie +;; * Bug fix +;; * Version 0.4.2 +;; +;; 2010-06-04 S. Irie +;; * Added support for text-scale-mode +;; * Version 0.4.1 +;; +;; 2010-05-04 S. Irie +;; * Added functions: +;; `pos-tip-x-display-width', `pos-tip-x-display-height' +;; `pos-tip-normalize-natnum', `pos-tip-frame-relative-position' +;; * Fixed the supports for multi-displays and multi-frames +;; * Version 0.4.0 +;; +;; 2010-04-29 S. Irie +;; * Modified to avoid byte-compile warning +;; * Bug fix +;; * Version 0.3.6 +;; +;; 2010-04-29 S. Irie +;; * Renamed argument MAX-HEIGHT of `pos-tip-fill-string' to MAX-ROWS +;; * Modified old FSF address +;; * Version 0.3.5 +;; +;; 2010-04-29 S. Irie +;; * Modified `pos-tip-show' to truncate string exceeding display size +;; * Added function `pos-tip-truncate-string' +;; * Added optional argument MAX-ROWS to `pos-tip-split-string' +;; * Added optional argument MAX-HEIGHT to `pos-tip-fill-string' +;; * Version 0.3.4 +;; +;; 2010-04-16 S. Irie +;; * Changed `pos-tip-show' not to fill paragraph unless exceeding WIDTH +;; * Version 0.3.3 +;; +;; 2010-04-08 S. Irie +;; * Bug fix +;; * Version 0.3.2 +;; +;; 2010-03-31 S. Irie +;; * Bug fix +;; * Version 0.3.1 +;; +;; 2010-03-30 S. Irie +;; * Added support for MS-Windows +;; * Added option `pos-tip-use-relative-coordinates' +;; * Bug fixes +;; * Version 0.3.0 +;; +;; 2010-03-23 S. Irie +;; * Changed argument WORD-WRAP to JUSTIFY +;; * Added optional argument SQUEEZE +;; * Added function `pos-tip-fill-string' +;; * Added option `pos-tip-tab-width' used to expand tab characters +;; * Bug fixes +;; * Version 0.2.0 +;; +;; 2010-03-22 S. Irie +;; * Added optional argument WORD-WRAP to `pos-tip-split-string' +;; * Changed `pos-tip-show' to perform word wrap or kinsoku shori +;; * Version 0.1.8 +;; +;; 2010-03-20 S. Irie +;; * Added optional argument DY +;; * Bug fix +;; * Modified docstrings +;; * Version 0.1.7 +;; +;; 2010-03-18 S. Irie +;; * Added/modified docstrings +;; * Changed working buffer name to " *xwininfo*" +;; * Version 0.1.6 +;; +;; 2010-03-17 S. Irie +;; * Fixed typos in docstrings +;; * Version 0.1.5 +;; +;; 2010-03-16 S. Irie +;; * Added support for multi-display environment +;; * Bug fix +;; * Version 0.1.4 +;; +;; 2010-03-16 S. Irie +;; * Bug fix +;; * Changed calculation for `x-max-tooltip-size' +;; * Modified docstring +;; * Version 0.1.3 +;; +;; 2010-03-11 S. Irie +;; * Modified commentary +;; * Version 0.1.2 +;; +;; 2010-03-11 S. Irie +;; * Re-implemented `pos-tip-string-width-height' +;; * Added indicator variable `pos-tip-upperside-p' +;; * Version 0.1.1 +;; +;; 2010-03-09 S. Irie +;; * Re-implemented `pos-tip-show' (*incompatibly changed*) +;; - Use frame default font +;; - Automatically calculate tooltip pixel size +;; - Added optional arguments: TIP-COLOR, MAX-WIDTH +;; * Added utility functions: +;; `pos-tip-split-string', `pos-tip-string-width-height' +;; * Bug fixes +;; * Version 0.1.0 +;; +;; 2010-03-08 S. Irie +;; * Added optional argument DX +;; * Version 0.0.4 +;; +;; 2010-03-08 S. Irie +;; * Bug fix +;; * Version 0.0.3 +;; +;; 2010-03-08 S. Irie +;; * Modified to move out mouse pointer +;; * Version 0.0.2 +;; +;; 2010-03-07 S. Irie +;; * First release +;; * Version 0.0.1 + +;; ToDo: + +;;; Code: +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Settings +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defgroup pos-tip nil + "Show tooltip at point" + :group 'faces + :prefix "pos-tip-") + +(defcustom pos-tip-border-width 1 + "Outer border width of pos-tip's tooltip." + :type 'integer + :group 'pos-tip) + +(defcustom pos-tip-internal-border-width 2 + "Text margin of pos-tip's tooltip." + :type 'integer + :group 'pos-tip) + +(defcustom pos-tip-foreground-color nil + "Default foreground color of pos-tip's tooltip. +When `nil', look up the foreground color of the `tooltip' face." + :type '(choice (const :tag "Default" nil) + string) + :group 'pos-tip) + +(defcustom pos-tip-background-color nil + "Default background color of pos-tip's tooltip. +When `nil', look up the background color of the `tooltip' face." + :type '(choice (const :tag "Default" nil) + string) + :group 'pos-tip) + +(defcustom pos-tip-tab-width nil + "Tab width used for `pos-tip-split-string' and `pos-tip-fill-string' +to expand tab characters. nil means use default value of `tab-width'." + :type '(choice (const :tag "Default" nil) + integer) + :group 'pos-tip) + +(defcustom pos-tip-use-relative-coordinates nil + "Non-nil means tooltip location is calculated as a coordinates +relative to the top left corner of frame. In this case the tooltip +will always be displayed within the frame. + +Note that this variable is automatically set to non-nil if absolute +coordinates can't be obtained by `pos-tip-compute-pixel-position'." + :type 'boolean + :group 'pos-tip) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Functions +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun pos-tip-window-system (&optional frame) + "The name of the window system that FRAME is displaying through. +The value is a symbol---for instance, 'x' for X windows. +The value is nil if Emacs is using a text-only terminal. + +FRAME defaults to the currently selected frame." + (let ((type (framep (or frame (selected-frame))))) + (if type + (and (not (eq type t)) + type) + (signal 'wrong-type-argument (list 'framep frame))))) + +(defun pos-tip-normalize-natnum (object &optional n) + "Return a Nth power of 2 if OBJECT is a positive integer. +Otherwise return 0. Omitting N means return 1 for a positive integer." + (ash (if (and (natnump object) (> object 0)) 1 0) + (or n 0))) + +(defvar pos-tip-saved-frame-coordinates '(0 . 0) + "The latest result of `pos-tip-frame-top-left-coordinates'.") + +(defvar pos-tip-frame-offset nil + "The latest result of `pos-tip-calibrate-frame-offset'. This value +is used for non-X graphical environment.") + +(defvar pos-tip-frame-offset-array [nil nil nil nil] + "Array of the results of `pos-tip-calibrate-frame-offset'. They are +recorded only when `pos-tip-frame-top-left-coordinates' is called for a +non-X but graphical frame. + +The 2nd and 4th elements are the values for frames having a menu bar. +The 3rd and 4th elements are the values for frames having a tool bar.") + +(defun pos-tip-frame-top-left-coordinates (&optional frame) + "Return the pixel coordinates of FRAME as a cons cell (LEFT . TOP), +which are relative to top left corner of screen. + +Return nil if failing to acquire the coordinates. + +If FRAME is omitted, use selected-frame. + +Users can also get the frame coordinates by referring the variable +`pos-tip-saved-frame-coordinates' just after calling this function." + (let ((winsys (pos-tip-window-system frame))) + (cond + ((null winsys) + (error "text-only frame: %S" frame)) + ((eq winsys 'x) + (condition-case nil + (with-current-buffer (get-buffer-create " *xwininfo*") + (let ((case-fold-search nil)) + (buffer-disable-undo) + (erase-buffer) + (call-process shell-file-name nil t nil shell-command-switch + (format "xwininfo -display %s -id %s" + (frame-parameter frame 'display) + (frame-parameter frame 'window-id))) + (goto-char (point-min)) + (search-forward "\n Absolute") + (setq pos-tip-saved-frame-coordinates + (cons (string-to-number (buffer-substring-no-properties + (search-forward "X: ") + (line-end-position))) + (string-to-number (buffer-substring-no-properties + (search-forward "Y: ") + (line-end-position))))))) + (error nil))) + (t + (let* ((index (+ (pos-tip-normalize-natnum + (frame-parameter frame 'menu-bar-lines) 0) + (pos-tip-normalize-natnum + (frame-parameter frame 'tool-bar-lines) 1))) + (offset (or (aref pos-tip-frame-offset-array index) + (aset pos-tip-frame-offset-array index + (pos-tip-calibrate-frame-offset frame))))) + (if offset + (setq pos-tip-saved-frame-coordinates + (cons (+ (eval (frame-parameter frame 'left)) + (car offset)) + (+ (eval (frame-parameter frame 'top)) + (cdr offset)))))))))) + +(defun pos-tip-frame-relative-position + (frame1 frame2 &optional w32-frame frame-coord1 frame-coord2) + "Return the pixel coordinates of FRAME1 relative to FRAME2 +as a cons cell (LEFT . TOP). + +W32-FRAME non-nil means both of frames are under `w32' window system. + +FRAME-COORD1 and FRAME-COORD2, if given, specify the absolute +coordinates of FRAME1 and FRAME2, respectively, which make the +calculations faster if the frames have different heights of menu bars +and tool bars." + (if (and (eq (pos-tip-normalize-natnum + (frame-parameter frame1 'menu-bar-lines)) + (pos-tip-normalize-natnum + (frame-parameter frame2 'menu-bar-lines))) + (or w32-frame + (eq (pos-tip-normalize-natnum + (frame-parameter frame1 'tool-bar-lines)) + (pos-tip-normalize-natnum + (frame-parameter frame2 'tool-bar-lines))))) + (cons (- (eval (frame-parameter frame1 'left)) + (eval (frame-parameter frame2 'left))) + (- (eval (frame-parameter frame1 'top)) + (eval (frame-parameter frame2 'top)))) + (unless frame-coord1 + (setq frame-coord1 (let (pos-tip-saved-frame-coordinates) + (pos-tip-frame-top-left-coordinates frame1)))) + (unless frame-coord2 + (setq frame-coord2 (let (pos-tip-saved-frame-coordinates) + (pos-tip-frame-top-left-coordinates frame2)))) + (cons (- (car frame-coord1) (car frame-coord2)) + (- (cdr frame-coord1) (cdr frame-coord2))))) + +(defvar pos-tip-upperside-p nil + "Non-nil indicates the latest result of `pos-tip-compute-pixel-position' +was upper than the location specified by the arguments.") + +(defvar pos-tip-w32-saved-max-width-height nil + "Display pixel size effective for showing tooltip in MS-Windows desktop. +This doesn't include the taskbar area, so isn't same as actual display size.") + +(defun pos-tip-compute-pixel-position + (&optional pos window pixel-width pixel-height frame-coordinates dx dy) + "Return pixel position of POS in WINDOW like (X . Y), which indicates +the absolute or relative coordinates of bottom left corner of the object. + +Omitting POS and WINDOW means use current position and selected window, +respectively. + +If PIXEL-WIDTH and PIXEL-HEIGHT are given, this function assumes these +values as the size of small window like tooltip which is located around the +object at POS. These values are used to adjust the location in order that +the tooltip won't disappear by sticking out of the display. By referring +the variable `pos-tip-upperside-p' after calling this function, user can +examine whether the tooltip will be located above the specified position. + +If FRAME-COORDINATES is omitted or nil, automatically obtain the absolute +coordinates of the top left corner of frame which WINDOW is on. Here, +`top left corner of frame' represents the origin of `window-pixel-edges' +and its coordinates are essential for calculating the return value as +absolute coordinates. If a cons cell like (LEFT . TOP), specifies the +frame absolute location and makes the calculation slightly faster, but can +be used only when it's clear that frame is in the specified position. Users +can get the latest values of frame coordinates for using in the next call +by referring the variable `pos-tip-saved-frame-coordinates' just after +calling this function. Otherwise, FRAME-COORDINATES `relative' means return +pixel coordinates of the object relative to the top left corner of the frame. +This is the same effect as `pos-tip-use-relative-coordinates' is non-nil. + +DX specifies horizontal offset in pixel. + +DY specifies vertical offset in pixel. This makes the calculations done +without considering the height of object at POS, so the object might be +hidden by the tooltip." + (let* ((frame (window-frame (or window (selected-window)))) + (w32-frame (eq (pos-tip-window-system frame) 'w32)) + (relative (or pos-tip-use-relative-coordinates + (eq frame-coordinates 'relative) + (and w32-frame + (null pos-tip-w32-saved-max-width-height)))) + (frame-coord (or (and relative '(0 . 0)) + frame-coordinates + (pos-tip-frame-top-left-coordinates frame) + (progn + (setq relative t + pos-tip-use-relative-coordinates t) + '(0 . 0)))) + (posn (posn-at-point (or pos (window-point window)) window)) + (line (cdr (posn-actual-col-row posn))) + (line-height (and line + (or (window-line-height line window) + (and (redisplay t) + (window-line-height line window))))) + (x-y (or (posn-x-y posn) + (let ((geom (pos-visible-in-window-p + (or pos (window-point window)) window t))) + (and geom (cons (car geom) (cadr geom)))) + '(0 . 0))) + (x (+ (car frame-coord) + (car (window-inside-pixel-edges window)) + (car x-y) + (or dx 0))) + (y0 (+ (cdr frame-coord) + (cadr (window-pixel-edges window)) + (or (nth 2 line-height) (cdr x-y)))) + (y (+ y0 + (or dy + (car line-height) + (with-current-buffer (window-buffer window) + (cond + ;; `posn-object-width-height' returns an incorrect value + ;; when the header line is displayed (Emacs bug #4426). + ((and posn + (null header-line-format)) + (cdr (posn-object-width-height posn))) + ((and (bound-and-true-p text-scale-mode) + (not (zerop (with-no-warnings + text-scale-mode-amount)))) + (round (* (frame-char-height frame) + (with-no-warnings + (expt text-scale-mode-step + text-scale-mode-amount))))) + (t + (frame-char-height frame))))))) + xmax ymax) + (cond + (relative + (setq xmax (frame-pixel-width frame) + ymax (frame-pixel-height frame))) + (w32-frame + (setq xmax (car pos-tip-w32-saved-max-width-height) + ymax (cdr pos-tip-w32-saved-max-width-height))) + (t + (setq xmax (x-display-pixel-width frame) + ymax (x-display-pixel-height frame)))) + (setq pos-tip-upperside-p (> (+ y (or pixel-height 0)) + ymax)) + (cons (max 0 (min x (- xmax (or pixel-width 0)))) + (max 0 (if pos-tip-upperside-p + (- (if dy ymax y0) (or pixel-height 0)) + y))))) + +(defun pos-tip-cancel-timer () + "Cancel timeout of tooltip." + (mapc (lambda (timer) + (if (eq (aref timer 5) 'x-hide-tip) + (cancel-timer timer))) + timer-list)) + +(defun pos-tip-avoid-mouse (left right top bottom &optional frame) + "Move out mouse pointer if it is inside region (LEFT RIGHT TOP BOTTOM) +in FRAME. Return new mouse position like (FRAME . (X . Y))." + (unless frame + (setq frame (selected-frame))) + (let* ((mpos (with-selected-window (frame-selected-window frame) + (mouse-pixel-position))) + (mframe (pop mpos)) + (mx (car mpos)) + (my (cdr mpos))) + (when (and (eq mframe frame) + (numberp mx)) + (let* ((large-number (+ (frame-pixel-width frame) (frame-pixel-height frame))) + (dl (if (> left 2) + (1+ (- mx left)) + large-number)) + (dr (if (< (1+ right) (frame-pixel-width frame)) + (- right mx) + large-number)) + (dt (if (> top 2) + (1+ (- my top)) + large-number)) + (db (if (< (1+ bottom) (frame-pixel-height frame)) + (- bottom my) + large-number)) + (d (min dl dr dt db))) + (when (> d -2) + (cond + ((= d dl) + (setq mx (- left 2))) + ((= d dr) + (setq mx (1+ right))) + ((= d dt) + (setq my (- top 2))) + (t + (setq my (1+ bottom)))) + (set-mouse-pixel-position frame mx my) + (sit-for 0.0001)))) + (cons mframe (and mpos (cons mx my))))) + +(defun pos-tip-compute-foreground-color (tip-color) + "Compute the foreground color to use for tooltip. + +TIP-COLOR is a face or a cons cell like (FOREGROUND-COLOR . BACKGROUND-COLOR). +If it is nil, use `pos-tip-foreground-color' or the foreground color of the +`tooltip' face." + (or (and (facep tip-color) + (face-attribute tip-color :foreground)) + (car-safe tip-color) + pos-tip-foreground-color + (face-foreground 'tooltip))) + +(defun pos-tip-compute-background-color (tip-color) + "Compute the background color to use for tooltip. + +TIP-COLOR is a face or a cons cell like (FOREGROUND-COLOR . BACKGROUND-COLOR). +If it is nil, use `pos-tip-background-color' or the background color of the +`tooltip' face." + (or (and (facep tip-color) + (face-attribute tip-color :background)) + (cdr-safe tip-color) + pos-tip-background-color + (face-background 'tooltip))) + +(defun pos-tip-show-no-propertize + (string &optional tip-color pos window timeout pixel-width pixel-height frame-coordinates dx dy) + "Show STRING in a tooltip at POS in WINDOW. +Analogous to `pos-tip-show' except don't propertize STRING by `pos-tip' face. + +PIXEL-WIDTH and PIXEL-HEIGHT specify the size of tooltip, if given. These +are used to adjust the tooltip position in order that it doesn't disappear by +sticking out of the display, and also used to prevent it from vanishing by +overlapping with mouse pointer. + +Note that this function itself doesn't calculate tooltip size because the +character width and height specified by faces are unknown. So users should +calculate PIXEL-WIDTH and PIXEL-HEIGHT by using `pos-tip-tooltip-width' and +`pos-tip-tooltip-height', or use `pos-tip-show' instead, which can +automatically calculate tooltip size. + +See `pos-tip-show' for details. + +Example: + +\(defface my-tooltip + '((t + :background \"gray85\" + :foreground \"black\" + :inherit variable-pitch)) + \"Face for my tooltip.\") + +\(defface my-tooltip-highlight + '((t + :background \"blue\" + :foreground \"white\" + :inherit my-tooltip)) + \"Face for my tooltip highlighted.\") + +\(let ((str (propertize \" foo \\n bar \\n baz \" 'face 'my-tooltip))) + (put-text-property 6 11 'face 'my-tooltip-highlight str) + (pos-tip-show-no-propertize str 'my-tooltip))" + (unless window + (setq window (selected-window))) + (let* ((frame (window-frame window)) + (winsys (pos-tip-window-system frame)) + (x-frame (eq winsys 'x)) + (w32-frame (eq winsys 'w32)) + (relative (or pos-tip-use-relative-coordinates + (eq frame-coordinates 'relative) + (and w32-frame + (null pos-tip-w32-saved-max-width-height)))) + (x-y (prog1 + (pos-tip-compute-pixel-position pos window + pixel-width pixel-height + frame-coordinates dx dy) + (if pos-tip-use-relative-coordinates + (setq relative t)))) + (ax (car x-y)) + (ay (cdr x-y)) + (rx (if relative ax (- ax (car pos-tip-saved-frame-coordinates)))) + (ry (if relative ay (- ay (cdr pos-tip-saved-frame-coordinates)))) + (retval (cons rx ry)) + (fg (pos-tip-compute-foreground-color tip-color)) + (bg (pos-tip-compute-background-color tip-color)) + (use-dxdy (or relative + (not x-frame))) + (spacing (frame-parameter frame 'line-spacing)) + (border (ash (+ pos-tip-border-width + pos-tip-internal-border-width) + 1)) + (x-max-tooltip-size + (cons (+ (if x-frame 1 0) + (/ (- (or pixel-width + (cond + (relative + (frame-pixel-width frame)) + (w32-frame + (car pos-tip-w32-saved-max-width-height)) + (t + (x-display-pixel-width frame)))) + border) + (frame-char-width frame))) + (/ (- (or pixel-height + (x-display-pixel-height frame)) + border) + (frame-char-height frame)))) + (x-gtk-use-system-tooltips nil) ; Don't use Gtk+ tooltip in Emacs 24 + (mpos (with-selected-window window (mouse-pixel-position))) + (mframe (car mpos)) + default-frame-alist) + (if (or relative + (and use-dxdy + (null (cadr mpos)))) + (unless (and (cadr mpos) + (eq mframe frame)) + (let* ((edges (window-inside-pixel-edges (cadr (window-list frame)))) + (mx (ash (+ (pop edges) (cadr edges)) -1)) + (my (ash (+ (pop edges) (cadr edges)) -1))) + (setq mframe frame) + (set-mouse-pixel-position mframe mx my) + (sit-for 0.0001))) + (when (and (cadr mpos) + (not (eq mframe frame))) + (let ((rel-coord (pos-tip-frame-relative-position frame mframe w32-frame + frame-coordinates))) + (setq rx (+ rx (car rel-coord)) + ry (+ ry (cdr rel-coord)))))) + (and pixel-width pixel-height + (setq mpos (pos-tip-avoid-mouse rx (+ rx pixel-width + (if w32-frame 3 0)) + ry (+ ry pixel-height) + mframe))) + (x-show-tip string mframe + `((border-width . ,pos-tip-border-width) + (internal-border-width . ,pos-tip-internal-border-width) + ,@(and (not use-dxdy) `((left . ,ax) + (top . ,ay))) + (font . ,(frame-parameter frame 'font)) + ,@(and spacing `((line-spacing . ,spacing))) + ,@(and (stringp fg) `((foreground-color . ,fg))) + ,@(and (stringp bg) `((background-color . ,bg)))) + (and timeout (> timeout 0) timeout) + (and use-dxdy (- rx (cadr mpos))) + (and use-dxdy (- ry (cddr mpos)))) + (if (and timeout (<= timeout 0)) + (pos-tip-cancel-timer)) + retval)) + +(defun pos-tip-split-string (string &optional width margin justify squeeze max-rows) + "Split STRING into fixed width strings. Return a list of these strings. + +WIDTH specifies the width of filling each paragraph. WIDTH nil means use +the width of currently selected frame. Note that this function doesn't add any +padding characters at the end of each row. + +MARGIN, if non-nil, specifies left margin width which is the number of spece +characters to add at the beginning of each row. + +The optional fourth argument JUSTIFY specifies which kind of justification +to do: `full', `left', `right', `center', or `none'. A value of t means handle +each paragraph as specified by its text properties. Omitting JUSTIFY means +don't perform justification, word wrap and kinsoku shori (禁則処理). + +SQUEEZE nil means leave whitespaces other than line breaks untouched. + +MAX-ROWS, if given, specifies maximum number of elements of return value. +The elements exceeding this number are discarded." + (with-temp-buffer + (let* ((tab-width (or pos-tip-tab-width tab-width)) + (fill-column (or width (frame-width))) + (left-margin (or margin 0)) + (kinsoku-limit 1) + indent-tabs-mode + row rows) + (insert string) + (untabify (point-min) (point-max)) + (if justify + (fill-region (point-min) (point-max) justify (not squeeze)) + (setq margin (make-string left-margin ?\s))) + (goto-char (point-min)) + (while (prog2 + (let ((line (buffer-substring + (point) (progn (end-of-line) (point))))) + (if justify + (push line rows) + (while (progn + (setq line (concat margin line) + row (truncate-string-to-width line fill-column)) + (push row rows) + (if (not (= (length row) (length line))) + (setq line (substring line (length row)))))))) + (< (point) (point-max)) + (beginning-of-line 2))) + (nreverse (if max-rows + (last rows max-rows) + rows))))) + +(defun pos-tip-fill-string (string &optional width margin justify squeeze max-rows) + "Fill each of the paragraphs in STRING. + +WIDTH specifies the width of filling each paragraph. WIDTH nil means use +the width of currently selected frame. Note that this function doesn't add any +padding characters at the end of each row. + +MARGIN, if non-nil, specifies left margin width which is the number of spece +characters to add at the beginning of each row. + +The optional fourth argument JUSTIFY specifies which kind of justification +to do: `full', `left', `right', `center', or `none'. A value of t means handle +each paragraph as specified by its text properties. Omitting JUSTIFY means +don't perform justification, word wrap and kinsoku shori (禁則処理). + +SQUEEZE nil means leave whitespaces other than line breaks untouched. + +MAX-ROWS, if given, specifies maximum number of rows. The rows exceeding +this number are discarded." + (if justify + (with-temp-buffer + (let* ((tab-width (or pos-tip-tab-width tab-width)) + (fill-column (or width (frame-width))) + (left-margin (or margin 0)) + (kinsoku-limit 1) + indent-tabs-mode) + (insert string) + (untabify (point-min) (point-max)) + (fill-region (point-min) (point-max) justify (not squeeze)) + (if max-rows + (buffer-substring (goto-char (point-min)) + (line-end-position max-rows)) + (buffer-string)))) + (mapconcat 'identity + (pos-tip-split-string string width margin nil nil max-rows) + "\n"))) + +(defun pos-tip-truncate-string (string width height) + "Truncate each line of STRING to WIDTH and discard lines exceeding HEIGHT." + (with-temp-buffer + (insert string) + (goto-char (point-min)) + (let ((nrow 0) + rows) + (while (and (< nrow height) + (prog2 + (push (truncate-string-to-width + (buffer-substring (point) (progn (end-of-line) (point))) + width) + rows) + (< (point) (point-max)) + (beginning-of-line 2) + (setq nrow (1+ nrow))))) + (mapconcat 'identity (nreverse rows) "\n")))) + +(defun pos-tip-string-width-height (string) + "Count columns and rows of STRING. Return a cons cell like (WIDTH . HEIGHT). +The last empty line of STRING is ignored. + +Example: + +\(pos-tip-string-width-height \"abc\\nあいう\\n123\") +;; => (6 . 3)" + (with-temp-buffer + (insert string) + (goto-char (point-min)) + (end-of-line) + (let ((width (current-column)) + (height (if (eq (char-before (point-max)) ?\n) 0 1))) + (while (< (point) (point-max)) + (end-of-line 2) + (setq width (max (current-column) width) + height (1+ height))) + (cons width height)))) + +(defun pos-tip-x-display-width (&optional frame) + "Return maximum column number in tooltip which occupies the full width +of display. Omitting FRAME means use display that selected frame is in." + (1+ (/ (x-display-pixel-width frame) (frame-char-width frame)))) + +(defun pos-tip-x-display-height (&optional frame) + "Return maximum row number in tooltip which occupies the full height +of display. Omitting FRAME means use display that selected frame is in." + (1+ (/ (x-display-pixel-height frame) (frame-char-height frame)))) + +(defun pos-tip-tooltip-width (width char-width) + "Calculate tooltip pixel width." + (+ (* width char-width) + (ash (+ pos-tip-border-width + pos-tip-internal-border-width) + 1))) + +(defun pos-tip-tooltip-height (height char-height &optional frame) + "Calculate tooltip pixel height." + (let ((spacing (or (default-value 'line-spacing) + (frame-parameter frame 'line-spacing)))) + (+ (* height (+ char-height + (cond + ((integerp spacing) + spacing) + ((floatp spacing) + (truncate (* (frame-char-height frame) + spacing))) + (t 0)))) + (ash (+ pos-tip-border-width + pos-tip-internal-border-width) + 1)))) + +(defun pos-tip-show + (string &optional tip-color pos window timeout width frame-coordinates dx dy) + "Show STRING in a tooltip, which is a small X window, at POS in WINDOW +using frame's default font with TIP-COLOR. + +Return pixel position of tooltip relative to top left corner of frame as +a cons cell like (X . Y). + +TIP-COLOR is a face or a cons cell like (FOREGROUND-COLOR . BACKGROUND-COLOR) +used to specify *only* foreground-color and background-color of tooltip. If +omitted, use `pos-tip-foreground-color' and `pos-tip-background-color' or the +foreground and background color of the `tooltip' face instead. + +Omitting POS and WINDOW means use current position and selected window, +respectively. + +Automatically hide the tooltip after TIMEOUT seconds. Omitting TIMEOUT means +use the default timeout of 5 seconds. Non-positive TIMEOUT means don't hide +tooltip automatically. + +WIDTH, if non-nil, specifies the width of filling each paragraph. + +If FRAME-COORDINATES is omitted or nil, automatically obtain the absolute +coordinates of the top left corner of frame which WINDOW is on. Here, +`top left corner of frame' represents the origin of `window-pixel-edges' +and its coordinates are essential for calculating the absolute coordinates +of the tooltip. If a cons cell like (LEFT . TOP), specifies the frame +absolute location and makes the calculation slightly faster, but can be +used only when it's clear that frame is in the specified position. Users +can get the latest values of frame coordinates for using in the next call +by referring the variable `pos-tip-saved-frame-coordinates' just after +calling this function. Otherwise, FRAME-COORDINATES `relative' means use +the pixel coordinates relative to the top left corner of the frame for +displaying the tooltip. This is the same effect as +`pos-tip-use-relative-coordinates' is non-nil. + +DX specifies horizontal offset in pixel. + +DY specifies vertical offset in pixel. This makes the calculations done +without considering the height of object at POS, so the object might be +hidden by the tooltip. + +See also `pos-tip-show-no-propertize'." + (unless window + (setq window (selected-window))) + (let* ((frame (window-frame window)) + (max-width (pos-tip-x-display-width frame)) + (max-height (pos-tip-x-display-height frame)) + (w-h (pos-tip-string-width-height string)) + (fg (pos-tip-compute-foreground-color tip-color)) + (bg (pos-tip-compute-background-color tip-color)) + (frame-font (find-font (font-spec :name (frame-parameter frame 'font)))) + (tip-face-attrs (list :font frame-font :foreground fg :background bg))) + (cond + ((and width + (> (car w-h) width)) + (setq string (pos-tip-fill-string string width nil 'none nil max-height) + w-h (pos-tip-string-width-height string))) + ((or (> (car w-h) max-width) + (> (cdr w-h) max-height)) + (setq string (pos-tip-truncate-string string max-width max-height) + w-h (pos-tip-string-width-height string)))) + (pos-tip-show-no-propertize + (propertize string 'face tip-face-attrs) + tip-color pos window timeout + (pos-tip-tooltip-width (car w-h) (frame-char-width frame)) + (pos-tip-tooltip-height (cdr w-h) (frame-char-height frame) frame) + frame-coordinates dx dy))) + +(defalias 'pos-tip-hide 'x-hide-tip + "Hide pos-tip's tooltip.") + +(defun pos-tip-calibrate-frame-offset (&optional frame) + "Return coordinates of FRAME origin relative to the top left corner of +the FRAME extent, like (LEFT . TOP). The return value is recorded to +`pos-tip-frame-offset'. + +Note that this function doesn't correctly work for X frame and Emacs 22." + (setq pos-tip-frame-offset nil) + (let* ((window (frame-first-window frame)) + (delete-frame-functions + '((lambda (frame) + (if (equal (frame-parameter frame 'name) "tooltip") + (setq pos-tip-frame-offset + (cons (eval (frame-parameter frame 'left)) + (eval (frame-parameter frame 'top)))))))) + (pos-tip-border-width 0) + (pos-tip-internal-border-width 1) + (rpos (pos-tip-show "" + `(nil . ,(frame-parameter frame 'background-color)) + (window-start window) window + nil nil 'relative nil 0))) + (sit-for 0) + (pos-tip-hide) + (and pos-tip-frame-offset + (setq pos-tip-frame-offset + (cons (- (car pos-tip-frame-offset) + (car rpos) + (eval (frame-parameter frame 'left))) + (- (cdr pos-tip-frame-offset) + (cdr rpos) + (eval (frame-parameter frame 'top)))))))) + +(defun pos-tip-w32-max-width-height (&optional keep-maximize) + "Maximize the currently selected frame temporarily and set +`pos-tip-w32-saved-max-width-height' the effective display size in order +to become possible to calculate the absolute location of tooltip. + +KEEP-MAXIMIZE non-nil means leave the frame maximized. + +Note that this function is usable only in Emacs 23 for MS-Windows." + (interactive) + (unless (eq window-system 'w32) + (error "`pos-tip-w32-max-width-height' can be used only in w32 frame.")) + ;; Maximize frame + (with-no-warnings (w32-send-sys-command 61488)) + (sit-for 0) + (let ((offset (pos-tip-calibrate-frame-offset))) + (prog1 + (setq pos-tip-w32-saved-max-width-height + (cons (frame-pixel-width) + (+ (frame-pixel-height) + (- (cdr offset) (car offset))))) + (if (called-interactively-p 'interactive) + (message "%S" pos-tip-w32-saved-max-width-height)) + (unless keep-maximize + ;; Restore frame + (with-no-warnings (w32-send-sys-command 61728)))))) + + +(provide 'pos-tip) + +;;; +;;; pos-tip.el ends here diff --git a/.emacs.d/elpa/pos-tip-20191227.1356/pos-tip.elc b/.emacs.d/elpa/pos-tip-20191227.1356/pos-tip.elc new file mode 100644 index 0000000..c456763 Binary files /dev/null and b/.emacs.d/elpa/pos-tip-20191227.1356/pos-tip.elc differ diff --git a/.emacs.d/elpa/projectile-20210607.1513/projectile-autoloads.el b/.emacs.d/elpa/projectile-20210607.1513/projectile-autoloads.el new file mode 100644 index 0000000..23799c4 --- /dev/null +++ b/.emacs.d/elpa/projectile-20210607.1513/projectile-autoloads.el @@ -0,0 +1,591 @@ +;;; projectile-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "projectile" "projectile.el" (0 0 0 0)) +;;; Generated autoloads from projectile.el + +(autoload 'projectile-version "projectile" "\ +Get the Projectile version as string. + +If called interactively or if SHOW-VERSION is non-nil, show the +version in the echo area and the messages buffer. + +The returned string includes both, the version from package.el +and the library version, if both a present and different. + +If the version number could not be determined, signal an error, +if called interactively, or if SHOW-VERSION is non-nil, otherwise +just return nil. + +\(fn &optional SHOW-VERSION)" t nil) + +(autoload 'projectile-invalidate-cache "projectile" "\ +Remove the current project's files from `projectile-projects-cache'. + +With a prefix argument PROMPT prompts for the name of the project whose cache +to invalidate. + +\(fn PROMPT)" t nil) + +(autoload 'projectile-purge-file-from-cache "projectile" "\ +Purge FILE from the cache of the current project. + +\(fn FILE)" t nil) + +(autoload 'projectile-purge-dir-from-cache "projectile" "\ +Purge DIR from the cache of the current project. + +\(fn DIR)" t nil) + +(autoload 'projectile-cache-current-file "projectile" "\ +Add the currently visited file to the cache." t nil) + +(autoload 'projectile-discover-projects-in-directory "projectile" "\ +Discover any projects in DIRECTORY and add them to the projectile cache. +This function is not recursive and only adds projects with roots +at the top level of DIRECTORY. + +\(fn DIRECTORY)" t nil) + +(autoload 'projectile-discover-projects-in-search-path "projectile" "\ +Discover projects in `projectile-project-search-path'. +Invoked automatically when `projectile-mode' is enabled." t nil) + +(autoload 'projectile-switch-to-buffer "projectile" "\ +Switch to a project buffer." t nil) + +(autoload 'projectile-switch-to-buffer-other-window "projectile" "\ +Switch to a project buffer and show it in another window." t nil) + +(autoload 'projectile-switch-to-buffer-other-frame "projectile" "\ +Switch to a project buffer and show it in another frame." t nil) + +(autoload 'projectile-display-buffer "projectile" "\ +Display a project buffer in another window without selecting it." t nil) + +(autoload 'projectile-project-buffers-other-buffer "projectile" "\ +Switch to the most recently selected buffer project buffer. +Only buffers not visible in windows are returned." t nil) + +(autoload 'projectile-multi-occur "projectile" "\ +Do a `multi-occur' in the project's buffers. +With a prefix argument, show NLINES of context. + +\(fn &optional NLINES)" t nil) + +(autoload 'projectile-find-other-file "projectile" "\ +Switch between files with the same name but different extensions. +With FLEX-MATCHING, match any file that contains the base name of current file. +Other file extensions can be customized with the variable `projectile-other-file-alist'. + +\(fn &optional FLEX-MATCHING)" t nil) + +(autoload 'projectile-find-other-file-other-window "projectile" "\ +Switch between files with the same name but different extensions in other window. +With FLEX-MATCHING, match any file that contains the base name of current file. +Other file extensions can be customized with the variable `projectile-other-file-alist'. + +\(fn &optional FLEX-MATCHING)" t nil) + +(autoload 'projectile-find-other-file-other-frame "projectile" "\ +Switch between files with the same name but different extensions in other frame. +With FLEX-MATCHING, match any file that contains the base name of current file. +Other file extensions can be customized with the variable `projectile-other-file-alist'. + +\(fn &optional FLEX-MATCHING)" t nil) + +(autoload 'projectile-find-file-dwim "projectile" "\ +Jump to a project's files using completion based on context. + +With a prefix arg INVALIDATE-CACHE invalidates the cache first. + +If point is on a filename, Projectile first tries to search for that +file in project: + +- If it finds just a file, it switches to that file instantly. This works even +if the filename is incomplete, but there's only a single file in the current project +that matches the filename at point. For example, if there's only a single file named +\"projectile/projectile.el\" but the current filename is \"projectile/proj\" (incomplete), +`projectile-find-file-dwim' still switches to \"projectile/projectile.el\" immediately + because this is the only filename that matches. + +- If it finds a list of files, the list is displayed for selecting. A list of +files is displayed when a filename appears more than one in the project or the +filename at point is a prefix of more than two files in a project. For example, +if `projectile-find-file-dwim' is executed on a filepath like \"projectile/\", it lists +the content of that directory. If it is executed on a partial filename like + \"projectile/a\", a list of files with character 'a' in that directory is presented. + +- If it finds nothing, display a list of all files in project for selecting. + +\(fn &optional INVALIDATE-CACHE)" t nil) + +(autoload 'projectile-find-file-dwim-other-window "projectile" "\ +Jump to a project's files using completion based on context in other window. + +With a prefix arg INVALIDATE-CACHE invalidates the cache first. + +If point is on a filename, Projectile first tries to search for that +file in project: + +- If it finds just a file, it switches to that file instantly. This works even +if the filename is incomplete, but there's only a single file in the current project +that matches the filename at point. For example, if there's only a single file named +\"projectile/projectile.el\" but the current filename is \"projectile/proj\" (incomplete), +`projectile-find-file-dwim-other-window' still switches to \"projectile/projectile.el\" +immediately because this is the only filename that matches. + +- If it finds a list of files, the list is displayed for selecting. A list of +files is displayed when a filename appears more than one in the project or the +filename at point is a prefix of more than two files in a project. For example, +if `projectile-find-file-dwim-other-window' is executed on a filepath like \"projectile/\", it lists +the content of that directory. If it is executed on a partial filename +like \"projectile/a\", a list of files with character 'a' in that directory +is presented. + +- If it finds nothing, display a list of all files in project for selecting. + +\(fn &optional INVALIDATE-CACHE)" t nil) + +(autoload 'projectile-find-file-dwim-other-frame "projectile" "\ +Jump to a project's files using completion based on context in other frame. + +With a prefix arg INVALIDATE-CACHE invalidates the cache first. + +If point is on a filename, Projectile first tries to search for that +file in project: + +- If it finds just a file, it switches to that file instantly. This works even +if the filename is incomplete, but there's only a single file in the current project +that matches the filename at point. For example, if there's only a single file named +\"projectile/projectile.el\" but the current filename is \"projectile/proj\" (incomplete), +`projectile-find-file-dwim-other-frame' still switches to \"projectile/projectile.el\" +immediately because this is the only filename that matches. + +- If it finds a list of files, the list is displayed for selecting. A list of +files is displayed when a filename appears more than one in the project or the +filename at point is a prefix of more than two files in a project. For example, +if `projectile-find-file-dwim-other-frame' is executed on a filepath like \"projectile/\", it lists +the content of that directory. If it is executed on a partial filename +like \"projectile/a\", a list of files with character 'a' in that directory +is presented. + +- If it finds nothing, display a list of all files in project for selecting. + +\(fn &optional INVALIDATE-CACHE)" t nil) + +(autoload 'projectile-find-file "projectile" "\ +Jump to a project's file using completion. +With a prefix arg INVALIDATE-CACHE invalidates the cache first. + +\(fn &optional INVALIDATE-CACHE)" t nil) + +(autoload 'projectile-find-file-other-window "projectile" "\ +Jump to a project's file using completion and show it in another window. + +With a prefix arg INVALIDATE-CACHE invalidates the cache first. + +\(fn &optional INVALIDATE-CACHE)" t nil) + +(autoload 'projectile-find-file-other-frame "projectile" "\ +Jump to a project's file using completion and show it in another frame. + +With a prefix arg INVALIDATE-CACHE invalidates the cache first. + +\(fn &optional INVALIDATE-CACHE)" t nil) + +(autoload 'projectile-toggle-project-read-only "projectile" "\ +Toggle project read only." t nil) + +(autoload 'projectile-find-dir "projectile" "\ +Jump to a project's directory using completion. + +With a prefix arg INVALIDATE-CACHE invalidates the cache first. + +\(fn &optional INVALIDATE-CACHE)" t nil) + +(autoload 'projectile-find-dir-other-window "projectile" "\ +Jump to a project's directory in other window using completion. + +With a prefix arg INVALIDATE-CACHE invalidates the cache first. + +\(fn &optional INVALIDATE-CACHE)" t nil) + +(autoload 'projectile-find-dir-other-frame "projectile" "\ +Jump to a project's directory in other frame using completion. + +With a prefix arg INVALIDATE-CACHE invalidates the cache first. + +\(fn &optional INVALIDATE-CACHE)" t nil) + +(autoload 'projectile-find-test-file "projectile" "\ +Jump to a project's test file using completion. + +With a prefix arg INVALIDATE-CACHE invalidates the cache first. + +\(fn &optional INVALIDATE-CACHE)" t nil) + +(autoload 'projectile-find-related-file-other-window "projectile" "\ +Open related file in other window." t nil) + +(autoload 'projectile-find-related-file-other-frame "projectile" "\ +Open related file in other frame." t nil) + +(autoload 'projectile-find-related-file "projectile" "\ +Open related file." t nil) + +(autoload 'projectile-related-files-fn-groups "projectile" "\ +Generate a related-files-fn which relates as KIND for files in each of GROUPS. + +\(fn KIND GROUPS)" nil nil) + +(autoload 'projectile-related-files-fn-extensions "projectile" "\ +Generate a related-files-fn which relates as KIND for files having EXTENSIONS. + +\(fn KIND EXTENSIONS)" nil nil) + +(autoload 'projectile-related-files-fn-test-with-prefix "projectile" "\ +Generate a related-files-fn which relates tests and impl for files with EXTENSION based on TEST-PREFIX. + +\(fn EXTENSION TEST-PREFIX)" nil nil) + +(autoload 'projectile-related-files-fn-test-with-suffix "projectile" "\ +Generate a related-files-fn which relates tests and impl for files with EXTENSION based on TEST-SUFFIX. + +\(fn EXTENSION TEST-SUFFIX)" nil nil) + +(autoload 'projectile-project-info "projectile" "\ +Display info for current project." t nil) + +(autoload 'projectile-find-implementation-or-test-other-window "projectile" "\ +Open matching implementation or test file in other window." t nil) + +(autoload 'projectile-find-implementation-or-test-other-frame "projectile" "\ +Open matching implementation or test file in other frame." t nil) + +(autoload 'projectile-toggle-between-implementation-and-test "projectile" "\ +Toggle between an implementation file and its test file." t nil) + +(autoload 'projectile-grep "projectile" "\ +Perform rgrep in the project. + +With a prefix ARG asks for files (globbing-aware) which to grep in. +With prefix ARG of `-' (such as `M--'), default the files (without prompt), +to `projectile-grep-default-files'. + +With REGEXP given, don't query the user for a regexp. + +\(fn &optional REGEXP ARG)" t nil) + +(autoload 'projectile-ag "projectile" "\ +Run an ag search with SEARCH-TERM in the project. + +With an optional prefix argument ARG SEARCH-TERM is interpreted as a +regular expression. + +\(fn SEARCH-TERM &optional ARG)" t nil) + +(autoload 'projectile-ripgrep "projectile" "\ +Run a Ripgrep search with `SEARCH-TERM' at current project root. + +With an optional prefix argument ARG SEARCH-TERM is interpreted as a +regular expression. + +\(fn SEARCH-TERM &optional ARG)" t nil) + +(autoload 'projectile-regenerate-tags "projectile" "\ +Regenerate the project's [e|g]tags." t nil) + +(autoload 'projectile-find-tag "projectile" "\ +Find tag in project." t nil) + +(autoload 'projectile-run-command-in-root "projectile" "\ +Invoke `execute-extended-command' in the project's root." t nil) + +(autoload 'projectile-run-shell-command-in-root "projectile" "\ +Invoke `shell-command' in the project's root." t nil) + +(autoload 'projectile-run-async-shell-command-in-root "projectile" "\ +Invoke `async-shell-command' in the project's root." t nil) + +(autoload 'projectile-run-gdb "projectile" "\ +Invoke `gdb' in the project's root." t nil) + +(autoload 'projectile-run-shell "projectile" "\ +Invoke `shell' in the project's root. + +Switch to the project specific shell buffer if it already exists. + +Use a prefix argument ARG to indicate creation of a new process instead. + +\(fn &optional ARG)" t nil) + +(autoload 'projectile-run-eshell "projectile" "\ +Invoke `eshell' in the project's root. + +Switch to the project specific eshell buffer if it already exists. + +Use a prefix argument ARG to indicate creation of a new process instead. + +\(fn &optional ARG)" t nil) + +(autoload 'projectile-run-ielm "projectile" "\ +Invoke `ielm' in the project's root. + +Switch to the project specific ielm buffer if it already exists. + +Use a prefix argument ARG to indicate creation of a new process instead. + +\(fn &optional ARG)" t nil) + +(autoload 'projectile-run-term "projectile" "\ +Invoke `term' in the project's root. + +Switch to the project specific term buffer if it already exists. + +Use a prefix argument ARG to indicate creation of a new process instead. + +\(fn &optional ARG)" t nil) + +(autoload 'projectile-run-vterm "projectile" "\ +Invoke `vterm' in the project's root. + +Switch to the project specific term buffer if it already exists. + +Use a prefix argument ARG to indicate creation of a new process instead. + +\(fn &optional ARG)" t nil) + +(autoload 'projectile-replace "projectile" "\ +Replace literal string in project using non-regexp `tags-query-replace'. + +With a prefix argument ARG prompts you for a directory on which +to run the replacement. + +\(fn &optional ARG)" t nil) + +(autoload 'projectile-replace-regexp "projectile" "\ +Replace a regexp in the project using `tags-query-replace'. + +With a prefix argument ARG prompts you for a directory on which +to run the replacement. + +\(fn &optional ARG)" t nil) + +(autoload 'projectile-kill-buffers "projectile" "\ +Kill project buffers. + +The buffer are killed according to the value of +`projectile-kill-buffers-filter'." t nil) + +(autoload 'projectile-save-project-buffers "projectile" "\ +Save all project buffers." t nil) + +(autoload 'projectile-dired "projectile" "\ +Open `dired' at the root of the project." t nil) + +(autoload 'projectile-dired-other-window "projectile" "\ +Open `dired' at the root of the project in another window." t nil) + +(autoload 'projectile-dired-other-frame "projectile" "\ +Open `dired' at the root of the project in another frame." t nil) + +(autoload 'projectile-vc "projectile" "\ +Open `vc-dir' at the root of the project. + +For git projects `magit-status-internal' is used if available. +For hg projects `monky-status' is used if available. + +If PROJECT-ROOT is given, it is opened instead of the project +root directory of the current buffer file. If interactively +called with a prefix argument, the user is prompted for a project +directory to open. + +\(fn &optional PROJECT-ROOT)" t nil) + +(autoload 'projectile-recentf "projectile" "\ +Show a list of recently visited files in a project." t nil) + +(autoload 'projectile-configure-project "projectile" "\ +Run project configure command. + +Normally you'll be prompted for a compilation command, unless +variable `compilation-read-command'. You can force the prompt +with a prefix ARG. + +\(fn ARG)" t nil) + +(autoload 'projectile-compile-project "projectile" "\ +Run project compilation command. + +Normally you'll be prompted for a compilation command, unless +variable `compilation-read-command'. You can force the prompt +with a prefix ARG. + +\(fn ARG)" t nil) + +(autoload 'projectile-test-project "projectile" "\ +Run project test command. + +Normally you'll be prompted for a compilation command, unless +variable `compilation-read-command'. You can force the prompt +with a prefix ARG. + +\(fn ARG)" t nil) + +(autoload 'projectile-install-project "projectile" "\ +Run project install command. + +Normally you'll be prompted for a compilation command, unless +variable `compilation-read-command'. You can force the prompt +with a prefix ARG. + +\(fn ARG)" t nil) + +(autoload 'projectile-package-project "projectile" "\ +Run project package command. + +Normally you'll be prompted for a compilation command, unless +variable `compilation-read-command'. You can force the prompt +with a prefix ARG. + +\(fn ARG)" t nil) + +(autoload 'projectile-run-project "projectile" "\ +Run project run command. + +Normally you'll be prompted for a compilation command, unless +variable `compilation-read-command'. You can force the prompt +with a prefix ARG. + +\(fn ARG)" t nil) + +(autoload 'projectile-repeat-last-command "projectile" "\ +Run last projectile external command. + +External commands are: `projectile-configure-project', +`projectile-compile-project', `projectile-test-project', +`projectile-install-project', `projectile-package-project', +and `projectile-run-project'. + +If the prefix argument SHOW_PROMPT is non nil, the command can be edited. + +\(fn SHOW-PROMPT)" t nil) + +(autoload 'projectile-switch-project "projectile" "\ +Switch to a project we have visited before. +Invokes the command referenced by `projectile-switch-project-action' on switch. +With a prefix ARG invokes `projectile-commander' instead of +`projectile-switch-project-action.' + +\(fn &optional ARG)" t nil) + +(autoload 'projectile-switch-open-project "projectile" "\ +Switch to a project we have currently opened. +Invokes the command referenced by `projectile-switch-project-action' on switch. +With a prefix ARG invokes `projectile-commander' instead of +`projectile-switch-project-action.' + +\(fn &optional ARG)" t nil) + +(autoload 'projectile-find-file-in-directory "projectile" "\ +Jump to a file in a (maybe regular) DIRECTORY. + +This command will first prompt for the directory the file is in. + +\(fn &optional DIRECTORY)" t nil) + +(autoload 'projectile-find-file-in-known-projects "projectile" "\ +Jump to a file in any of the known projects." t nil) + +(autoload 'projectile-cleanup-known-projects "projectile" "\ +Remove known projects that don't exist anymore." t nil) + +(autoload 'projectile-clear-known-projects "projectile" "\ +Clear both `projectile-known-projects' and `projectile-known-projects-file'." t nil) + +(autoload 'projectile-reset-known-projects "projectile" "\ +Clear known projects and rediscover." t nil) + +(autoload 'projectile-remove-known-project "projectile" "\ +Remove PROJECT from the list of known projects. + +\(fn &optional PROJECT)" t nil) + +(autoload 'projectile-remove-current-project-from-known-projects "projectile" "\ +Remove the current project from the list of known projects." t nil) + +(autoload 'projectile-add-known-project "projectile" "\ +Add PROJECT-ROOT to the list of known projects. + +\(fn PROJECT-ROOT)" t nil) + +(autoload 'projectile-ibuffer "projectile" "\ +Open an IBuffer window showing all buffers in the current project. + +Let user choose another project when PROMPT-FOR-PROJECT is supplied. + +\(fn PROMPT-FOR-PROJECT)" t nil) + +(autoload 'projectile-commander "projectile" "\ +Execute a Projectile command with a single letter. +The user is prompted for a single character indicating the action to invoke. +The `?' character describes then +available actions. + +See `def-projectile-commander-method' for defining new methods." t nil) + +(autoload 'projectile-browse-dirty-projects "projectile" "\ +Browse dirty version controlled projects. + +With a prefix argument, or if CACHED is non-nil, try to use the cached +dirty project list. + +\(fn &optional CACHED)" t nil) + +(autoload 'projectile-edit-dir-locals "projectile" "\ +Edit or create a .dir-locals.el file of the project." t nil) + +(defvar projectile-mode nil "\ +Non-nil if Projectile mode is enabled. +See the `projectile-mode' command +for a description of this minor mode. +Setting this variable directly does not take effect; +either customize it (see the info node `Easy Customization') +or call the function `projectile-mode'.") + +(custom-autoload 'projectile-mode "projectile" nil) + +(autoload 'projectile-mode "projectile" "\ +Minor mode to assist project management and navigation. + +When called interactively, toggle `projectile-mode'. With prefix +ARG, enable `projectile-mode' if ARG is positive, otherwise disable +it. + +When called from Lisp, enable `projectile-mode' if ARG is omitted, +nil or positive. If ARG is `toggle', toggle `projectile-mode'. +Otherwise behave as if called interactively. + +\\{projectile-mode-map} + +\(fn &optional ARG)" t nil) + +(define-obsolete-function-alias 'projectile-global-mode 'projectile-mode "1.0") + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "projectile" '("??" "compilation-find-file-projectile-find-compilation-buffer" "def-projectile-commander-method" "delete-file-projectile-remove-from-cache" "projectile-"))) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; projectile-autoloads.el ends here diff --git a/.emacs.d/elpa/projectile-20210607.1513/projectile-pkg.el b/.emacs.d/elpa/projectile-20210607.1513/projectile-pkg.el new file mode 100644 index 0000000..b8dd579 --- /dev/null +++ b/.emacs.d/elpa/projectile-20210607.1513/projectile-pkg.el @@ -0,0 +1,2 @@ +;;; Generated package description from projectile.el -*- no-byte-compile: t -*- +(define-package "projectile" "20210607.1513" "Manage and navigate projects in Emacs easily" '((emacs "25.1") (pkg-info "0.4")) :commit "155fdb44176347c9599357c7935993033260a930" :authors '(("Bozhidar Batsov" . "bozhidar@batsov.com")) :maintainer '("Bozhidar Batsov" . "bozhidar@batsov.com") :keywords '("project" "convenience") :url "https://github.com/bbatsov/projectile") diff --git a/.emacs.d/elpa/projectile-20210607.1513/projectile.el b/.emacs.d/elpa/projectile-20210607.1513/projectile.el new file mode 100644 index 0000000..b139ac1 --- /dev/null +++ b/.emacs.d/elpa/projectile-20210607.1513/projectile.el @@ -0,0 +1,5421 @@ +;;; projectile.el --- Manage and navigate projects in Emacs easily -*- lexical-binding: t -*- + +;; Copyright © 2011-2021 Bozhidar Batsov <bozhidar@batsov.com> + +;; Author: Bozhidar Batsov <bozhidar@batsov.com> +;; URL: https://github.com/bbatsov/projectile +;; Package-Version: 20210607.1513 +;; Package-Commit: 155fdb44176347c9599357c7935993033260a930 +;; Keywords: project, convenience +;; Version: 2.4.0 +;; Package-Requires: ((emacs "25.1") (pkg-info "0.4")) + +;; This file is NOT part of GNU Emacs. + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3, or (at your option) +;; any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. + +;;; Commentary: +;; +;; This library provides easy project management and navigation. The +;; concept of a project is pretty basic - just a folder containing +;; special file. Currently git, mercurial and bazaar repos are +;; considered projects by default. If you want to mark a folder +;; manually as a project just create an empty .projectile file in +;; it. See the README for more details. +;; +;;; Code: + +(require 'cl-lib) +(require 'thingatpt) +(require 'ibuffer) +(require 'ibuf-ext) +(require 'compile) +(require 'grep) +(eval-when-compile + (require 'find-dired) + (require 'subr-x)) + +(eval-when-compile + (defvar ido-mode) + (defvar ivy-mode) + (defvar helm-mode) + (defvar ag-ignore-list) + (defvar ggtags-completion-table) + (defvar tags-completion-table) + (defvar tags-loop-scan) + (defvar tags-loop-operate) + (defvar eshell-buffer-name) + (defvar explicit-shell-file-name)) + +(declare-function tags-completion-table "etags") +(declare-function make-term "term") +(declare-function term-mode "term") +(declare-function term-char-mode "term") +(declare-function term-ansi-make-term "term") +(declare-function eshell-search-path "esh-ext") +(declare-function vc-dir "vc-dir") +(declare-function vc-dir-busy "vc-dir") +(declare-function string-trim "subr-x") +(declare-function fileloop-continue "fileloop") +(declare-function fileloop-initialize-replace "fileloop") +(declare-function tramp-archive-file-name-p "tramp-archive") + +(declare-function ggtags-ensure-project "ext:ggtags") +(declare-function ggtags-update-tags "ext:ggtags") +(declare-function pkg-info-version-info "ext:pkg-info") +(declare-function ripgrep-regexp "ext:ripgrep") +(declare-function vterm "ext:vterm") +(declare-function vterm-send-return "ext:vterm") +(declare-function vterm-send-string "ext:vterm") + +(defvar grep-files-aliases) +(defvar grep-find-ignored-directories) +(defvar grep-find-ignored-files) + + +;;; Customization +(defgroup projectile nil + "Manage and navigate projects easily." + :group 'tools + :group 'convenience + :link '(url-link :tag "GitHub" "https://github.com/bbatsov/projectile") + :link '(url-link :tag "Online Manual" "https://docs.projectile.mx/") + :link '(emacs-commentary-link :tag "Commentary" "projectile")) + +(defcustom projectile-indexing-method (if (eq system-type 'windows-nt) 'native 'alien) + "Specifies the indexing method used by Projectile. + +There are three indexing methods - native, hybrid and alien. + +The native method is implemented in Emacs Lisp (therefore it is +native to Emacs). Its advantage is that it is portable and will +work everywhere that Emacs does. Its disadvantage is that it is a +bit slow (especially for large projects). Generally it's a good +idea to pair the native indexing method with caching. + +The hybrid indexing method uses external tools (e.g. git, find, +etc) to speed up the indexing process. Still, the files will be +post-processed by Projectile for sorting/filtering purposes. +In this sense that approach is a hybrid between native indexing +and alien indexing. + +The alien indexing method optimizes to the limit the speed +of the hybrid indexing method. This means that Projectile will +not do any processing of the files returned by the external +commands and you're going to get the maximum performance +possible. This behaviour makes a lot of sense for most people, +as they'd typically be putting ignores in their VCS config and +won't care about any additional ignores/unignores/sorting that +Projectile might also provide. + +The disadvantage of the hybrid and alien methods is that they are not well +supported on Windows systems. That's why by default alien indexing is the +default on all operating systems, except Windows." + :group 'projectile + :type '(radio + (const :tag "Native" native) + (const :tag "Hybrid" hybrid) + (const :tag "Alien" alien))) + +(defcustom projectile-enable-caching (eq projectile-indexing-method 'native) + "When t enables project files caching. + +Project caching is automatically enabled by default if you're +using the native indexing method." + :group 'projectile + :type 'boolean) + +(defcustom projectile-kill-buffers-filter 'kill-all + "Determine which buffers are killed by `projectile-kill-buffers'. + +When the kill-all option is selected, kills each buffer. + +When the kill-only-files option is selected, kill only the buffer +associated to a file. + +Otherwise, it should be a predicate that takes one argument: the buffer to +be killed." + :group 'projectile + :type '(radio + (const :tag "All project buffers" kill-all) + (const :tag "Project file buffers" kill-only-files) + (function :tag "Predicate"))) + +(defcustom projectile-file-exists-local-cache-expire nil + "Number of seconds before the local file existence cache expires. +Local refers to a file on a local file system. + +A value of nil disables this cache. +See `projectile-file-exists-p' for details." + :group 'projectile + :type '(choice (const :tag "Disabled" nil) + (integer :tag "Seconds"))) + +(defcustom projectile-file-exists-remote-cache-expire (* 5 60) + "Number of seconds before the remote file existence cache expires. +Remote refers to a file on a remote file system such as tramp. + +A value of nil disables this cache. +See `projectile-file-exists-p' for details." + :group 'projectile + :type '(choice (const :tag "Disabled" nil) + (integer :tag "Seconds"))) + +(defcustom projectile-files-cache-expire nil + "Number of seconds before project files list cache expires. + +A value of nil means the cache never expires." + :group 'projectile + :type '(choice (const :tag "Disabled" nil) + (integer :tag "Seconds"))) + +(defcustom projectile-auto-discover t + "Whether to discover projects when `projectile-mode' is activated." + :group 'projectile + :type 'boolean + :package-version '(projectile . "2.3.0")) + +(defcustom projectile-auto-update-cache t + "Whether the cache should automatically be updated when files are opened or deleted." + :group 'projectile + :type 'boolean) + +(defcustom projectile-require-project-root 'prompt + "Require the presence of a project root to operate when true. +When set to 'prompt Projectile will ask you to select a project +directory if you're not in a project. + +When nil Projectile will consider the current directory the project root." + :group 'projectile + :type '(choice (const :tag "No" nil) + (const :tag "Yes" t) + (const :tag "Prompt for project" prompt))) + +(defcustom projectile-completion-system 'auto + "The completion system to be used by Projectile." + :group 'projectile + :type '(radio + (const :tag "Auto-detect" auto) + (const :tag "Ido" ido) + (const :tag "Helm" helm) + (const :tag "Ivy" ivy) + (const :tag "Default" default) + (function :tag "Custom function"))) + +(defcustom projectile-keymap-prefix nil + "Projectile keymap prefix." + :group 'projectile + :type 'string) + +(make-obsolete-variable 'projectile-keymap-prefix "Use (define-key projectile-mode-map (kbd ...) 'projectile-command-map) instead." "2.0.0") + +(defcustom projectile-cache-file + (expand-file-name "projectile.cache" user-emacs-directory) + "The name of Projectile's cache file." + :group 'projectile + :type 'string) + +(defcustom projectile-tags-file-name "TAGS" + "The tags filename Projectile's going to use." + :group 'projectile + :type 'string) + +(defcustom projectile-tags-command "ctags -Re -f \"%s\" %s \"%s\"" + "The command Projectile's going to use to generate a TAGS file." + :group 'projectile + :type 'string) + +(defcustom projectile-tags-backend 'auto + "The tag backend that Projectile should use. + +If set to 'auto', `projectile-find-tag' will automatically choose +which backend to use. Preference order is ggtags -> xref +-> etags-select -> `find-tag'. Variable can also be set to specify which +backend to use. If selected backend is unavailable, fall back to +`find-tag'. + +If this variable is set to 'auto' and ggtags is available, or if +set to 'ggtags', then ggtags will be used for +`projectile-regenerate-tags'. For all other settings +`projectile-tags-command' will be used." + :group 'projectile + :type '(radio + (const :tag "auto" auto) + (const :tag "xref" xref) + (const :tag "ggtags" ggtags) + (const :tag "etags" etags-select) + (const :tag "standard" find-tag)) + :package-version '(projectile . "0.14.0")) + +(defcustom projectile-sort-order 'default + "The sort order used for a project's files. + +Note that files aren't sorted if `projectile-indexing-method' +is set to 'alien'." + :group 'projectile + :type '(radio + (const :tag "Default (no sorting)" default) + (const :tag "Recently opened files" recentf) + (const :tag "Recently active buffers, then recently opened files" recently-active) + (const :tag "Access time (atime)" access-time) + (const :tag "Modification time (mtime)" modification-time))) + +(defcustom projectile-verbose t + "Echo messages that are not errors." + :group 'projectile + :type 'boolean) + +(defcustom projectile-buffers-filter-function nil + "A function used to filter the buffers in `projectile-project-buffers'. + +The function should accept and return a list of Emacs buffers. +Two example filter functions are shipped by default - +`projectile-buffers-with-file' and +`projectile-buffers-with-file-or-process'." + :group 'projectile + :type 'function) + +(defcustom projectile-project-name nil + "If this value is non-nil, it will be used as project name. + +It has precedence over function `projectile-project-name-function'." + :group 'projectile + :type 'string + :package-version '(projectile . "0.14.0")) + +(defcustom projectile-project-name-function 'projectile-default-project-name + "A function that receives the project-root and returns the project name. + +If variable `projectile-project-name' is non-nil, this function will not be used." + :group 'projectile + :type 'function + :package-version '(projectile . "0.14.0")) + +(defcustom projectile-project-root-files + '( + "GTAGS" ; GNU Global tags + "TAGS" ; etags/ctags are usually in the root of project + "configure.ac" ; autoconf new style + "configure.in" ; autoconf old style + "cscope.out" ; cscope + ) + "A list of files considered to mark the root of a project. +The topmost match has precedence. +See `projectile-register-project-type'." + :group 'projectile + :type '(repeat string)) + +(defcustom projectile-project-root-files-bottom-up + '(".projectile" ; projectile project marker + ".git" ; Git VCS root dir + ".hg" ; Mercurial VCS root dir + ".fslckout" ; Fossil VCS root dir + "_FOSSIL_" ; Fossil VCS root DB on Windows + ".bzr" ; Bazaar VCS root dir + "_darcs" ; Darcs VCS root dir + ) + "A list of files considered to mark the root of a project. +The bottommost (parentmost) match has precedence." + :group 'projectile + :type '(repeat string)) + +(defcustom projectile-project-root-files-top-down-recurring + '(".svn" ; Svn VCS root dir + "CVS" ; Csv VCS root dir + "Makefile") + "A list of files considered to mark the root of a project. +The search starts at the top and descends down till a directory +that contains a match file but its parent does not. Thus, it's a +bottommost match in the topmost sequence of directories +containing a root file." + :group 'projectile + :type '(repeat string)) + +(define-obsolete-variable-alias 'projectile-project-root-files-functions 'projectile-project-root-functions "2.4") + +(defcustom projectile-project-root-functions + '(projectile-root-local + projectile-root-bottom-up + projectile-root-top-down + projectile-root-top-down-recurring) + "A list of functions for finding project root folders. +The functions will be ran until one of them returns a project folder. +Reordering the default functions will alter the project discovery +algorithm." + :group 'projectile + :type '(repeat function)) + +(defcustom projectile-dirconfig-comment-prefix + nil + "Projectile config file (.projectile) comment start marker. +If specified, starting a line in a project's .projectile file with this +character marks that line as a comment instead of a pattern. +Similar to '#' in .gitignore files." + :group 'projectile + :type 'character + :package-version '(projectile . "2.2.0")) + +(defcustom projectile-globally-ignored-files + (list projectile-tags-file-name) + "A list of files globally ignored by projectile. +Note that files aren't filtered if `projectile-indexing-method' +is set to 'alien'." + :group 'projectile + :type '(repeat string)) + +(defcustom projectile-globally-unignored-files nil + "A list of files globally unignored by projectile. +Regular expressions can be used. +Note that files aren't filtered if `projectile-indexing-method' +is set to 'alien'." + :group 'projectile + :type '(repeat string) + :package-version '(projectile . "0.14.0")) + +(defcustom projectile-globally-ignored-file-suffixes + nil + "A list of file suffixes globally ignored by projectile. +Note that files aren't filtered if `projectile-indexing-method' +is set to 'alien'." + :group 'projectile + :type '(repeat string)) + +(defcustom projectile-globally-ignored-directories + '(".idea" + ".vscode" + ".ensime_cache" + ".eunit" + ".git" + ".hg" + ".fslckout" + "_FOSSIL_" + ".bzr" + "_darcs" + ".tox" + ".svn" + ".stack-work" + ".ccls-cache" + ".cache" + ".clangd") + "A list of directories globally ignored by projectile. +Regular expressions can be used. + +Strings that don't start with * are only ignored at the top level +of the project. Strings that start with * are ignored everywhere +in the project, as if there was no *. So note that * when used as +a prefix is not a wildcard; it is an indicator that the directory +should be ignored at all levels, not just root. + +Examples: \"tmp\" ignores only ./tmp at the top level of the +project, but not ./src/tmp. \"*tmp\" will ignore both ./tmp and +./src/tmp, but not ./not-a-tmp or ./src/not-a-tmp. + +Note that files aren't filtered if `projectile-indexing-method' +is set to 'alien'." + :safe (lambda (x) (not (remq t (mapcar #'stringp x)))) + :group 'projectile + :type '(repeat string)) + +(defcustom projectile-globally-unignored-directories nil + "A list of directories globally unignored by projectile. +Note that files aren't filtered if `projectile-indexing-method' +is set to 'alien'." + :group 'projectile + :type '(repeat string) + :package-version '(projectile . "0.14.0")) + +(defcustom projectile-globally-ignored-modes + '("erc-mode" + "help-mode" + "completion-list-mode" + "Buffer-menu-mode" + "gnus-.*-mode" + "occur-mode") + "A list of regular expressions for major modes ignored by projectile. + +If a buffer is using a given major mode, projectile will ignore +it for functions working with buffers." + :group 'projectile + :type '(repeat string)) + +(defcustom projectile-globally-ignored-buffers nil + "A list of buffer-names ignored by projectile. + +You can use either exact buffer names or regular expressions. +If a buffer is in the list projectile will ignore it for +functions working with buffers." + :group 'projectile + :type '(repeat string) + :package-version '(projectile . "0.12.0")) + +(defcustom projectile-find-file-hook nil + "Hooks run when a file is opened with `projectile-find-file'." + :group 'projectile + :type 'hook) + +(defcustom projectile-find-dir-hook nil + "Hooks run when a directory is opened with `projectile-find-dir'." + :group 'projectile + :type 'hook) + +(defcustom projectile-switch-project-action 'projectile-find-file + "Action invoked after switching projects with `projectile-switch-project'. + +Any function that does not take arguments will do." + :group 'projectile + :type 'function) + +(defcustom projectile-find-dir-includes-top-level nil + "If true, add top-level dir to options offered by `projectile-find-dir'." + :group 'projectile + :type 'boolean) + +(defcustom projectile-use-git-grep nil + "If true, use `vc-git-grep' in git projects." + :group 'projectile + :type 'boolean) + +(defcustom projectile-grep-finished-hook nil + "Hooks run when `projectile-grep' finishes." + :group 'projectile + :type 'hook + :package-version '(projectile . "0.14.0")) + +(defcustom projectile-test-prefix-function 'projectile-test-prefix + "Function to find test files prefix based on PROJECT-TYPE." + :group 'projectile + :type 'function) + +(defcustom projectile-test-suffix-function 'projectile-test-suffix + "Function to find test files suffix based on PROJECT-TYPE." + :group 'projectile + :type 'function) + +(defcustom projectile-related-files-fn-function 'projectile-related-files-fn + "Function to find related files based on PROJECT-TYPE." + :group 'projectile + :type 'function) + +(defcustom projectile-dynamic-mode-line t + "If true, update the mode-line dynamically. +Only file buffers are affected by this, as the update happens via +`find-file-hook'. + +See also `projectile-mode-line-function' and `projectile-update-mode-line'." + :group 'projectile + :type 'boolean + :package-version '(projectile . "2.0.0")) + +(defcustom projectile-mode-line-function 'projectile-default-mode-line + "The function to use to generate project-specific mode-line. +The default function adds the project name and type to the mode-line. +See also `projectile-update-mode-line'." + :group 'projectile + :type 'function + :package-version '(projectile . "2.0.0")) + + +;;; Idle Timer +(defvar projectile-idle-timer nil + "The timer object created when `projectile-enable-idle-timer' is non-nil.") + +(defcustom projectile-idle-timer-seconds 30 + "The idle period to use when `projectile-enable-idle-timer' is non-nil." + :group 'projectile + :type 'number) + +(defcustom projectile-idle-timer-hook '(projectile-regenerate-tags) + "The hook run when `projectile-enable-idle-timer' is non-nil." + :group 'projectile + :type '(repeat symbol)) + +(defcustom projectile-enable-idle-timer nil + "Enables idle timer hook `projectile-idle-timer-functions'. + +When `projectile-enable-idle-timer' is non-nil, the hook +`projectile-idle-timer-hook' is run each time Emacs has been idle +for `projectile-idle-timer-seconds' seconds and we're in a +project." + :group 'projectile + :set (lambda (symbol value) + (set symbol value) + (when projectile-idle-timer + (cancel-timer projectile-idle-timer)) + (setq projectile-idle-timer nil) + (when projectile-enable-idle-timer + (setq projectile-idle-timer (run-with-idle-timer + projectile-idle-timer-seconds t + (lambda () + (when (projectile-project-p) + (run-hooks 'projectile-idle-timer-hook))))))) + :type 'boolean) + +(defvar projectile-projects-cache nil + "A hashmap used to cache project file names to speed up related operations.") + +(defvar projectile-projects-cache-time nil + "A hashmap used to record when we populated `projectile-projects-cache'.") + +(defvar projectile-project-root-cache (make-hash-table :test 'equal) + "Cached value of function `projectile-project-root`.") + +(defvar projectile-project-type-cache (make-hash-table :test 'equal) + "A hashmap used to cache project type to speed up related operations.") + +(defvar projectile-known-projects nil + "List of locations where we have previously seen projects. +The list of projects is ordered by the time they have been accessed. + +See also `projectile-remove-known-project', +`projectile-cleanup-known-projects' and `projectile-clear-known-projects'.") + +(defvar projectile-known-projects-on-file nil + "List of known projects reference point. + +Contains a copy of `projectile-known-projects' when it was last +synchronized with `projectile-known-projects-file'.") + +(defcustom projectile-known-projects-file + (expand-file-name "projectile-bookmarks.eld" + user-emacs-directory) + "Name and location of the Projectile's known projects file." + :group 'projectile + :type 'string) + +(defcustom projectile-ignored-projects nil + "A list of projects not to be added to `projectile-known-projects'." + :group 'projectile + :type '(repeat :tag "Project list" directory) + :package-version '(projectile . "0.11.0")) + +(defcustom projectile-ignored-project-function nil + "Function to decide if a project is added to `projectile-known-projects'. + +Can be either nil, or a function that takes the truename of the +project root as argument and returns non-nil if the project is to +be ignored or nil otherwise. + +This function is only called if the project is not listed in +`projectile-ignored-projects'. + +A suitable candidate would be `file-remote-p' to ignore remote +projects." + :group 'projectile + :type '(choice + (const :tag "Nothing" nil) + (const :tag "Remote files" file-remote-p) + function) + :package-version '(projectile . "0.13.0")) + +(defcustom projectile-track-known-projects-automatically t + "Controls whether Projectile will automatically register known projects. + +When set to nil you'll have always add projects explicitly with +`projectile-add-known-project'." + :group 'projectile + :type 'boolean + :package-version '(projectile . "1.0.0")) + +(defcustom projectile-project-search-path nil + "List of folders where projectile is automatically going to look for projects. +You can think of something like $PATH, but for projects instead of executables. +Examples of such paths might be ~/projects, ~/work, etc." + :group 'projectile + :type '(repeat directory) + :package-version '(projectile . "1.0.0")) + +(defcustom projectile-git-command "git ls-files -zco --exclude-standard" + "Command used by projectile to get the files in a git project." + :group 'projectile + :type 'string) + +(defcustom projectile-git-submodule-command "git submodule --quiet foreach 'echo $displaypath' | tr '\\n' '\\0'" + "Command used by projectile to list submodules of a given git repository. +Set to nil to disable listing submodules contents." + :group 'projectile + :type 'string) + +(defcustom projectile-git-ignored-command "git ls-files -zcoi --exclude-standard" + "Command used by projectile to get the ignored files in a git project." + :group 'projectile + :type 'string + :package-version '(projectile . "0.14.0")) + +(defcustom projectile-hg-command "hg locate -f -0 -I ." + "Command used by projectile to get the files in a hg project." + :group 'projectile + :type 'string) + +(defcustom projectile-fossil-command (concat "fossil ls | " + (when (string-equal system-type + "windows-nt") + "dos2unix | ") + "tr '\\n' '\\0'") + "Command used by projectile to get the files in a fossil project." + :group 'projectile + :type 'string) + +(defcustom projectile-bzr-command "bzr ls -R --versioned -0" + "Command used by projectile to get the files in a bazaar project." + :group 'projectile + :type 'string) + +(defcustom projectile-darcs-command "darcs show files -0 . " + "Command used by projectile to get the files in a darcs project." + :group 'projectile + :type 'string) + +(defcustom projectile-svn-command "svn list -R . | grep -v '$/' | tr '\\n' '\\0'" + "Command used by projectile to get the files in a svn project." + :group 'projectile + :type 'string) + +(defcustom projectile-generic-command + (if (executable-find "fd") + "fd . -0 --type f --color=never" + "find . -type f -print0") + "Command used by projectile to get the files in a generic project." + :group 'projectile + :type 'string) + +(defcustom projectile-vcs-dirty-state '("edited" "unregistered" "needs-update" "needs-merge" "unlocked-changes" "conflict") + "List of states checked by `projectile-browse-dirty-projects'. +Possible checked states are: +\"edited\", \"unregistered\", \"needs-update\", \"needs-merge\", +\"unlocked-changes\" and \"conflict\", +as defined in `vc.el'." + :group 'projectile + :type '(repeat (string)) + :package-version '(projectile . "1.0.0")) + +(defcustom projectile-other-file-alist + '( ;; handle C/C++ extensions + ("cpp" . ("h" "hpp" "ipp")) + ("ipp" . ("h" "hpp" "cpp")) + ("hpp" . ("h" "ipp" "cpp" "cc")) + ("cxx" . ("h" "hxx" "ixx")) + ("ixx" . ("h" "hxx" "cxx")) + ("hxx" . ("h" "ixx" "cxx")) + ("c" . ("h")) + ("m" . ("h")) + ("mm" . ("h")) + ("h" . ("c" "cc" "cpp" "ipp" "hpp" "cxx" "ixx" "hxx" "m" "mm")) + ("cc" . ("h" "hh" "hpp")) + ("hh" . ("cc")) + + ;; OCaml extensions + ("ml" . ("mli")) + ("mli" . ("ml" "mll" "mly")) + ("mll" . ("mli")) + ("mly" . ("mli")) + ("eliomi" . ("eliom")) + ("eliom" . ("eliomi")) + + ;; vertex shader and fragment shader extensions in glsl + ("vert" . ("frag")) + ("frag" . ("vert")) + + ;; handle files with no extension + (nil . ("lock" "gpg")) + ("lock" . ("")) + ("gpg" . ("")) + ) + "Alist of extensions for switching to file with the same name, + using other extensions based on the extension of current + file." + :type 'alist) + +(defcustom projectile-create-missing-test-files nil + "During toggling, if non-nil enables creating test files if not found. + +When not-nil, every call to projectile-find-implementation-or-test-* +creates test files if not found on the file system. Defaults to nil. +It assumes the test/ folder is at the same level as src/." + :group 'projectile + :type 'boolean) + +(defcustom projectile-after-switch-project-hook nil + "Hooks run right after project is switched." + :group 'projectile + :type 'hook) + +(defcustom projectile-before-switch-project-hook nil + "Hooks run when right before project is switched." + :group 'projectile + :type 'hook) + +(defcustom projectile-current-project-on-switch 'remove + "Determines whether to display current project when switching projects. + +When set to 'remove current project is not included, 'move-to-end +will display current project and the end of the list of known +projects, 'keep will leave the current project at the default +position." + :group 'projectile + :type '(radio + (const :tag "Remove" remove) + (const :tag "Move to end" move-to-end) + (const :tag "Keep" keep))) + +(defcustom projectile-max-file-buffer-count nil + "Maximum number of file buffers per project that are kept open. + +If the value is nil, there is no limit to the opend buffers count." + :group 'projectile + :type 'integer + :package-version '(projectile . "2.2.0")) + + +;;; Version information + +;;;###autoload +(defun projectile-version (&optional show-version) + "Get the Projectile version as string. + +If called interactively or if SHOW-VERSION is non-nil, show the +version in the echo area and the messages buffer. + +The returned string includes both, the version from package.el +and the library version, if both a present and different. + +If the version number could not be determined, signal an error, +if called interactively, or if SHOW-VERSION is non-nil, otherwise +just return nil." + (interactive (list t)) + (if (require 'pkg-info nil t) + (let ((version (pkg-info-version-info 'projectile))) + (when show-version + (message "Projectile %s" version)) + version) + (error "Cannot determine version without package pkg-info"))) + +;;; Misc utility functions +(defun projectile-difference (list1 list2) + (cl-remove-if + (lambda (x) (member x list2)) + list1)) + +(defun projectile-unixy-system-p () + "Check to see if unixy text utilities are installed." + (cl-every + (lambda (x) (executable-find x)) + '("grep" "cut" "uniq"))) + +(defun projectile-symbol-or-selection-at-point () + "Get the symbol or selected text at point." + (if (use-region-p) + (buffer-substring-no-properties (region-beginning) (region-end)) + (projectile-symbol-at-point))) + +(defun projectile-symbol-at-point () + "Get the symbol at point and strip its properties." + (substring-no-properties (or (thing-at-point 'symbol) ""))) + +(defun projectile-generate-process-name (process make-new &optional project) + "Infer the buffer name for PROCESS or generate a new one if MAKE-NEW is true. +The function operates on the current project by default, but you can also +specify a project explicitly via the optional PROJECT param." + (let* ((project (or project (projectile-acquire-root))) + (base-name (format "*%s %s*" process (projectile-project-name project)))) + (if make-new + (generate-new-buffer-name base-name) + base-name))) + + +;;; Serialization +(defun projectile-serialize (data filename) + "Serialize DATA to FILENAME. + +The saved data can be restored with `projectile-unserialize'." + (when (file-writable-p filename) + (with-temp-file filename + (insert (let (print-length) (prin1-to-string data)))))) + +(defun projectile-unserialize (filename) + "Read data serialized by `projectile-serialize' from FILENAME." + (with-demoted-errors + "Error during file deserialization: %S" + (when (file-exists-p filename) + (with-temp-buffer + (insert-file-contents filename) + ;; this will blow up if the contents of the file aren't + ;; lisp data structures + (read (buffer-string)))))) + + +;;; Caching +(defvar projectile-file-exists-cache + (make-hash-table :test 'equal) + "Cached `projectile-file-exists-p' results.") + +(defvar projectile-file-exists-cache-timer nil + "Timer for scheduling`projectile-file-exists-cache-cleanup'.") + +(defun projectile-file-exists-cache-cleanup () + "Removed timed out cache entries and reschedules or remove the +timer if no more items are in the cache." + (let ((now (current-time))) + (maphash (lambda (key value) + (if (time-less-p (cdr value) now) + (remhash key projectile-file-exists-cache))) + projectile-file-exists-cache) + (setq projectile-file-exists-cache-timer + (if (> (hash-table-count projectile-file-exists-cache) 0) + (run-with-timer 10 nil 'projectile-file-exists-cache-cleanup))))) + +(defun projectile-file-exists-p (filename) + "Return t if file FILENAME exist. +A wrapper around `file-exists-p' with additional caching support." + (let* ((file-remote (file-remote-p filename)) + (expire-seconds + (if file-remote + (and projectile-file-exists-remote-cache-expire + (> projectile-file-exists-remote-cache-expire 0) + projectile-file-exists-remote-cache-expire) + (and projectile-file-exists-local-cache-expire + (> projectile-file-exists-local-cache-expire 0) + projectile-file-exists-local-cache-expire))) + (remote-file-name-inhibit-cache (if expire-seconds + expire-seconds + remote-file-name-inhibit-cache))) + (if (not expire-seconds) + (file-exists-p filename) + (let* ((current-time (current-time)) + (cached (gethash filename projectile-file-exists-cache)) + (cached-value (if cached (car cached))) + (cached-expire (if cached (cdr cached))) + (cached-expired (if cached (time-less-p cached-expire current-time) t)) + (value (or (and (not cached-expired) cached-value) + (if (file-exists-p filename) 'found 'notfound)))) + (when (or (not cached) cached-expired) + (puthash filename + (cons value (time-add current-time (seconds-to-time expire-seconds))) + projectile-file-exists-cache)) + (unless projectile-file-exists-cache-timer + (setq projectile-file-exists-cache-timer + (run-with-timer 10 nil 'projectile-file-exists-cache-cleanup))) + (equal value 'found))))) + +;;;###autoload +(defun projectile-invalidate-cache (prompt) + "Remove the current project's files from `projectile-projects-cache'. + +With a prefix argument PROMPT prompts for the name of the project whose cache +to invalidate." + (interactive "P") + (let ((project-root + (if prompt + (completing-read "Remove cache for: " + (hash-table-keys projectile-projects-cache)) + (projectile-acquire-root)))) + (setq projectile-project-root-cache (make-hash-table :test 'equal)) + (remhash project-root projectile-project-type-cache) + (remhash project-root projectile-projects-cache) + (remhash project-root projectile-projects-cache-time) + (projectile-serialize-cache) + (when projectile-verbose + (message "Invalidated Projectile cache for %s." + (propertize project-root 'face 'font-lock-keyword-face)))) + (when (fboundp 'recentf-cleanup) + (recentf-cleanup))) + +(defun projectile-time-seconds () + "Return the number of seconds since the unix epoch." + (cl-destructuring-bind (high low _usec _psec) (current-time) + (+ (lsh high 16) low))) + +(defun projectile-cache-project (project files) + "Cache PROJECTs FILES. +The cache is created both in memory and on the hard drive." + (when projectile-enable-caching + (puthash project files projectile-projects-cache) + (puthash project (projectile-time-seconds) projectile-projects-cache-time) + (projectile-serialize-cache))) + +;;;###autoload +(defun projectile-purge-file-from-cache (file) + "Purge FILE from the cache of the current project." + (interactive + (list (projectile-completing-read + "Remove file from cache: " + (projectile-current-project-files)))) + (let* ((project-root (projectile-project-root)) + (project-cache (gethash project-root projectile-projects-cache))) + (if (projectile-file-cached-p file project-root) + (progn + (puthash project-root (remove file project-cache) projectile-projects-cache) + (projectile-serialize-cache) + (when projectile-verbose + (message "%s removed from cache" file))) + (error "%s is not in the cache" file)))) + +;;;###autoload +(defun projectile-purge-dir-from-cache (dir) + "Purge DIR from the cache of the current project." + (interactive + (list (projectile-completing-read + "Remove directory from cache: " + (projectile-current-project-dirs)))) + (let* ((project-root (projectile-project-root)) + (project-cache (gethash project-root projectile-projects-cache))) + (puthash project-root + (cl-remove-if (lambda (str) (string-prefix-p dir str)) project-cache) + projectile-projects-cache))) + +(defun projectile-file-cached-p (file project) + "Check if FILE is already in PROJECT cache." + (member file (gethash project projectile-projects-cache))) + +;;;###autoload +(defun projectile-cache-current-file () + "Add the currently visited file to the cache." + (interactive) + (let ((current-project (projectile-project-root))) + (when (and (buffer-file-name) (gethash (projectile-project-root) projectile-projects-cache)) + (let* ((abs-current-file (file-truename (buffer-file-name))) + (current-file (file-relative-name abs-current-file current-project))) + (unless (or (projectile-file-cached-p current-file current-project) + (projectile-ignored-directory-p (file-name-directory abs-current-file)) + (projectile-ignored-file-p abs-current-file)) + (puthash current-project + (cons current-file (gethash current-project projectile-projects-cache)) + projectile-projects-cache) + (projectile-serialize-cache) + (message "File %s added to project %s cache." + (propertize current-file 'face 'font-lock-keyword-face) + (propertize current-project 'face 'font-lock-keyword-face))))))) + +;; cache opened files automatically to reduce the need for cache invalidation +(defun projectile-cache-files-find-file-hook () + "Function for caching files with `find-file-hook'." + (let ((project-root (projectile-project-p))) + (when (and projectile-enable-caching + project-root + (not (projectile-ignored-project-p project-root))) + (projectile-cache-current-file)))) + +(defun projectile-track-known-projects-find-file-hook () + "Function for caching projects with `find-file-hook'." + (when (and projectile-track-known-projects-automatically (projectile-project-p)) + (projectile-add-known-project (projectile-project-root)))) + +(defun projectile-maybe-invalidate-cache (force) + "Invalidate if FORCE or project's dirconfig newer than cache." + (when (or force (file-newer-than-file-p (projectile-dirconfig-file) + projectile-cache-file)) + (projectile-invalidate-cache nil))) + +;;;###autoload +(defun projectile-discover-projects-in-directory (directory) + "Discover any projects in DIRECTORY and add them to the projectile cache. +This function is not recursive and only adds projects with roots +at the top level of DIRECTORY." + (interactive + (list (read-directory-name "Starting directory: "))) + (if (file-exists-p directory) + (let ((subdirs (directory-files directory t directory-files-no-dot-files-regexp t))) + (mapc + (lambda (dir) + (when (and (file-directory-p dir) (projectile-project-p dir)) + (projectile-add-known-project dir))) + subdirs)) + (message "Project search path directory %s doesn't exist" directory))) + +;;;###autoload +(defun projectile-discover-projects-in-search-path () + "Discover projects in `projectile-project-search-path'. +Invoked automatically when `projectile-mode' is enabled." + (interactive) + (mapcar #'projectile-discover-projects-in-directory projectile-project-search-path)) + + +(defun delete-file-projectile-remove-from-cache (filename &optional _trash) + (if (and projectile-enable-caching projectile-auto-update-cache (projectile-project-p)) + (let* ((project-root (projectile-project-root)) + (true-filename (file-truename filename)) + (relative-filename (file-relative-name true-filename project-root))) + (if (projectile-file-cached-p relative-filename project-root) + (projectile-purge-file-from-cache relative-filename))))) + + +;;; Project root related utilities +(defun projectile-parent (path) + "Return the parent directory of PATH. +PATH may be a file or directory and directory paths may end with a slash." + (directory-file-name (file-name-directory (directory-file-name (expand-file-name path))))) + +(defun projectile-locate-dominating-file (file name) + "Look up the directory hierarchy from FILE for a directory containing NAME. +Stop at the first parent directory containing a file NAME, +and return the directory. Return nil if not found. +Instead of a string, NAME can also be a predicate taking one argument +\(a directory) and returning a non-nil value if that directory is the one for +which we're looking." + ;; copied from files.el (stripped comments) emacs-24 bzr branch 2014-03-28 10:20 + (setq file (abbreviate-file-name file)) + (let ((root nil) + try) + (while (not (or root + (null file) + (string-match locate-dominating-stop-dir-regexp file))) + (setq try (if (stringp name) + (projectile-file-exists-p (expand-file-name name file)) + (funcall name file))) + (cond (try (setq root file)) + ((equal file (setq file (file-name-directory + (directory-file-name file)))) + (setq file nil)))) + (and root (expand-file-name (file-name-as-directory root))))) + +(defvar-local projectile-project-root nil + "Defines a custom Projectile project root. +This is intended to be used as a file local variable.") + +(defun projectile-root-local (_dir) + "A simple wrapper around `projectile-project-root'." + projectile-project-root) + +(defun projectile-root-top-down (dir &optional list) + "Identify a project root in DIR by top-down search for files in LIST. +If LIST is nil, use `projectile-project-root-files' instead. +Return the first (topmost) matched directory or nil if not found." + (projectile-locate-dominating-file + dir + (lambda (dir) + (cl-find-if (lambda (f) (projectile-file-exists-p (expand-file-name f dir))) + (or list projectile-project-root-files))))) + +(defun projectile-root-bottom-up (dir &optional list) + "Identify a project root in DIR by bottom-up search for files in LIST. +If LIST is nil, use `projectile-project-root-files-bottom-up' instead. +Return the first (bottommost) matched directory or nil if not found." + (cl-some (lambda (name) (projectile-locate-dominating-file dir name)) + (or list projectile-project-root-files-bottom-up))) + +(defun projectile-root-top-down-recurring (dir &optional list) + "Identify a project root in DIR by recurring top-down search for files in LIST. +If LIST is nil, use `projectile-project-root-files-top-down-recurring' +instead. Return the last (bottommost) matched directory in the +topmost sequence of matched directories. Nil otherwise." + (cl-some + (lambda (f) + (projectile-locate-dominating-file + dir + (lambda (dir) + (and (projectile-file-exists-p (expand-file-name f dir)) + (or (string-match locate-dominating-stop-dir-regexp (projectile-parent dir)) + (not (projectile-file-exists-p (expand-file-name f (projectile-parent dir))))))))) + (or list projectile-project-root-files-top-down-recurring))) + +(defun projectile-project-root (&optional dir) + "Retrieves the root directory of a project if available. +If DIR is not supplied its set to the current directory by default." + ;; the cached value will be 'none in the case of no project root (this is to + ;; ensure it is not reevaluated each time when not inside a project) so use + ;; cl-subst to replace this 'none value with nil so a nil value is used + ;; instead + (let ((dir (or dir default-directory))) + ;; Back out of any archives, the project will live on the outside and + ;; searching them is slow. + (when (and (fboundp 'tramp-archive-file-name-archive) + (tramp-archive-file-name-p dir)) + (setq dir (file-name-directory (tramp-archive-file-name-archive dir)))) + (cl-subst nil 'none + ;; The `is-local' and `is-connected' variables are + ;; used to fix the behavior where Emacs hangs + ;; because of Projectile when you open a file over + ;; TRAMP. It basically prevents Projectile from + ;; trying to find information about files for which + ;; it's not possible to get that information right + ;; now. + (or (let ((is-local (not (file-remote-p dir))) ;; `true' if the file is local + (is-connected (file-remote-p dir nil t))) ;; `true' if the file is remote AND we are connected to the remote + (when (or is-local is-connected) + ;; Here is where all the magic happens. + ;; We run the functions in `projectile-project-root-functions' until we find a project dir. + (cl-some + (lambda (func) + (let* ((cache-key (format "%s-%s" func dir)) + (cache-value (gethash cache-key projectile-project-root-cache))) + (if (and cache-value (file-exists-p cache-value)) + cache-value + (let ((value (funcall func (file-truename dir)))) + (puthash cache-key value projectile-project-root-cache) + value)))) + projectile-project-root-functions))) + ;; set cached to none so is non-nil so we don't try + ;; and look it up again + 'none)))) + +(defun projectile-ensure-project (dir) + "Ensure that DIR is non-nil. +Useful for commands that expect the presence of a project. +Controlled by `projectile-require-project-root'. + +See also `projectile-acquire-root'." + (if dir + dir + (cond + ((eq projectile-require-project-root 'prompt) (projectile-completing-read + "Switch to project: " projectile-known-projects)) + (projectile-require-project-root (error "Projectile cannot find a project definition in %s" default-directory)) + (t default-directory)))) + +(defun projectile-acquire-root (&optional dir) + "Find the current project root, and prompts the user for it if that fails. +Provides the common idiom (projectile-ensure-project (projectile-project-root)). +Starts the search for the project with DIR." + (projectile-ensure-project (projectile-project-root dir))) + +(defun projectile-project-p (&optional dir) + "Check if DIR is a project. +Defaults to the current directory if not provided +explicitly." + (projectile-project-root (or dir default-directory))) + +(defun projectile-default-project-name (project-root) + "Default function used create project name to be displayed based on the value of PROJECT-ROOT." + (file-name-nondirectory (directory-file-name project-root))) + +(defun projectile-project-name (&optional project) + "Return project name. +If PROJECT is not specified acts on the current project." + (or projectile-project-name + (let ((project-root (or project (projectile-project-root)))) + (if project-root + (funcall projectile-project-name-function project-root) + "-")))) + + +;;; Project indexing +(defun projectile-get-project-directories (project-dir) + "Get the list of PROJECT-DIR directories that are of interest to the user." + (mapcar (lambda (subdir) (concat project-dir subdir)) + (or (nth 0 (projectile-parse-dirconfig-file)) '("")))) + +(defun projectile--directory-p (directory) + "Checks if DIRECTORY is a string designating a valid directory." + (and (stringp directory) (file-directory-p directory))) + +(defun projectile-dir-files (directory) + "List the files in DIRECTORY and in its sub-directories. +Files are returned as relative paths to DIRECTORY." + (unless (projectile--directory-p directory) + (error "Directory %S does not exist" directory)) + ;; check for a cache hit first if caching is enabled + (let ((files-list (and projectile-enable-caching + (gethash directory projectile-projects-cache)))) + ;; cache disabled or cache miss + (or files-list + (let ((vcs (projectile-project-vcs directory))) + (pcase projectile-indexing-method + ('native (projectile-dir-files-native directory)) + ;; use external tools to get the project files + ('hybrid (projectile-adjust-files directory vcs (projectile-dir-files-alien directory))) + ('alien (projectile-dir-files-alien directory)) + (_ (user-error "Unsupported indexing method `%S'" projectile-indexing-method))))))) + +;;; Native Project Indexing +;; +;; This corresponds to `projectile-indexing-method' being set to native. +(defun projectile-dir-files-native (directory) + "Get the files for ROOT under DIRECTORY using just Emacs Lisp." + (let ((progress-reporter + (make-progress-reporter + (format "Projectile is indexing %s" + (propertize directory 'face 'font-lock-keyword-face))))) + ;; we need the files with paths relative to the project root + (mapcar (lambda (file) (file-relative-name file directory)) + (projectile-index-directory directory (projectile-filtering-patterns) + progress-reporter)))) + +(defun projectile-index-directory (directory patterns progress-reporter &optional ignored-files ignored-directories globally-ignored-directories) + "Index DIRECTORY taking into account PATTERNS. + +The function calls itself recursively until all sub-directories +have been indexed. The PROGRESS-REPORTER is updated while the +function is executing. The list of IGNORED-FILES and +IGNORED-DIRECTORIES may optionally be provided." + ;; we compute the ignored files and directories only once and then we reuse the + ;; pre-computed values in the subsequent recursive invocations of the function + (let ((ignored-files (or ignored-files (projectile-ignored-files))) + (ignored-directories (or ignored-directories (projectile-ignored-directories))) + (globally-ignored-directories (or globally-ignored-directories (projectile-globally-ignored-directory-names)))) + (apply #'append + (mapcar + (lambda (f) + (let ((local-f (file-name-nondirectory (directory-file-name f)))) + (unless (or (and patterns (projectile-ignored-rel-p f directory patterns)) + (member local-f '("." ".."))) + (progress-reporter-update progress-reporter) + (if (file-directory-p f) + (unless (projectile-ignored-directory-p + (file-name-as-directory f) + ignored-directories + local-f + globally-ignored-directories) + (projectile-index-directory f patterns progress-reporter ignored-files ignored-directories globally-ignored-directories)) + (unless (projectile-ignored-file-p f ignored-files) + (list f)))))) + (directory-files directory t))))) + +;;; Alien Project Indexing +;; +;; This corresponds to `projectile-indexing-method' being set to hybrid or alien. +;; The only difference between the two methods is that alien doesn't do +;; any post-processing of the files obtained via the external command. +(defun projectile-dir-files-alien (directory) + "Get the files for DIRECTORY using external tools." + (let ((vcs (projectile-project-vcs directory))) + (cond + ((eq vcs 'git) + (nconc (projectile-files-via-ext-command directory (projectile-get-ext-command vcs)) + (projectile-get-sub-projects-files directory vcs))) + (t (projectile-files-via-ext-command directory (projectile-get-ext-command vcs)))))) + +(define-obsolete-function-alias 'projectile-dir-files-external 'projectile-dir-files-alien "2.0.0") +(define-obsolete-function-alias 'projectile-get-repo-files 'projectile-dir-files-alien "2.0.0") + +(defun projectile-get-ext-command (vcs) + "Determine which external command to invoke based on the project's VCS. +Fallback to a generic command when not in a VCS-controlled project." + (pcase vcs + ('git projectile-git-command) + ('hg projectile-hg-command) + ('fossil projectile-fossil-command) + ('bzr projectile-bzr-command) + ('darcs projectile-darcs-command) + ('svn projectile-svn-command) + (_ projectile-generic-command))) + +(defun projectile-get-sub-projects-command (vcs) + "Get the sub-projects command for VCS. +Currently that's supported just for Git (sub-projects being Git +sub-modules there)." + (pcase vcs + ('git projectile-git-submodule-command) + (_ ""))) + +(defun projectile-get-ext-ignored-command (vcs) + "Determine which external command to invoke based on the project's VCS." + (pcase vcs + ('git projectile-git-ignored-command) + ;; TODO: Add support for other VCS + (_ nil))) + +(defun projectile-flatten (lst) + "Take a nested list LST and return its contents as a single, flat list." + (if (and (listp lst) (listp (cdr lst))) + (cl-mapcan 'projectile-flatten lst) + (list lst))) + +(defun projectile-get-all-sub-projects (project) + "Get all sub-projects for a given project. + +PROJECT is base directory to start search recursively." + (let ((submodules (projectile-get-immediate-sub-projects project))) + (cond + ((null submodules) + nil) + (t + (nconc submodules (projectile-flatten + ;; recursively get sub-projects of each sub-project + (mapcar (lambda (s) + (projectile-get-all-sub-projects s)) submodules))))))) + +(defun projectile-get-immediate-sub-projects (path) + "Get immediate sub-projects for a given project without recursing. + +PATH is the vcs root or project root from which to start +searching, and should end with an appropriate path delimiter, such as +'/' or a '\\'. + +If the vcs get-sub-projects query returns results outside of path, +they are excluded from the results of this function." + (let* ((vcs (projectile-project-vcs path)) + ;; search for sub-projects under current project `project' + (submodules (mapcar + (lambda (s) + (file-name-as-directory (expand-file-name s path))) + (projectile-files-via-ext-command path (projectile-get-sub-projects-command vcs)))) + (project-child-folder-regex + (concat "\\`" + (regexp-quote path)))) + + ;; If project root is inside of an VCS folder, but not actually an + ;; VCS root itself, submodules external to the project will be + ;; included in the VCS get sub-projects result. Let's remove them. + (cl-remove-if-not + (lambda (submodule) + (string-match-p project-child-folder-regex + submodule)) + submodules))) + +(defun projectile-get-sub-projects-files (project-root _vcs) + "Get files from sub-projects for PROJECT-ROOT recursively." + (projectile-flatten + (mapcar (lambda (sub-project) + (let ((project-relative-path + (file-name-as-directory (file-relative-name + sub-project project-root)))) + (mapcar (lambda (file) + (concat project-relative-path file)) + ;; TODO: Seems we forgot git hardcoded here + (projectile-files-via-ext-command sub-project projectile-git-command)))) + (projectile-get-all-sub-projects project-root)))) + +(defun projectile-get-repo-ignored-files (project vcs) + "Get a list of the files ignored in the PROJECT using VCS." + (let ((cmd (projectile-get-ext-ignored-command vcs))) + (when cmd + (projectile-files-via-ext-command project cmd)))) + +(defun projectile-get-repo-ignored-directory (project dir vcs) + "Get a list of the files ignored in the PROJECT in the directory DIR. +VCS is the VCS of the project." + (let ((cmd (projectile-get-ext-ignored-command vcs))) + (when cmd + (projectile-files-via-ext-command project (concat cmd " " dir))))) + +(defun projectile-files-via-ext-command (root command) + "Get a list of relative file names in the project ROOT by executing COMMAND. + +If `command' is nil or an empty string, return nil. +This allows commands to be disabled. + +Only text sent to standard output is taken into account." + (when (stringp command) + (let ((default-directory root)) + (with-temp-buffer + (shell-command command t "*projectile-files-errors*") + (let ((shell-output (buffer-substring (point-min) (point-max)))) + (split-string (string-trim shell-output) "\0" t)))))) + +(defun projectile-adjust-files (project vcs files) + "First remove ignored files from FILES, then add back unignored files." + (projectile-add-unignored project vcs (projectile-remove-ignored files))) + +(defun projectile-remove-ignored (files) + "Remove ignored files and folders from FILES. + +If ignored directory prefixed with '*', then ignore all +directories/subdirectories with matching filename, +otherwise operates relative to project root." + (let ((ignored-files (projectile-ignored-files-rel)) + (ignored-dirs (projectile-ignored-directories-rel))) + (cl-remove-if + (lambda (file) + (or (cl-some + (lambda (f) + (string= f (file-name-nondirectory file))) + ignored-files) + (cl-some + (lambda (dir) + ;; if the directory is prefixed with '*' then ignore all directories matching that name + (if (string-prefix-p "*" dir) + ;; remove '*' and trailing slash from ignored directory name + (let ((d (substring dir 1 (if (equal (substring dir -1) "/") -1 nil)))) + (cl-some + (lambda (p) + (string= d p)) + ;; split path by '/', remove empty strings, and check if any subdirs match name 'd' + (delete "" (split-string (or (file-name-directory file) "") "/")))) + (string-prefix-p dir file))) + ignored-dirs) + (cl-some + (lambda (suf) + (string-suffix-p suf file t)) + projectile-globally-ignored-file-suffixes))) + files))) + +(defun projectile-keep-ignored-files (project vcs files) + "Filter FILES to retain only those that are ignored." + (when files + (cl-remove-if-not + (lambda (file) + (cl-some (lambda (f) (string-prefix-p f file)) files)) + (projectile-get-repo-ignored-files project vcs)))) + +(defun projectile-keep-ignored-directories (project vcs directories) + "Get ignored files within each of DIRECTORIES." + (when directories + (let (result) + (dolist (dir directories result) + (setq result (append result + (projectile-get-repo-ignored-directory project dir vcs)))) + result))) + +(defun projectile-add-unignored (project vcs files) + "This adds unignored files to FILES. + +Useful because the VCS may not return ignored files at all. In +this case unignored files will be absent from FILES." + (let ((unignored-files (projectile-keep-ignored-files + project + vcs + (projectile-unignored-files-rel))) + (unignored-paths (projectile-remove-ignored + (projectile-keep-ignored-directories + project + vcs + (projectile-unignored-directories-rel))))) + (append files unignored-files unignored-paths))) + +(defun projectile-buffers-with-file (buffers) + "Return only those BUFFERS backed by files." + (cl-remove-if-not (lambda (b) (buffer-file-name b)) buffers)) + +(defun projectile-buffers-with-file-or-process (buffers) + "Return only those BUFFERS backed by files or processes." + (cl-remove-if-not (lambda (b) (or (buffer-file-name b) + (get-buffer-process b))) buffers)) + +(defun projectile-project-buffers (&optional project) + "Get a list of a project's buffers. +If PROJECT is not specified the command acts on the current project." + (let* ((project-root (or project (projectile-acquire-root))) + (all-buffers (cl-remove-if-not + (lambda (buffer) + (projectile-project-buffer-p buffer project-root)) + (buffer-list)))) + (if projectile-buffers-filter-function + (funcall projectile-buffers-filter-function all-buffers) + all-buffers))) + +(defun projectile-process-current-project-buffers (action) + "Process the current project's buffers using ACTION." + (let ((project-buffers (projectile-project-buffers))) + (dolist (buffer project-buffers) + (funcall action buffer)))) + +(defun projectile-process-current-project-buffers-current (action) + "Invoke ACTION on every project buffer with that buffer current. +ACTION is called without arguments." + (let ((project-buffers (projectile-project-buffers))) + (dolist (buffer project-buffers) + (with-current-buffer buffer + (funcall action))))) + +(defun projectile-project-buffer-files (&optional project) + "Get a list of a project's buffer files. +If PROJECT is not specified the command acts on the current project." + (let ((project-root (or project (projectile-project-root)))) + (mapcar + (lambda (buffer) + (file-relative-name + (buffer-file-name buffer) + project-root)) + (projectile-buffers-with-file + (projectile-project-buffers project))))) + +(defun projectile-project-buffer-p (buffer project-root) + "Check if BUFFER is under PROJECT-ROOT." + (with-current-buffer buffer + (and (not (string-prefix-p " " (buffer-name buffer))) + (not (projectile-ignored-buffer-p buffer)) + default-directory + (string-equal (file-remote-p default-directory) + (file-remote-p project-root)) + (not (string-match-p "^http\\(s\\)?://" default-directory)) + (string-prefix-p project-root (file-truename default-directory) (eq system-type 'windows-nt))))) + +(defun projectile-ignored-buffer-p (buffer) + "Check if BUFFER should be ignored. + +Regular expressions can be use." + (or + (with-current-buffer buffer + (cl-some + (lambda (name) + (string-match-p name (buffer-name))) + projectile-globally-ignored-buffers)) + (with-current-buffer buffer + (cl-some + (lambda (mode) + (string-match-p (concat "^" mode "$") + (symbol-name major-mode))) + projectile-globally-ignored-modes)))) + +(defun projectile-recently-active-files () + "Get list of recently active files. + +Files are ordered by recently active buffers, and then recently +opened through use of recentf." + (let ((project-buffer-files (projectile-project-buffer-files))) + (append project-buffer-files + (projectile-difference + (projectile-recentf-files) + project-buffer-files)))) + +(defun projectile-project-buffer-names () + "Get a list of project buffer names." + (mapcar #'buffer-name (projectile-project-buffers))) + +(defun projectile-prepend-project-name (string) + "Prepend the current project's name to STRING." + (format "[%s] %s" (projectile-project-name) string)) + +(defun projectile-read-buffer-to-switch (prompt) + "Read the name of a buffer to switch to, prompting with PROMPT. + +This function excludes the current buffer from the offered +choices." + (projectile-completing-read + prompt + (delete (buffer-name (current-buffer)) + (projectile-project-buffer-names)))) + +;;;###autoload +(defun projectile-switch-to-buffer () + "Switch to a project buffer." + (interactive) + (switch-to-buffer + (projectile-read-buffer-to-switch "Switch to buffer: "))) + +;;;###autoload +(defun projectile-switch-to-buffer-other-window () + "Switch to a project buffer and show it in another window." + (interactive) + (switch-to-buffer-other-window + (projectile-read-buffer-to-switch "Switch to buffer: "))) + +;;;###autoload +(defun projectile-switch-to-buffer-other-frame () + "Switch to a project buffer and show it in another frame." + (interactive) + (switch-to-buffer-other-frame + (projectile-read-buffer-to-switch "Switch to buffer: "))) + +;;;###autoload +(defun projectile-display-buffer () + "Display a project buffer in another window without selecting it." + (interactive) + (display-buffer + (projectile-completing-read + "Display buffer: " + (projectile-project-buffer-names)))) + +;;;###autoload +(defun projectile-project-buffers-other-buffer () + "Switch to the most recently selected buffer project buffer. +Only buffers not visible in windows are returned." + (interactive) + (switch-to-buffer (car (projectile-project-buffers-non-visible))) nil t) + +(defun projectile-project-buffers-non-visible () + "Get a list of non visible project buffers." + (cl-remove-if-not + (lambda (buffer) + (not (get-buffer-window buffer 'visible))) + (projectile-project-buffers))) + +;;;###autoload +(defun projectile-multi-occur (&optional nlines) + "Do a `multi-occur' in the project's buffers. +With a prefix argument, show NLINES of context." + (interactive "P") + (let ((project (projectile-acquire-root))) + (multi-occur (projectile-project-buffers project) + (car (occur-read-primary-args)) + nlines))) + +(defun projectile-normalise-paths (patterns) + "Remove leading `/' from the elements of PATTERNS." + (delq nil (mapcar (lambda (pat) (and (string-prefix-p "/" pat) + ;; remove the leading / + (substring pat 1))) + patterns))) + +(defun projectile-expand-paths (paths) + "Expand the elements of PATHS. + +Elements containing wildcards are expanded and spliced into the +resulting paths. The returned PATHS are absolute, based on the +projectile project root." + (let ((default-directory (projectile-project-root))) + (projectile-flatten (mapcar + (lambda (pattern) + (or (file-expand-wildcards pattern t) + (projectile-expand-root pattern))) + paths)))) + +(defun projectile-normalise-patterns (patterns) + "Remove paths from PATTERNS." + (cl-remove-if (lambda (pat) (string-prefix-p "/" pat)) patterns)) + +(defun projectile-make-relative-to-root (files) + "Make FILES relative to the project root." + (let ((project-root (projectile-project-root))) + (mapcar (lambda (f) (file-relative-name f project-root)) files))) + +(defun projectile-ignored-directory-p + (directory &optional ignored-directories local-directory globally-ignored-directories) + "Check if DIRECTORY should be ignored. + +Regular expressions can be used. Pre-computed lists of +IGNORED-DIRECTORIES and GLOBALLY-IGNORED-DIRECTORIES +and the LOCAL-DIRECTORY name may optionally be provided." + (let ((ignored-directories (or ignored-directories (projectile-ignored-directories))) + (globally-ignored-directories (or globally-ignored-directories (projectile-globally-ignored-directory-names))) + (local-directory (or local-directory (file-name-nondirectory (directory-file-name directory))))) + (or (cl-some + (lambda (name) + (string-match-p name directory)) + ignored-directories) + (cl-some + (lambda (name) + (string-match-p name local-directory)) + globally-ignored-directories)))) + +(defun projectile-ignored-file-p (file &optional ignored-files) + "Check if FILE should be ignored. + +Regular expressions can be used. A pre-computed list of +IGNORED-FILES may optionally be provided." + (cl-some + (lambda (name) + (string-match-p name file)) + (or ignored-files (projectile-ignored-files)))) + +(defun projectile-check-pattern-p (file pattern) + "Check if FILE meets PATTERN." + (or (string-suffix-p (directory-file-name pattern) + (directory-file-name file)) + (member file (file-expand-wildcards pattern t)))) + +(defun projectile-ignored-rel-p (file directory patterns) + "Check if FILE should be ignored relative to DIRECTORY +according to PATTERNS: (ignored . unignored)" + (let ((default-directory directory)) + (and (cl-some + (lambda (pat) (projectile-check-pattern-p file pat)) + (car patterns)) + (cl-notany + (lambda (pat) (projectile-check-pattern-p file pat)) + (cdr patterns))))) + +(defun projectile-ignored-files () + "Return list of ignored files." + (projectile-difference + (mapcar + #'projectile-expand-root + (append + projectile-globally-ignored-files + (projectile-project-ignored-files))) + (projectile-unignored-files))) + +(defun projectile-globally-ignored-directory-names () + "Return list of ignored directory names." + (projectile-difference + projectile-globally-ignored-directories + projectile-globally-unignored-directories)) + +(defun projectile-ignored-directories () + "Return list of ignored directories." + (projectile-difference + (mapcar + #'file-name-as-directory + (mapcar + #'projectile-expand-root + (append + projectile-globally-ignored-directories + (projectile-project-ignored-directories)))) + (projectile-unignored-directories))) + +(defun projectile-ignored-directories-rel () + "Return list of ignored directories, relative to the root." + (projectile-make-relative-to-root (projectile-ignored-directories))) + +(defun projectile-ignored-files-rel () + "Return list of ignored files, relative to the root." + (projectile-make-relative-to-root (projectile-ignored-files))) + +(defun projectile-project-ignored-files () + "Return list of project ignored files. +Unignored files are not included." + (cl-remove-if 'file-directory-p (projectile-project-ignored))) + +(defun projectile-project-ignored-directories () + "Return list of project ignored directories. +Unignored directories are not included." + (cl-remove-if-not 'file-directory-p (projectile-project-ignored))) + +(defun projectile-paths-to-ignore () + "Return a list of ignored project paths." + (projectile-normalise-paths (nth 1 (projectile-parse-dirconfig-file)))) + +(defun projectile-patterns-to-ignore () + "Return a list of relative file patterns." + (projectile-normalise-patterns (nth 1 (projectile-parse-dirconfig-file)))) + +(defun projectile-project-ignored () + "Return list of project ignored files/directories. +Unignored files/directories are not included." + (let ((paths (projectile-paths-to-ignore))) + (projectile-expand-paths paths))) + +(defun projectile-unignored-files () + "Return list of unignored files." + (mapcar + #'projectile-expand-root + (append + projectile-globally-unignored-files + (projectile-project-unignored-files)))) + +(defun projectile-unignored-directories () + "Return list of unignored directories." + (mapcar + #'file-name-as-directory + (mapcar + #'projectile-expand-root + (append + projectile-globally-unignored-directories + (projectile-project-unignored-directories))))) + +(defun projectile-unignored-directories-rel () + "Return list of unignored directories, relative to the root." + (projectile-make-relative-to-root (projectile-unignored-directories))) + +(defun projectile-unignored-files-rel () + "Return list of unignored files, relative to the root." + (projectile-make-relative-to-root (projectile-unignored-files))) + +(defun projectile-project-unignored-files () + "Return list of project unignored files." + (cl-remove-if 'file-directory-p (projectile-project-unignored))) + +(defun projectile-project-unignored-directories () + "Return list of project unignored directories." + (cl-remove-if-not 'file-directory-p (projectile-project-unignored))) + +(defun projectile-paths-to-ensure () + "Return a list of unignored project paths." + (projectile-normalise-paths (nth 2 (projectile-parse-dirconfig-file)))) + +(defun projectile-files-to-ensure () + (projectile-flatten (mapcar (lambda (pat) (file-expand-wildcards pat t)) + (projectile-patterns-to-ensure)))) + +(defun projectile-patterns-to-ensure () + "Return a list of relative file patterns." + (projectile-normalise-patterns (nth 2 (projectile-parse-dirconfig-file)))) + +(defun projectile-filtering-patterns () + (cons (projectile-patterns-to-ignore) + (projectile-patterns-to-ensure))) + +(defun projectile-project-unignored () + "Return list of project ignored files/directories." + (delete-dups (append (projectile-expand-paths (projectile-paths-to-ensure)) + (projectile-expand-paths (projectile-files-to-ensure))))) + + +(defun projectile-dirconfig-file () + "Return the absolute path to the project's dirconfig file." + (expand-file-name ".projectile" (projectile-project-root))) + +(defun projectile-parse-dirconfig-file () + "Parse project ignore file and return directories to ignore and keep. + +The return value will be a list of three elements, the car being +the list of directories to keep, the cadr being the list of files +or directories to ignore, and the caddr being the list of files +or directories to ensure. + +Strings starting with + will be added to the list of directories +to keep, and strings starting with - will be added to the list of +directories to ignore. For backward compatibility, without a +prefix the string will be assumed to be an ignore string." + (let (keep ignore ensure (dirconfig (projectile-dirconfig-file))) + (when (projectile-file-exists-p dirconfig) + (with-temp-buffer + (insert-file-contents dirconfig) + (while (not (eobp)) + (pcase (char-after) + ;; ignore comment lines if prefix char has been set + ((pred (lambda (leading-char) + (and projectile-dirconfig-comment-prefix + (eql leading-char + projectile-dirconfig-comment-prefix)))) + nil) + (?+ (push (buffer-substring (1+ (point)) (line-end-position)) keep)) + (?- (push (buffer-substring (1+ (point)) (line-end-position)) ignore)) + (?! (push (buffer-substring (1+ (point)) (line-end-position)) ensure)) + (_ (push (buffer-substring (point) (line-end-position)) ignore))) + (forward-line))) + (list (mapcar (lambda (f) (file-name-as-directory (string-trim f))) + (delete "" (reverse keep))) + (mapcar #'string-trim + (delete "" (reverse ignore))) + (mapcar #'string-trim + (delete "" (reverse ensure))))))) + +(defun projectile-expand-root (name) + "Expand NAME to project root. + +Never use on many files since it's going to recalculate the +project-root for every file." + (expand-file-name name (projectile-project-root))) + +(cl-defun projectile-completing-read (prompt choices &key initial-input action) + "Present a project tailored PROMPT with CHOICES." + (let ((prompt (projectile-prepend-project-name prompt)) + res) + (setq res + (pcase (if (eq projectile-completion-system 'auto) + (cond + ((bound-and-true-p ido-mode) 'ido) + ((bound-and-true-p helm-mode) 'helm) + ((bound-and-true-p ivy-mode) 'ivy) + (t 'default)) + projectile-completion-system) + ('default (completing-read prompt choices nil nil initial-input)) + ('ido (ido-completing-read prompt choices nil nil initial-input)) + ('helm + (if (and (fboundp 'helm) + (fboundp 'helm-make-source)) + (helm :sources + (helm-make-source "Projectile" 'helm-source-sync + :candidates choices + :action (if action + (prog1 action + (setq action nil)) + #'identity)) + :prompt prompt + :input initial-input + :buffer "*helm-projectile*") + (user-error "Please install helm"))) + ('ivy + (if (fboundp 'ivy-read) + (ivy-read prompt choices + :initial-input initial-input + :action (prog1 action + (setq action nil)) + :caller 'projectile-completing-read) + (user-error "Please install ivy"))) + (_ (funcall projectile-completion-system prompt choices)))) + (if action + (funcall action res) + res))) + +(defun projectile-project-files (project-root) + "Return a list of files for the PROJECT-ROOT." + (let (files) + ;; If the cache is too stale, don't use it. + (when projectile-files-cache-expire + (let ((cache-time + (gethash project-root projectile-projects-cache-time))) + (when (or (null cache-time) + (< (+ cache-time projectile-files-cache-expire) + (projectile-time-seconds))) + (remhash project-root projectile-projects-cache) + (remhash project-root projectile-projects-cache-time)))) + + ;; Use the cache, if requested and available. + (when projectile-enable-caching + (setq files (gethash project-root projectile-projects-cache))) + + ;; Calculate the list of files. + (when (null files) + (when projectile-enable-caching + (message "Projectile is initializing cache for %s ..." project-root)) + (setq files + (if (eq projectile-indexing-method 'alien) + ;; In alien mode we can just skip reading + ;; .projectile and find all files in the root dir. + (projectile-dir-files-alien project-root) + ;; If a project is defined as a list of subfolders + ;; then we'll have the files returned for each subfolder, + ;; so they are relative to the project root. + ;; + ;; TODO: That's pretty slow and we need to improve it. + ;; One options would be to pass explicitly the subdirs + ;; to commands like `git ls-files` which would return + ;; files paths relative to the project root. + (cl-mapcan + (lambda (dir) + (mapcar (lambda (f) + (file-relative-name (concat dir f) + project-root)) + (projectile-dir-files dir))) + (projectile-get-project-directories project-root)))) + + ;; Save the cached list. + (when projectile-enable-caching + (projectile-cache-project project-root files))) + + ;;; Sorting + ;; + ;; Files can't be cached in sorted order as some sorting schemes + ;; require dynamic data. Sorting is ignored completely when in + ;; alien mode. + (if (eq projectile-indexing-method 'alien) + files + (projectile-sort-files files)))) + +(defun projectile-current-project-files () + "Return a list of the files in the current project." + (projectile-project-files (projectile-acquire-root))) + +(defun projectile-process-current-project-files (action) + "Process the current project's files using ACTION." + (let ((project-files (projectile-current-project-files)) + (default-directory (projectile-project-root))) + (dolist (filename project-files) + (funcall action filename)))) + +(defun projectile-project-dirs (project) + "Return a list of dirs for PROJECT." + (delete-dups + (delq nil + (mapcar #'file-name-directory + (projectile-project-files project))))) + +(defun projectile-current-project-dirs () + "Return a list of dirs for the current project." + (projectile-project-dirs (projectile-acquire-root))) + +(defun projectile-get-other-files (file-name &optional flex-matching) + "Return a list of other files for FILE-NAME. +The list depends on `:related-files-fn' project option and +`projectile-other-file-alist'. For the latter, FLEX-MATCHING can be used +to match any basename." + (if-let ((plist (projectile--related-files-plist-by-kind file-name :other))) + (projectile--related-files-from-plist plist) + (projectile--other-extension-files file-name + (projectile-current-project-files) + flex-matching))) + +(defun projectile--find-other-file (&optional flex-matching ff-variant) + "Switch between files with the same name but different extensions. +With FLEX-MATCHING, match any file that contains the base name of current file. +Other file extensions can be customized with the variable +`projectile-other-file-alist'. With FF-VARIANT set to a defun, use that +instead of `find-file'. A typical example of such a defun would be +`find-file-other-window' or `find-file-other-frame'" + (let ((ff (or ff-variant #'find-file)) + (other-files (projectile-get-other-files (buffer-file-name) flex-matching))) + (if other-files + (let ((file-name (projectile--choose-from-candidates other-files))) + (funcall ff (expand-file-name file-name + (projectile-project-root)))) + (error "No other file found")))) + + +;;; Interactive commands +;;;###autoload +(defun projectile-find-other-file (&optional flex-matching) + "Switch between files with the same name but different extensions. +With FLEX-MATCHING, match any file that contains the base name of current file. +Other file extensions can be customized with the variable `projectile-other-file-alist'." + (interactive "P") + (projectile--find-other-file flex-matching)) + +;;;###autoload +(defun projectile-find-other-file-other-window (&optional flex-matching) + "Switch between files with the same name but different extensions in other window. +With FLEX-MATCHING, match any file that contains the base name of current file. +Other file extensions can be customized with the variable `projectile-other-file-alist'." + (interactive "P") + (projectile--find-other-file flex-matching + #'find-file-other-window)) + +;;;###autoload +(defun projectile-find-other-file-other-frame (&optional flex-matching) + "Switch between files with the same name but different extensions in other frame. +With FLEX-MATCHING, match any file that contains the base name of current file. +Other file extensions can be customized with the variable `projectile-other-file-alist'." + (interactive "P") + (projectile--find-other-file flex-matching + #'find-file-other-frame)) + +(defun projectile--file-name-sans-extensions (file-name) + "Return FILE-NAME sans any extensions. +The extensions, in a filename, are what follows the first '.', with the exception of a leading '.'" + (setq file-name (file-name-nondirectory file-name)) + (substring file-name 0 (string-match "\\..*" file-name 1))) + +(defun projectile--file-name-extensions (file-name) + "Return FILE-NAME's extensions. +The extensions, in a filename, are what follows the first '.', with the exception of a leading '.'" + ;;would it make sense to return nil instead of an empty string if no extensions are found? + (setq file-name (file-name-nondirectory file-name)) + (let (extensions-start) + (substring file-name + (if (setq extensions-start (string-match "\\..*" file-name 1)) + (1+ extensions-start) + (length file-name))))) + +(defun projectile-associated-file-name-extensions (file-name) + "Return projectile-other-file-extensions associated to FILE-NAME's extensions. +If no associated other-file-extensions for the complete (nested) extension are found, remove subextensions from FILENAME's extensions until a match is found." + (let ((current-extensions (projectile--file-name-extensions (file-name-nondirectory file-name))) + associated-extensions) + (catch 'break + (while (not (string= "" current-extensions)) + (if (setq associated-extensions (cdr (assoc current-extensions projectile-other-file-alist))) + (throw 'break associated-extensions)) + (setq current-extensions (projectile--file-name-extensions current-extensions)))))) + +(defun projectile--other-extension-files (current-file project-file-list &optional flex-matching) + "Narrow to files with the same names but different extensions. +Returns a list of possible files for users to choose. + +With FLEX-MATCHING, match any file that contains the base name of current file" + (let* ((file-ext-list (projectile-associated-file-name-extensions current-file)) + (fulldirname (if (file-name-directory current-file) + (file-name-directory current-file) "./")) + (dirname (file-name-nondirectory (directory-file-name fulldirname))) + (filename (regexp-quote (projectile--file-name-sans-extensions current-file))) + (file-list (mapcar (lambda (ext) + (if flex-matching + (concat ".*" filename ".*" "\." ext "\\'") + (concat "^" filename + (unless (equal ext "") + (concat "\." ext)) + "\\'"))) + file-ext-list)) + (candidates (cl-remove-if-not + (lambda (project-file) + (string-match filename project-file)) + project-file-list)) + (candidates + (projectile-flatten (mapcar + (lambda (file) + (cl-remove-if-not + (lambda (project-file) + (string-match file + (concat (file-name-base project-file) + (unless (equal (file-name-extension project-file) nil) + (concat "\." (file-name-extension project-file)))))) + candidates)) + file-list))) + (candidates + (cl-remove-if-not (lambda (file) (not (backup-file-name-p file))) candidates)) + (candidates + (cl-sort (copy-sequence candidates) + (lambda (file _) + (let ((candidate-dirname (file-name-nondirectory (directory-file-name (file-name-directory file))))) + (unless (equal fulldirname (file-name-directory file)) + (equal dirname candidate-dirname))))))) + candidates)) + +(defun projectile-select-files (project-files &optional invalidate-cache) + "Select a list of files based on filename at point. + +With a prefix arg INVALIDATE-CACHE invalidates the cache first." + (projectile-maybe-invalidate-cache invalidate-cache) + (let* ((file (if (region-active-p) + (buffer-substring (region-beginning) (region-end)) + (or (thing-at-point 'filename) ""))) + (file (if (string-match "\\.?\\./" file) + (file-relative-name (file-truename file) (projectile-project-root)) + file)) + (files (if file + (cl-remove-if-not + (lambda (project-file) + (string-match file project-file)) + project-files) + nil))) + files)) + +(defun projectile--find-file-dwim (invalidate-cache &optional ff-variant) + "Jump to a project's files using completion based on context. + +With a INVALIDATE-CACHE invalidates the cache first. + +With FF-VARIANT set to a defun, use that instead of `find-file'. +A typical example of such a defun would be `find-file-other-window' or +`find-file-other-frame' + +Subroutine for `projectile-find-file-dwim' and +`projectile-find-file-dwim-other-window'" + (let* ((project-root (projectile-acquire-root)) + (project-files (projectile-project-files project-root)) + (files (projectile-select-files project-files invalidate-cache)) + (file (cond ((= (length files) 1) + (car files)) + ((> (length files) 1) + (projectile-completing-read "Switch to: " files)) + (t + (projectile-completing-read "Switch to: " project-files)))) + (ff (or ff-variant #'find-file))) + (funcall ff (expand-file-name file project-root)) + (run-hooks 'projectile-find-file-hook))) + +;;;###autoload +(defun projectile-find-file-dwim (&optional invalidate-cache) + "Jump to a project's files using completion based on context. + +With a prefix arg INVALIDATE-CACHE invalidates the cache first. + +If point is on a filename, Projectile first tries to search for that +file in project: + +- If it finds just a file, it switches to that file instantly. This works even +if the filename is incomplete, but there's only a single file in the current project +that matches the filename at point. For example, if there's only a single file named +\"projectile/projectile.el\" but the current filename is \"projectile/proj\" (incomplete), +`projectile-find-file-dwim' still switches to \"projectile/projectile.el\" immediately + because this is the only filename that matches. + +- If it finds a list of files, the list is displayed for selecting. A list of +files is displayed when a filename appears more than one in the project or the +filename at point is a prefix of more than two files in a project. For example, +if `projectile-find-file-dwim' is executed on a filepath like \"projectile/\", it lists +the content of that directory. If it is executed on a partial filename like + \"projectile/a\", a list of files with character 'a' in that directory is presented. + +- If it finds nothing, display a list of all files in project for selecting." + (interactive "P") + (projectile--find-file-dwim invalidate-cache)) + +;;;###autoload +(defun projectile-find-file-dwim-other-window (&optional invalidate-cache) + "Jump to a project's files using completion based on context in other window. + +With a prefix arg INVALIDATE-CACHE invalidates the cache first. + +If point is on a filename, Projectile first tries to search for that +file in project: + +- If it finds just a file, it switches to that file instantly. This works even +if the filename is incomplete, but there's only a single file in the current project +that matches the filename at point. For example, if there's only a single file named +\"projectile/projectile.el\" but the current filename is \"projectile/proj\" (incomplete), +`projectile-find-file-dwim-other-window' still switches to \"projectile/projectile.el\" +immediately because this is the only filename that matches. + +- If it finds a list of files, the list is displayed for selecting. A list of +files is displayed when a filename appears more than one in the project or the +filename at point is a prefix of more than two files in a project. For example, +if `projectile-find-file-dwim-other-window' is executed on a filepath like \"projectile/\", it lists +the content of that directory. If it is executed on a partial filename +like \"projectile/a\", a list of files with character 'a' in that directory +is presented. + +- If it finds nothing, display a list of all files in project for selecting." + (interactive "P") + (projectile--find-file-dwim invalidate-cache #'find-file-other-window)) + +;;;###autoload +(defun projectile-find-file-dwim-other-frame (&optional invalidate-cache) + "Jump to a project's files using completion based on context in other frame. + +With a prefix arg INVALIDATE-CACHE invalidates the cache first. + +If point is on a filename, Projectile first tries to search for that +file in project: + +- If it finds just a file, it switches to that file instantly. This works even +if the filename is incomplete, but there's only a single file in the current project +that matches the filename at point. For example, if there's only a single file named +\"projectile/projectile.el\" but the current filename is \"projectile/proj\" (incomplete), +`projectile-find-file-dwim-other-frame' still switches to \"projectile/projectile.el\" +immediately because this is the only filename that matches. + +- If it finds a list of files, the list is displayed for selecting. A list of +files is displayed when a filename appears more than one in the project or the +filename at point is a prefix of more than two files in a project. For example, +if `projectile-find-file-dwim-other-frame' is executed on a filepath like \"projectile/\", it lists +the content of that directory. If it is executed on a partial filename +like \"projectile/a\", a list of files with character 'a' in that directory +is presented. + +- If it finds nothing, display a list of all files in project for selecting." + (interactive "P") + (projectile--find-file-dwim invalidate-cache #'find-file-other-frame)) + +(defun projectile--find-file (invalidate-cache &optional ff-variant) + "Jump to a project's file using completion. +With INVALIDATE-CACHE invalidates the cache first. With FF-VARIANT set to a +defun, use that instead of `find-file'. A typical example of such a defun +would be `find-file-other-window' or `find-file-other-frame'" + (interactive "P") + (projectile-maybe-invalidate-cache invalidate-cache) + (let* ((project-root (projectile-acquire-root)) + (file (projectile-completing-read "Find file: " + (projectile-project-files project-root))) + (ff (or ff-variant #'find-file))) + (when file + (funcall ff (expand-file-name file project-root)) + (run-hooks 'projectile-find-file-hook)))) + +;;;###autoload +(defun projectile-find-file (&optional invalidate-cache) + "Jump to a project's file using completion. +With a prefix arg INVALIDATE-CACHE invalidates the cache first." + (interactive "P") + (projectile--find-file invalidate-cache)) + +;;;###autoload +(defun projectile-find-file-other-window (&optional invalidate-cache) + "Jump to a project's file using completion and show it in another window. + +With a prefix arg INVALIDATE-CACHE invalidates the cache first." + (interactive "P") + (projectile--find-file invalidate-cache #'find-file-other-window)) + +;;;###autoload +(defun projectile-find-file-other-frame (&optional invalidate-cache) + "Jump to a project's file using completion and show it in another frame. + +With a prefix arg INVALIDATE-CACHE invalidates the cache first." + (interactive "P") + (projectile--find-file invalidate-cache #'find-file-other-frame)) + +;;;###autoload +(defun projectile-toggle-project-read-only () + "Toggle project read only." + (interactive) + (let ((inhibit-read-only t) + (val (not buffer-read-only)) + (default-directory (projectile-acquire-root))) + (add-dir-local-variable nil 'buffer-read-only val) + (save-buffer) + (kill-buffer) + (when buffer-file-name + (read-only-mode (if val +1 -1)) + (message "[%s] read-only-mode is %s" (projectile-project-name) (if val "on" "off"))))) + + +;;;; Sorting project files +(defun projectile-sort-files (files) + "Sort FILES according to `projectile-sort-order'." + (cl-case projectile-sort-order + (default files) + (recentf (projectile-sort-by-recentf-first files)) + (recently-active (projectile-sort-by-recently-active-first files)) + (modification-time (projectile-sort-by-modification-time files)) + (access-time (projectile-sort-by-access-time files)))) + +(defun projectile-sort-by-recentf-first (files) + "Sort FILES by a recent first scheme." + (let ((project-recentf-files (projectile-recentf-files))) + (append project-recentf-files + (projectile-difference files project-recentf-files)))) + +(defun projectile-sort-by-recently-active-first (files) + "Sort FILES by most recently active buffers or opened files." + (let ((project-recently-active-files (projectile-recently-active-files))) + (append project-recently-active-files + (projectile-difference files project-recently-active-files)))) + +(defun projectile-sort-by-modification-time (files) + "Sort FILES by modification time." + (let ((default-directory (projectile-project-root))) + (cl-sort + (copy-sequence files) + (lambda (file1 file2) + (let ((file1-mtime (nth 5 (file-attributes file1))) + (file2-mtime (nth 5 (file-attributes file2)))) + (not (time-less-p file1-mtime file2-mtime))))))) + +(defun projectile-sort-by-access-time (files) + "Sort FILES by access time." + (let ((default-directory (projectile-project-root))) + (cl-sort + (copy-sequence files) + (lambda (file1 file2) + (let ((file1-atime (nth 4 (file-attributes file1))) + (file2-atime (nth 4 (file-attributes file2)))) + (not (time-less-p file1-atime file2-atime))))))) + + +;;;; Find directory in project functionality +(defun projectile--find-dir (invalidate-cache &optional dired-variant) + "Jump to a project's directory using completion. + +With INVALIDATE-CACHE invalidates the cache first. With DIRED-VARIANT set to a +defun, use that instead of `dired'. A typical example of such a defun would be +`dired-other-window' or `dired-other-frame'" + (projectile-maybe-invalidate-cache invalidate-cache) + (let* ((project (projectile-acquire-root)) + (dir (projectile-complete-dir project)) + (dired-v (or dired-variant #'dired))) + (funcall dired-v (expand-file-name dir project)) + (run-hooks 'projectile-find-dir-hook))) + +;;;###autoload +(defun projectile-find-dir (&optional invalidate-cache) + "Jump to a project's directory using completion. + +With a prefix arg INVALIDATE-CACHE invalidates the cache first." + (interactive "P") + (projectile--find-dir invalidate-cache)) + +;;;###autoload +(defun projectile-find-dir-other-window (&optional invalidate-cache) + "Jump to a project's directory in other window using completion. + +With a prefix arg INVALIDATE-CACHE invalidates the cache first." + (interactive "P") + (projectile--find-dir invalidate-cache #'dired-other-window)) + +;;;###autoload +(defun projectile-find-dir-other-frame (&optional invalidate-cache) + "Jump to a project's directory in other frame using completion. + +With a prefix arg INVALIDATE-CACHE invalidates the cache first." + (interactive "P") + (projectile--find-dir invalidate-cache #'dired-other-frame)) + +(defun projectile-complete-dir (project) + (let ((project-dirs (projectile-project-dirs project))) + (projectile-completing-read + "Find dir: " + (if projectile-find-dir-includes-top-level + (append '("./") project-dirs) + project-dirs)))) + +;;;###autoload +(defun projectile-find-test-file (&optional invalidate-cache) + "Jump to a project's test file using completion. + +With a prefix arg INVALIDATE-CACHE invalidates the cache first." + (interactive "P") + (projectile-maybe-invalidate-cache invalidate-cache) + (let ((file (projectile-completing-read "Find test file: " + (projectile-current-project-test-files)))) + (find-file (expand-file-name file (projectile-project-root))))) + +(defun projectile-test-files (files) + "Return only the test FILES." + (cl-remove-if-not 'projectile-test-file-p files)) + +(defun projectile--merge-related-files-fns (related-files-fns) + "Merge multiple RELATED-FILES-FNS into one function." + (lambda (path) + (let (merged-plist) + (dolist (fn related-files-fns merged-plist) + (let ((plist (funcall fn path))) + (cl-loop for (key value) on plist by #'cddr + do (let ((values (if (consp value) value (list value)))) + (if (plist-member merged-plist key) + (nconc (plist-get merged-plist key) values) + (setq merged-plist (plist-put merged-plist key values)))))))))) + +(defun projectile--related-files-plist (project-root file) + "Return a plist containing all related files information for FILE in PROJECT-ROOT." + (if-let ((rel-path (if (file-name-absolute-p file) + (file-relative-name file project-root) + file)) + (custom-function (funcall projectile-related-files-fn-function (projectile-project-type)))) + (funcall (cond ((functionp custom-function) + custom-function) + ((consp custom-function) + (projectile--merge-related-files-fns custom-function)) + (t + (error "Unsupported value type of :related-files-fn"))) + rel-path))) + +(defun projectile--related-files-plist-by-kind (file kind) + "Return a plist containing :paths and/or :predicate of KIND for FILE." + (if-let ((project-root (projectile-project-root)) + (plist (projectile--related-files-plist project-root file)) + (has-kind? (plist-member plist kind))) + (let* ((kind-value (plist-get plist kind)) + (values (if (cl-typep kind-value '(or string function)) + (list kind-value) + kind-value)) + (paths (delete-dups (cl-remove-if-not 'stringp values))) + (predicates (delete-dups (cl-remove-if-not 'functionp values)))) + (append + ;; Make sure that :paths exists even with nil if there is no predicates + (when (or paths (null predicates)) + (list :paths (cl-remove-if-not + (lambda (f) + (projectile-file-exists-p (expand-file-name f project-root))) + paths))) + (when predicates + (list :predicate (if (= 1 (length predicates)) + (car predicates) + (lambda (other-file) + (cl-some (lambda (predicate) + (funcall predicate other-file)) + predicates))))))))) + +(defun projectile--related-files-from-plist (plist) + "Return a list of files matching to PLIST from current project files." + (let* ((predicate (plist-get plist :predicate)) + (paths (plist-get plist :paths))) + (delete-dups (append + paths + (when predicate + (cl-remove-if-not predicate (projectile-current-project-files))))))) + +(defun projectile--related-files-kinds(file) + "Return a list o keywords meaning available related kinds for FILE." + (if-let ((project-root (projectile-project-root)) + (plist (projectile--related-files-plist project-root file))) + (cl-loop for key in plist by #'cddr + collect key))) + +(defun projectile--related-files (file kind) + "Return a list of related files of KIND for FILE." + (projectile--related-files-from-plist (projectile--related-files-plist-by-kind file kind))) + +(defun projectile--find-related-file (file &optional kind) + "Choose a file from files related to FILE as KIND. +If KIND is not provided, a list of possible kinds can be chosen." + (unless kind + (if-let ((available-kinds (projectile--related-files-kinds file))) + (setq kind (if (= (length available-kinds) 1) + (car available-kinds) + (intern (projectile-completing-read "Kind :" available-kinds)))) + (error "No related files found"))) + + (if-let ((candidates (projectile--related-files file kind))) + (projectile-expand-root (projectile--choose-from-candidates candidates)) + (error + "No matching related file as `%s' found for project type `%s'" + kind (projectile-project-type)))) + +;;;###autoload +(defun projectile-find-related-file-other-window () + "Open related file in other window." + (interactive) + (find-file-other-window + (projectile--find-related-file (buffer-file-name)))) + +;;;###autoload +(defun projectile-find-related-file-other-frame () + "Open related file in other frame." + (interactive) + (find-file-other-frame + (projectile--find-related-file (buffer-file-name)))) + +;;;###autoload +(defun projectile-find-related-file() + "Open related file." + (interactive) + (find-file + (projectile--find-related-file (buffer-file-name)))) + +;;;###autoload +(defun projectile-related-files-fn-groups(kind groups) + "Generate a related-files-fn which relates as KIND for files in each of GROUPS." + (lambda (path) + (if-let ((group-found (cl-find-if (lambda (group) + (member path group)) + groups))) + (list kind (cl-remove path group-found :test 'equal))))) + +;;;###autoload +(defun projectile-related-files-fn-extensions(kind extensions) + "Generate a related-files-fn which relates as KIND for files having EXTENSIONS." + (lambda (path) + (let* ((ext (file-name-extension path)) + (basename (file-name-base path)) + (basename-regexp (regexp-quote basename))) + (when (member ext extensions) + (list kind (lambda (other-path) + (and (string-match-p basename-regexp other-path) + (equal basename (file-name-base other-path)) + (let ((other-ext (file-name-extension other-path))) + (and (member other-ext extensions) + (not (equal other-ext ext))))))))))) + +;;;###autoload +(defun projectile-related-files-fn-test-with-prefix(extension test-prefix) + "Generate a related-files-fn which relates tests and impl for files with EXTENSION based on TEST-PREFIX." + (lambda (path) + (when (equal (file-name-extension path) extension) + (let* ((file-name (file-name-nondirectory path)) + (find-impl? (string-prefix-p test-prefix file-name)) + (file-name-to-find (if find-impl? + (substring file-name (length test-prefix)) + (concat test-prefix file-name)))) + (list (if find-impl? :impl :test) + (lambda (other-path) + (and (string-suffix-p file-name-to-find other-path) + (equal (file-name-nondirectory other-path) file-name-to-find)))))))) + +;;;###autoload +(defun projectile-related-files-fn-test-with-suffix(extension test-suffix) + "Generate a related-files-fn which relates tests and impl for files with EXTENSION based on TEST-SUFFIX." + (lambda (path) + (when (equal (file-name-extension path) extension) + (let* ((file-name (file-name-nondirectory path)) + (dot-ext (concat "." extension)) + (suffix-ext (concat test-suffix dot-ext)) + (find-impl? (string-suffix-p suffix-ext file-name)) + (file-name-to-find (if find-impl? + (concat (substring file-name 0 (- (length suffix-ext))) + dot-ext) + (concat (substring file-name 0 (- (length dot-ext))) + suffix-ext)))) + (list (if find-impl? :impl :test) + (lambda (other-path) + (and (string-suffix-p file-name-to-find other-path) + (equal (file-name-nondirectory other-path) file-name-to-find)))))))) + +(defun projectile-test-file-p (file) + "Check if FILE is a test file." + (let ((kinds (projectile--related-files-kinds file))) + (cond ((member :impl kinds) t) + ((member :test kinds) nil) + (t (or (cl-some (lambda (pat) (string-prefix-p pat (file-name-nondirectory file))) + (delq nil (list (funcall projectile-test-prefix-function (projectile-project-type))))) + (cl-some (lambda (pat) (string-suffix-p pat (file-name-sans-extension (file-name-nondirectory file)))) + (delq nil (list (funcall projectile-test-suffix-function (projectile-project-type)))))))))) + +(defun projectile-current-project-test-files () + "Return a list of test files for the current project." + (projectile-test-files (projectile-current-project-files))) + +(defvar projectile-project-types nil + "An alist holding all project types that are known to Projectile. +The project types are symbols and they are linked to plists holding +the properties of the various project types.") + +(defun projectile--combine-plists (&rest plists) + "Create a single property list from all plists in PLISTS. +The process starts by copying the first list, and then setting properties +from the other lists. Settings in the last list are the most significant +ones and overrule settings in the other lists. nil values are ignored in +all but the first plist." + (let ((rtn (copy-sequence (pop plists))) + p v ls) + (while plists + (setq ls (pop plists)) + (while ls + (setq p (pop ls) v (pop ls)) + (when v + (setq rtn (plist-put rtn p v))))) + rtn)) + +(cl-defun projectile--build-project-plist + (marker-files &key project-file compilation-dir configure compile install package test run test-suffix test-prefix src-dir test-dir related-files-fn) + "Return a project type plist with the provided arguments. + +A project type is defined by PROJECT-TYPE, a set of MARKER-FILES, +and optional keyword arguments: +PROJECT-FILE the main project file in the root project directory. +COMPILATION-DIR the directory to run the tests- and compilations in, +CONFIGURE which specifies a command that configures the project + `%s' in the command will be substituted with (projectile-project-root) + before the command is run, +COMPILE which specifies a command that builds the project, +INSTALL which specifies a command to install the project. +PACKAGE which specifies a command to package the project. +TEST which specified a command that tests the project, +RUN which specifies a command that runs the project, +TEST-SUFFIX which specifies test file suffix, and +TEST-PREFIX which specifies test file prefix. +SRC-DIR which specifies the path to the source relative to the project root. +TEST-DIR which specifies the path to the tests relative to the project root. +RELATED-FILES-FN which specifies a custom function to find the related files such as +test/impl/other files as below: + CUSTOM-FUNCTION accepts FILE as relative path from the project root and returns + a plist containing :test, :impl or :other as key and the relative path/paths or + predicate as value. PREDICATE accepts a relative path as the input." + (let ((project-plist (list 'marker-files marker-files + 'project-file project-file + 'compilation-dir compilation-dir + 'configure-command configure + 'compile-command compile + 'test-command test + 'install-command install + 'package-command package + 'run-command run))) + ;; There is no way for the function to distinguish between an + ;; explicit argument of nil and an omitted argument. However, the + ;; body of the function is free to consider nil an abbreviation + ;; for some other meaningful value + (when (and project-file (not (member project-file projectile-project-root-files))) + (add-to-list 'projectile-project-root-files project-file)) + (when test-suffix + (plist-put project-plist 'test-suffix test-suffix)) + (when test-prefix + (plist-put project-plist 'test-prefix test-prefix)) + (when src-dir + (plist-put project-plist 'src-dir src-dir)) + (when test-dir + (plist-put project-plist 'test-dir test-dir)) + (when related-files-fn + (plist-put project-plist 'related-files-fn related-files-fn)) + project-plist)) + +(cl-defun projectile-register-project-type + (project-type marker-files &key project-file compilation-dir configure compile install package test run test-suffix test-prefix src-dir test-dir related-files-fn) + "Register a project type with projectile. + +A project type is defined by PROJECT-TYPE, a set of MARKER-FILES, +and optional keyword arguments: +PROJECT-FILE the main project file in the root project directory. +COMPILATION-DIR the directory to run the tests- and compilations in, +CONFIGURE which specifies a command that configures the project + `%s' in the command will be substituted with (projectile-project-root) + before the command is run, +COMPILE which specifies a command that builds the project, +INSTALL which specifies a command to install the project. +PACKAGE which specifies a command to package the project. +TEST which specified a command that tests the project, +RUN which specifies a command that runs the project, +TEST-SUFFIX which specifies test file suffix, and +TEST-PREFIX which specifies test file prefix. +SRC-DIR which specifies the path to the source relative to the project root. +TEST-DIR which specifies the path to the tests relative to the project root. +RELATED-FILES-FN which specifies a custom function to find the related files such as +test/impl/other files as below: + CUSTOM-FUNCTION accepts FILE as relative path from the project root and returns + a plist containing :test, :impl or :other as key and the relative path/paths or + predicate as value. PREDICATE accepts a relative path as the input." + (setq projectile-project-types + (cons `(,project-type . + ,(projectile--build-project-plist + marker-files + :project-file project-file + :compilation-dir compilation-dir + :configure configure + :compile compile + :install install + :package package + :test test + :run run + :test-suffix test-suffix + :test-prefix test-prefix + :src-dir src-dir + :test-dir test-dir + :related-files-fn related-files-fn)) + projectile-project-types))) + +(cl-defun projectile-update-project-type + (project-type &key marker-files project-file compilation-dir configure compile install package test run test-suffix test-prefix src-dir test-dir related-files-fn) + "Update an existing projectile project type. + +Non-nil passed items will override existing values for the project type given +by PROJECT-TYPE. Raise an error if PROJECT-TYPE is not already registered +with projectile. The arguments to this function are as for +projectile-register-project-type: + +A project type is defined by PROJECT-TYPE, a set of MARKER-FILES, +and optional keyword arguments: +MARKER-FILES a set of indicator files for PROJECT-TYPE. +PROJECT-FILE the main project file in the root project directory. +COMPILATION-DIR the directory to run the tests- and compilations in, +CONFIGURE which specifies a command that configures the project + `%s' in the command will be substituted with (projectile-project-root) + before the command is run, +COMPILE which specifies a command that builds the project, +INSTALL which specifies a command to install the project. +PACKAGE which specifies a command to package the project. +TEST which specified a command that tests the project, +RUN which specifies a command that runs the project, +TEST-SUFFIX which specifies test file suffix, and +TEST-PREFIX which specifies test file prefix. +SRC-DIR which specifies the path to the source relative to the project root. +TEST-DIR which specifies the path to the tests relative to the project root. +RELATED-FILES-FN which specifies a custom function to find the related files such as +test/impl/other files as below: + CUSTOM-FUNCTION accepts FILE as relative path from the project root and returns + a plist containing :test, :impl or :other as key and the relative path/paths or + predicate as value. PREDICATE accepts a relative path as the input." + (if-let ((existing-project-plist + (cl-find-if + (lambda (p) (eq project-type (car p))) projectile-project-types)) + (new-plist + (projectile--build-project-plist + marker-files + :project-file project-file + :compilation-dir compilation-dir + :configure configure + :compile compile + :install install + :package package + :test test + :run run + :test-suffix test-suffix + :test-prefix test-prefix + :src-dir src-dir + :test-dir test-dir + :related-files-fn related-files-fn)) + (merged-plist + (projectile--combine-plists + (cdr existing-project-plist) new-plist)) + (project-type-elt (cons project-type merged-plist))) + (setq projectile-project-types + (mapcar (lambda (p) (if (eq project-type (car p)) + project-type-elt + p)) + projectile-project-types)) + (error "No existing project found for: %s" project-type))) + +(defun projectile-cabal-project-p () + "Check if a project contains *.cabal files but no stack.yaml file." + (and (projectile-verify-file-wildcard "?*.cabal") + (not (projectile-verify-file "stack.yaml")))) + +(defun projectile-dotnet-project-p () + "Check if a project contains a .NET project marker." + (or (projectile-verify-file-wildcard "?*.csproj") + (projectile-verify-file-wildcard "?*.fsproj"))) + +(defun projectile-go-project-p () + "Check if a project contains Go source files." + (or (projectile-verify-file "go.mod") + (projectile-verify-file-wildcard "*.go"))) + +(defcustom projectile-go-project-test-function #'projectile-go-project-p + "Function to determine if project's type is go." + :group 'projectile + :type 'function + :package-version '(projectile . "1.0.0")) + +;;;; Constant signifying opting out of CMake preset commands. +(defconst projectile--cmake-no-preset "*no preset*") + +(defun projectile--cmake-version () + "Compute CMake version." + (let* ((string (shell-command-to-string "cmake --version")) + (match (string-match "^cmake version \\(.*\\)$" string))) + (when match + (version-to-list (match-string 1 string))))) + +(defun projectile--cmake-check-version (version) + "Check if CMake version is at least VERSION." + (and + (version-list-<= version (projectile--cmake-version)))) + +(defconst projectile--cmake-command-presets-minimum-version-alist + '((:configure-command . (3 19)) + (:compile-command . (3 20)) + (:test-command . (3 20)))) + +(defun projectile--cmake-command-presets-supported (command-type) + "Check if CMake supports presets for COMMAND-TYPE." + (let ((minimum-version + (cdr (assoc command-type projectile--cmake-command-presets-minimum-version-alist)))) + (projectile--cmake-check-version minimum-version))) + +(defun projectile--cmake-read-preset (filename) + "Read CMake preset from FILENAME." + (when (file-exists-p filename) + (with-temp-buffer + (insert-file-contents filename) + (when (functionp 'json-parse-buffer) + (json-parse-buffer :array-type 'list))))) + +(defconst projectile--cmake-command-preset-array-id-alist + '((:configure-command . "configurePresets") + (:compile-command . "buildPresets") + (:test-command . "testPresets"))) + +(defun projectile--cmake-command-preset-array-id (command-type) + "Map from COMMAND-TYPE to id of command preset array in CMake preset." + (cdr (assoc command-type projectile--cmake-command-preset-array-id-alist))) + +(defun projectile--cmake-command-presets (filename command-type) + "Get CMake COMMAND-TYPE presets from FILENAME." + (when-let ((preset (projectile--cmake-read-preset (projectile-expand-root filename)))) + (cl-remove-if + (lambda (preset) (equal (gethash "hidden" preset) t)) + (gethash (projectile--cmake-command-preset-array-id command-type) preset)))) + +(defun projectile--cmake-all-command-presets (command-type) + "Get CMake user and system COMMAND-TYPE presets." + (projectile-flatten + (mapcar (lambda (filename) (projectile--cmake-command-presets filename command-type)) + '("CMakeUserPresets.json" "CMakePresets.json")))) + +(defun projectile--cmake-command-preset-names (command-type) + "Get names of CMake user and system COMMAND-TYPE presets." + (mapcar (lambda (preset) + (gethash "name" preset)) + (projectile--cmake-all-command-presets command-type))) + +(defcustom projectile-enable-cmake-presets nil + "Enables configuration with CMake presets. + +When `projectile-enable-cmake-presets' is non-nil, CMake projects can +be configured, built and tested using presets." + :group 'projectile + :type 'boolean + :package-version '(projectile . "2.4.0")) + +(defun projectile--cmake-use-command-presets (command-type) + "Test whether or not to use command presets for COMMAND-TYPE. + +Presets are used if `projectile-enable-cmake-presets' is non-nil, and CMake +supports presets for COMMAND-TYPE, and `json-parse-buffer' is available." + (and projectile-enable-cmake-presets + (projectile--cmake-command-presets-supported command-type) + (functionp 'json-parse-buffer))) + +(defun projectile--cmake-select-command (command-type) + "Select a CMake command preset or a manual CMake command. + +The selection is done like this: + +- If `projectile--cmake-use-commands-presets' for COMMAND-TYPE returns true, and +there is at least one preset available for COMMAND-TYPE, the user is prompted to +select a name of a command preset, or opt a manual command by selecting +`projectile--cmake-no-preset'. + +- Else `projectile--cmake-no-preset' is used." + (if-let ((use-presets (projectile--cmake-use-command-presets command-type)) + (preset-names (projectile--cmake-command-preset-names command-type))) + (projectile-completing-read + "Use preset: " + (append preset-names `(,projectile--cmake-no-preset))) + projectile--cmake-no-preset)) + +(defconst projectile--cmake-manual-command-alist + '((:configure-command . "cmake -S . -B build") + (:compile-command . "cmake --build build") + (:test-command . "cmake --build build --target test"))) + +(defun projectile--cmake-manual-command (command-type) + "Create maunual CMake COMMAND-TYPE command." + (cdr (assoc command-type projectile--cmake-manual-command-alist))) + +(defconst projectile--cmake-preset-command-alist + '((:configure-command . "cmake . --preset %s") + (:compile-command . "cmake --build --preset %s") + (:test-command . "ctest --preset %s"))) + +(defun projectile--cmake-preset-command (command-type preset) + "Create CMake COMMAND-TYPE command using PRESET." + (format (cdr (assoc command-type projectile--cmake-preset-command-alist)) preset)) + +(defun projectile--cmake-command (command-type) + "Create a CMake COMMAND-TYPE command. + +The command is created like this: + +- If `projectile--cmake-select-command' returns `projectile--cmake-no-preset' +a manual COMMAND-TYPE command is created with +`projectile--cmake-manual-command'. + +- Else a preset COMMAND-TYPE command using the selected preset is created with +`projectile--cmake-preset-command'." + (let ((maybe-preset (projectile--cmake-select-command command-type))) + (if (equal maybe-preset projectile--cmake-no-preset) + (projectile--cmake-manual-command command-type) + (projectile--cmake-preset-command command-type maybe-preset)))) + +(defun projectile--cmake-configure-command () + "CMake configure command." + (projectile--cmake-command :configure-command)) + +(defun projectile--cmake-compile-command () + "CMake compile command." + (projectile--cmake-command :compile-command)) + +(defun projectile--cmake-test-command () + "CMake test command." + (projectile--cmake-command :test-command)) + +;;; Project type registration +;; +;; Project type detection happens in a reverse order with respect to +;; project type registration (invocations of `projectile-register-project-type'). +;; +;; As function-based project type detection is pretty slow, so it +;; should be tried at the end if everything else failed (meaning here +;; it should be listed first). +;; +;; Ideally common project types should be checked earlier than exotic ones. + +;; Function-based detection project type +(projectile-register-project-type 'haskell-cabal #'projectile-cabal-project-p + :compile "cabal build" + :test "cabal test" + :run "cabal run" + :test-suffix "Spec") +(projectile-register-project-type 'dotnet #'projectile-dotnet-project-p + :compile "dotnet build" + :run "dotnet run" + :test "dotnet test") +(projectile-register-project-type 'go projectile-go-project-test-function + :compile "go build" + :test "go test ./..." + :test-suffix "_test") +;; File-based detection project types + +;; Universal +(projectile-register-project-type 'scons '("SConstruct") + :project-file "SConstruct" + :compile "scons" + :test "scons test" + :test-suffix "test") +(projectile-register-project-type 'meson '("meson.build") + :project-file "meson.build" + :compilation-dir "build" + :configure "meson %s" + :compile "ninja" + :test "ninja test") +(projectile-register-project-type 'nix '("default.nix") + :project-file "default.nix" + :compile "nix-build" + :test "nix-build") +(projectile-register-project-type 'bazel '("WORKSPACE") + :project-file "WORKSPACE" + :compile "bazel build" + :test "bazel test" + :run "bazel run") +(projectile-register-project-type 'debian '("debian/control") + :project-file "debian/control" + :compile "debuild -uc -us") + +;; Make & CMake +(projectile-register-project-type 'make '("Makefile") + :project-file "Makefile" + :compile "make" + :test "make test" + :install "make install") +(projectile-register-project-type 'cmake '("CMakeLists.txt") + :project-file "CMakeLists.txt" + :configure #'projectile--cmake-configure-command + :compile #'projectile--cmake-compile-command + :test #'projectile--cmake-test-command + :install "cmake --build build --target install" + :package "cmake --build build --target package") +;; PHP +(projectile-register-project-type 'php-symfony '("composer.json" "app" "src" "vendor") + :project-file "composer.json" + :compile "app/console server:run" + :test "phpunit -c app " + :test-suffix "Test") +;; Erlang & Elixir +(projectile-register-project-type 'rebar '("rebar.config") + :project-file "rebar.config" + :compile "rebar3 compile" + :test "rebar3 do eunit,ct" + :test-suffix "_SUITE") +(projectile-register-project-type 'elixir '("mix.exs") + :project-file "mix.exs" + :compile "mix compile" + :src-dir "lib/" + :test "mix test" + :test-suffix "_test") +;; JavaScript +(projectile-register-project-type 'grunt '("Gruntfile.js") + :project-file "Gruntfile.js" + :compile "grunt" + :test "grunt test") +(projectile-register-project-type 'gulp '("gulpfile.js") + :project-file "gulpfile.js" + :compile "gulp" + :test "gulp test") +(projectile-register-project-type 'npm '("package.json") + :project-file "package.json" + :compile "npm install" + :test "npm test" + :test-suffix ".test") +;; Angular +(projectile-register-project-type 'angular '("angular.json" ".angular-cli.json") + :project-file "angular.json" + :compile "ng build" + :run "ng serve" + :test "ng test" + :test-suffix ".spec") +;; Python +(projectile-register-project-type 'django '("manage.py") + :project-file "manage.py" + :compile "python manage.py runserver" + :test "python manage.py test" + :test-prefix "test_" + :test-suffix"_test") +(projectile-register-project-type 'python-pip '("requirements.txt") + :project-file "requirements.txt" + :compile "python setup.py build" + :test "python -m unittest discover" + :test-prefix "test_" + :test-suffix"_test") +(projectile-register-project-type 'python-pkg '("setup.py") + :project-file "setup.py" + :compile "python setup.py build" + :test "python -m unittest discover" + :test-prefix "test_" + :test-suffix"_test") +(projectile-register-project-type 'python-tox '("tox.ini") + :project-file "tox.ini" + :compile "tox -r --notest" + :test "tox" + :test-prefix "test_" + :test-suffix"_test") +(projectile-register-project-type 'python-pipenv '("Pipfile") + :project-file "Pipfile" + :compile "pipenv run build" + :test "pipenv run test" + :test-prefix "test_" + :test-suffix "_test") +(projectile-register-project-type 'python-poetry '("poetry.lock") + :project-file "poetry.lock" + :compile "poetry build" + :test "poetry run python -m unittest discover" + :test-prefix "test_" + :test-suffix "_test") +;; Java & friends +(projectile-register-project-type 'maven '("pom.xml") + :project-file "pom.xml" + :compile "mvn -B clean install" + :test "mvn -B test" + :test-suffix "Test" + :src-dir "main/src/" + :test-dir "main/test/") +(projectile-register-project-type 'gradle '("build.gradle") + :project-file "build.gradle" + :compile "gradle build" + :test "gradle test" + :test-suffix "Spec") +(projectile-register-project-type 'gradlew '("gradlew") + :project-file "gradlew" + :compile "./gradlew build" + :test "./gradlew test" + :test-suffix "Spec") +(projectile-register-project-type 'grails '("application.properties" "grails-app") + :project-file "application.properties" + :compile "grails package" + :test "grails test-app" + :test-suffix "Spec") +;; Scala +(projectile-register-project-type 'sbt '("build.sbt") + :project-file "build.sbt" + :compile "sbt compile" + :test "sbt test" + :test-suffix "Spec") + +(projectile-register-project-type 'mill '("build.sc") + :project-file "build.sc" + :compile "mill all __.compile" + :test "mill all __.test" + :test-suffix "Test") + +;; Clojure +(projectile-register-project-type 'lein-test '("project.clj") + :project-file "project.clj" + :compile "lein compile" + :test "lein test" + :test-suffix "_test") +(projectile-register-project-type 'lein-midje '("project.clj" ".midje.clj") + :project-file "project.clj" + :compile "lein compile" + :test "lein midje" + :test-prefix "t_") +(projectile-register-project-type 'boot-clj '("build.boot") + :project-file "build.boot" + :compile "boot aot" + :test "boot test" + :test-suffix "_test") +(projectile-register-project-type 'clojure-cli '("deps.edn") + :project-file "deps.edn" + :test-suffix "_test") +(projectile-register-project-type 'bloop '(".bloop") + :project-file ".bloop" + :compile "bloop compile root" + :test "bloop test --propagate --reporter scalac root" + :src-dir "src/main/" + :test-dir "src/test/" + :test-suffix "Spec") +;; Ruby +(projectile-register-project-type 'ruby-rspec '("Gemfile" "lib" "spec") + :project-file "Gemfile" + :compile "bundle exec rake" + :src-dir "lib/" + :test "bundle exec rspec" + :test-dir "spec/" + :test-suffix "_spec") +(projectile-register-project-type 'ruby-test '("Gemfile" "lib" "test") + :project-file "Gemfile" + :compile"bundle exec rake" + :src-dir "lib/" + :test "bundle exec rake test" + :test-suffix "_test") +;; Rails needs to be registered after npm, otherwise `package.json` makes it `npm`. +;; https://github.com/bbatsov/projectile/pull/1191 +(projectile-register-project-type 'rails-test '("Gemfile" "app" "lib" "db" "config" "test") + :project-file "Gemfile" + :compile "bundle exec rails server" + :src-dir "lib/" + :test "bundle exec rake test" + :test-suffix "_test") +(projectile-register-project-type 'rails-rspec '("Gemfile" "app" "lib" "db" "config" "spec") + :project-file "Gemfile" + :compile "bundle exec rails server" + :src-dir "lib/" + :test "bundle exec rspec" + :test-dir "spec/" + :test-suffix "_spec") +;; Crystal +(projectile-register-project-type 'crystal-spec '("shard.yml") + :project-file "shard.yml" + :src-dir "src/" + :test "crystal spec" + :test-dir "spec/" + :test-suffix "_spec") + +;; Emacs +(projectile-register-project-type 'emacs-cask '("Cask") + :project-file "Cask" + :compile "cask install" + :test-prefix "test-" + :test-suffix "-test") +(projectile-register-project-type 'emacs-eldev (lambda () (or (projectile-verify-file "Eldev") + (projectile-verify-file "Eldev-local"))) + :project-file "Eldev" + :compile "eldev compile" + :test "eldev test" + :run "eldev emacs" + :package "eldev package") + +;; R +(projectile-register-project-type 'r '("DESCRIPTION") + :project-file "DESCRIPTION" + :compile "R CMD INSTALL --with-keep.source ." + :test (concat "R CMD check -o " temporary-file-directory " .")) + +;; Haskell +(projectile-register-project-type 'haskell-stack '("stack.yaml") + :project-file "stack.yaml" + :compile "stack build" + :test "stack build --test" + :test-suffix "Spec") + +;; Rust +(projectile-register-project-type 'rust-cargo '("Cargo.toml") + :project-file "Cargo.toml" + :compile "cargo build" + :test "cargo test" + :run "cargo run") + +;; Racket +(projectile-register-project-type 'racket '("info.rkt") + :project-file "info.rkt" + :test "raco test ." + :install "raco pkg install" + :package "raco pkg create --source $(pwd)") + +;; Dart +(projectile-register-project-type 'dart '("pubspec.yaml") + :project-file "pubspec.yaml" + :compile "pub get" + :test "pub run test" + :run "dart" + :test-suffix "_test.dart") + +;; OCaml +(projectile-register-project-type 'ocaml-dune '("dune-project") + :project-file "dune-project" + :compile "dune build" + :test "dune runtest") + +(defvar-local projectile-project-type nil + "Buffer local var for overriding the auto-detected project type. +Normally you'd set this from .dir-locals.el.") +(put 'projectile-project-type 'safe-local-variable #'symbolp) + +(defun projectile-detect-project-type () + "Detect the type of the current project. +Fallsback to a generic project type when the type can't be determined." + (let ((project-type + (or (car (cl-find-if + (lambda (project-type-record) + (let ((project-type (car project-type-record)) + (marker (plist-get (cdr project-type-record) 'marker-files))) + (if (functionp marker) + (and (funcall marker) project-type) + (and (projectile-verify-files marker) project-type)))) + projectile-project-types)) + 'generic))) + (puthash (projectile-project-root) project-type projectile-project-type-cache) + project-type)) + +(defun projectile-project-type (&optional dir) + "Determine a project's type based on its structure. +When DIR is specified it checks it, otherwise it acts +on the current project. + +The project type is cached for improved performance." + (if projectile-project-type + projectile-project-type + (let* ((dir (or dir default-directory)) + (project-root (projectile-project-root dir))) + (if project-root + (or (gethash project-root projectile-project-type-cache) + (projectile-detect-project-type)) + ;; if we're not in a project we just return nil + nil)))) + +;;;###autoload +(defun projectile-project-info () + "Display info for current project." + (interactive) + (message "Project dir: %s ## Project VCS: %s ## Project type: %s" + (projectile-acquire-root) + (projectile-project-vcs) + (projectile-project-type))) + +(defun projectile-verify-files (files) + "Check whether all FILES exist in the current project." + (cl-every #'projectile-verify-file files)) + +(defun projectile-verify-file (file) + "Check whether FILE exists in the current project." + (file-exists-p (projectile-expand-root file))) + +(defun projectile-verify-file-wildcard (file) + "Check whether FILE exists in the current project. +Expands wildcards using `file-expand-wildcards' before checking." + (file-expand-wildcards (projectile-expand-root file))) + +(defun projectile-project-vcs (&optional project-root) + "Determine the VCS used by the project if any. +PROJECT-ROOT is the targeted directory. If nil, use +`projectile-project-root'." + (or project-root (setq project-root (projectile-acquire-root))) + (cond + ;; first we check for a VCS marker in the project root itself + ((projectile-file-exists-p (expand-file-name ".git" project-root)) 'git) + ((projectile-file-exists-p (expand-file-name ".hg" project-root)) 'hg) + ((projectile-file-exists-p (expand-file-name ".fslckout" project-root)) 'fossil) + ((projectile-file-exists-p (expand-file-name "_FOSSIL_" project-root)) 'fossil) + ((projectile-file-exists-p (expand-file-name ".bzr" project-root)) 'bzr) + ((projectile-file-exists-p (expand-file-name "_darcs" project-root)) 'darcs) + ((projectile-file-exists-p (expand-file-name ".svn" project-root)) 'svn) + ;; then we check if there's a VCS marker up the directory tree + ;; that covers the case when a project is part of a multi-project repository + ;; in those cases you can still the VCS to get a list of files for + ;; the project in question + ((projectile-locate-dominating-file project-root ".git") 'git) + ((projectile-locate-dominating-file project-root ".hg") 'hg) + ((projectile-locate-dominating-file project-root ".fslckout") 'fossil) + ((projectile-locate-dominating-file project-root "_FOSSIL_") 'fossil) + ((projectile-locate-dominating-file project-root ".bzr") 'bzr) + ((projectile-locate-dominating-file project-root "_darcs") 'darcs) + ((projectile-locate-dominating-file project-root ".svn") 'svn) + (t 'none))) + +(defun projectile--test-name-for-impl-name (impl-file-path) + "Determine the name of the test file for IMPL-FILE-PATH." + (let* ((project-type (projectile-project-type)) + (impl-file-name (file-name-sans-extension (file-name-nondirectory impl-file-path))) + (impl-file-ext (file-name-extension impl-file-path)) + (test-prefix (funcall projectile-test-prefix-function project-type)) + (test-suffix (funcall projectile-test-suffix-function project-type))) + (cond + (test-prefix (concat test-prefix impl-file-name "." impl-file-ext)) + (test-suffix (concat impl-file-name test-suffix "." impl-file-ext)) + (t (error "Project type `%s' not supported!" project-type))))) + +(defun projectile-create-test-file-for (impl-file-path) + "Create a test file for IMPL-FILE-PATH." + (let* ((test-file (projectile--test-name-for-impl-name impl-file-path)) + (project-root (projectile-project-root)) + (relative-dir (file-name-directory (file-relative-name impl-file-path project-root))) + (src-dir-name (projectile-src-directory (projectile-project-type))) + (test-dir-name (projectile-test-directory (projectile-project-type))) + (test-dir (expand-file-name (replace-regexp-in-string src-dir-name test-dir-name relative-dir) project-root)) + (test-path (expand-file-name test-file test-dir))) + (unless (file-exists-p test-path) + (progn (unless (file-exists-p test-dir) + (make-directory test-dir :create-parents)) + test-path)))) + +(defun projectile-find-implementation-or-test (file-name) + "Given a FILE-NAME return the matching implementation or test filename. + +If `projectile-create-missing-test-files' is non-nil, create the missing +test file." + (unless file-name (error "The current buffer is not visiting a file")) + (if (projectile-test-file-p file-name) + ;; find the matching impl file + (let ((impl-file (projectile-find-matching-file file-name))) + (if impl-file + (projectile-expand-root impl-file) + (error + "No matching source file found for project type `%s'" + (projectile-project-type)))) + ;; find the matching test file + (let ((test-file (projectile-find-matching-test file-name))) + (if test-file + (projectile-expand-root test-file) + (if projectile-create-missing-test-files + (projectile-create-test-file-for file-name) + (error "No matching test file found for project type `%s'" + (projectile-project-type))))))) + +;;;###autoload +(defun projectile-find-implementation-or-test-other-window () + "Open matching implementation or test file in other window." + (interactive) + (find-file-other-window + (projectile-find-implementation-or-test (buffer-file-name)))) + +;;;###autoload +(defun projectile-find-implementation-or-test-other-frame () + "Open matching implementation or test file in other frame." + (interactive) + (find-file-other-frame + (projectile-find-implementation-or-test (buffer-file-name)))) + +;;;###autoload +(defun projectile-toggle-between-implementation-and-test () + "Toggle between an implementation file and its test file." + (interactive) + (find-file + (projectile-find-implementation-or-test (buffer-file-name)))) + + +(defun projectile-project-type-attribute (project-type key &optional default-value) + "Return the value of some PROJECT-TYPE attribute identified by KEY. +Fallback to DEFAULT-VALUE for missing attributes." + (let ((project (alist-get project-type projectile-project-types))) + (if (and project (plist-member project key)) + (plist-get project key) + default-value))) + +(defun projectile-test-prefix (project-type) + "Find default test files prefix based on PROJECT-TYPE." + (projectile-project-type-attribute project-type 'test-prefix)) + +(defun projectile-test-suffix (project-type) + "Find default test files suffix based on PROJECT-TYPE." + (projectile-project-type-attribute project-type 'test-suffix)) + +(defun projectile-related-files-fn (project-type) + "Find relative file based on PROJECT-TYPE." + (projectile-project-type-attribute project-type 'related-files-fn)) + +(defun projectile-src-directory (project-type) + "Find default src directory based on PROJECT-TYPE." + (projectile-project-type-attribute project-type 'src-dir "src/")) + +(defun projectile-test-directory (project-type) + "Find default test directory based on PROJECT-TYPE." + (projectile-project-type-attribute project-type 'test-dir "test/")) + +(defun projectile-dirname-matching-count (a b) + "Count matching dirnames ascending file paths in A and B." + (setq a (reverse (split-string (or (file-name-directory a) "") "/" t)) + b (reverse (split-string (or (file-name-directory b) "") "/" t))) + (let ((common 0)) + (while (and a b (string-equal (pop a) (pop b))) + (setq common (1+ common))) + common)) + +(defun projectile-group-file-candidates (file candidates) + "Group file candidates by dirname matching count." + (cl-sort (copy-sequence + (let (value result) + (while (setq value (pop candidates)) + (let* ((key (projectile-dirname-matching-count file value)) + (kv (assoc key result))) + (if kv + (setcdr kv (cons value (cdr kv))) + (push (list key value) result)))) + (mapcar (lambda (x) + (cons (car x) (nreverse (cdr x)))) + (nreverse result)))) + (lambda (a b) (> (car a) (car b))))) + +(defun projectile--best-or-all-candidates-based-on-parents-dirs (file candidates) + "Return a list containing the best one one for FILE from CANDIDATES or all CANDIDATES." + (let ((grouped-candidates (projectile-group-file-candidates file candidates))) + (if (= (length (car grouped-candidates)) 2) + (list (car (last (car grouped-candidates)))) + (apply #'append (mapcar #'cdr grouped-candidates))))) + +(defun projectile--impl-to-test-predicate (impl-file) + "Return a predicate, which returns t for any test files for IMPL-FILE." + (let* ((basename (file-name-sans-extension (file-name-nondirectory impl-file))) + (test-prefix (funcall projectile-test-prefix-function (projectile-project-type))) + (test-suffix (funcall projectile-test-suffix-function (projectile-project-type))) + (prefix-name (when test-prefix (concat test-prefix basename))) + (suffix-name (when test-suffix (concat basename test-suffix)))) + (lambda (current-file) + (let ((name (file-name-sans-extension (file-name-nondirectory current-file)))) + (or (string-equal prefix-name name) + (string-equal suffix-name name)))))) + +(defun projectile--find-matching-test (impl-file) + "Return a list of test files for IMPL-FILE." + (if-let ((plist (projectile--related-files-plist-by-kind impl-file :test))) + (projectile--related-files-from-plist plist) + (if-let ((predicate (projectile--impl-to-test-predicate impl-file))) + (projectile--best-or-all-candidates-based-on-parents-dirs + impl-file (cl-remove-if-not predicate (projectile-current-project-files)))))) + +(defun projectile--test-to-impl-predicate (test-file) + "Return a predicate, which returns t for any impl files for TEST-FILE." + (let* ((basename (file-name-sans-extension (file-name-nondirectory test-file))) + (test-prefix (funcall projectile-test-prefix-function (projectile-project-type))) + (test-suffix (funcall projectile-test-suffix-function (projectile-project-type)))) + (lambda (current-file) + (let ((name (file-name-nondirectory (file-name-sans-extension current-file)))) + (or (when test-prefix (string-equal (concat test-prefix name) basename)) + (when test-suffix (string-equal (concat name test-suffix) basename))))))) + +(defun projectile--find-matching-file (test-file) + "Return a list of impl files tested by TEST-FILE." + (if-let ((plist (projectile--related-files-plist-by-kind test-file :impl))) + (projectile--related-files-from-plist plist) + (if-let ((predicate (projectile--test-to-impl-predicate test-file))) + (projectile--best-or-all-candidates-based-on-parents-dirs + test-file (cl-remove-if-not predicate (projectile-current-project-files)))))) + +(defun projectile--choose-from-candidates (candidates) + "Choose one item from CANDIDATES." + (if (= (length candidates) 1) + (car candidates) + (projectile-completing-read "Switch to: " candidates))) + +(defun projectile-find-matching-test (impl-file) + "Compute the name of the test matching IMPL-FILE." + (if-let ((candidates (projectile--find-matching-test impl-file))) + (projectile--choose-from-candidates candidates))) + +(defun projectile-find-matching-file (test-file) + "Compute the name of a file matching TEST-FILE." + (if-let ((candidates (projectile--find-matching-file test-file))) + (projectile--choose-from-candidates candidates))) + +(defun projectile-grep-default-files () + "Try to find a default pattern for `projectile-grep'. +This is a subset of `grep-read-files', where either a matching entry from +`grep-files-aliases' or file name extension pattern is returned." + (when buffer-file-name + (let* ((fn (file-name-nondirectory buffer-file-name)) + (default-alias + (let ((aliases (remove (assoc "all" grep-files-aliases) + grep-files-aliases)) + alias) + (while aliases + (setq alias (car aliases) + aliases (cdr aliases)) + (if (string-match (mapconcat + #'wildcard-to-regexp + (split-string (cdr alias) nil t) + "\\|") + fn) + (setq aliases nil) + (setq alias nil))) + (cdr alias))) + (default-extension + (let ((ext (file-name-extension fn))) + (and ext (concat "*." ext))))) + (or default-alias default-extension)))) + +(defun projectile--globally-ignored-file-suffixes-glob () + "Return ignored file suffixes as a list of glob patterns." + (mapcar (lambda (pat) (concat "*" pat)) projectile-globally-ignored-file-suffixes)) + +(defun projectile--read-search-string-with-default (prefix-label) + (let* ((prefix-label (projectile-prepend-project-name prefix-label)) + (default-value (projectile-symbol-or-selection-at-point)) + (default-label (if (or (not default-value) + (string= default-value "")) + "" + (format " (default %s)" default-value)))) + (read-string (format "%s%s: " prefix-label default-label) nil nil default-value))) + +(defvar projectile-grep-find-ignored-paths) +(defvar projectile-grep-find-unignored-paths) +(defvar projectile-grep-find-ignored-patterns) +(defvar projectile-grep-find-unignored-patterns) + +(defun projectile-rgrep-default-command (regexp files dir) + "Compute the command for \\[rgrep] to use by default. + +Extension of the Emacs 25.1 implementation of `rgrep-default-command', with +which it shares its arglist." + (require 'find-dired) ; for `find-name-arg' + (grep-expand-template + grep-find-template + regexp + (concat (shell-quote-argument "(") + " " find-name-arg " " + (mapconcat + #'shell-quote-argument + (split-string files) + (concat " -o " find-name-arg " ")) + " " + (shell-quote-argument ")")) + dir + (concat + (and grep-find-ignored-directories + (concat "-type d " + (shell-quote-argument "(") + ;; we should use shell-quote-argument here + " -path " + (mapconcat + #'identity + (delq nil (mapcar + #'(lambda (ignore) + (cond ((stringp ignore) + (shell-quote-argument + (concat "*/" ignore))) + ((consp ignore) + (and (funcall (car ignore) dir) + (shell-quote-argument + (concat "*/" + (cdr ignore))))))) + grep-find-ignored-directories)) + " -o -path ") + " " + (shell-quote-argument ")") + " -prune -o ")) + (and grep-find-ignored-files + (concat (shell-quote-argument "!") " -type d " + (shell-quote-argument "(") + ;; we should use shell-quote-argument here + " -name " + (mapconcat + #'(lambda (ignore) + (cond ((stringp ignore) + (shell-quote-argument ignore)) + ((consp ignore) + (and (funcall (car ignore) dir) + (shell-quote-argument + (cdr ignore)))))) + grep-find-ignored-files + " -o -name ") + " " + (shell-quote-argument ")") + " -prune -o ")) + (and projectile-grep-find-ignored-paths + (concat (shell-quote-argument "(") + " -path " + (mapconcat + (lambda (ignore) (shell-quote-argument + (concat "./" ignore))) + projectile-grep-find-ignored-paths + " -o -path ") + " " + (shell-quote-argument ")") + " -prune -o ")) + (and projectile-grep-find-ignored-patterns + (concat (shell-quote-argument "(") + (and (or projectile-grep-find-unignored-paths + projectile-grep-find-unignored-patterns) + (concat " " + (shell-quote-argument "("))) + " -path " + (mapconcat + (lambda (ignore) + (shell-quote-argument + (if (string-prefix-p "*" ignore) ignore + (concat "*/" ignore)))) + projectile-grep-find-ignored-patterns + " -o -path ") + (and (or projectile-grep-find-unignored-paths + projectile-grep-find-unignored-patterns) + (concat " " + (shell-quote-argument ")") + " -a " + (shell-quote-argument "!") + " " + (shell-quote-argument "(") + (and projectile-grep-find-unignored-paths + (concat " -path " + (mapconcat + (lambda (ignore) (shell-quote-argument + (concat "./" ignore))) + projectile-grep-find-unignored-paths + " -o -path "))) + (and projectile-grep-find-unignored-paths + projectile-grep-find-unignored-patterns + " -o") + (and projectile-grep-find-unignored-patterns + (concat " -path " + (mapconcat + (lambda (ignore) + (shell-quote-argument + (if (string-prefix-p "*" ignore) ignore + (concat "*/" ignore)))) + projectile-grep-find-unignored-patterns + " -o -path "))) + " " + (shell-quote-argument ")"))) + " " + (shell-quote-argument ")") + " -prune -o "))))) + +;;;###autoload +(defun projectile-grep (&optional regexp arg) + "Perform rgrep in the project. + +With a prefix ARG asks for files (globbing-aware) which to grep in. +With prefix ARG of `-' (such as `M--'), default the files (without prompt), +to `projectile-grep-default-files'. + +With REGEXP given, don't query the user for a regexp." + (interactive "i\nP") + (require 'grep) ;; for `rgrep' + (let* ((roots (projectile-get-project-directories (projectile-acquire-root))) + (search-regexp (or regexp + (projectile--read-search-string-with-default "Grep for"))) + (files (and arg (or (and (equal current-prefix-arg '-) + (projectile-grep-default-files)) + (read-string (projectile-prepend-project-name "Grep in: ") + (projectile-grep-default-files)))))) + (dolist (root-dir roots) + (require 'vc-git) ;; for `vc-git-grep' + ;; in git projects users have the option to use `vc-git-grep' instead of `rgrep' + (if (and (eq (projectile-project-vcs) 'git) + projectile-use-git-grep + (fboundp 'vc-git-grep)) + (vc-git-grep search-regexp (or files "") root-dir) + ;; paths for find-grep should relative and without trailing / + (let ((grep-find-ignored-files + (cl-union (projectile--globally-ignored-file-suffixes-glob) + grep-find-ignored-files)) + (projectile-grep-find-ignored-paths + (append (mapcar (lambda (f) (directory-file-name (file-relative-name f root-dir))) + (projectile-ignored-directories)) + (mapcar (lambda (file) + (file-relative-name file root-dir)) + (projectile-ignored-files)))) + (projectile-grep-find-unignored-paths + (append (mapcar (lambda (f) (directory-file-name (file-relative-name f root-dir))) + (projectile-unignored-directories)) + (mapcar (lambda (file) + (file-relative-name file root-dir)) + (projectile-unignored-files)))) + (projectile-grep-find-ignored-patterns (projectile-patterns-to-ignore)) + (projectile-grep-find-unignored-patterns (projectile-patterns-to-ensure))) + (grep-compute-defaults) + (cl-letf (((symbol-function 'rgrep-default-command) #'projectile-rgrep-default-command)) + (rgrep search-regexp (or files "* .*") root-dir) + (when (get-buffer "*grep*") + ;; When grep is using a global *grep* buffer rename it to be + ;; scoped to the current root to allow multiple concurrent grep + ;; operations, one per root + (with-current-buffer "*grep*" + (rename-buffer (concat "*grep <" root-dir ">*")))))))) + (run-hooks 'projectile-grep-finished-hook))) + +;;;###autoload +(defun projectile-ag (search-term &optional arg) + "Run an ag search with SEARCH-TERM in the project. + +With an optional prefix argument ARG SEARCH-TERM is interpreted as a +regular expression." + (interactive + (list (projectile--read-search-string-with-default + (format "Ag %ssearch for" (if current-prefix-arg "regexp " ""))) + current-prefix-arg)) + (if (require 'ag nil 'noerror) + (let ((ag-command (if arg 'ag-regexp 'ag)) + (ag-ignore-list (delq nil + (delete-dups + (append + ag-ignore-list + (projectile--globally-ignored-file-suffixes-glob) + ;; ag supports git ignore files directly + (unless (eq (projectile-project-vcs) 'git) + (append (projectile-ignored-files-rel) + (projectile-ignored-directories-rel) + grep-find-ignored-files + grep-find-ignored-directories + '())))))) + ;; reset the prefix arg, otherwise it will affect the ag-command + (current-prefix-arg nil)) + (funcall ag-command search-term (projectile-acquire-root))) + (error "Package 'ag' is not available"))) + +;;;###autoload +(defun projectile-ripgrep (search-term &optional arg) + "Run a Ripgrep search with `SEARCH-TERM' at current project root. + +With an optional prefix argument ARG SEARCH-TERM is interpreted as a +regular expression." + (interactive + (list (projectile--read-search-string-with-default + (format "Ripgrep %ssearch for" (if current-prefix-arg "regexp " ""))) + current-prefix-arg)) + (if (require 'ripgrep nil 'noerror) + (let ((args (mapcar (lambda (val) (concat "--glob !" val)) + (append projectile-globally-ignored-files + projectile-globally-ignored-directories)))) + (ripgrep-regexp search-term + (projectile-acquire-root) + (if arg + args + (cons "--fixed-strings" args)))) + (error "Package `ripgrep' is not available"))) + +(defun projectile-tags-exclude-patterns () + "Return a string with exclude patterns for ctags." + (mapconcat (lambda (pattern) (format "--exclude=\"%s\"" + (directory-file-name pattern))) + (append + (projectile-ignored-directories-rel) + (projectile-patterns-to-ignore)) " ")) + +;;;###autoload +(defun projectile-regenerate-tags () + "Regenerate the project's [e|g]tags." + (interactive) + (if (and (boundp 'ggtags-mode) + (memq projectile-tags-backend '(auto ggtags))) + (progn + (let* ((ggtags-project-root (projectile-acquire-root)) + (default-directory ggtags-project-root)) + (ggtags-ensure-project) + (ggtags-update-tags t))) + (let* ((project-root (projectile-acquire-root)) + (tags-exclude (projectile-tags-exclude-patterns)) + (default-directory project-root) + (tags-file (expand-file-name projectile-tags-file-name)) + (command (format projectile-tags-command + tags-file + tags-exclude + ;; Use directory file name for MSYS2 compatibility. + ;; See https://github.com/bbatsov/projectile/issues/1377 for more details + (directory-file-name default-directory))) + shell-output exit-code) + (with-temp-buffer + (setq exit-code + (call-process-shell-command command nil (current-buffer)) + shell-output (string-trim + (buffer-substring (point-min) (point-max))))) + (unless (zerop exit-code) + (error shell-output)) + (visit-tags-table tags-file) + (message "Regenerated %s" tags-file)))) + +(defun projectile-visit-project-tags-table () + "Visit the current project's tags table." + (when (projectile-project-p) + (let ((tags-file (projectile-expand-root projectile-tags-file-name))) + (when (file-exists-p tags-file) + (with-demoted-errors "Error loading tags-file: %s" + (visit-tags-table tags-file t)))))) + +(defun projectile-determine-find-tag-fn () + "Determine which function to use for a call to `projectile-find-tag'." + (or + (cond + ((eq projectile-tags-backend 'auto) + (cond + ((fboundp 'ggtags-find-tag-dwim) + 'ggtags-find-tag-dwim) + ((fboundp 'xref-find-definitions) + 'xref-find-definitions) + ((fboundp 'etags-select-find-tag) + 'etags-select-find-tag))) + ((eq projectile-tags-backend 'xref) + (when (fboundp 'xref-find-definitions) + 'xref-find-definitions)) + ((eq projectile-tags-backend 'ggtags) + (when (fboundp 'ggtags-find-tag-dwim) + 'ggtags-find-tag-dwim)) + ((eq projectile-tags-backend 'etags-select) + (when (fboundp 'etags-select-find-tag) + 'etags-select-find-tag))) + 'find-tag)) + +;;;###autoload +(defun projectile-find-tag () + "Find tag in project." + (interactive) + (projectile-visit-project-tags-table) + ;; Auto-discover the user's preference for tags + (let ((find-tag-fn (projectile-determine-find-tag-fn))) + (call-interactively find-tag-fn))) + +(defmacro projectile-with-default-dir (dir &rest body) + "Invoke in DIR the BODY." + (declare (debug t) (indent 1)) + `(let ((default-directory ,dir)) + ,@body)) + +;;;###autoload +(defun projectile-run-command-in-root () + "Invoke `execute-extended-command' in the project's root." + (interactive) + (projectile-with-default-dir (projectile-acquire-root) + (call-interactively #'execute-extended-command))) + +;;;###autoload +(defun projectile-run-shell-command-in-root () + "Invoke `shell-command' in the project's root." + (interactive) + (projectile-with-default-dir (projectile-acquire-root) + (call-interactively #'shell-command))) + +;;;###autoload +(defun projectile-run-async-shell-command-in-root () + "Invoke `async-shell-command' in the project's root." + (interactive) + (projectile-with-default-dir (projectile-acquire-root) + (call-interactively #'async-shell-command))) + +;;;###autoload +(defun projectile-run-gdb () + "Invoke `gdb' in the project's root." + (interactive) + (projectile-with-default-dir (projectile-acquire-root) + (call-interactively 'gdb))) + +;;;###autoload +(defun projectile-run-shell (&optional arg) + "Invoke `shell' in the project's root. + +Switch to the project specific shell buffer if it already exists. + +Use a prefix argument ARG to indicate creation of a new process instead." + (interactive "P") + (let ((project (projectile-acquire-root))) + (projectile-with-default-dir project + (shell (projectile-generate-process-name "shell" arg project))))) + +;;;###autoload +(defun projectile-run-eshell (&optional arg) + "Invoke `eshell' in the project's root. + +Switch to the project specific eshell buffer if it already exists. + +Use a prefix argument ARG to indicate creation of a new process instead." + (interactive "P") + (let ((project (projectile-acquire-root))) + (projectile-with-default-dir project + (let ((eshell-buffer-name (projectile-generate-process-name "eshell" arg project))) + (eshell))))) + +;;;###autoload +(defun projectile-run-ielm (&optional arg) + "Invoke `ielm' in the project's root. + +Switch to the project specific ielm buffer if it already exists. + +Use a prefix argument ARG to indicate creation of a new process instead." + (interactive "P") + (let* ((project (projectile-acquire-root)) + (ielm-buffer-name (projectile-generate-process-name "ielm" arg project))) + (if (get-buffer ielm-buffer-name) + (switch-to-buffer ielm-buffer-name) + (projectile-with-default-dir project + (ielm)) + ;; ielm's buffer name is hardcoded, so we have to rename it after creation + (rename-buffer ielm-buffer-name)))) + +;;;###autoload +(defun projectile-run-term (&optional arg) + "Invoke `term' in the project's root. + +Switch to the project specific term buffer if it already exists. + +Use a prefix argument ARG to indicate creation of a new process instead." + (interactive "P") + (let* ((project (projectile-acquire-root)) + (buffer-name (projectile-generate-process-name "term" arg project)) + (default-program (or explicit-shell-file-name + (getenv "ESHELL") + (getenv "SHELL") + "/bin/sh"))) + (unless (get-buffer buffer-name) + (require 'term) + (let ((program (read-from-minibuffer "Run program: " default-program))) + (projectile-with-default-dir project + (set-buffer (term-ansi-make-term buffer-name program)) + (term-mode) + (term-char-mode)))) + (switch-to-buffer buffer-name))) + +;;;###autoload +(defun projectile-run-vterm (&optional arg) + "Invoke `vterm' in the project's root. + +Switch to the project specific term buffer if it already exists. + +Use a prefix argument ARG to indicate creation of a new process instead." + (interactive "P") + (let* ((project (projectile-acquire-root)) + (buffer (projectile-generate-process-name "vterm" arg project))) + (unless (buffer-live-p (get-buffer buffer)) + (unless (require 'vterm nil 'noerror) + (error "Package 'vterm' is not available")) + (projectile-with-default-dir project + (vterm buffer))) + (switch-to-buffer buffer))) + +(defun projectile-files-in-project-directory (directory) + "Return a list of files in DIRECTORY." + (let* ((project (projectile-acquire-root)) + (dir (file-relative-name (expand-file-name directory) + project))) + (cl-remove-if-not + (lambda (f) (string-prefix-p dir f)) + (projectile-project-files project)))) + +(defun projectile-files-from-cmd (cmd directory) + "Use a grep-like CMD to search for files within DIRECTORY. + +CMD should include the necessary search params and should output +equivalently to grep -HlI (only unique matching filenames). +Returns a list of expanded filenames." + (let ((default-directory directory)) + (mapcar (lambda (str) + (concat directory + (if (string-prefix-p "./" str) + (substring str 2) + str))) + (split-string + (string-trim (shell-command-to-string cmd)) + "\n+" + t)))) + +(defvar projectile-files-with-string-commands + '((rg . "rg -lF --no-heading --color never -- ") + (ag . "ag --literal --nocolor --noheading -l -- ") + (ack . "ack --literal --nocolor -l -- ") + (git . "git grep -HlI ") + ;; -r: recursive + ;; -H: show filename for each match + ;; -l: show only file names with matches + ;; -I: no binary files + (grep . "grep -rHlI %s ."))) + +(defun projectile-files-with-string (string directory) + "Return a list of all files containing STRING in DIRECTORY. + +Tries to use rg, ag, ack, git-grep, and grep in that order. If those +are impossible (for instance on Windows), returns a list of all +files in the project." + (if (projectile-unixy-system-p) + (let* ((search-term (shell-quote-argument string)) + (cmd (cond ((executable-find "rg") + (concat (cdr (assoc 'rg projectile-files-with-string-commands)) + search-term)) + ((executable-find "ag") + (concat (cdr (assoc 'ag projectile-files-with-string-commands)) + search-term)) + ((executable-find "ack") + (concat (cdr (assoc 'ack projectile-files-with-string-commands)) + search-term)) + ((and (executable-find "git") + (eq (projectile-project-vcs) 'git)) + (concat (cdr (assoc 'git projectile-files-with-string-commands)) search-term)) + (t + (format (cdr (assoc 'grep projectile-files-with-string-commands)) search-term))))) + (projectile-files-from-cmd cmd directory)) + ;; we have to reject directories as a workaround to work with git submodules + (cl-remove-if + #'file-directory-p + (mapcar #'(lambda (file) (expand-file-name file directory)) + (projectile-dir-files directory))))) + +;;;###autoload +(defun projectile-replace (&optional arg) + "Replace literal string in project using non-regexp `tags-query-replace'. + +With a prefix argument ARG prompts you for a directory on which +to run the replacement." + (interactive "P") + (let* ((directory (if arg + (file-name-as-directory + (read-directory-name "Replace in directory: ")) + (projectile-acquire-root))) + (old-text (read-string + (projectile-prepend-project-name "Replace: ") + (projectile-symbol-or-selection-at-point))) + (new-text (read-string + (projectile-prepend-project-name + (format "Replace %s with: " old-text)))) + (files (projectile-files-with-string old-text directory))) + (if (fboundp #'fileloop-continue) + ;; Emacs 27+ + (progn (fileloop-initialize-replace old-text new-text files 'default) + (fileloop-continue)) + ;; Emacs 25 and 26 + ;; + ;; Adapted from `tags-query-replace' for literal strings (not regexp) + (with-no-warnings + (setq tags-loop-scan + `(let ,(unless (equal old-text (downcase old-text)) + '((case-fold-search nil))) + (if (search-forward ',old-text nil t) + ;; When we find a match, move back to + ;; the beginning of it so + ;; perform-replace will see it. + (goto-char (match-beginning 0))))) + (setq tags-loop-operate + `(perform-replace ',old-text ',new-text t nil nil + nil multi-query-replace-map)) + (tags-loop-continue (or (cons 'list files) t)))))) + +;;;###autoload +(defun projectile-replace-regexp (&optional arg) + "Replace a regexp in the project using `tags-query-replace'. + +With a prefix argument ARG prompts you for a directory on which +to run the replacement." + (interactive "P") + (let* ((directory (if arg + (file-name-as-directory + (read-directory-name "Replace regexp in directory: ")) + (projectile-acquire-root))) + (old-text (read-string + (projectile-prepend-project-name "Replace regexp: ") + (projectile-symbol-or-selection-at-point))) + (new-text (read-string + (projectile-prepend-project-name + (format "Replace regexp %s with: " old-text)))) + (files + ;; We have to reject directories as a workaround to work with git submodules. + ;; + ;; We can't narrow the list of files with + ;; `projectile-files-with-string' because those regexp tools + ;; don't support Emacs regular expressions. + (cl-remove-if + #'file-directory-p + (mapcar #'(lambda (file) (expand-file-name file directory)) + (projectile-dir-files directory))))) + ;; FIXME: Probably would fail on Emacs 27+, fourth argument is gone. + (with-no-warnings (tags-query-replace old-text new-text nil (cons 'list files))))) + +;;;###autoload +(defun projectile-kill-buffers () + "Kill project buffers. + +The buffer are killed according to the value of +`projectile-kill-buffers-filter'." + (interactive) + (let* ((project (projectile-acquire-root)) + (project-name (projectile-project-name project)) + (buffers (projectile-project-buffers project))) + (when (yes-or-no-p + (format "Are you sure you want to kill %s buffers for '%s'? " + (length buffers) project-name)) + (dolist (buffer buffers) + (when (and + ;; we take care not to kill indirect buffers directly + ;; as we might encounter them after their base buffers are killed + (not (buffer-base-buffer buffer)) + (if (functionp projectile-kill-buffers-filter) + (funcall projectile-kill-buffers-filter buffer) + (pcase projectile-kill-buffers-filter + ('kill-all t) + ('kill-only-files (buffer-file-name buffer)) + (_ (user-error "Invalid projectile-kill-buffers-filter value: %S" projectile-kill-buffers-filter))))) + (kill-buffer buffer)))))) + +;;;###autoload +(defun projectile-save-project-buffers () + "Save all project buffers." + (interactive) + (let* ((project (projectile-acquire-root)) + (project-name (projectile-project-name project)) + (modified-buffers (cl-remove-if-not (lambda (buf) + (and (buffer-file-name buf) + (buffer-modified-p buf))) + (projectile-project-buffers project)))) + (if (null modified-buffers) + (message "[%s] No buffers need saving" project-name) + (dolist (buf modified-buffers) + (with-current-buffer buf + (save-buffer))) + (message "[%s] Saved %d buffers" project-name (length modified-buffers))))) + +;;;###autoload +(defun projectile-dired () + "Open `dired' at the root of the project." + (interactive) + (dired (projectile-acquire-root))) + +;;;###autoload +(defun projectile-dired-other-window () + "Open `dired' at the root of the project in another window." + (interactive) + (dired-other-window (projectile-acquire-root))) + +;;;###autoload +(defun projectile-dired-other-frame () + "Open `dired' at the root of the project in another frame." + (interactive) + (dired-other-frame (projectile-acquire-root))) + +;;;###autoload +(defun projectile-vc (&optional project-root) + "Open `vc-dir' at the root of the project. + +For git projects `magit-status-internal' is used if available. +For hg projects `monky-status' is used if available. + +If PROJECT-ROOT is given, it is opened instead of the project +root directory of the current buffer file. If interactively +called with a prefix argument, the user is prompted for a project +directory to open." + (interactive (and current-prefix-arg + (list + (projectile-completing-read + "Open project VC in: " + projectile-known-projects)))) + (unless project-root + (setq project-root (projectile-acquire-root))) + (let ((vcs (projectile-project-vcs project-root))) + (cl-case vcs + (git + (cond ((fboundp 'magit-status-internal) + (magit-status-internal project-root)) + ((fboundp 'magit-status) + (with-no-warnings (magit-status project-root))) + (t + (vc-dir project-root)))) + (hg + (if (fboundp 'monky-status) + (monky-status project-root) + (vc-dir project-root))) + (t (vc-dir project-root))))) + +;;;###autoload +(defun projectile-recentf () + "Show a list of recently visited files in a project." + (interactive) + (if (boundp 'recentf-list) + (find-file (projectile-expand-root + (projectile-completing-read + "Recently visited files: " + (projectile-recentf-files)))) + (message "recentf is not enabled"))) + +(defun projectile-recentf-files () + "Return a list of recently visited files in a project." + (and (boundp 'recentf-list) + (let ((project-root (projectile-acquire-root))) + (mapcar + (lambda (f) (file-relative-name f project-root)) + (cl-remove-if-not + (lambda (f) (string-prefix-p project-root (expand-file-name f))) + recentf-list))))) + +(defun projectile-serialize-cache () + "Serializes the memory cache to the hard drive." + (projectile-serialize projectile-projects-cache projectile-cache-file)) + +(defvar projectile-configure-cmd-map + (make-hash-table :test 'equal) + "A mapping between projects and the last configure command used on them.") + +(defvar projectile-compilation-cmd-map + (make-hash-table :test 'equal) + "A mapping between projects and the last compilation command used on them.") + +(defvar projectile-install-cmd-map + (make-hash-table :test 'equal) + "A mapping between projects and the last install command used on them.") + +(defvar projectile-package-cmd-map + (make-hash-table :test 'equal) + "A mapping between projects and the last package command used on them.") + +(defvar projectile-test-cmd-map + (make-hash-table :test 'equal) + "A mapping between projects and the last test command used on them.") + +(defvar projectile-run-cmd-map + (make-hash-table :test 'equal) + "A mapping between projects and the last run command used on them.") + +(defvar projectile-project-configure-cmd nil + "The command to use with `projectile-configure-project'. +It takes precedence over the default command for the project type when set. +Should be set via .dir-locals.el.") + +(defvar projectile-project-compilation-cmd nil + "The command to use with `projectile-compile-project'. +It takes precedence over the default command for the project type when set. +Should be set via .dir-locals.el.") + +(defvar projectile-project-compilation-dir nil + "The directory to use with `projectile-compile-project'. +The directory path is relative to the project root. +Should be set via .dir-locals.el.") + +(defvar projectile-project-test-cmd nil + "The command to use with `projectile-test-project'. +It takes precedence over the default command for the project type when set. +Should be set via .dir-locals.el.") + +(defvar projectile-project-install-cmd nil + "The command to use with `projectile-install-project'. +It takes precedence over the default command for the project type when set. +Should be set via .dir-locals.el.") + +(defvar projectile-project-package-cmd nil + "The command to use with `projectile-package-project'. +It takes precedence over the default command for the project type when set. +Should be set via .dir-locals.el.") + +(defvar projectile-project-run-cmd nil + "The command to use with `projectile-run-project'. +It takes precedence over the default command for the project type when set. +Should be set via .dir-locals.el.") + +(defun projectile-default-generic-command (project-type command-type) + "Generic retrieval of COMMAND-TYPEs default cmd-value for PROJECT-TYPE. + +If found, checks if value is symbol or string. In case of symbol +resolves to function `funcall's. Return value of function MUST +be string to be executed as command." + (let ((command (plist-get (alist-get project-type projectile-project-types) command-type))) + (cond + ((not command) nil) + ((stringp command) command) + ((functionp command) + (if (fboundp command) + (funcall (symbol-function command)))) + (t + (error "The value for: %s in project-type: %s was neither a function nor a string" command-type project-type))))) + +(defun projectile-default-configure-command (project-type) + "Retrieve default configure command for PROJECT-TYPE." + (projectile-default-generic-command project-type 'configure-command)) + +(defun projectile-default-compilation-command (project-type) + "Retrieve default compilation command for PROJECT-TYPE." + (projectile-default-generic-command project-type 'compile-command)) + +(defun projectile-default-compilation-dir (project-type) + "Retrieve default compilation directory for PROJECT-TYPE." + (projectile-default-generic-command project-type 'compilation-dir)) + +(defun projectile-default-test-command (project-type) + "Retrieve default test command for PROJECT-TYPE." + (projectile-default-generic-command project-type 'test-command)) + +(defun projectile-default-install-command (project-type) + "Retrieve default install command for PROJECT-TYPE." + (projectile-default-generic-command project-type 'install-command)) + +(defun projectile-default-package-command (project-type) + "Retrieve default package command for PROJECT-TYPE." + (projectile-default-generic-command project-type 'package-command)) + +(defun projectile-default-run-command (project-type) + "Retrieve default run command for PROJECT-TYPE." + (projectile-default-generic-command project-type 'run-command)) + +(defun projectile-configure-command (compile-dir) + "Retrieve the configure command for COMPILE-DIR. + +The command is determined like this: + +- first we check `projectile-configure-cmd-map' for the last +configure command that was invoked on the project + +- then we check for `projectile-project-configure-cmd' supplied +via .dir-locals.el + +- finally we check for the default configure command for a +project of that type" + (or (gethash compile-dir projectile-configure-cmd-map) + projectile-project-configure-cmd + (let ((cmd-format-string (projectile-default-configure-command (projectile-project-type)))) + (when cmd-format-string + (format cmd-format-string (projectile-project-root) compile-dir))))) + +(defun projectile-compilation-buffer-name (compilation-mode) + "Meant to be used for `compilation-buffer-name-function`. +Argument COMPILATION-MODE is the name of the major mode used for the compilation buffer." + (concat "*" (downcase compilation-mode) "*" + (if (projectile-project-p) (concat "<" (projectile-project-name) ">") ""))) + +(defun projectile-current-project-buffer-p () + "Meant to be used for `compilation-save-buffers-predicate`. +This indicates whether the current buffer is in the same project as the current +window (including returning true if neither is in a project)." + (let ((root (with-current-buffer (window-buffer) (projectile-project-root)))) + (or (not root) + (projectile-project-buffer-p (current-buffer) root)))) + +(defun projectile-compilation-command (compile-dir) + "Retrieve the compilation command for COMPILE-DIR. + +The command is determined like this: + +- first we check `projectile-compilation-cmd-map' for the last +compile command that was invoked on the project + +- then we check for `projectile-project-compilation-cmd' supplied +via .dir-locals.el + +- finally we check for the default compilation command for a +project of that type" + (or (gethash compile-dir projectile-compilation-cmd-map) + projectile-project-compilation-cmd + (projectile-default-compilation-command (projectile-project-type)))) + +(defun projectile-test-command (compile-dir) + "Retrieve the test command for COMPILE-DIR. + +The command is determined like this: + +- first we check `projectile-test-cmd-map' for the last +test command that was invoked on the project + +- then we check for `projectile-project-test-cmd' supplied +via .dir-locals.el + +- finally we check for the default test command for a +project of that type" + (or (gethash compile-dir projectile-test-cmd-map) + projectile-project-test-cmd + (projectile-default-test-command (projectile-project-type)))) + +(defun projectile-install-command (compile-dir) + "Retrieve the install command for COMPILE-DIR. + +The command is determined like this: + +- first we check `projectile-install-cmd-map' for the last +install command that was invoked on the project + +- then we check for `projectile-project-install-cmd' supplied +via .dir-locals.el + +- finally we check for the default install command for a +project of that type" + (or (gethash compile-dir projectile-install-cmd-map) + projectile-project-install-cmd + (projectile-default-install-command (projectile-project-type)))) + +(defun projectile-package-command (compile-dir) + "Retrieve the pacakge command for COMPILE-DIR. + +The command is determined like this: + +- first we check `projectile-packgage-cmd-map' for the last +install command that was invoked on the project + +- then we check for `projectile-project-package-cmd' supplied +via .dir-locals.el + +- finally we check for the default package command for a +project of that type" + (or (gethash compile-dir projectile-package-cmd-map) + projectile-project-package-cmd + (projectile-default-package-command (projectile-project-type)))) + +(defun projectile-run-command (compile-dir) + "Retrieve the run command for COMPILE-DIR. + +The command is determined like this: + +- first we check `projectile-run-cmd-map' for the last +run command that was invoked on the project + +- then we check for `projectile-project-run-cmd' supplied +via .dir-locals.el + +- finally we check for the default run command for a +project of that type" + (or (gethash compile-dir projectile-run-cmd-map) + projectile-project-run-cmd + (projectile-default-run-command (projectile-project-type)))) + +(defun projectile-read-command (prompt command) + "Adapted from `compilation-read-command'." + (let ((compile-history + ;; fetch the command history for the current project + (ring-elements (projectile--get-command-history (projectile-acquire-root))))) + (read-shell-command prompt command + (if (equal (car compile-history) command) + '(compile-history . 1) + 'compile-history)))) + +(defun projectile-compilation-dir () + "Retrieve the compilation directory for this project." + (let* ((type (projectile-project-type)) + (directory (or projectile-project-compilation-dir + (projectile-default-compilation-dir type)))) + (if directory + (file-truename + (concat (file-name-as-directory (projectile-project-root)) + (file-name-as-directory directory))) + (projectile-project-root)))) + +(defun projectile-maybe-read-command (arg default-cmd prompt) + "Prompt user for command unless DEFAULT-CMD is an Elisp function." + (if (and (or (stringp default-cmd) (null default-cmd)) + (or compilation-read-command arg)) + (projectile-read-command prompt default-cmd) + default-cmd)) + +(defun projectile-run-compilation (cmd) + "Run external or Elisp compilation command CMD." + (if (functionp cmd) + (funcall cmd) + (compile cmd))) + +(defvar projectile-project-command-history (make-hash-table :test 'equal) + "The history of last executed project commands, per project. + +Projects are indexed by their project-root value.") + +(defun projectile--get-command-history (project-root) + (or (gethash project-root projectile-project-command-history) + (puthash project-root + (make-ring 16) + projectile-project-command-history))) + +(cl-defun projectile--run-project-cmd + (command command-map &key show-prompt prompt-prefix save-buffers) + "Run a project COMMAND, typically a test- or compile command. + +Cache the COMMAND for later use inside the hash-table COMMAND-MAP. + +Normally you'll be prompted for a compilation command, unless +variable `compilation-read-command'. You can force the prompt +by setting SHOW-PROMPT. The prompt will be prefixed with PROMPT-PREFIX. + +If SAVE-BUFFERS is non-nil save all projectile buffers before +running the command. + +The command actually run is returned." + (let* ((project-root (projectile-project-root)) + (default-directory (projectile-compilation-dir)) + (command (projectile-maybe-read-command show-prompt + command + prompt-prefix))) + (when command-map + (puthash default-directory command command-map) + (ring-insert (projectile--get-command-history project-root) command)) + (when save-buffers + (save-some-buffers (not compilation-ask-about-save) + (lambda () + (projectile-project-buffer-p (current-buffer) + project-root)))) + (unless (file-directory-p default-directory) + (mkdir default-directory)) + (projectile-run-compilation command) + command)) + +;;;###autoload +(defun projectile-configure-project (arg) + "Run project configure command. + +Normally you'll be prompted for a compilation command, unless +variable `compilation-read-command'. You can force the prompt +with a prefix ARG." + (interactive "P") + (let ((command (projectile-configure-command (projectile-compilation-dir)))) + (projectile--run-project-cmd command projectile-configure-cmd-map + :show-prompt arg + :prompt-prefix "Configure command: " + :save-buffers t))) + +;;;###autoload +(defun projectile-compile-project (arg) + "Run project compilation command. + +Normally you'll be prompted for a compilation command, unless +variable `compilation-read-command'. You can force the prompt +with a prefix ARG." + (interactive "P") + (let ((command (projectile-compilation-command (projectile-compilation-dir)))) + (projectile--run-project-cmd command projectile-compilation-cmd-map + :show-prompt arg + :prompt-prefix "Compile command: " + :save-buffers t))) + +;;;###autoload +(defun projectile-test-project (arg) + "Run project test command. + +Normally you'll be prompted for a compilation command, unless +variable `compilation-read-command'. You can force the prompt +with a prefix ARG." + (interactive "P") + (let ((command (projectile-test-command (projectile-compilation-dir)))) + (projectile--run-project-cmd command projectile-test-cmd-map + :show-prompt arg + :prompt-prefix "Test command: " + :save-buffers t))) + +;;;###autoload +(defun projectile-install-project (arg) + "Run project install command. + +Normally you'll be prompted for a compilation command, unless +variable `compilation-read-command'. You can force the prompt +with a prefix ARG." + (interactive "P") + (let ((command (projectile-install-command (projectile-compilation-dir)))) + (projectile--run-project-cmd command projectile-install-cmd-map + :show-prompt arg + :prompt-prefix "Install command: " + :save-buffers t))) + +;;;###autoload +(defun projectile-package-project (arg) + "Run project package command. + +Normally you'll be prompted for a compilation command, unless +variable `compilation-read-command'. You can force the prompt +with a prefix ARG." + (interactive "P") + (let ((command (projectile-package-command (projectile-compilation-dir)))) + (projectile--run-project-cmd command projectile-package-cmd-map + :show-prompt arg + :prompt-prefix "Package command: " + :save-buffers t))) + +;;;###autoload +(defun projectile-run-project (arg) + "Run project run command. + +Normally you'll be prompted for a compilation command, unless +variable `compilation-read-command'. You can force the prompt +with a prefix ARG." + (interactive "P") + (let ((command (projectile-run-command (projectile-compilation-dir)))) + (projectile--run-project-cmd command projectile-run-cmd-map + :show-prompt arg + :prompt-prefix "Run command: "))) + +;;;###autoload +(defun projectile-repeat-last-command (show-prompt) + "Run last projectile external command. + +External commands are: `projectile-configure-project', +`projectile-compile-project', `projectile-test-project', +`projectile-install-project', `projectile-package-project', +and `projectile-run-project'. + +If the prefix argument SHOW_PROMPT is non nil, the command can be edited." + (interactive "P") + (let* ((project-root (projectile-acquire-root)) + (command-history (projectile--get-command-history project-root)) + (command (car-safe (ring-elements command-history))) + (compilation-read-command show-prompt) + executed-command) + (unless command + (user-error "No command has been run yet for this project")) + (setq executed-command + (projectile--run-project-cmd command + nil + :save-buffers t + :prompt-prefix "Execute command: ")) + (unless (string= command executed-command) + (ring-insert command-history executed-command)))) + +(defun compilation-find-file-projectile-find-compilation-buffer (orig-fun marker filename directory &rest formats) + "Try to find a buffer for FILENAME, if we cannot find it, +fallback to the original function." + (when (and (not (file-exists-p (expand-file-name filename))) + (projectile-project-p)) + (let* ((root (projectile-project-root)) + (dirs (cons "" (projectile-current-project-dirs))) + (new-filename (car (cl-remove-if-not + #'file-exists-p + (mapcar + (lambda (f) + (expand-file-name + filename + (expand-file-name f root))) + dirs))))) + (when new-filename + (setq filename new-filename)))) + + (apply orig-fun `(,marker ,filename ,directory ,@formats))) + +(defun projectile-open-projects () + "Return a list of all open projects. +An open project is a project with any open buffers." + (delete-dups + (delq nil + (mapcar (lambda (buffer) + (with-current-buffer buffer + (when (projectile-project-p) + (abbreviate-file-name (projectile-project-root))))) + (buffer-list))))) + +(defun projectile--remove-current-project (projects) + "Remove the current project (if any) from the list of PROJECTS." + (if-let ((project (projectile-project-root))) + (projectile-difference projects + (list (abbreviate-file-name project))) + projects)) + +(defun projectile--move-current-project-to-end (projects) + "Move current project (if any) to the end of list in the list of PROJECTS." + (if-let ((project (projectile-project-root))) + (append + (projectile--remove-current-project projects) + (list (abbreviate-file-name project))) + projects)) + +(defun projectile-relevant-known-projects () + "Return a list of known projects." + (pcase projectile-current-project-on-switch + ('remove (projectile--remove-current-project projectile-known-projects)) + ('move-to-end (projectile--move-current-project-to-end projectile-known-projects)) + ('keep projectile-known-projects))) + +(defun projectile-relevant-open-projects () + "Return a list of open projects." + (let ((open-projects (projectile-open-projects))) + (pcase projectile-current-project-on-switch + ('remove (projectile--remove-current-project open-projects)) + ('move-to-end (projectile--move-current-project-to-end open-projects)) + ('keep open-projects)))) + +;;;###autoload +(defun projectile-switch-project (&optional arg) + "Switch to a project we have visited before. +Invokes the command referenced by `projectile-switch-project-action' on switch. +With a prefix ARG invokes `projectile-commander' instead of +`projectile-switch-project-action.'" + (interactive "P") + (let ((projects (projectile-relevant-known-projects))) + (if projects + (projectile-completing-read + "Switch to project: " projects + :action (lambda (project) + (projectile-switch-project-by-name project arg))) + (user-error "There are no known projects")))) + +;;;###autoload +(defun projectile-switch-open-project (&optional arg) + "Switch to a project we have currently opened. +Invokes the command referenced by `projectile-switch-project-action' on switch. +With a prefix ARG invokes `projectile-commander' instead of +`projectile-switch-project-action.'" + (interactive "P") + (let ((projects (projectile-relevant-open-projects))) + (if projects + (projectile-completing-read + "Switch to open project: " projects + :action (lambda (project) + (projectile-switch-project-by-name project arg))) + (user-error "There are no open projects")))) + +(defun projectile-switch-project-by-name (project-to-switch &optional arg) + "Switch to project by project name PROJECT-TO-SWITCH. +Invokes the command referenced by `projectile-switch-project-action' on switch. +With a prefix ARG invokes `projectile-commander' instead of +`projectile-switch-project-action.'" + ;; let's make sure that the target directory exists and is actually a project + ;; we ignore remote folders, as the check breaks for TRAMP unless already connected + (unless (or (file-remote-p project-to-switch) (projectile-project-p project-to-switch)) + (projectile-remove-known-project project-to-switch) + (error "Directory %s is not a project" project-to-switch)) + (let ((switch-project-action (if arg + 'projectile-commander + projectile-switch-project-action))) + (run-hooks 'projectile-before-switch-project-hook) + (let* ((default-directory project-to-switch) + (switched-buffer + ;; use a temporary buffer to load PROJECT-TO-SWITCH's dir-locals + ;; before calling SWITCH-PROJECT-ACTION + (with-temp-buffer + (hack-dir-local-variables-non-file-buffer) + ;; Normally the project name is determined from the current + ;; buffer. However, when we're switching projects, we want to + ;; show the name of the project being switched to, rather than + ;; the current project, in the minibuffer. This is a simple hack + ;; to tell the `projectile-project-name' function to ignore the + ;; current buffer and the caching mechanism, and just return the + ;; value of the `projectile-project-name' variable. + (let ((projectile-project-name (funcall projectile-project-name-function + project-to-switch))) + (funcall switch-project-action) + (current-buffer))))) + ;; If switch-project-action switched buffers then with-temp-buffer will + ;; have lost that change, so switch back to the correct buffer. + (when (buffer-live-p switched-buffer) + (switch-to-buffer switched-buffer))) + (run-hooks 'projectile-after-switch-project-hook))) + +;;;###autoload +(defun projectile-find-file-in-directory (&optional directory) + "Jump to a file in a (maybe regular) DIRECTORY. + +This command will first prompt for the directory the file is in." + (interactive "DFind file in directory: ") + (unless (projectile--directory-p directory) + (user-error "Directory %S does not exist" directory)) + (let ((default-directory directory)) + (if (projectile-project-p) + ;; target directory is in a project + (let ((file (projectile-completing-read "Find file: " + (projectile-dir-files directory)))) + (find-file (expand-file-name file directory)) + (run-hooks 'projectile-find-file-hook)) + ;; target directory is not in a project + (projectile-find-file)))) + +(defun projectile-all-project-files () + "Get a list of all files in all projects." + (cl-mapcan + (lambda (project) + (when (file-exists-p project) + (mapcar (lambda (file) + (expand-file-name file project)) + (projectile-project-files project)))) + projectile-known-projects)) + +;;;###autoload +(defun projectile-find-file-in-known-projects () + "Jump to a file in any of the known projects." + (interactive) + (find-file (projectile-completing-read "Find file in projects: " (projectile-all-project-files)))) + +(defun projectile-keep-project-p (project) + "Determine whether we should cleanup (remove) PROJECT or not. + +It handles the case of remote projects as well. +See `projectile--cleanup-known-projects'." + ;; Taken from from `recentf-keep-default-predicate' + (cond + ((file-remote-p project nil t) (file-readable-p project)) + ((file-remote-p project)) + ((file-readable-p project)))) + +(defun projectile--cleanup-known-projects () + "Remove known projects that don't exist anymore and return a list of projects removed." + (projectile-merge-known-projects) + (let ((projects-kept (cl-remove-if-not #'projectile-keep-project-p projectile-known-projects)) + (projects-removed (cl-remove-if #'projectile-keep-project-p projectile-known-projects))) + (setq projectile-known-projects projects-kept) + (projectile-merge-known-projects) + projects-removed)) + +;;;###autoload +(defun projectile-cleanup-known-projects () + "Remove known projects that don't exist anymore." + (interactive) + (if-let ((projects-removed (projectile--cleanup-known-projects))) + (message "Projects removed: %s" + (mapconcat #'identity projects-removed ", ")) + (message "No projects needed to be removed."))) + +;;;###autoload +(defun projectile-clear-known-projects () + "Clear both `projectile-known-projects' and `projectile-known-projects-file'." + (interactive) + (setq projectile-known-projects nil) + (projectile-save-known-projects)) + +;;;###autoload +(defun projectile-reset-known-projects () + "Clear known projects and rediscover." + (interactive) + (projectile-clear-known-projects) + (projectile-discover-projects-in-search-path)) + +;;;###autoload +(defun projectile-remove-known-project (&optional project) + "Remove PROJECT from the list of known projects." + (interactive (list (projectile-completing-read + "Remove from known projects: " projectile-known-projects + :action 'projectile-remove-known-project))) + (unless (called-interactively-p 'any) + (setq projectile-known-projects + (cl-remove-if + (lambda (proj) (string= project proj)) + projectile-known-projects)) + (projectile-merge-known-projects) + (when projectile-verbose + (message "Project %s removed from the list of known projects." project)))) + +;;;###autoload +(defun projectile-remove-current-project-from-known-projects () + "Remove the current project from the list of known projects." + (interactive) + (projectile-remove-known-project (abbreviate-file-name (projectile-acquire-root)))) + +(defun projectile-ignored-projects () + "A list of projects that should not be save in `projectile-known-projects'." + (mapcar #'file-truename projectile-ignored-projects)) + +(defun projectile-ignored-project-p (project-root) + "Return t if PROJECT-ROOT should not be added to `projectile-known-projects'." + (or (member project-root (projectile-ignored-projects)) + (and (functionp projectile-ignored-project-function) + (funcall projectile-ignored-project-function project-root)))) + +;;;###autoload +(defun projectile-add-known-project (project-root) + "Add PROJECT-ROOT to the list of known projects." + (interactive (list (read-directory-name "Add to known projects: "))) + (unless (projectile-ignored-project-p project-root) + (setq projectile-known-projects + (delete-dups + (cons (file-name-as-directory (abbreviate-file-name project-root)) + projectile-known-projects))) + (projectile-merge-known-projects))) + +(defun projectile-load-known-projects () + "Load saved projects from `projectile-known-projects-file'. +Also set `projectile-known-projects'." + (setq projectile-known-projects + (projectile-unserialize projectile-known-projects-file)) + (setq projectile-known-projects-on-file + (and (sequencep projectile-known-projects) + (copy-sequence projectile-known-projects)))) + +(defun projectile-save-known-projects () + "Save PROJECTILE-KNOWN-PROJECTS to PROJECTILE-KNOWN-PROJECTS-FILE." + (projectile-serialize projectile-known-projects + projectile-known-projects-file) + (setq projectile-known-projects-on-file + (and (sequencep projectile-known-projects) + (copy-sequence projectile-known-projects)))) + +(defun projectile-merge-known-projects () + "Merge any change from `projectile-known-projects-file' and save to disk. + +This enables multiple Emacs processes to make changes without +overwriting each other's changes." + (let* ((known-now projectile-known-projects) + (known-on-last-sync projectile-known-projects-on-file) + (known-on-file + (projectile-unserialize projectile-known-projects-file)) + (removed-after-sync (projectile-difference known-on-last-sync known-now)) + (removed-in-other-process + (projectile-difference known-on-last-sync known-on-file)) + (result (delete-dups + (projectile-difference + (append known-now known-on-file) + (append removed-after-sync removed-in-other-process))))) + (setq projectile-known-projects result) + (projectile-save-known-projects))) + + +;;; IBuffer integration +(define-ibuffer-filter projectile-files + "Show Ibuffer with all buffers in the current project." + (:reader (read-directory-name "Project root: " (projectile-project-root)) + :description nil) + (with-current-buffer buf + (let ((directory (file-name-as-directory (expand-file-name qualifier)))) + (and (projectile-project-buffer-p buf directory) + (equal directory + (projectile-project-root)))))) + +(defun projectile-ibuffer-by-project (project-root) + "Open an IBuffer window showing all buffers in PROJECT-ROOT." + (let ((project-name (funcall projectile-project-name-function project-root))) + (ibuffer nil (format "*%s Buffers*" project-name) + (list (cons 'projectile-files project-root))))) + +;;;###autoload +(defun projectile-ibuffer (prompt-for-project) + "Open an IBuffer window showing all buffers in the current project. + +Let user choose another project when PROMPT-FOR-PROJECT is supplied." + (interactive "P") + (let ((project-root (if prompt-for-project + (projectile-completing-read + "Project name: " + (projectile-relevant-known-projects)) + (projectile-acquire-root)))) + (projectile-ibuffer-by-project project-root))) + + +;;;; projectile-commander + +(defconst projectile-commander-help-buffer "*Projectile Commander Help*") + +(defvar projectile-commander-methods nil + "List of file-selection methods for the `projectile-commander' command. +Each element is a list (KEY DESCRIPTION FUNCTION). +DESCRIPTION is a one-line description of what the key selects.") + +;;;###autoload +(defun projectile-commander () + "Execute a Projectile command with a single letter. +The user is prompted for a single character indicating the action to invoke. +The `?' character describes then +available actions. + +See `def-projectile-commander-method' for defining new methods." + (interactive) + (let* ((choices (mapcar #'car projectile-commander-methods)) + (prompt (concat "Select Projectile command [" choices "]: ")) + (ch (read-char-choice prompt choices)) + (fn (nth 2 (assq ch projectile-commander-methods)))) + (funcall fn))) + +(defmacro def-projectile-commander-method (key description &rest body) + "Define a new `projectile-commander' method. + +KEY is the key the user will enter to choose this method. + +DESCRIPTION is a one-line sentence describing how the method. + +BODY is a series of forms which are evaluated when the find +is chosen." + (let ((method `(lambda () + ,@body))) + `(setq projectile-commander-methods + (cl-sort (copy-sequence + (cons (list ,key ,description ,method) + (assq-delete-all ,key projectile-commander-methods))) + (lambda (a b) (< (car a) (car b))))))) + +(def-projectile-commander-method ?? "Commander help buffer." + (ignore-errors (kill-buffer projectile-commander-help-buffer)) + (with-current-buffer (get-buffer-create projectile-commander-help-buffer) + (insert "Projectile Commander Methods:\n\n") + (dolist (met projectile-commander-methods) + (insert (format "%c:\t%s\n" (car met) (cadr met)))) + (goto-char (point-min)) + (help-mode) + (display-buffer (current-buffer) t)) + (projectile-commander)) + +(defun projectile-commander-bindings () + "Setup the keybindings for the Projectile Commander." + (def-projectile-commander-method ?f + "Find file in project." + (projectile-find-file)) + + (def-projectile-commander-method ?T + "Find test file in project." + (projectile-find-test-file)) + + (def-projectile-commander-method ?b + "Switch to project buffer." + (projectile-switch-to-buffer)) + + (def-projectile-commander-method ?d + "Find directory in project." + (projectile-find-dir)) + + (def-projectile-commander-method ?D + "Open project root in dired." + (projectile-dired)) + + (def-projectile-commander-method ?v + "Open project root in vc-dir or magit." + (projectile-vc)) + + (def-projectile-commander-method ?V + "Browse dirty projects" + (projectile-browse-dirty-projects)) + + (def-projectile-commander-method ?r + "Replace a string in the project." + (projectile-replace)) + + (def-projectile-commander-method ?R + "Regenerate the project's [e|g]tags." + (projectile-regenerate-tags)) + + (def-projectile-commander-method ?g + "Run grep on project." + (projectile-grep)) + + (def-projectile-commander-method ?a + "Run ag on project." + (call-interactively #'projectile-ag)) + + (def-projectile-commander-method ?s + "Switch project." + (projectile-switch-project)) + + (def-projectile-commander-method ?o + "Run multi-occur on project buffers." + (projectile-multi-occur)) + + (def-projectile-commander-method ?j + "Find tag in project." + (projectile-find-tag)) + + (def-projectile-commander-method ?k + "Kill all project buffers." + (projectile-kill-buffers)) + + (def-projectile-commander-method ?e + "Find recently visited file in project." + (projectile-recentf))) + + +;;; Dirty (modified) project check related functionality +(defun projectile-check-vcs-status (&optional project-path) + "Check the status of the current project. +If PROJECT-PATH is a project, check this one instead." + (let ((project-path (or project-path (projectile-acquire-root))) + (project-status nil)) + (save-excursion + (vc-dir project-path) + ;; wait until vc-dir is done + (while (vc-dir-busy) (sleep-for 0 100)) + ;; check for status + (save-excursion + (save-match-data + (dolist (check projectile-vcs-dirty-state) + (goto-char (point-min)) + (when (search-forward check nil t) + (setq project-status (cons check project-status)))))) + (kill-buffer) + project-status))) + +(defvar projectile-cached-dirty-projects-status nil + "Cache of the last dirty projects check.") + +(defun projectile-check-vcs-status-of-known-projects () + "Return the list of dirty projects. +The list is composed of sublists~: (project-path, project-status). +Raise an error if their is no dirty project." + (save-window-excursion + (message "Checking for modifications in known projects...") + (let ((projects projectile-known-projects) + (status ())) + (dolist (project projects) + (when (and (projectile-keep-project-p project) (not (string= 'none (projectile-project-vcs project)))) + (let ((tmp-status (projectile-check-vcs-status project))) + (when tmp-status + (setq status (cons (list project tmp-status) status)))))) + (when (= (length status) 0) + (message "No dirty projects have been found")) + (setq projectile-cached-dirty-projects-status status) + status))) + +;;;###autoload +(defun projectile-browse-dirty-projects (&optional cached) + "Browse dirty version controlled projects. + +With a prefix argument, or if CACHED is non-nil, try to use the cached +dirty project list." + (interactive "P") + (let ((status (if (and cached projectile-cached-dirty-projects-status) + projectile-cached-dirty-projects-status + (projectile-check-vcs-status-of-known-projects))) + (mod-proj nil)) + (while (not (= (length status) 0)) + (setq mod-proj (cons (car (pop status)) mod-proj))) + (projectile-completing-read "Select project: " mod-proj + :action 'projectile-vc))) + + +;;; Find next/previous project buffer +(defun projectile--repeat-until-project-buffer (orig-fun &rest args) + "Repeat ORIG-FUN with ARGS until the current buffer is a project buffer." + (if (projectile-project-root) + (let* ((other-project-buffers (make-hash-table :test 'eq)) + (projectile-project-buffers (projectile-project-buffers)) + (max-iterations (length (buffer-list))) + (counter 0)) + (dolist (buffer projectile-project-buffers) + (unless (eq buffer (current-buffer)) + (puthash buffer t other-project-buffers))) + (when (cdr-safe projectile-project-buffers) + (while (and (< counter max-iterations) + (not (gethash (current-buffer) other-project-buffers))) + (apply orig-fun args) + (cl-incf counter)))) + (apply orig-fun args))) + +(defun projectile-next-project-buffer () + "In selected window switch to the next project buffer. + +If the current buffer does not belong to a project, call `next-buffer'." + (interactive) + (projectile--repeat-until-project-buffer #'next-buffer)) + +(defun projectile-previous-project-buffer () + "In selected window switch to the previous project buffer. + +If the current buffer does not belong to a project, call `previous-buffer'." + (interactive) + (projectile--repeat-until-project-buffer #'previous-buffer)) + + +;;; Editing a project's .dir-locals +(defun projectile-read-variable () + "Prompt for a variable and return its name." + (completing-read "Variable: " + obarray + (lambda (v) + (and (boundp v) (not (keywordp v)))) + t)) + +(define-skeleton projectile-skel-variable-cons + "Insert a variable-name and a value in a cons-cell." + "Value: " + "(" + (projectile-read-variable) + " . " + str + ")") + +(define-skeleton projectile-skel-dir-locals + "Insert a .dir-locals.el template." + nil + "((nil . (" + ("" '(projectile-skel-variable-cons) \n) + resume: + ")))") + +;;;###autoload +(defun projectile-edit-dir-locals () + "Edit or create a .dir-locals.el file of the project." + (interactive) + (let ((file (expand-file-name ".dir-locals.el" (projectile-acquire-root)))) + (find-file file) + (when (not (file-exists-p file)) + (unwind-protect + (projectile-skel-dir-locals) + (save-buffer))))) + + +;;; Projectile Minor mode +(define-obsolete-variable-alias 'projectile-mode-line-lighter 'projectile-mode-line-prefix "0.12.0") +(defcustom projectile-mode-line-prefix + " Projectile" + "Mode line lighter prefix for Projectile. +It's used by `projectile-default-mode-line' +when using dynamic mode line lighter and is the only +thing shown in the mode line otherwise." + :group 'projectile + :type 'string + :package-version '(projectile . "0.12.0")) + +(defvar-local projectile--mode-line projectile-mode-line-prefix) + +(defun projectile-default-mode-line () + "Report project name and type in the modeline." + (let ((project-name (projectile-project-name)) + (project-type (projectile-project-type))) + (format "%s[%s%s]" + projectile-mode-line-prefix + (or project-name "-") + (if project-type + (format ":%s" project-type) + "")))) + +(defun projectile-update-mode-line () + "Update the Projectile mode-line." + (let ((mode-line (funcall projectile-mode-line-function))) + (setq projectile--mode-line mode-line)) + (force-mode-line-update)) + +(defvar projectile-command-map + (let ((map (make-sparse-keymap))) + (define-key map (kbd "4 a") #'projectile-find-other-file-other-window) + (define-key map (kbd "4 b") #'projectile-switch-to-buffer-other-window) + (define-key map (kbd "4 C-o") #'projectile-display-buffer) + (define-key map (kbd "4 d") #'projectile-find-dir-other-window) + (define-key map (kbd "4 D") #'projectile-dired-other-window) + (define-key map (kbd "4 f") #'projectile-find-file-other-window) + (define-key map (kbd "4 g") #'projectile-find-file-dwim-other-window) + (define-key map (kbd "4 t") #'projectile-find-implementation-or-test-other-window) + (define-key map (kbd "5 a") #'projectile-find-other-file-other-frame) + (define-key map (kbd "5 b") #'projectile-switch-to-buffer-other-frame) + (define-key map (kbd "5 d") #'projectile-find-dir-other-frame) + (define-key map (kbd "5 D") #'projectile-dired-other-frame) + (define-key map (kbd "5 f") #'projectile-find-file-other-frame) + (define-key map (kbd "5 g") #'projectile-find-file-dwim-other-frame) + (define-key map (kbd "5 t") #'projectile-find-implementation-or-test-other-frame) + (define-key map (kbd "!") #'projectile-run-shell-command-in-root) + (define-key map (kbd "&") #'projectile-run-async-shell-command-in-root) + (define-key map (kbd "a") #'projectile-find-other-file) + (define-key map (kbd "b") #'projectile-switch-to-buffer) + (define-key map (kbd "d") #'projectile-find-dir) + (define-key map (kbd "D") #'projectile-dired) + (define-key map (kbd "e") #'projectile-recentf) + (define-key map (kbd "E") #'projectile-edit-dir-locals) + (define-key map (kbd "f") #'projectile-find-file) + (define-key map (kbd "g") #'projectile-find-file-dwim) + (define-key map (kbd "F") #'projectile-find-file-in-known-projects) + (define-key map (kbd "i") #'projectile-invalidate-cache) + (define-key map (kbd "I") #'projectile-ibuffer) + (define-key map (kbd "j") #'projectile-find-tag) + (define-key map (kbd "k") #'projectile-kill-buffers) + (define-key map (kbd "l") #'projectile-find-file-in-directory) + (define-key map (kbd "m") #'projectile-commander) + (define-key map (kbd "o") #'projectile-multi-occur) + (define-key map (kbd "p") #'projectile-switch-project) + (define-key map (kbd "q") #'projectile-switch-open-project) + (define-key map (kbd "r") #'projectile-replace) + (define-key map (kbd "R") #'projectile-regenerate-tags) + (define-key map (kbd "s g") #'projectile-grep) + (define-key map (kbd "s r") #'projectile-ripgrep) + (define-key map (kbd "s s") #'projectile-ag) + (define-key map (kbd "S") #'projectile-save-project-buffers) + (define-key map (kbd "t") #'projectile-toggle-between-implementation-and-test) + (define-key map (kbd "T") #'projectile-find-test-file) + (define-key map (kbd "v") #'projectile-vc) + (define-key map (kbd "V") #'projectile-browse-dirty-projects) + ;; project lifecycle external commands + ;; TODO: Bundle those under some prefix key + (define-key map (kbd "C") #'projectile-configure-project) + (define-key map (kbd "c") #'projectile-compile-project) + (define-key map (kbd "K") #'projectile-package-project) + (define-key map (kbd "L") #'projectile-install-project) + (define-key map (kbd "P") #'projectile-test-project) + (define-key map (kbd "u") #'projectile-run-project) + ;; utilities + (define-key map (kbd "x e") #'projectile-run-eshell) + (define-key map (kbd "x i") #'projectile-run-ielm) + (define-key map (kbd "x t") #'projectile-run-term) + (define-key map (kbd "x s") #'projectile-run-shell) + (define-key map (kbd "x g") #'projectile-run-gdb) + (define-key map (kbd "x v") #'projectile-run-vterm) + (define-key map (kbd "z") #'projectile-cache-current-file) + (define-key map (kbd "<left>") #'projectile-previous-project-buffer) + (define-key map (kbd "<right>") #'projectile-next-project-buffer) + (define-key map (kbd "ESC") #'projectile-project-buffers-other-buffer) + map) + "Keymap for Projectile commands after `projectile-keymap-prefix'.") +(fset 'projectile-command-map projectile-command-map) + +(defvar projectile-mode-map + (let ((map (make-sparse-keymap))) + (when projectile-keymap-prefix + (define-key map projectile-keymap-prefix 'projectile-command-map)) + (easy-menu-define projectile-mode-menu map + "Menu for Projectile" + '("Projectile" + ["Find file" projectile-find-file] + ["Find file in known projects" projectile-find-file-in-known-projects] + ["Find test file" projectile-find-test-file] + ["Find directory" projectile-find-dir] + ["Find file in directory" projectile-find-file-in-directory] + ["Find other file" projectile-find-other-file] + ["Switch to buffer" projectile-switch-to-buffer] + ["Jump between implementation file and test file" projectile-toggle-between-implementation-and-test] + ["Kill project buffers" projectile-kill-buffers] + ["Save project buffers" projectile-save-project-buffers] + ["Recent files" projectile-recentf] + ["Previous buffer" projectile-previous-project-buffer] + ["Next buffer" projectile-next-project-buffer] + "--" + ["Toggle project wide read-only" projectile-toggle-project-read-only] + ["Edit .dir-locals.el" projectile-edit-dir-locals] + "--" + ["Switch to project" projectile-switch-project] + ["Switch to open project" projectile-switch-open-project] + ["Discover projects in directory" projectile-discover-projects-in-directory] + ["Clear known projects" projectile-clear-known-projects] + ["Reset known projects" projectile-reset-known-projects] + ["Browse dirty projects" projectile-browse-dirty-projects] + ["Open project in dired" projectile-dired] + "--" + ["Search in project (grep)" projectile-grep] + ["Search in project (ag)" projectile-ag] + ["Replace in project" projectile-replace] + ["Multi-occur in project" projectile-multi-occur] + "--" + ["Run GDB" projectile-run-gdb] + "--" + ["Run shell" projectile-run-shell] + ["Run eshell" projectile-run-eshell] + ["Run ielm" projectile-run-ielm] + ["Run term" projectile-run-term] + "--" + ["Cache current file" projectile-cache-current-file] + ["Invalidate cache" projectile-invalidate-cache] + ["Regenerate [e|g]tags" projectile-regenerate-tags] + "--" + ["Configure project" projectile-configure-project] + ["Compile project" projectile-compile-project] + ["Test project" projectile-test-project] + ["Install project" projectile-install-project] + ["Package project" projectile-package-project] + ["Run project" projectile-run-project] + ["Repeat last external command" projectile-repeat-last-command] + "--" + ["Project info" projectile-project-info] + ["About" projectile-version])) + map) + "Keymap for Projectile mode.") + +(defun projectile-find-file-hook-function () + "Called by `find-file-hook' when `projectile-mode' is on. + +The function does pretty much nothing when triggered on remote files +as all the operations it normally performs are extremely slow over +tramp." + (projectile-maybe-limit-project-file-buffers) + (unless (file-remote-p default-directory) + (when projectile-dynamic-mode-line + (projectile-update-mode-line)) + (when projectile-auto-update-cache + (projectile-cache-files-find-file-hook)) + (projectile-track-known-projects-find-file-hook) + (projectile-visit-project-tags-table))) + +(defun projectile-maybe-limit-project-file-buffers () + "Limit the opened file buffers for a project. + +The function simply kills the last buffer, as it's normally called +when opening new files." + (when projectile-max-file-buffer-count + (let ((project-buffers (projectile-project-buffer-files))) + (when (> (length project-buffers) projectile-max-file-buffer-count) + (kill-buffer (car (last project-buffers))))))) + +;;;###autoload +(define-minor-mode projectile-mode + "Minor mode to assist project management and navigation. + +When called interactively, toggle `projectile-mode'. With prefix +ARG, enable `projectile-mode' if ARG is positive, otherwise disable +it. + +When called from Lisp, enable `projectile-mode' if ARG is omitted, +nil or positive. If ARG is `toggle', toggle `projectile-mode'. +Otherwise behave as if called interactively. + +\\{projectile-mode-map}" + :lighter projectile--mode-line + :keymap projectile-mode-map + :group 'projectile + :require 'projectile + :global t + (cond + (projectile-mode + ;; setup the commander bindings + (projectile-commander-bindings) + ;; initialize the projects cache if needed + (unless projectile-projects-cache + (setq projectile-projects-cache + (or (projectile-unserialize projectile-cache-file) + (make-hash-table :test 'equal)))) + (unless projectile-projects-cache-time + (setq projectile-projects-cache-time + (make-hash-table :test 'equal))) + ;; load the known projects + (projectile-load-known-projects) + ;; update the list of known projects + (projectile--cleanup-known-projects) + (when projectile-auto-discover + (projectile-discover-projects-in-search-path)) + (add-hook 'find-file-hook 'projectile-find-file-hook-function) + (add-hook 'projectile-find-dir-hook #'projectile-track-known-projects-find-file-hook t) + (add-hook 'dired-before-readin-hook #'projectile-track-known-projects-find-file-hook t t) + (advice-add 'compilation-find-file :around #'compilation-find-file-projectile-find-compilation-buffer) + (advice-add 'delete-file :before #'delete-file-projectile-remove-from-cache)) + (t + (remove-hook 'find-file-hook #'projectile-find-file-hook-function) + (remove-hook 'dired-before-readin-hook #'projectile-track-known-projects-find-file-hook t) + (advice-remove 'compilation-find-file #'compilation-find-file-projectile-find-compilation-buffer) + (advice-remove 'delete-file #'delete-file-projectile-remove-from-cache)))) + +;;; savehist-mode - When `savehist-mode' is t, projectile-project-command-history will be saved. +;; See https://github.com/bbatsov/projectile/issues/1637 for more details +(if (bound-and-true-p savehist-loaded) + (add-to-list 'savehist-additional-variables 'projectile-project-command-history) + (defvar savehist-additional-variables nil) + (add-hook 'savehist-mode-hook + (lambda() + (add-to-list 'savehist-additional-variables 'projectile-project-command-history)))) + +;;;###autoload +(define-obsolete-function-alias 'projectile-global-mode 'projectile-mode "1.0") + +(provide 'projectile) + +;;; projectile.el ends here diff --git a/.emacs.d/elpa/projectile-20210607.1513/projectile.elc b/.emacs.d/elpa/projectile-20210607.1513/projectile.elc new file mode 100644 index 0000000..22897eb Binary files /dev/null and b/.emacs.d/elpa/projectile-20210607.1513/projectile.elc differ diff --git a/.emacs.d/elpa/s-20210603.736/s-autoloads.el b/.emacs.d/elpa/s-20210603.736/s-autoloads.el new file mode 100644 index 0000000..a232497 --- /dev/null +++ b/.emacs.d/elpa/s-20210603.736/s-autoloads.el @@ -0,0 +1,22 @@ +;;; s-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "s" "s.el" (0 0 0 0)) +;;; Generated autoloads from s.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "s" '("s-"))) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; s-autoloads.el ends here diff --git a/.emacs.d/elpa/s-20210603.736/s-pkg.el b/.emacs.d/elpa/s-20210603.736/s-pkg.el new file mode 100644 index 0000000..4c4bd58 --- /dev/null +++ b/.emacs.d/elpa/s-20210603.736/s-pkg.el @@ -0,0 +1,2 @@ +;;; Generated package description from s.el -*- no-byte-compile: t -*- +(define-package "s" "20210603.736" "The long lost Emacs string manipulation library." 'nil :commit "e1710af8d058faca32529d1129deb5d57871385a" :authors '(("Magnar Sveen" . "magnars@gmail.com")) :maintainer '("Magnar Sveen" . "magnars@gmail.com") :keywords '("strings")) diff --git a/.emacs.d/elpa/s-20210603.736/s.el b/.emacs.d/elpa/s-20210603.736/s.el new file mode 100644 index 0000000..5244ace --- /dev/null +++ b/.emacs.d/elpa/s-20210603.736/s.el @@ -0,0 +1,744 @@ +;;; s.el --- The long lost Emacs string manipulation library. + +;; Copyright (C) 2012-2015 Magnar Sveen + +;; Author: Magnar Sveen <magnars@gmail.com> +;; Version: 1.12.0 +;; Package-Version: 20210603.736 +;; Package-Commit: e1710af8d058faca32529d1129deb5d57871385a +;; Keywords: strings + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: + +;; The long lost Emacs string manipulation library. +;; +;; See documentation on https://github.com/magnars/s.el#functions + +;;; Code: + +;; Silence byte-compiler +(defvar ucs-normalize-combining-chars) ; Defined in `ucs-normalize' +(autoload 'slot-value "eieio") + +(defun s-trim-left (s) + "Remove whitespace at the beginning of S." + (declare (pure t) (side-effect-free t)) + (save-match-data + (if (string-match "\\`[ \t\n\r]+" s) + (replace-match "" t t s) + s))) + +(defun s-trim-right (s) + "Remove whitespace at the end of S." + (save-match-data + (declare (pure t) (side-effect-free t)) + (if (string-match "[ \t\n\r]+\\'" s) + (replace-match "" t t s) + s))) + +(defun s-trim (s) + "Remove whitespace at the beginning and end of S." + (declare (pure t) (side-effect-free t)) + (s-trim-left (s-trim-right s))) + +(defun s-collapse-whitespace (s) + "Convert all adjacent whitespace characters to a single space." + (declare (pure t) (side-effect-free t)) + (replace-regexp-in-string "[ \t\n\r]+" " " s)) + +(defun s-split (separator s &optional omit-nulls) + "Split S into substrings bounded by matches for regexp SEPARATOR. +If OMIT-NULLS is non-nil, zero-length substrings are omitted. + +This is a simple wrapper around the built-in `split-string'." + (declare (side-effect-free t)) + (save-match-data + (split-string s separator omit-nulls))) + +(defun s-split-up-to (separator s n &optional omit-nulls) + "Split S up to N times into substrings bounded by matches for regexp SEPARATOR. + +If OMIT-NULLS is non-nil, zero-length substrings are omitted. + +See also `s-split'." + (declare (side-effect-free t)) + (save-match-data + (let ((op 0) + (r nil)) + (with-temp-buffer + (insert s) + (setq op (goto-char (point-min))) + (while (and (re-search-forward separator nil t) + (< 0 n)) + (let ((sub (buffer-substring op (match-beginning 0)))) + (unless (and omit-nulls + (equal sub "")) + (push sub r))) + (setq op (goto-char (match-end 0))) + (setq n (1- n))) + (let ((sub (buffer-substring op (point-max)))) + (unless (and omit-nulls + (equal sub "")) + (push sub r)))) + (nreverse r)))) + +(defun s-lines (s) + "Splits S into a list of strings on newline characters." + (declare (pure t) (side-effect-free t)) + (s-split "\\(\r\n\\|[\n\r]\\)" s)) + +(defun s-join (separator strings) + "Join all the strings in STRINGS with SEPARATOR in between." + (declare (pure t) (side-effect-free t)) + (mapconcat 'identity strings separator)) + +(defun s-concat (&rest strings) + "Join all the string arguments into one string." + (declare (pure t) (side-effect-free t)) + (apply 'concat strings)) + +(defun s-prepend (prefix s) + "Concatenate PREFIX and S." + (declare (pure t) (side-effect-free t)) + (concat prefix s)) + +(defun s-append (suffix s) + "Concatenate S and SUFFIX." + (declare (pure t) (side-effect-free t)) + (concat s suffix)) + +(defun s-repeat (num s) + "Make a string of S repeated NUM times." + (declare (pure t) (side-effect-free t)) + (let (ss) + (while (> num 0) + (setq ss (cons s ss)) + (setq num (1- num))) + (apply 'concat ss))) + +(defun s-chop-suffix (suffix s) + "Remove SUFFIX if it is at end of S." + (declare (pure t) (side-effect-free t)) + (let ((pos (- (length suffix)))) + (if (and (>= (length s) (length suffix)) + (string= suffix (substring s pos))) + (substring s 0 pos) + s))) + +(defun s-chop-suffixes (suffixes s) + "Remove SUFFIXES one by one in order, if they are at the end of S." + (declare (pure t) (side-effect-free t)) + (while suffixes + (setq s (s-chop-suffix (car suffixes) s)) + (setq suffixes (cdr suffixes))) + s) + +(defun s-chop-prefix (prefix s) + "Remove PREFIX if it is at the start of S." + (declare (pure t) (side-effect-free t)) + (let ((pos (length prefix))) + (if (and (>= (length s) (length prefix)) + (string= prefix (substring s 0 pos))) + (substring s pos) + s))) + +(defun s-chop-prefixes (prefixes s) + "Remove PREFIXES one by one in order, if they are at the start of S." + (declare (pure t) (side-effect-free t)) + (while prefixes + (setq s (s-chop-prefix (car prefixes) s)) + (setq prefixes (cdr prefixes))) + s) + +(defun s-shared-start (s1 s2) + "Returns the longest prefix S1 and S2 have in common." + (declare (pure t) (side-effect-free t)) + (let ((cmp (compare-strings s1 0 (length s1) s2 0 (length s2)))) + (if (eq cmp t) s1 (substring s1 0 (1- (abs cmp)))))) + +(defun s-shared-end (s1 s2) + "Returns the longest suffix S1 and S2 have in common." + (declare (pure t) (side-effect-free t)) + (let* ((l1 (length s1)) + (l2 (length s2)) + (search-length (min l1 l2)) + (i 0)) + (while (and (< i search-length) + (= (aref s1 (- l1 i 1)) (aref s2 (- l2 i 1)))) + (setq i (1+ i))) + ;; If I is 0, then it means that there's no common suffix between + ;; S1 and S2. + ;; + ;; However, since (substring s (- 0)) will return the whole + ;; string, `s-shared-end' should simply return the empty string + ;; when I is 0. + (if (zerop i) + "" + (substring s1 (- i))))) + +(defun s-chomp (s) + "Remove one trailing `\\n`, `\\r` or `\\r\\n` from S." + (declare (pure t) (side-effect-free t)) + (s-chop-suffixes '("\n" "\r") s)) + +(defun s-truncate (len s &optional ellipsis) + "If S is longer than LEN, cut it down and add ELLIPSIS to the end. + +The resulting string, including ellipsis, will be LEN characters +long. + +When not specified, ELLIPSIS defaults to ‘...’." + (declare (pure t) (side-effect-free t)) + (unless ellipsis + (setq ellipsis "...")) + (if (> (length s) len) + (format "%s%s" (substring s 0 (- len (length ellipsis))) ellipsis) + s)) + +(defun s-word-wrap (len s) + "If S is longer than LEN, wrap the words with newlines." + (declare (side-effect-free t)) + (save-match-data + (with-temp-buffer + (insert s) + (let ((fill-column len)) + (fill-region (point-min) (point-max))) + (buffer-substring (point-min) (point-max))))) + +(defun s-center (len s) + "If S is shorter than LEN, pad it with spaces so it is centered." + (declare (pure t) (side-effect-free t)) + (let ((extra (max 0 (- len (length s))))) + (concat + (make-string (ceiling extra 2) ? ) + s + (make-string (floor extra 2) ? )))) + +(defun s-pad-left (len padding s) + "If S is shorter than LEN, pad it with PADDING on the left." + (declare (pure t) (side-effect-free t)) + (let ((extra (max 0 (- len (length s))))) + (concat (make-string extra (string-to-char padding)) + s))) + +(defun s-pad-right (len padding s) + "If S is shorter than LEN, pad it with PADDING on the right." + (declare (pure t) (side-effect-free t)) + (let ((extra (max 0 (- len (length s))))) + (concat s + (make-string extra (string-to-char padding))))) + +(defun s-left (len s) + "Returns up to the LEN first chars of S." + (declare (pure t) (side-effect-free t)) + (if (> (length s) len) + (substring s 0 len) + s)) + +(defun s-right (len s) + "Returns up to the LEN last chars of S." + (declare (pure t) (side-effect-free t)) + (let ((l (length s))) + (if (> l len) + (substring s (- l len) l) + s))) + +(defun s-ends-with? (suffix s &optional ignore-case) + "Does S end with SUFFIX? + +If IGNORE-CASE is non-nil, the comparison is done without paying +attention to case differences. + +Alias: `s-suffix?'" + (declare (pure t) (side-effect-free t)) + (let ((start-pos (- (length s) (length suffix)))) + (and (>= start-pos 0) + (eq t (compare-strings suffix nil nil + s start-pos nil ignore-case))))) + +(defun s-starts-with? (prefix s &optional ignore-case) + "Does S start with PREFIX? + +If IGNORE-CASE is non-nil, the comparison is done without paying +attention to case differences. + +Alias: `s-prefix?'. This is a simple wrapper around the built-in +`string-prefix-p'." + (declare (pure t) (side-effect-free t)) + (string-prefix-p prefix s ignore-case)) + +(defun s--truthy? (val) + (declare (pure t) (side-effect-free t)) + (not (null val))) + +(defun s-contains? (needle s &optional ignore-case) + "Does S contain NEEDLE? + +If IGNORE-CASE is non-nil, the comparison is done without paying +attention to case differences." + (declare (pure t) (side-effect-free t)) + (let ((case-fold-search ignore-case)) + (s--truthy? (string-match-p (regexp-quote needle) s)))) + +(defun s-equals? (s1 s2) + "Is S1 equal to S2? + +This is a simple wrapper around the built-in `string-equal'." + (declare (pure t) (side-effect-free t)) + (string-equal s1 s2)) + +(defun s-less? (s1 s2) + "Is S1 less than S2? + +This is a simple wrapper around the built-in `string-lessp'." + (declare (pure t) (side-effect-free t)) + (string-lessp s1 s2)) + +(defun s-matches? (regexp s &optional start) + "Does REGEXP match S? +If START is non-nil the search starts at that index. + +This is a simple wrapper around the built-in `string-match-p'." + (declare (side-effect-free t)) + (s--truthy? (string-match-p regexp s start))) + +(defun s-blank? (s) + "Is S nil or the empty string?" + (declare (pure t) (side-effect-free t)) + (or (null s) (string= "" s))) + +(defun s-blank-str? (s) + "Is S nil or the empty string or string only contains whitespace?" + (declare (pure t) (side-effect-free t)) + (or (s-blank? s) (s-blank? (s-trim s)))) + +(defun s-present? (s) + "Is S anything but nil or the empty string?" + (declare (pure t) (side-effect-free t)) + (not (s-blank? s))) + +(defun s-presence (s) + "Return S if it's `s-present?', otherwise return nil." + (declare (pure t) (side-effect-free t)) + (and (s-present? s) s)) + +(defun s-lowercase? (s) + "Are all the letters in S in lower case?" + (declare (side-effect-free t)) + (let ((case-fold-search nil)) + (not (string-match-p "[[:upper:]]" s)))) + +(defun s-uppercase? (s) + "Are all the letters in S in upper case?" + (declare (side-effect-free t)) + (let ((case-fold-search nil)) + (not (string-match-p "[[:lower:]]" s)))) + +(defun s-mixedcase? (s) + "Are there both lower case and upper case letters in S?" + (let ((case-fold-search nil)) + (s--truthy? + (and (string-match-p "[[:lower:]]" s) + (string-match-p "[[:upper:]]" s))))) + +(defun s-capitalized? (s) + "In S, is the first letter upper case, and all other letters lower case?" + (declare (side-effect-free t)) + (let ((case-fold-search nil)) + (s--truthy? + (string-match-p "^[[:upper:]][^[:upper:]]*$" s)))) + +(defun s-numeric? (s) + "Is S a number?" + (declare (pure t) (side-effect-free t)) + (s--truthy? + (string-match-p "^[0-9]+$" s))) + +(defun s-replace (old new s) + "Replaces OLD with NEW in S." + (declare (pure t) (side-effect-free t)) + (replace-regexp-in-string (regexp-quote old) new s t t)) + +(defalias 's-replace-regexp 'replace-regexp-in-string) + +(defun s--aget (alist key) + (declare (pure t) (side-effect-free t)) + (cdr (assoc-string key alist))) + +(defun s-replace-all (replacements s) + "REPLACEMENTS is a list of cons-cells. Each `car` is replaced with `cdr` in S." + (declare (pure t) (side-effect-free t)) + (replace-regexp-in-string (regexp-opt (mapcar 'car replacements)) + (lambda (it) (s--aget replacements it)) + s t t)) + +(defun s-downcase (s) + "Convert S to lower case. + +This is a simple wrapper around the built-in `downcase'." + (declare (side-effect-free t)) + (downcase s)) + +(defun s-upcase (s) + "Convert S to upper case. + +This is a simple wrapper around the built-in `upcase'." + (declare (side-effect-free t)) + (upcase s)) + +(defun s-capitalize (s) + "Convert the first word's first character to upper case and the rest to lower case in S." + (declare (side-effect-free t)) + (concat (upcase (substring s 0 1)) (downcase (substring s 1)))) + +(defun s-titleize (s) + "Convert each word's first character to upper case and the rest to lower case in S. + +This is a simple wrapper around the built-in `capitalize'." + (declare (side-effect-free t)) + (capitalize s)) + +(defmacro s-with (s form &rest more) + "Threads S through the forms. Inserts S as the last item +in the first form, making a list of it if it is not a list +already. If there are more forms, inserts the first form as the +last item in second form, etc." + (declare (debug (form &rest [&or (function &rest form) fboundp]))) + (if (null more) + (if (listp form) + `(,(car form) ,@(cdr form) ,s) + (list form s)) + `(s-with (s-with ,s ,form) ,@more))) + +(put 's-with 'lisp-indent-function 1) + +(defun s-index-of (needle s &optional ignore-case) + "Returns first index of NEEDLE in S, or nil. + +If IGNORE-CASE is non-nil, the comparison is done without paying +attention to case differences." + (declare (pure t) (side-effect-free t)) + (let ((case-fold-search ignore-case)) + (string-match-p (regexp-quote needle) s))) + +(defun s-reverse (s) + "Return the reverse of S." + (declare (pure t) (side-effect-free t)) + (save-match-data + (if (multibyte-string-p s) + (let ((input (string-to-list s)) + output) + (require 'ucs-normalize) + (while input + ;; Handle entire grapheme cluster as a single unit + (let ((grapheme (list (pop input)))) + (while (memql (car input) ucs-normalize-combining-chars) + (push (pop input) grapheme)) + (setq output (nconc (nreverse grapheme) output)))) + (concat output)) + (concat (nreverse (string-to-list s)))))) + +(defun s-match-strings-all (regex string) + "Return a list of matches for REGEX in STRING. + +Each element itself is a list of matches, as per +`match-string'. Multiple matches at the same position will be +ignored after the first." + (declare (side-effect-free t)) + (save-match-data + (let ((all-strings ()) + (i 0)) + (while (and (< i (length string)) + (string-match regex string i)) + (setq i (1+ (match-beginning 0))) + (let (strings + (num-matches (/ (length (match-data)) 2)) + (match 0)) + (while (/= match num-matches) + (push (match-string match string) strings) + (setq match (1+ match))) + (push (nreverse strings) all-strings))) + (nreverse all-strings)))) + +(defun s-matched-positions-all (regexp string &optional subexp-depth) + "Return a list of matched positions for REGEXP in STRING. +SUBEXP-DEPTH is 0 by default." + (declare (side-effect-free t)) + (if (null subexp-depth) + (setq subexp-depth 0)) + (save-match-data + (let ((pos 0) result) + (while (and (string-match regexp string pos) + (< pos (length string))) + (let ((m (match-end subexp-depth))) + (push (cons (match-beginning subexp-depth) (match-end subexp-depth)) result) + (setq pos (match-end 0)))) + (nreverse result)))) + +(defun s-match (regexp s &optional start) + "When the given expression matches the string, this function returns a list +of the whole matching string and a string for each matched subexpressions. +If it did not match the returned value is an empty list (nil). + +When START is non-nil the search will start at that index." + (declare (side-effect-free t)) + (save-match-data + (if (string-match regexp s start) + (let ((match-data-list (match-data)) + result) + (while match-data-list + (let* ((beg (car match-data-list)) + (end (cadr match-data-list)) + (subs (if (and beg end) (substring s beg end) nil))) + (setq result (cons subs result)) + (setq match-data-list + (cddr match-data-list)))) + (nreverse result))))) + +(defun s-slice-at (regexp s) + "Slices S up at every index matching REGEXP." + (declare (side-effect-free t)) + (if (= 0 (length s)) (list "") + (save-match-data + (let (i) + (setq i (string-match regexp s 1)) + (if i + (cons (substring s 0 i) + (s-slice-at regexp (substring s i))) + (list s)))))) + +(defun s-split-words (s) + "Split S into list of words." + (declare (side-effect-free t)) + (s-split + "[^[:word:]0-9]+" + (let ((case-fold-search nil)) + (replace-regexp-in-string + "\\([[:lower:]]\\)\\([[:upper:]]\\)" "\\1 \\2" + (replace-regexp-in-string "\\([[:upper:]]\\)\\([[:upper:]][0-9[:lower:]]\\)" "\\1 \\2" s))) + t)) + +(defun s--mapcar-head (fn-head fn-rest list) + "Like MAPCAR, but applies a different function to the first element." + (if list + (cons (funcall fn-head (car list)) (mapcar fn-rest (cdr list))))) + +(defun s-lower-camel-case (s) + "Convert S to lowerCamelCase." + (declare (side-effect-free t)) + (s-join "" (s--mapcar-head 'downcase 'capitalize (s-split-words s)))) + +(defun s-upper-camel-case (s) + "Convert S to UpperCamelCase." + (declare (side-effect-free t)) + (s-join "" (mapcar 'capitalize (s-split-words s)))) + +(defun s-snake-case (s) + "Convert S to snake_case." + (declare (side-effect-free t)) + (s-join "_" (mapcar 'downcase (s-split-words s)))) + +(defun s-dashed-words (s) + "Convert S to dashed-words." + (declare (side-effect-free t)) + (s-join "-" (mapcar 'downcase (s-split-words s)))) + +(defun s-capitalized-words (s) + "Convert S to Capitalized words." + (declare (side-effect-free t)) + (let ((words (s-split-words s))) + (s-join " " (cons (capitalize (car words)) (mapcar 'downcase (cdr words)))))) + +(defun s-titleized-words (s) + "Convert S to Titleized Words." + (declare (side-effect-free t)) + (s-join " " (mapcar 's-titleize (s-split-words s)))) + +(defun s-word-initials (s) + "Convert S to its initials." + (declare (side-effect-free t)) + (s-join "" (mapcar (lambda (ss) (substring ss 0 1)) + (s-split-words s)))) + +;; Errors for s-format +(progn + (put 's-format-resolve + 'error-conditions + '(error s-format s-format-resolve)) + (put 's-format-resolve + 'error-message + "Cannot resolve a template to values")) + +(defun s-format (template replacer &optional extra) + "Format TEMPLATE with the function REPLACER. + +REPLACER takes an argument of the format variable and optionally +an extra argument which is the EXTRA value from the call to +`s-format'. + +Several standard `s-format' helper functions are recognized and +adapted for this: + + (s-format \"${name}\" 'gethash hash-table) + (s-format \"${name}\" 'aget alist) + (s-format \"$0\" 'elt sequence) + +The REPLACER function may be used to do any other kind of +transformation." + (let ((saved-match-data (match-data))) + (unwind-protect + (replace-regexp-in-string + "\\$\\({\\([^}]+\\)}\\|[0-9]+\\)" + (lambda (md) + (let ((var + (let ((m (match-string 2 md))) + (if m m + (string-to-number (match-string 1 md))))) + (replacer-match-data (match-data))) + (unwind-protect + (let ((v + (cond + ((eq replacer 'gethash) + (funcall replacer var extra)) + ((eq replacer 'aget) + (funcall 's--aget extra var)) + ((eq replacer 'elt) + (funcall replacer extra var)) + ((eq replacer 'oref) + (funcall #'slot-value extra (intern var))) + (t + (set-match-data saved-match-data) + (if extra + (funcall replacer var extra) + (funcall replacer var)))))) + (if v (format "%s" v) (signal 's-format-resolve md))) + (set-match-data replacer-match-data)))) template + ;; Need literal to make sure it works + t t) + (set-match-data saved-match-data)))) + +(defvar s-lex-value-as-lisp nil + "If `t' interpolate lisp values as lisp. + +`s-lex-format' inserts values with (format \"%S\").") + +(defun s-lex-fmt|expand (fmt) + "Expand FMT into lisp." + (declare (side-effect-free t)) + (list 's-format fmt (quote 'aget) + (append '(list) + (mapcar + (lambda (matches) + (list + 'cons + (cadr matches) + `(format + (if s-lex-value-as-lisp "%S" "%s") + ,(intern (cadr matches))))) + (s-match-strings-all "${\\([^}]+\\)}" fmt))))) + +(defmacro s-lex-format (format-str) + "`s-format` with the current environment. + +FORMAT-STR may use the `s-format' variable reference to refer to +any variable: + + (let ((x 1)) + (s-lex-format \"x is: ${x}\")) + +The values of the variables are interpolated with \"%s\" unless +the variable `s-lex-value-as-lisp' is `t' and then they are +interpolated with \"%S\"." + (declare (debug (form))) + (s-lex-fmt|expand format-str)) + +(defun s-count-matches (regexp s &optional start end) + "Count occurrences of `regexp' in `s'. + +`start', inclusive, and `end', exclusive, delimit the part of `s' to +match. `start' and `end' are both indexed starting at 1; the initial +character in `s' is index 1. + +This function starts looking for the next match from the end of the +previous match. Hence, it ignores matches that overlap a previously +found match. To count overlapping matches, use +`s-count-matches-all'." + (declare (side-effect-free t)) + (save-match-data + (with-temp-buffer + (insert s) + (goto-char (point-min)) + (count-matches regexp (or start 1) (or end (point-max)))))) + +(defun s-count-matches-all (regexp s &optional start end) + "Count occurrences of `regexp' in `s'. + +`start', inclusive, and `end', exclusive, delimit the part of `s' to +match. `start' and `end' are both indexed starting at 1; the initial +character in `s' is index 1. + +This function starts looking for the next match from the second +character of the previous match. Hence, it counts matches that +overlap a previously found match. To ignore matches that overlap a +previously found match, use `s-count-matches'." + (declare (side-effect-free t)) + (let* ((anchored-regexp (format "^%s" regexp)) + (match-count 0) + (i 0) + (narrowed-s (substring s + (when start (1- start)) + (when end (1- end))))) + (save-match-data + (while (< i (length narrowed-s)) + (when (s-matches? anchored-regexp (substring narrowed-s i)) + (setq match-count (1+ match-count))) + (setq i (1+ i)))) + match-count)) + +(defun s-wrap (s prefix &optional suffix) + "Wrap string S with PREFIX and optionally SUFFIX. + +Return string S with PREFIX prepended. If SUFFIX is present, it +is appended, otherwise PREFIX is used as both prefix and +suffix." + (declare (pure t) (side-effect-free t)) + (concat prefix s (or suffix prefix))) + + +;;; Aliases + +(defalias 's-blank-p 's-blank?) +(defalias 's-blank-str-p 's-blank-str?) +(defalias 's-capitalized-p 's-capitalized?) +(defalias 's-contains-p 's-contains?) +(defalias 's-ends-with-p 's-ends-with?) +(defalias 's-equals-p 's-equals?) +(defalias 's-less-p 's-less?) +(defalias 's-lowercase-p 's-lowercase?) +(defalias 's-matches-p 's-matches?) +(defalias 's-mixedcase-p 's-mixedcase?) +(defalias 's-numeric-p 's-numeric?) +(defalias 's-prefix-p 's-starts-with?) +(defalias 's-prefix? 's-starts-with?) +(defalias 's-present-p 's-present?) +(defalias 's-starts-with-p 's-starts-with?) +(defalias 's-suffix-p 's-ends-with?) +(defalias 's-suffix? 's-ends-with?) +(defalias 's-uppercase-p 's-uppercase?) + + +(provide 's) +;;; s.el ends here diff --git a/.emacs.d/elpa/s-20210603.736/s.elc b/.emacs.d/elpa/s-20210603.736/s.elc new file mode 100644 index 0000000..619eb49 Binary files /dev/null and b/.emacs.d/elpa/s-20210603.736/s.elc differ diff --git a/.emacs.d/elpa/shrink-path-20190208.1335/shrink-path-autoloads.el b/.emacs.d/elpa/shrink-path-20190208.1335/shrink-path-autoloads.el new file mode 100644 index 0000000..d381af2 --- /dev/null +++ b/.emacs.d/elpa/shrink-path-20190208.1335/shrink-path-autoloads.el @@ -0,0 +1,22 @@ +;;; shrink-path-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "shrink-path" "shrink-path.el" (0 0 0 0)) +;;; Generated autoloads from shrink-path.el + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "shrink-path" '("shrink-path-"))) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; shrink-path-autoloads.el ends here diff --git a/.emacs.d/elpa/shrink-path-20190208.1335/shrink-path-pkg.el b/.emacs.d/elpa/shrink-path-20190208.1335/shrink-path-pkg.el new file mode 100644 index 0000000..c568bd0 --- /dev/null +++ b/.emacs.d/elpa/shrink-path-20190208.1335/shrink-path-pkg.el @@ -0,0 +1,2 @@ +;;; Generated package description from shrink-path.el -*- no-byte-compile: t -*- +(define-package "shrink-path" "20190208.1335" "fish-style path" '((emacs "24") (s "1.6.1") (dash "1.8.0") (f "0.10.0")) :commit "c14882c8599aec79a6e8ef2d06454254bb3e1e41" :authors '(("Benjamin Andresen")) :maintainer '("Benjamin Andresen") :url "https://gitlab.com/bennya/shrink-path.el") diff --git a/.emacs.d/elpa/shrink-path-20190208.1335/shrink-path.el b/.emacs.d/elpa/shrink-path-20190208.1335/shrink-path.el new file mode 100644 index 0000000..154bfd6 --- /dev/null +++ b/.emacs.d/elpa/shrink-path-20190208.1335/shrink-path.el @@ -0,0 +1,150 @@ +;;; shrink-path.el --- fish-style path -*- lexical-binding: t; -*- + +;; Copyright (C) 2017 Benjamin Andresen + +;; Author: Benjamin Andresen +;; Version: 0.3.1 +;; Package-Version: 20190208.1335 +;; Package-Commit: c14882c8599aec79a6e8ef2d06454254bb3e1e41 +;; URL: https://gitlab.com/bennya/shrink-path.el +;; Package-Requires: ((emacs "24") (s "1.6.1") (dash "1.8.0") (f "0.10.0")) + +;; This file is NOT part of GNU Emacs. + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3, or (at your option) +;; any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file LICENSE. If not, write to the +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. + +;;; Commentary: + +;; Provides functions that offer fish shell[1] path truncation. +;; Directory /usr/share/emacs/site-lisp => /u/s/e/site-lisp +;; +;; Also includes utility functions that make integration in eshell or the +;; modeline easier. +;; +;; [1] https://fishshell.com/ + + +;;; Code: +(require 'dash) +(require 's) +(require 'f) +(require 'rx) + +(defun shrink-path--truncate (str) + "Return STR's first character or first two characters if hidden." + (substring str 0 (if (s-starts-with? "." str) 2 1))) + +(defun shrink-path--dirs-internal (full-path &optional truncate-all) + "Return fish-style truncated string based on FULL-PATH. +Optional parameter TRUNCATE-ALL will cause the function to truncate the last +directory too." + (let* ((home (expand-file-name "~")) + (path (replace-regexp-in-string + (s-concat "^" home) "~" full-path)) + (split (s-split "/" path 'omit-nulls)) + (split-len (length split)) + shrunk) + (->> split + (--map-indexed (if (= it-index (1- split-len)) + (if truncate-all (shrink-path--truncate it) it) + (shrink-path--truncate it))) + (s-join "/") + (setq shrunk)) + (s-concat (unless (s-matches? (rx bos (or "~" "/")) shrunk) "/") + shrunk + (unless (s-ends-with? "/" shrunk) "/")))) + + +(defun shrink-path-dirs (&optional path truncate-tail) + "Given PATH return fish-styled shrunken down path. +TRUNCATE-TAIL will cause the function to truncate the last directory too." + (let* ((path (or path default-directory)) + (path (f-full path))) + (cond + ((s-equals? (f-short path) "/") "/") + ((s-matches? (rx bos (or "~" "/") eos) "~/")) + (t (shrink-path--dirs-internal path truncate-tail))))) + +(defun shrink-path-expand (str &optional absolute-p) + "Return expanded path from STR if found or list of matches on multiple. +The path referred to by STR has to exist for this to work. +If ABSOLUTE-P is t the returned path will be absolute." + (let* ((str-split (s-split "/" str 'omit-nulls)) + (head (car str-split))) + (if (= (length str-split) 1) + (s-concat "/" str-split) + (--> (-drop 1 str-split) ;; drop head + (-map (lambda (e) (s-concat e "*")) it) + (-drop-last 1 it) ;; drop tail as it may not exist + (s-join "/" it) + (s-concat (if (s-equals? head "~") "~/" head) it) + (f-glob it) + (-map (lambda (e) (s-concat e "/" (-last-item str-split))) it) + (if absolute-p (-map #'f-full it) (-map #'f-abbrev it)) + (if (= (length it) 1) (car it) it))))) + +(defun shrink-path-prompt (&optional pwd) + "Return cons of BASE and DIR for PWD. +If PWD isn't provided will default to `default-directory'." + (let* ((pwd (or pwd default-directory)) + (shrunk (shrink-path-dirs pwd)) + (split (--> shrunk (s-split "/" it 'omit-nulls))) + base dir) + (setq dir (or (-last-item split) "/")) + (setq base (if (s-equals? dir "/") "" + (s-chop-suffix (s-concat dir "/") shrunk))) + (cons base dir))) + +(defun shrink-path-file (file &optional truncate-tail) + "Return FILE's shrunk down path and filename. +TRUNCATE-TAIL controls if the last directory should also be shortened." + (let ((filename (f-filename file)) + (dirname (f-dirname file))) + (s-concat (shrink-path-dirs dirname truncate-tail) filename))) + +(defun shrink-path-file-expand (str &optional exists-p absolute-p) + "Return STR's expanded filename. +The path referred to by STR has to exist for this to work. +If EXISTS-P is t the filename also has to exist. +If ABSOLUTE-P is t the returned path will be absolute." + (let ((expanded (shrink-path-expand str absolute-p))) + (if (and expanded exists-p) + (if (f-exists? expanded) expanded) + expanded))) + +(defun shrink-path-file-mixed (shrink-path rel-path filename) + "Returns list of mixed truncated file name locations. + +Consists of SHRINK-PATH's parent, SHRINK-PATH basename, relative REL-PATH and +FILENAME. +For use in modeline or prompts, etc." + (let ((shrunk-dirs (shrink-path-prompt shrink-path)) + sp-parent sp-rel rel-rel nd-file) + + (when (f-descendant-of? filename shrink-path) + (when shrunk-dirs + (setq sp-parent (car shrunk-dirs) + sp-rel (cdr shrunk-dirs))) + (setq rel-rel (if (or (f-same? rel-path shrink-path) + (s-equals? (f-relative rel-path shrink-path) ".")) + nil + (f-relative rel-path shrink-path))) + (setq nd-file (file-name-nondirectory filename)) + + (list sp-parent sp-rel rel-rel nd-file)))) + +(provide 'shrink-path) +;;; shrink-path.el ends here diff --git a/.emacs.d/elpa/shrink-path-20190208.1335/shrink-path.elc b/.emacs.d/elpa/shrink-path-20190208.1335/shrink-path.elc new file mode 100644 index 0000000..cdceca4 Binary files /dev/null and b/.emacs.d/elpa/shrink-path-20190208.1335/shrink-path.elc differ diff --git a/.emacs.d/elpa/yasnippet-20200604.246/yasnippet-autoloads.el b/.emacs.d/elpa/yasnippet-20200604.246/yasnippet-autoloads.el new file mode 100644 index 0000000..c429335 --- /dev/null +++ b/.emacs.d/elpa/yasnippet-20200604.246/yasnippet-autoloads.el @@ -0,0 +1,68 @@ +;;; yasnippet-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "yasnippet" "yasnippet.el" (0 0 0 0)) +;;; Generated autoloads from yasnippet.el + +(autoload 'yas-minor-mode "yasnippet" "\ +Toggle YASnippet mode. + +If called interactively, enable Yas minor mode if ARG is +positive, and disable it if ARG is zero or negative. If called +from Lisp, also enable the mode if ARG is omitted or nil, and +toggle it if ARG is `toggle'; disable the mode otherwise. + +When YASnippet mode is enabled, `yas-expand', normally bound to +the TAB key, expands snippets of code depending on the major +mode. + +With no argument, this command toggles the mode. +positive prefix argument turns on the mode. +Negative prefix argument turns off the mode. + +Key bindings: +\\{yas-minor-mode-map} + +\(fn &optional ARG)" t nil) + +(put 'yas-global-mode 'globalized-minor-mode t) + +(defvar yas-global-mode nil "\ +Non-nil if Yas-Global mode is enabled. +See the `yas-global-mode' command +for a description of this minor mode. +Setting this variable directly does not take effect; +either customize it (see the info node `Easy Customization') +or call the function `yas-global-mode'.") + +(custom-autoload 'yas-global-mode "yasnippet" nil) + +(autoload 'yas-global-mode "yasnippet" "\ +Toggle Yas minor mode in all buffers. +With prefix ARG, enable Yas-Global mode if ARG is positive; +otherwise, disable it. If called from Lisp, enable the mode if +ARG is omitted or nil. + +Yas minor mode is enabled in all buffers where +`yas-minor-mode-on' would do it. +See `yas-minor-mode' for more information on Yas minor mode. + +\(fn &optional ARG)" t nil) +(autoload 'snippet-mode "yasnippet" "A mode for editing yasnippets" t nil) + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "yasnippet" '("help-snippet-def" "snippet-mode-map" "yas"))) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; yasnippet-autoloads.el ends here diff --git a/.emacs.d/elpa/yasnippet-20200604.246/yasnippet-pkg.el b/.emacs.d/elpa/yasnippet-20200604.246/yasnippet-pkg.el new file mode 100644 index 0000000..22d3cc6 --- /dev/null +++ b/.emacs.d/elpa/yasnippet-20200604.246/yasnippet-pkg.el @@ -0,0 +1,2 @@ +;;; Generated package description from yasnippet.el -*- no-byte-compile: t -*- +(define-package "yasnippet" "20200604.246" "Yet another snippet extension for Emacs" '((cl-lib "0.5")) :commit "5cbdbf0d2015540c59ed8ee0fcf4788effdf75b6" :maintainer '("Noam Postavsky" . "npostavs@gmail.com") :keywords '("convenience" "emulation") :url "http://github.com/joaotavora/yasnippet") diff --git a/.emacs.d/elpa/yasnippet-20200604.246/yasnippet.el b/.emacs.d/elpa/yasnippet-20200604.246/yasnippet.el new file mode 100644 index 0000000..3eaae4c --- /dev/null +++ b/.emacs.d/elpa/yasnippet-20200604.246/yasnippet.el @@ -0,0 +1,5311 @@ +;;; yasnippet.el --- Yet another snippet extension for Emacs + +;; Copyright (C) 2008-2019 Free Software Foundation, Inc. +;; Authors: pluskid <pluskid@gmail.com>, +;; João Távora <joaotavora@gmail.com>, +;; Noam Postavsky <npostavs@gmail.com> +;; Maintainer: Noam Postavsky <npostavs@gmail.com> +;; Version: 0.14.0 +;; Package-Version: 20200604.246 +;; Package-Commit: 5cbdbf0d2015540c59ed8ee0fcf4788effdf75b6 +;; X-URL: http://github.com/joaotavora/yasnippet +;; Keywords: convenience, emulation +;; URL: http://github.com/joaotavora/yasnippet +;; Package-Requires: ((cl-lib "0.5")) +;; EmacsWiki: YaSnippetMode + +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: +;; +;; Basic steps to setup: +;; +;; (add-to-list 'load-path +;; "~/path-to-yasnippet") +;; (require 'yasnippet) +;; (yas-global-mode 1) +;; +;; +;; Interesting variables are: +;; +;; `yas-snippet-dirs' +;; +;; The directory where user-created snippets are to be +;; stored. Can also be a list of directories. In that case, +;; when used for bulk (re)loading of snippets (at startup or +;; via `yas-reload-all'), directories appearing earlier in +;; the list override other dir's snippets. Also, the first +;; directory is taken as the default for storing the user's +;; new snippets. +;; +;; The deprecated `yas/root-directory' aliases this variable +;; for backward-compatibility. +;; +;; +;; Major commands are: +;; +;; M-x yas-expand +;; +;; Try to expand snippets before point. In `yas-minor-mode', +;; this is normally bound to TAB, but you can customize it in +;; `yas-minor-mode-map'. +;; +;; M-x yas-load-directory +;; +;; Prompts you for a directory hierarchy of snippets to load. +;; +;; M-x yas-activate-extra-mode +;; +;; Prompts you for an extra mode to add snippets for in the +;; current buffer. +;; +;; M-x yas-insert-snippet +;; +;; Prompts you for possible snippet expansion if that is +;; possible according to buffer-local and snippet-local +;; expansion conditions. With prefix argument, ignore these +;; conditions. +;; +;; M-x yas-visit-snippet-file +;; +;; Prompts you for possible snippet expansions like +;; `yas-insert-snippet', but instead of expanding it, takes +;; you directly to the snippet definition's file, if it +;; exists. +;; +;; M-x yas-new-snippet +;; +;; Lets you create a new snippet file in the correct +;; subdirectory of `yas-snippet-dirs', according to the +;; active major mode. +;; +;; M-x yas-load-snippet-buffer +;; +;; When editing a snippet, this loads the snippet. This is +;; bound to "C-c C-c" while in the `snippet-mode' editing +;; mode. +;; +;; M-x yas-tryout-snippet +;; +;; When editing a snippet, this opens a new empty buffer, +;; sets it to the appropriate major mode and inserts the +;; snippet there, so you can see what it looks like. This is +;; bound to "C-c C-t" while in `snippet-mode'. +;; +;; M-x yas-describe-tables +;; +;; Lists known snippets in a separate buffer. User is +;; prompted as to whether only the currently active tables +;; are to be displayed, or all the tables for all major +;; modes. +;; +;; If you have `dropdown-list' installed, you can optionally use it +;; as the preferred "prompting method", putting in your .emacs file, +;; for example: +;; +;; (require 'dropdown-list) +;; (setq yas-prompt-functions '(yas-dropdown-prompt +;; yas-ido-prompt +;; yas-completing-prompt)) +;; +;; Also check out the customization group +;; +;; M-x customize-group RET yasnippet RET +;; +;; If you use the customization group to set variables +;; `yas-snippet-dirs' or `yas-global-mode', make sure the path to +;; "yasnippet.el" is present in the `load-path' *before* the +;; `custom-set-variables' is executed in your .emacs file. +;; +;; For more information and detailed usage, refer to the project page: +;; http://github.com/joaotavora/yasnippet + +;;; Code: + +(require 'cl-lib) +(require 'eldoc) ; Needed for 24. +(declare-function cl-progv-after "cl-extra") ; Needed for 23.4. +(require 'easymenu) +(require 'help-mode) + +(defvar yas--editing-template) +(defvar yas--guessed-modes) +(defvar yas--indent-original-column) +(defvar yas--scheduled-jit-loads) +(defvar yas-keymap) +(defvar yas-selected-text) +(defvar yas-verbosity) +(defvar yas--current-template) + + +;;; User customizable variables + +(defgroup yasnippet nil + "Yet Another Snippet extension" + :prefix "yas-" + :group 'editing) + +(defconst yas--loaddir + (file-name-directory (or load-file-name buffer-file-name)) + "Directory that yasnippet was loaded from.") + +(defconst yas-installed-snippets-dir (expand-file-name "snippets" yas--loaddir)) +(make-obsolete-variable 'yas-installed-snippets-dir "\ +Yasnippet no longer comes with installed snippets" "0.14") + +(defconst yas--default-user-snippets-dir + (expand-file-name "snippets" user-emacs-directory)) + +(defcustom yas-snippet-dirs (list yas--default-user-snippets-dir) + "List of top-level snippet directories. + +Each element, a string or a symbol whose value is a string, +designates a top-level directory where per-mode snippet +directories can be found. + +Elements appearing earlier in the list override later elements' +snippets. + +The first directory is taken as the default for storing snippet's +created with `yas-new-snippet'. " + :type '(choice (directory :tag "Single directory") + (repeat :tag "List of directories" + (choice (directory) (variable)))) + :set #'(lambda (symbol new) + (let ((old (and (boundp symbol) + (symbol-value symbol)))) + (set-default symbol new) + (unless (or (not (fboundp 'yas-reload-all)) + (equal old new)) + (yas-reload-all))))) + +(defun yas-snippet-dirs () + "Return variable `yas-snippet-dirs' as list of strings." + (cl-loop for e in (if (listp yas-snippet-dirs) + yas-snippet-dirs + (list yas-snippet-dirs)) + collect + (cond ((stringp e) e) + ((and (symbolp e) + (boundp e) + (stringp (symbol-value e))) + (symbol-value e)) + (t + (error "[yas] invalid element %s in `yas-snippet-dirs'" e))))) + +(defcustom yas-new-snippet-default "\ +# -*- mode: snippet -*- +# name: $1 +# key: ${2:${1:$(yas--key-from-desc yas-text)}} +# -- +$0`(yas-escape-text yas-selected-text)`" + "Default snippet to use when creating a new snippet. +If nil, don't use any snippet." + :type 'string) + +(defcustom yas-prompt-functions '(yas-dropdown-prompt + yas-completing-prompt + yas-maybe-ido-prompt + yas-no-prompt) + "Functions to prompt for keys, templates, etc interactively. + +These functions are called with the following arguments: + +- PROMPT: A string to prompt the user + +- CHOICES: a list of strings or objects. + +- optional DISPLAY-FN : A function that, when applied to each of +the objects in CHOICES will return a string. + +The return value of any function you put here should be one of +the objects in CHOICES, properly formatted with DISPLAY-FN (if +that is passed). + +- To signal that your particular style of prompting is +unavailable at the moment, you can also have the function return +nil. + +- To signal that the user quit the prompting process, you can +signal `quit' with + + (signal \\='quit \"user quit!\")" + :type '(repeat function)) + +(defcustom yas-indent-line 'auto + "Controls indenting applied to a recent snippet expansion. + +The following values are possible: + +- `fixed' Indent the snippet to the current column; + +- `auto' Indent each line of the snippet with `indent-according-to-mode' + +Every other value means don't apply any snippet-side indentation +after expansion (the manual per-line \"$>\" indentation still +applies)." + :type '(choice (const :tag "Nothing" nothing) + (const :tag "Fixed" fixed) + (const :tag "Auto" auto))) + +(defcustom yas-also-auto-indent-first-line nil + "Non-nil means also auto indent first line according to mode. + +Naturally this is only valid when `yas-indent-line' is `auto'." + :type 'boolean) + +(defcustom yas-also-indent-empty-lines nil + "Non-nil means also indent empty lines according to mode." + :type 'boolean) + +(defcustom yas-snippet-revival t + "Non-nil means re-activate snippet fields after undo/redo." + :type 'boolean) + +(defcustom yas-triggers-in-field nil + "If non-nil, allow stacked expansions (snippets inside snippets). + +Otherwise `yas-next-field-or-maybe-expand' just moves on to the +next field" + :type 'boolean) + +(defcustom yas-fallback-behavior 'return-nil + "This option is obsolete. +Now that the conditional keybinding `yas-maybe-expand' is +available, there's no more need for it." + :type '(choice (const :tag "Call previous command" call-other-command) + (const :tag "Do nothing" return-nil))) + +(make-obsolete-variable + 'yas-fallback-behavior + "For `call-other-command' behavior bind to the conditional +command value `yas-maybe-expand', for `return-nil' behavior bind +directly to `yas-expand'." + "0.12") + +(defcustom yas-choose-keys-first nil + "If non-nil, prompt for snippet key first, then for template. + +Otherwise prompts for all possible snippet names. + +This affects `yas-insert-snippet' and `yas-visit-snippet-file'." + :type 'boolean) + +(defcustom yas-choose-tables-first nil + "If non-nil, and multiple eligible snippet tables, prompts user for tables first. + +Otherwise, user chooses between the merging together of all +eligible tables. + +This affects `yas-insert-snippet', `yas-visit-snippet-file'" + :type 'boolean) + +(defcustom yas-use-menu 'abbreviate + "Display a YASnippet menu in the menu bar. + +When non-nil, submenus for each snippet table will be listed +under the menu \"Yasnippet\". + +- If set to `abbreviate', only the current major-mode +menu and the modes set in `yas--extra-modes' are listed. + +- If set to `full', every submenu is listed + +- If set to nil, hide the menu. + +Any other non-nil value, every submenu is listed." + :type '(choice (const :tag "Full" full) + (const :tag "Abbreviate" abbreviate) + (const :tag "No menu" nil))) + +(defcustom yas-trigger-symbol (or (and (eq window-system 'mac) + (ignore-errors + (char-to-string ?\x21E5))) ;; little ->| sign + " =>") + "The text that will be used in menu to represent the trigger." + :type 'string) + +(defcustom yas-wrap-around-region nil + "What to insert for snippet's $0 field. + +If set to a character, insert contents of corresponding register. +If non-nil insert region contents. This can be overridden on a +per-snippet basis. A value of `cua' is considered equivalent to +`?0' for backwards compatibility." + :type '(choice (character :tag "Insert from register") + (const t :tag "Insert region contents") + (const nil :tag "Don't insert anything") + (const cua))) ; backwards compat + +(defcustom yas-good-grace t + "If non-nil, don't raise errors in elisp evaluation. + +This affects both the inline elisp in snippets and the hook +variables such as `yas-after-exit-snippet-hook'. + +If this variable's value is `inline', an error string \"[yas] +error\" is returned instead of raising the error. If this +variable's value is `hooks', a message is output to according to +`yas-verbosity-level'. If this variable's value is t, both are +active." + :type 'boolean) + +(defcustom yas-visit-from-menu nil + "If non-nil visit snippets's files from menu, instead of expanding them. + +This can only work when snippets are loaded from files." + :type 'boolean) + +(defcustom yas-expand-only-for-last-commands nil + "List of `last-command' values to restrict tab-triggering to, or nil. + +Leave this set at nil (the default) to be able to trigger an +expansion simply by placing the cursor after a valid tab trigger, +using whichever commands. + +Optionally, set this to something like (self-insert-command) if +you to wish restrict expansion to only happen when the last +letter of the snippet tab trigger was typed immediately before +the trigger key itself." + :type '(repeat function)) + +(defcustom yas-alias-to-yas/prefix-p t + "If non-nil make aliases for the old style yas/ prefixed symbols. +It must be set to nil before loading yasnippet to take effect." + :type 'boolean) + +;; Only two faces, and one of them shouldn't even be used... +;; +(defface yas-field-highlight-face + '((t (:inherit region))) + "The face used to highlight the currently active field of a snippet") + +(defface yas--field-debug-face + '() + "The face used for debugging some overlays normally hidden") + + +;;; User-visible variables + +(defconst yas-maybe-skip-and-clear-field + '(menu-item "" yas-skip-and-clear-field + :filter yas--maybe-clear-field-filter) + "A conditional key definition. +This can be used as a key definition in keymaps to bind a key to +`yas-skip-and-clear-field' only when at the beginning of an +unmodified snippet field.") + +(defconst yas-maybe-clear-field + '(menu-item "" yas-clear-field + :filter yas--maybe-clear-field-filter) + "A conditional key definition. +This can be used as a key definition in keymaps to bind a key to +`yas-clear-field' only when at the beginning of an +unmodified snippet field.") + +(defun yas-filtered-definition (def) + "Return a condition key definition. +The condition will respect the value of `yas-keymap-disable-hook'." + `(menu-item "" ,def + :filter ,(lambda (cmd) (unless (run-hook-with-args-until-success + 'yas-keymap-disable-hook) + cmd)))) + +(defvar yas-keymap + (let ((map (make-sparse-keymap))) + (define-key map [(tab)] (yas-filtered-definition 'yas-next-field-or-maybe-expand)) + (define-key map (kbd "TAB") (yas-filtered-definition 'yas-next-field-or-maybe-expand)) + (define-key map [(shift tab)] (yas-filtered-definition 'yas-prev-field)) + (define-key map [backtab] (yas-filtered-definition 'yas-prev-field)) + (define-key map (kbd "C-g") (yas-filtered-definition 'yas-abort-snippet)) + ;; Yes, filters can be chained! + (define-key map (kbd "C-d") (yas-filtered-definition yas-maybe-skip-and-clear-field)) + (define-key map (kbd "DEL") (yas-filtered-definition yas-maybe-clear-field)) + map) + "The active keymap while a snippet expansion is in progress.") + +(defvar yas-key-syntaxes (list #'yas-try-key-from-whitespace + "w_.()" "w_." "w_" "w") + "Syntaxes and functions to help look for trigger keys before point. + +Each element in this list specifies how to skip buffer positions +backwards and look for the start of a trigger key. + +Each element can be either a string or a function receiving the +original point as an argument. A string element is simply passed +to `skip-syntax-backward' whereas a function element is called +with no arguments and should also place point before the original +position. + +The string between the resulting buffer position and the original +point is matched against the trigger keys in the active snippet +tables. + +If no expandable snippets are found, the next element is the list +is tried, unless a function element returned the symbol `again', +in which case it is called again from the previous position and +may once more reposition point. + +For example, if `yas-key-syntaxes' has the value (\"w\" \"w_\"), +trigger keys composed exclusively of \"word\"-syntax characters +are looked for first. Failing that, longer keys composed of +\"word\" or \"symbol\" syntax are looked for. Therefore, +triggering after + +foo-barbaz + +will, according to the \"w\" element first try \"barbaz\". If +that isn't a trigger key, \"foo-barbaz\" is tried, respecting the +second \"w_\" element. Notice that even if \"baz\" is a trigger +key for an active snippet, it won't be expanded, unless a +function is added to `yas-key-syntaxes' that eventually places +point between \"bar\" and \"baz\". + +See also Info node `(elisp) Syntax Descriptors'.") + +(defvar yas-after-exit-snippet-hook + '() + "Hooks to run after a snippet exited. + +The hooks will be run in an environment where some variables bound to +proper values: + +`yas-snippet-beg' : The beginning of the region of the snippet. + +`yas-snippet-end' : Similar to beg. + +Attention: These hooks are not run when exiting nested/stacked snippet expansion!") + +(defvar yas-before-expand-snippet-hook + '() + "Hooks to run just before expanding a snippet.") + +(defconst yas-not-string-or-comment-condition + '(if (let ((ppss (syntax-ppss))) + (or (nth 3 ppss) (nth 4 ppss))) + '(require-snippet-condition . force-in-comment) + t) + "Disables snippet expansion in strings and comments. +To use, set `yas-buffer-local-condition' to this value.") + +(defcustom yas-buffer-local-condition t + "Snippet expanding condition. + +This variable is a Lisp form which is evaluated every time a +snippet expansion is attempted: + + * If it evaluates to nil, no snippets can be expanded. + + * If it evaluates to the a cons (require-snippet-condition + . REQUIREMENT) + + * Snippets bearing no \"# condition:\" directive are not + considered + + * Snippets bearing conditions that evaluate to nil (or + produce an error) won't be considered. + + * If the snippet has a condition that evaluates to non-nil + RESULT: + + * If REQUIREMENT is t, the snippet is considered + + * If REQUIREMENT is `eq' RESULT, the snippet is + considered + + * Otherwise, the snippet is not considered. + + * If it evaluates to the symbol `always', all snippets are + considered for expansion, regardless of any conditions. + + * If it evaluates to t or some other non-nil value + + * Snippet bearing no conditions, or conditions that + evaluate to non-nil, are considered for expansion. + + * Otherwise, the snippet is not considered. + +Here's an example preventing snippets from being expanded from +inside comments, in `python-mode' only, with the exception of +snippets returning the symbol `force-in-comment' in their +conditions. + + (add-hook \\='python-mode-hook + (lambda () + (setq yas-buffer-local-condition + \\='(if (python-syntax-comment-or-string-p) + \\='(require-snippet-condition . force-in-comment) + t))))" + :type + `(choice + (const :tag "Disable snippet expansion inside strings and comments" + ,yas-not-string-or-comment-condition) + (const :tag "Expand all snippets regardless of conditions" always) + (const :tag "Expand snippets unless their condition is nil" t) + (const :tag "Disable all snippet expansion" nil) + sexp)) + +(defcustom yas-keymap-disable-hook nil + "The `yas-keymap' bindings are disabled if any function in this list returns non-nil. +This is useful to control whether snippet navigation bindings +override bindings from other packages (e.g., `company-mode')." + :type 'hook) + +(defcustom yas-overlay-priority 100 + "Priority to use for yasnippets overlays. +This is useful to control whether snippet navigation bindings +override `keymap' overlay property bindings from other packages." + :type 'integer) + +(defcustom yas-inhibit-overlay-modification-protection nil + "If nil, changing text outside the active field aborts the snippet. +This protection is intended to prevent yasnippet from ending up +in an inconsistent state. However, some packages (e.g., the +company completion package) may trigger this protection when it +is not needed. In that case, setting this variable to non-nil +can be useful." + ;; See also `yas--on-protection-overlay-modification'. + :type 'boolean) + + +;;; Internal variables + +(defconst yas--version "0.14.0") + +(defvar yas--menu-table (make-hash-table) + "A hash table of MAJOR-MODE symbols to menu keymaps.") + +(defvar yas--escaped-characters + '(?\\ ?` ?\" ?' ?$ ?} ?{ ?\( ?\)) + "List of characters which *might* need to be escaped.") + +(defconst yas--field-regexp + "${\\([0-9]+:\\)?\\([^}]*\\)}" + "A regexp to *almost* recognize a field.") + +(defconst yas--multi-dollar-lisp-expression-regexp + "$+[ \t\n]*\\(([^)]*)\\)" + "A regexp to *almost* recognize a \"$(...)\" expression.") + +(defconst yas--backquote-lisp-expression-regexp + "`\\([^`]*\\)`" + "A regexp to recognize a \"\\=`lisp-expression\\=`\" expression." ) + +(defconst yas--transform-mirror-regexp + "${\\(?:\\([0-9]+\\):\\)?$\\([ \t\n]*([^}]*\\)" + "A regexp to *almost* recognize a mirror with a transform.") + +(defconst yas--simple-mirror-regexp + "$\\([0-9]+\\)" + "A regexp to recognize a simple mirror.") + +(defvar yas--snippet-id-seed 0 + "Contains the next id for a snippet.") + +(defvar yas--original-auto-fill-function nil + "The original value of `auto-fill-function'.") +(make-variable-buffer-local 'yas--original-auto-fill-function) + +(defvar yas--watch-auto-fill-backtrace nil) + +(defun yas--watch-auto-fill (sym newval op _where) + (when (and (or (and (eq sym 'yas--original-auto-fill-function) + (null newval) + (eq auto-fill-function 'yas--auto-fill)) + (and (eq sym 'auto-fill-function) + (eq newval 'yas--auto-fill) + (null yas--original-auto-fill-function))) + (null yas--watch-auto-fill-backtrace) + (fboundp 'backtrace-frames) ; Suppress compiler warning. + ;; If we're about to change `auto-fill-function' too, + ;; it's okay (probably). + (not (and (eq op 'makunbound) + (not (eq (default-value 'auto-fill-function) 'yas--auto-fill)) + (cl-member 'kill-all-local-variables + (backtrace-frames 'yas--watch-auto-fill) + :key (lambda (frame) (nth 1 frame)))))) + (setq yas--watch-auto-fill-backtrace + (backtrace-frames 'yas--watch-auto-fill)))) + +;; Try to get more info on #873/919 (this only works for Emacs 26+). +(when (fboundp 'add-variable-watcher) + (add-variable-watcher 'yas--original-auto-fill-function + #'yas--watch-auto-fill) + (add-variable-watcher 'auto-fill-function + #'yas--watch-auto-fill)) + +(defun yas--snippet-next-id () + (let ((id yas--snippet-id-seed)) + (cl-incf yas--snippet-id-seed) + id)) + + +;;; Minor mode stuff + +(defvar yas--minor-mode-menu nil + "Holds the YASnippet menu.") + +(defvar yas--condition-cache-timestamp nil) + +(defun yas-maybe-expand-abbrev-key-filter (cmd) + "Return CMD if there is an expandable snippet at point. +This function is useful as a `:filter' to a conditional key +definition." + (when (let ((yas--condition-cache-timestamp (current-time))) + (yas--templates-for-key-at-point)) + cmd)) + +(define-obsolete-function-alias 'yas--maybe-expand-key-filter + #'yas-maybe-expand-abbrev-key-filter "0.14") + +(defconst yas-maybe-expand + '(menu-item "" yas-expand :filter yas-maybe-expand-abbrev-key-filter) + "A conditional key definition. +This can be used as a key definition in keymaps to bind a key to +`yas-expand' only when there is a snippet available to be +expanded.") + +(defvar yas-minor-mode-map + (let ((map (make-sparse-keymap))) + (define-key map [(tab)] yas-maybe-expand) + (define-key map (kbd "TAB") yas-maybe-expand) + (define-key map "\C-c&\C-s" 'yas-insert-snippet) + (define-key map "\C-c&\C-n" 'yas-new-snippet) + (define-key map "\C-c&\C-v" 'yas-visit-snippet-file) + map) + "The keymap used when `yas-minor-mode' is active.") + +(easy-menu-define yas--minor-mode-menu + yas-minor-mode-map + "Menu used when `yas-minor-mode' is active." + '("YASnippet" :visible yas-use-menu + "----" + ["Expand trigger" yas-expand + :help "Possibly expand tab trigger before point"] + ["Insert at point..." yas-insert-snippet + :help "Prompt for an expandable snippet and expand it at point"] + ["New snippet..." yas-new-snippet + :help "Create a new snippet in an appropriate directory"] + ["Visit snippet file..." yas-visit-snippet-file + :help "Prompt for an expandable snippet and find its file"] + "----" + ("Snippet menu behaviour" + ["Visit snippets" (setq yas-visit-from-menu t) + :help "Visit snippets from the menu" + :active t :style radio :selected yas-visit-from-menu] + ["Expand snippets" (setq yas-visit-from-menu nil) + :help "Expand snippets from the menu" + :active t :style radio :selected (not yas-visit-from-menu)] + "----" + ["Show all known modes" (setq yas-use-menu 'full) + :help "Show one snippet submenu for each loaded table" + :active t :style radio :selected (eq yas-use-menu 'full)] + ["Abbreviate according to current mode" (setq yas-use-menu 'abbreviate) + :help "Show only snippet submenus for the current active modes" + :active t :style radio :selected (eq yas-use-menu 'abbreviate)]) + ("Indenting" + ["Auto" (setq yas-indent-line 'auto) + :help "Indent each line of the snippet with `indent-according-to-mode'" + :active t :style radio :selected (eq yas-indent-line 'auto)] + ["Fixed" (setq yas-indent-line 'fixed) + :help "Indent the snippet to the current column" + :active t :style radio :selected (eq yas-indent-line 'fixed)] + ["None" (setq yas-indent-line 'none) + :help "Don't apply any particular snippet indentation after expansion" + :active t :style radio :selected (not (member yas-indent-line '(fixed auto)))] + "----" + ["Also auto indent first line" (setq yas-also-auto-indent-first-line + (not yas-also-auto-indent-first-line)) + :help "When auto-indenting also, auto indent the first line menu" + :active (eq yas-indent-line 'auto) + :style toggle :selected yas-also-auto-indent-first-line] + ) + ("Prompting method" + ["System X-widget" (setq yas-prompt-functions + (cons #'yas-x-prompt + (remove #'yas-x-prompt + yas-prompt-functions))) + :help "Use your windowing system's (gtk, mac, windows, etc...) default menu" + :active t :style radio :selected (eq (car yas-prompt-functions) + #'yas-x-prompt)] + ["Dropdown-list" (setq yas-prompt-functions + (cons #'yas-dropdown-prompt + (remove #'yas-dropdown-prompt + yas-prompt-functions))) + :help "Use a special dropdown list" + :active t :style radio :selected (eq (car yas-prompt-functions) + #'yas-dropdown-prompt)] + ["Ido" (setq yas-prompt-functions + (cons #'yas-ido-prompt + (remove #'yas-ido-prompt + yas-prompt-functions))) + :help "Use an ido-style minibuffer prompt" + :active t :style radio :selected (eq (car yas-prompt-functions) + #'yas-ido-prompt)] + ["Completing read" (setq yas-prompt-functions + (cons #'yas-completing-prompt + (remove #'yas-completing-prompt + yas-prompt-functions))) + :help "Use a normal minibuffer prompt" + :active t :style radio :selected (eq (car yas-prompt-functions) + #'yas-completing-prompt)] + ) + ("Misc" + ["Wrap region in exit marker" + (setq yas-wrap-around-region + (not yas-wrap-around-region)) + :help "If non-nil automatically wrap the selected text in the $0 snippet exit" + :style toggle :selected yas-wrap-around-region] + ["Allow stacked expansions " + (setq yas-triggers-in-field + (not yas-triggers-in-field)) + :help "If non-nil allow snippets to be triggered inside other snippet fields" + :style toggle :selected yas-triggers-in-field] + ["Revive snippets on undo " + (setq yas-snippet-revival + (not yas-snippet-revival)) + :help "If non-nil allow snippets to become active again after undo" + :style toggle :selected yas-snippet-revival] + ["Good grace " + (setq yas-good-grace + (not yas-good-grace)) + :help "If non-nil don't raise errors in bad embedded elisp in snippets" + :style toggle :selected yas-good-grace] + ) + "----" + ["Load snippets..." yas-load-directory + :help "Load snippets from a specific directory"] + ["Reload everything" yas-reload-all + :help "Cleanup stuff, reload snippets, rebuild menus"] + ["About" yas-about + :help "Display some information about YASnippet"])) + +(define-obsolete-variable-alias 'yas-extra-modes 'yas--extra-modes "0.9.1") +(defvar yas--extra-modes nil + "An internal list of modes for which to also lookup snippets. + +This variable probably makes more sense as buffer-local, so +ensure your use `make-local-variable' when you set it.") + +(defvar yas--tables (make-hash-table) + "A hash table of mode symbols to `yas--table' objects.") + +(defvar yas--parents (make-hash-table) + "A hash table of mode symbols do lists of direct parent mode symbols. + +This list is populated when reading the \".yas-parents\" files +found when traversing snippet directories with +`yas-load-directory'. + +There might be additional parenting information stored in the +`derived-mode-parent' property of some mode symbols, but that is +not recorded here.") + +(defvar yas--direct-keymaps (list) + "Keymap alist supporting direct snippet keybindings. + +This variable is placed in `emulation-mode-map-alists'. + +Its elements looks like (TABLE-NAME . KEYMAP). They're +instantiated on `yas-reload-all' but KEYMAP is added to only when +loading snippets. `yas--direct-TABLE-NAME' is then a variable +set buffer-locally when entering `yas-minor-mode'. KEYMAP binds +all defined direct keybindings to `yas-maybe-expand-from-keymap' +which decides on the snippet to expand.") + +(defun yas-direct-keymaps-reload () + "Force reload the direct keybinding for active snippet tables." + (interactive) + (setq yas--direct-keymaps nil) + (maphash #'(lambda (name table) + (push (cons (intern (format "yas--direct-%s" name)) + (yas--table-direct-keymap table)) + yas--direct-keymaps)) + yas--tables)) + +(defun yas--modes-to-activate (&optional mode) + "Compute list of mode symbols that are active for `yas-expand' and friends." + (defvar yas--dfs) ;We rely on dynbind. We could use `letrec' instead! + (let* ((explored (if mode (list mode) ; Building up list in reverse. + (cons major-mode (reverse yas--extra-modes)))) + (yas--dfs + (lambda (mode) + (cl-loop for neighbour + in (cl-list* (or (get mode 'derived-mode-parent) + ;; Consider `fundamental-mode' + ;; as ultimate ancestor. + 'fundamental-mode) + ;; NOTE: `fboundp' check is redundant + ;; since Emacs 24.4. + (and (fboundp mode) (symbol-function mode)) + (gethash mode yas--parents)) + when (and neighbour + (not (memq neighbour explored)) + (symbolp neighbour)) + do (push neighbour explored) + (funcall yas--dfs neighbour))))) + (mapc yas--dfs explored) + (nreverse explored))) + +(defvar yas-minor-mode-hook nil + "Hook run when `yas-minor-mode' is turned on.") + +(defun yas--auto-fill-wrapper () + (when (and auto-fill-function + (not (eq auto-fill-function #'yas--auto-fill))) + (setq yas--original-auto-fill-function auto-fill-function) + (setq auto-fill-function #'yas--auto-fill))) + +;;;###autoload +(define-minor-mode yas-minor-mode + "Toggle YASnippet mode. + +When YASnippet mode is enabled, `yas-expand', normally bound to +the TAB key, expands snippets of code depending on the major +mode. + +With no argument, this command toggles the mode. +positive prefix argument turns on the mode. +Negative prefix argument turns off the mode. + +Key bindings: +\\{yas-minor-mode-map}" + :lighter " yas" ;; The indicator for the mode line. + (cond ((and yas-minor-mode (featurep 'yasnippet)) + ;; Install the direct keymaps in `emulation-mode-map-alists' + ;; (we use `add-hook' even though it's not technically a hook, + ;; but it works). Then define variables named after modes to + ;; index `yas--direct-keymaps'. + ;; + ;; Also install the post-command-hook. + ;; + (cl-pushnew 'yas--direct-keymaps emulation-mode-map-alists) + (add-hook 'post-command-hook #'yas--post-command-handler nil t) + ;; Set the `yas--direct-%s' vars for direct keymap expansion + ;; + (dolist (mode (yas--modes-to-activate)) + (let ((name (intern (format "yas--direct-%s" mode)))) + (set-default name nil) + (set (make-local-variable name) t))) + ;; Perform JIT loads + (yas--load-pending-jits) + ;; Install auto-fill handler. + (yas--auto-fill-wrapper) ; Now... + (add-hook 'auto-fill-mode-hook #'yas--auto-fill-wrapper)) ; or later. + (t + ;; Uninstall the direct keymaps, post-command hook, and + ;; auto-fill handler. + (remove-hook 'post-command-hook #'yas--post-command-handler t) + (remove-hook 'auto-fill-mode-hook #'yas--auto-fill-wrapper) + (when (local-variable-p 'yas--original-auto-fill-function) + (setq auto-fill-function yas--original-auto-fill-function)) + (setq emulation-mode-map-alists + (remove 'yas--direct-keymaps emulation-mode-map-alists))))) + +(defun yas-activate-extra-mode (mode) + "Activates the snippets for the given `mode' in the buffer. + +The function can be called in the hook of a minor mode to +activate snippets associated with that mode." + (interactive + (let (modes + symbol) + (maphash (lambda (k _) + (setq modes (cons (list k) modes))) + yas--parents) + (setq symbol (completing-read + "Activate mode: " modes nil t)) + (list + (when (not (string= "" symbol)) + (intern symbol))))) + (when mode + (add-to-list (make-local-variable 'yas--extra-modes) mode) + (yas--load-pending-jits))) + +(defun yas-deactivate-extra-mode (mode) + "Deactivates the snippets for the given `mode' in the buffer." + (interactive + (list (intern + (completing-read + "Deactivate mode: " (mapcar #'list yas--extra-modes) nil t)))) + (set (make-local-variable 'yas--extra-modes) + (remove mode + yas--extra-modes))) + +(defun yas-temp-buffer-p (&optional buffer) + (eq (aref (buffer-name buffer) 0) ?\s)) + +(define-obsolete-variable-alias 'yas-dont-activate + 'yas-dont-activate-functions "0.9.2") +(defvar yas-dont-activate-functions (list #'minibufferp #'yas-temp-buffer-p) + "Special hook to control which buffers `yas-global-mode' affects. +Functions are called with no argument, and should return non-nil to prevent +`yas-global-mode' from enabling yasnippet in this buffer. + +In Emacsen < 24, this variable is buffer-local. Because +`yas-minor-mode-on' is called by `yas-global-mode' after +executing the buffer's major mode hook, setting this variable +there is an effective way to define exceptions to the \"global\" +activation behaviour. + +In Emacsen >= 24, only the global value is used. To define +per-mode exceptions to the \"global\" activation behaviour, call +`yas-minor-mode' with a negative argument directily in the major +mode's hook.") +(unless (> emacs-major-version 23) + (with-no-warnings + (make-variable-buffer-local 'yas-dont-activate))) + + +(defun yas-minor-mode-on () + "Turn on YASnippet minor mode. + +Honour `yas-dont-activate-functions', which see." + (interactive) + (unless (or + ;; The old behavior used for Emacs<24 was to set + ;; `yas-dont-activate-functions' to t buffer-locally. + (not (or (listp yas-dont-activate-functions) + (functionp yas-dont-activate-functions))) + (run-hook-with-args-until-success 'yas-dont-activate-functions)) + (yas-minor-mode 1))) + +;;;###autoload +(define-globalized-minor-mode yas-global-mode yas-minor-mode yas-minor-mode-on) + +(defun yas--global-mode-reload-with-jit-maybe () + "Run `yas-reload-all' when `yas-global-mode' is on." + (when yas-global-mode (yas-reload-all))) + +(add-hook 'yas-global-mode-hook #'yas--global-mode-reload-with-jit-maybe) + + +;;; Major mode stuff + +(defvar yas--font-lock-keywords + (append '(("^#.*$" . font-lock-comment-face)) + (with-temp-buffer + (let ((prog-mode-hook nil) + (emacs-lisp-mode-hook nil)) + (ignore-errors (emacs-lisp-mode))) + (font-lock-set-defaults) + (if (eq t (car-safe font-lock-keywords)) + ;; They're "compiled", so extract the source. + (cadr font-lock-keywords) + font-lock-keywords)) + '(("\\$\\([0-9]+\\)" + (0 font-lock-keyword-face) + (1 font-lock-string-face t)) + ("\\${\\([0-9]+\\):?" + (0 font-lock-keyword-face) + (1 font-lock-warning-face t)) + ("\\(\\$(\\)" 1 font-lock-preprocessor-face) + ("}" + (0 font-lock-keyword-face))))) + +(defvar snippet-mode-map + (let ((map (make-sparse-keymap))) + (easy-menu-define nil + map + "Menu used when snippet-mode is active." + (cons "Snippet" + (mapcar #'(lambda (ent) + (when (nth 2 ent) + (define-key map (nth 2 ent) (nth 1 ent))) + (vector (nth 0 ent) (nth 1 ent) t)) + '(("Load this snippet" yas-load-snippet-buffer "\C-c\C-l") + ("Load and quit window" yas-load-snippet-buffer-and-close "\C-c\C-c") + ("Try out this snippet" yas-tryout-snippet "\C-c\C-t"))))) + map) + "The keymap used when `snippet-mode' is active.") + + + +;;;###autoload(autoload 'snippet-mode "yasnippet" "A mode for editing yasnippets" t nil) +(eval-and-compile + (if (fboundp 'prog-mode) + ;; `prog-mode' is new in 24.1. + (define-derived-mode snippet-mode prog-mode "Snippet" + "A mode for editing yasnippets" + (setq font-lock-defaults '(yas--font-lock-keywords)) + (set (make-local-variable 'require-final-newline) nil) + (set (make-local-variable 'comment-start) "#") + (set (make-local-variable 'comment-start-skip) "#+[\t ]*") + (add-hook 'after-save-hook #'yas-maybe-load-snippet-buffer nil t)) + (define-derived-mode snippet-mode fundamental-mode "Snippet" + "A mode for editing yasnippets" + (setq font-lock-defaults '(yas--font-lock-keywords)) + (set (make-local-variable 'require-final-newline) nil) + (set (make-local-variable 'comment-start) "#") + (set (make-local-variable 'comment-start-skip) "#+[\t ]*") + (add-hook 'after-save-hook #'yas-maybe-load-snippet-buffer nil t)))) + +(defun yas-snippet-mode-buffer-p () + "Return non-nil if current buffer should be in `snippet-mode'. +Meaning it's visiting a file under one of the mode directories in +`yas-snippet-dirs'." + (when buffer-file-name + (cl-member buffer-file-name (yas-snippet-dirs) + :test #'file-in-directory-p))) + +;; We're abusing `magic-fallback-mode-alist' here because +;; `auto-mode-alist' doesn't support function matchers. +(add-to-list 'magic-fallback-mode-alist + `(yas-snippet-mode-buffer-p . snippet-mode)) + + +;;; Internal structs for template management + +(cl-defstruct (yas--template + (:constructor yas--make-template) + ;; Handles `yas-define-snippets' format, plus the + ;; initial TABLE argument. + (:constructor + yas--define-snippets-2 + (table + key content + &optional xname condition group + expand-env load-file xkeybinding xuuid save-file + &aux + (name (or xname + ;; A little redundant: we always get a name + ;; from `yas--parse-template' except when + ;; there isn't a file. + (and load-file (file-name-nondirectory load-file)) + (and save-file (file-name-nondirectory save-file)) + key)) + (keybinding (yas--read-keybinding xkeybinding)) + (uuid (or xuuid name)) + (old (gethash uuid (yas--table-uuidhash table))) + (menu-binding-pair + (and old (yas--template-menu-binding-pair old))) + (perm-group + (and old (yas--template-perm-group old)))))) + "A template for a snippet." + key + content + name + condition + expand-env + load-file + save-file + keybinding + uuid + menu-binding-pair + group ;; as dictated by the #group: directive or .yas-make-groups + perm-group ;; as dictated by `yas-define-menu' + table + ) + +(cl-defstruct (yas--table (:constructor yas--make-snippet-table (name))) + "A table to store snippets for a particular mode. + +Has the following fields: + +`yas--table-name' + + A symbol name normally corresponding to a major mode, but can + also be a pseudo major-mode to be used in + `yas-activate-extra-mode', for example. + +`yas--table-hash' + + A hash table (KEY . NAMEHASH), known as the \"keyhash\". KEY is + a string or a vector, where the former is the snippet's trigger + and the latter means it's a direct keybinding. NAMEHASH is yet + another hash of (NAME . TEMPLATE) where NAME is the snippet's + name and TEMPLATE is a `yas--template' object. + +`yas--table-direct-keymap' + + A keymap for the snippets in this table that have direct + keybindings. This is kept in sync with the keyhash, i.e., all + the elements of the keyhash that are vectors appear here as + bindings to `yas-maybe-expand-from-keymap'. + +`yas--table-uuidhash' + + A hash table mapping snippets uuid's to the same `yas--template' + objects. A snippet uuid defaults to the snippet's name." + name + (hash (make-hash-table :test 'equal)) + (uuidhash (make-hash-table :test 'equal)) + (parents nil) + (direct-keymap (make-sparse-keymap))) + +(defun yas--get-template-by-uuid (mode uuid) + "Find the snippet template in MODE by its UUID." + (let* ((table (gethash mode yas--tables mode))) + (when table + (gethash uuid (yas--table-uuidhash table))))) + +;; Apropos storing/updating in TABLE, this works in two steps: +;; +;; 1. `yas--remove-template-by-uuid' removes any +;; keyhash-namehash-template mappings from TABLE, grabbing the +;; snippet by its uuid. Also removes mappings from TABLE's +;; `yas--table-direct-keymap' (FIXME: and should probably take care +;; of potentially stale menu bindings right?.) +;; +;; 2. `yas--add-template' adds this all over again. +;; +;; Create a new or add to an existing keyhash-namehash mapping. +;; +;; For reference on understanding this, consider three snippet +;; definitions: +;; +;; A: # name: The Foo +;; # key: foo +;; # binding: C-c M-l +;; +;; B: # name: Mrs Foo +;; # key: foo +;; +;; C: # name: The Bar +;; # binding: C-c M-l +;; +;; D: # name: Baz +;; # key: baz +;; +;; keyhash namehashes(3) yas--template structs(4) +;; ----------------------------------------------------- +;; __________ +;; / \ +;; "foo" ---> "The Foo" ---> [yas--template A] | +;; "Mrs Foo" ---> [yas--template B] | +;; | +;; [C-c M-l] ---> "The Foo" -------------------------/ +;; "The Bar" ---> [yas--template C] +;; +;; "baz" ---> "Baz" ---> [yas--template D] +;; +;; Additionally, since uuid defaults to the name, we have a +;; `yas--table-uuidhash' for TABLE +;; +;; uuidhash yas--template structs +;; ------------------------------- +;; "The Foo" ---> [yas--template A] +;; "Mrs Foo" ---> [yas--template B] +;; "The Bar" ---> [yas--template C] +;; "Baz" ---> [yas--template D] +;; +;; FIXME: the more I look at this data-structure the more I think I'm +;; stupid. There has to be an easier way (but beware lots of code +;; depends on this). +;; +(defun yas--remove-template-by-uuid (table uuid) + "Remove from TABLE a template identified by UUID." + (let ((template (gethash uuid (yas--table-uuidhash table)))) + (when template + (let* ((name (yas--template-name template)) + (empty-keys nil)) + ;; Remove the name from each of the targeted namehashes + ;; + (maphash #'(lambda (k v) + (let ((template (gethash name v))) + (when (and template + (equal uuid (yas--template-uuid template))) + (remhash name v) + (when (zerop (hash-table-count v)) + (push k empty-keys))))) + (yas--table-hash table)) + ;; Remove the namehash themselves if they've become empty + ;; + (dolist (key empty-keys) + (when (vectorp key) + (define-key (yas--table-direct-keymap table) key nil)) + (remhash key (yas--table-hash table))) + + ;; Finally, remove the uuid from the uuidhash + ;; + (remhash uuid (yas--table-uuidhash table)))))) + +(defconst yas-maybe-expand-from-keymap + '(menu-item "" yas-expand-from-keymap + :filter yas--maybe-expand-from-keymap-filter)) + +(defun yas--add-template (table template) + "Store in TABLE the snippet template TEMPLATE. + +KEY can be a string (trigger key) of a vector (direct +keybinding)." + (let ((name (yas--template-name template)) + (key (yas--template-key template)) + (keybinding (yas--template-keybinding template)) + (_menu-binding-pair (yas--template-menu-binding-pair-get-create template))) + (dolist (k (remove nil (list key keybinding))) + (puthash name + template + (or (gethash k + (yas--table-hash table)) + (puthash k + (make-hash-table :test 'equal) + (yas--table-hash table)))) + (when (vectorp k) + (define-key (yas--table-direct-keymap table) k yas-maybe-expand-from-keymap))) + + ;; Update TABLE's `yas--table-uuidhash' + (puthash (yas--template-uuid template) + template + (yas--table-uuidhash table)))) + +(defun yas--update-template (table template) + "Add or update TEMPLATE in TABLE. + +Also takes care of adding and updating to the associated menu. +Return TEMPLATE." + ;; Remove from table by uuid + ;; + (yas--remove-template-by-uuid table (yas--template-uuid template)) + ;; Add to table again + ;; + (yas--add-template table template) + ;; Take care of the menu + ;; + (yas--update-template-menu table template) + template) + +(defun yas--update-template-menu (table template) + "Update every menu-related for TEMPLATE." + (let ((menu-binding-pair (yas--template-menu-binding-pair-get-create template)) + (key (yas--template-key template)) + (keybinding (yas--template-keybinding template))) + ;; The snippet might have changed name or keys, so update + ;; user-visible strings + ;; + (unless (eq (cdr menu-binding-pair) :none) + ;; the menu item name + ;; + (setf (cl-cadar menu-binding-pair) (yas--template-name template)) + ;; the :keys information (also visible to the user) + (setf (cl-getf (cdr (car menu-binding-pair)) :keys) + (or (and keybinding (key-description keybinding)) + (and key (concat key yas-trigger-symbol)))))) + (unless (yas--template-menu-managed-by-yas-define-menu template) + (let ((menu-keymap + (yas--menu-keymap-get-create (yas--table-mode table) + (mapcar #'yas--table-mode + (yas--table-parents table)))) + (group (yas--template-group template))) + ;; Remove from menu keymap + ;; + (cl-assert menu-keymap) + (yas--delete-from-keymap menu-keymap (yas--template-uuid template)) + + ;; Add necessary subgroups as necessary. + ;; + (dolist (subgroup group) + (let ((subgroup-keymap (lookup-key menu-keymap (vector (make-symbol subgroup))))) + (unless (and subgroup-keymap + (keymapp subgroup-keymap)) + (setq subgroup-keymap (make-sparse-keymap)) + (define-key menu-keymap (vector (make-symbol subgroup)) + `(menu-item ,subgroup ,subgroup-keymap))) + (setq menu-keymap subgroup-keymap))) + + ;; Add this entry to the keymap + ;; + (define-key menu-keymap + (vector (make-symbol (yas--template-uuid template))) + (car (yas--template-menu-binding-pair template)))))) + +(defun yas--namehash-templates-alist (namehash) + "Return NAMEHASH as an alist." + (let (alist) + (maphash #'(lambda (k v) + (push (cons k v) alist)) + namehash) + alist)) + +(defun yas--fetch (table key) + "Fetch templates in TABLE by KEY. + +Return a list of cons (NAME . TEMPLATE) where NAME is a +string and TEMPLATE is a `yas--template' structure." + (let* ((keyhash (yas--table-hash table)) + (namehash (and keyhash (gethash key keyhash)))) + (when namehash + (yas--filter-templates-by-condition (yas--namehash-templates-alist namehash))))) + + +;;; Filtering/condition logic + +(defun yas--eval-condition (condition) + (condition-case err + (save-excursion + (save-restriction + (save-match-data + (eval condition)))) + (error (progn + (yas--message 1 "Error in condition evaluation: %s" (error-message-string err)) + nil)))) + + +(defun yas--filter-templates-by-condition (templates) + "Filter the templates using the applicable condition. + +TEMPLATES is a list of cons (NAME . TEMPLATE) where NAME is a +string and TEMPLATE is a `yas--template' structure. + +This function implements the rules described in +`yas-buffer-local-condition'. See that variables documentation." + (let ((requirement (yas--require-template-specific-condition-p))) + (if (eq requirement 'always) + templates + (cl-remove-if-not (lambda (pair) + (yas--template-can-expand-p + (yas--template-condition (cdr pair)) requirement)) + templates)))) + +(defun yas--require-template-specific-condition-p () + "Decide if this buffer requests/requires snippet-specific +conditions to filter out potential expansions." + (if (eq 'always yas-buffer-local-condition) + 'always + (let ((local-condition (or (and (consp yas-buffer-local-condition) + (yas--eval-condition yas-buffer-local-condition)) + yas-buffer-local-condition))) + (when local-condition + (if (eq local-condition t) + t + (and (consp local-condition) + (eq 'require-snippet-condition (car local-condition)) + (symbolp (cdr local-condition)) + (cdr local-condition))))))) + +(defun yas--template-can-expand-p (condition requirement) + "Evaluate CONDITION and REQUIREMENT and return a boolean." + (let* ((result (or (null condition) + (yas--eval-condition condition)))) + (cond ((eq requirement t) + result) + (t + (eq requirement result))))) + +(defun yas--table-templates (table) + (when table + (let ((acc (list))) + (maphash #'(lambda (_key namehash) + (maphash #'(lambda (name template) + (push (cons name template) acc)) + namehash)) + (yas--table-hash table)) + (maphash #'(lambda (uuid template) + (push (cons uuid template) acc)) + (yas--table-uuidhash table)) + (yas--filter-templates-by-condition acc)))) + +(defun yas--templates-for-key-at-point () + "Find `yas--template' objects for any trigger keys preceding point. +Returns (TEMPLATES START END). This function respects +`yas-key-syntaxes', which see." + (save-excursion + (let ((original (point)) + (methods yas-key-syntaxes) + (templates) + (method)) + (while (and methods + (not templates)) + (unless (eq method (car methods)) + ;; TRICKY: `eq'-ness test means we can only be here if + ;; `method' is a function that returned `again', and hence + ;; don't revert back to original position as per + ;; `yas-key-syntaxes'. + (goto-char original)) + (setq method (car methods)) + (cond ((stringp method) + (skip-syntax-backward method) + (setq methods (cdr methods))) + ((functionp method) + (unless (eq (funcall method original) + 'again) + (setq methods (cdr methods)))) + (t + (setq methods (cdr methods)) + (yas--warning "Invalid element `%s' in `yas-key-syntaxes'" method))) + (let ((possible-key (buffer-substring-no-properties (point) original))) + (save-excursion + (goto-char original) + (setq templates + (cl-mapcan (lambda (table) + (yas--fetch table possible-key)) + (yas--get-snippet-tables)))))) + (when templates + (list templates (point) original))))) + +(defun yas--table-all-keys (table) + "Get trigger keys of all active snippets in TABLE." + (let ((acc)) + (maphash #'(lambda (key namehash) + (when (yas--filter-templates-by-condition (yas--namehash-templates-alist namehash)) + (push key acc))) + (yas--table-hash table)) + acc)) + +(defun yas--table-mode (table) + (intern (yas--table-name table))) + + +;;; Internal functions and macros: + +(defun yas--remove-misc-free-from-undo (old-undo-list) + "Tries to work around Emacs Bug#30931. +Helper function for `yas--save-restriction-and-widen'." + ;; If Bug#30931 is unfixed, we get (#<Lisp_Misc_Free> . INTEGER) + ;; entries in the undo list. If we call `type-of' on the + ;; Lisp_Misc_Free object then Emacs aborts, so try to find it by + ;; checking that its type is none of the expected ones. + (when (consp buffer-undo-list) + (let* ((prev buffer-undo-list) + (undo-list prev)) + (while (and (consp undo-list) + ;; Only check new entries. + (not (eq undo-list old-undo-list))) + (let ((entry (pop undo-list))) + (when (consp entry) + (let ((head (car entry))) + (unless (or (stringp head) + (markerp head) + (integerp head) + (symbolp head) + (not (integerp (cdr entry)))) + ;; (message "removing misc free %S" entry) + (setcdr prev undo-list))))) + (setq prev undo-list))))) + +(defmacro yas--save-restriction-and-widen (&rest body) + "Equivalent to (save-restriction (widen) BODY). +Also tries to work around Emacs Bug#30931." + (declare (debug (body)) (indent 0)) + ;; Disable garbage collection, since it could cause an abort. + `(let ((gc-cons-threshold most-positive-fixnum) + (old-undo-list buffer-undo-list)) + (prog1 (save-restriction + (widen) + ,@body) + (yas--remove-misc-free-from-undo old-undo-list)))) + +(defun yas--eval-for-string (form) + "Evaluate FORM and convert the result to string." + (let ((debug-on-error (and (not (memq yas-good-grace '(t inline))) + debug-on-error))) + (condition-case oops + (save-excursion + (yas--save-restriction-and-widen + (save-match-data + (let ((result (eval form))) + (when result + (format "%s" result)))))) + ((debug error) (error-message-string oops))))) + +(defun yas--eval-for-effect (form) + (yas--safely-call-fun (apply-partially #'eval form))) + +(defun yas--read-lisp (string &optional nil-on-error) + "Read STRING as a elisp expression and return it. + +In case STRING in an invalid expression and NIL-ON-ERROR is nil, +return an expression that when evaluated will issue an error." + (condition-case err + (read string) + (error (and (not nil-on-error) + `(error (error-message-string ,err)))))) + +(defun yas--read-keybinding (keybinding) + "Read KEYBINDING as a snippet keybinding, return a vector." + (when (and keybinding + (not (string-match "keybinding" keybinding))) + (condition-case err + (let ((res (or (and (string-match "^\\[.*\\]$" keybinding) + (read keybinding)) + (read-kbd-macro keybinding 'need-vector)))) + res) + (error + (yas--message 2 "warning: keybinding \"%s\" invalid since %s." + keybinding (error-message-string err)) + nil)))) + +(defun yas--table-get-create (mode) + "Get or create the snippet table corresponding to MODE." + (let ((table (gethash mode + yas--tables))) + (unless table + (setq table (yas--make-snippet-table (symbol-name mode))) + (puthash mode table yas--tables) + (push (cons (intern (format "yas--direct-%s" mode)) + (yas--table-direct-keymap table)) + yas--direct-keymaps)) + table)) + +(defun yas--get-snippet-tables (&optional mode) + "Get snippet tables for MODE. + +MODE defaults to the current buffer's `major-mode'. + +Return a list of `yas--table' objects. The list of modes to +consider is returned by `yas--modes-to-activate'" + (remove nil + (mapcar #'(lambda (name) + (gethash name yas--tables)) + (yas--modes-to-activate mode)))) + +(defun yas--menu-keymap-get-create (mode &optional parents) + "Get or create the menu keymap for MODE and its PARENTS. + +This may very well create a plethora of menu keymaps and arrange +them all in `yas--menu-table'" + (let* ((menu-keymap (or (gethash mode yas--menu-table) + (puthash mode (make-sparse-keymap) yas--menu-table)))) + (mapc #'yas--menu-keymap-get-create parents) + (define-key yas--minor-mode-menu (vector mode) + `(menu-item ,(symbol-name mode) ,menu-keymap + :visible (yas--show-menu-p ',mode))) + menu-keymap)) + + +;;; Template-related and snippet loading functions + +(defun yas--parse-template (&optional file) + "Parse the template in the current buffer. + +Optional FILE is the absolute file name of the file being +parsed. + +Optional GROUP is the group where the template is to go, +otherwise we attempt to calculate it from FILE. + +Return a snippet-definition, i.e. a list + + (KEY TEMPLATE NAME CONDITION GROUP VARS LOAD-FILE KEYBINDING UUID) + +If the buffer contains a line of \"# --\" then the contents above +this line are ignored. Directives can set most of these with the syntax: + +# directive-name : directive-value + +Here's a list of currently recognized directives: + + * type + * name + * contributor + * condition + * group + * key + * expand-env + * binding + * uuid" + (goto-char (point-min)) + (let* ((type 'snippet) + (name (and file + (file-name-nondirectory file))) + (key nil) + template + bound + condition + (group (and file + (yas--calculate-group file))) + expand-env + binding + uuid) + (if (re-search-forward "^# --\\s-*\n" nil t) + (progn (setq template + (buffer-substring-no-properties (point) + (point-max))) + (setq bound (point)) + (goto-char (point-min)) + (while (re-search-forward "^# *\\([^ ]+?\\) *: *\\(.*?\\)[[:space:]]*$" bound t) + (when (string= "uuid" (match-string-no-properties 1)) + (setq uuid (match-string-no-properties 2))) + (when (string= "type" (match-string-no-properties 1)) + (setq type (if (string= "command" (match-string-no-properties 2)) + 'command + 'snippet))) + (when (string= "key" (match-string-no-properties 1)) + (setq key (match-string-no-properties 2))) + (when (string= "name" (match-string-no-properties 1)) + (setq name (match-string-no-properties 2))) + (when (string= "condition" (match-string-no-properties 1)) + (setq condition (yas--read-lisp (match-string-no-properties 2)))) + (when (string= "group" (match-string-no-properties 1)) + (setq group (match-string-no-properties 2))) + (when (string= "expand-env" (match-string-no-properties 1)) + (setq expand-env (yas--read-lisp (match-string-no-properties 2) + 'nil-on-error))) + (when (string= "binding" (match-string-no-properties 1)) + (setq binding (match-string-no-properties 2))))) + (setq template + (buffer-substring-no-properties (point-min) (point-max)))) + (unless (or key binding) + (setq key (and file (file-name-nondirectory file)))) + (when (eq type 'command) + (setq template (yas--read-lisp (concat "(progn" template ")")))) + (when group + (setq group (split-string group "\\."))) + (list key template name condition group expand-env file binding uuid))) + +(defun yas--calculate-group (file) + "Calculate the group for snippet file path FILE." + (let* ((dominating-dir (locate-dominating-file file + ".yas-make-groups")) + (extra-path (and dominating-dir + (file-relative-name file dominating-dir))) + (extra-dir (and extra-path + (file-name-directory extra-path))) + (group (and extra-dir + (replace-regexp-in-string "/" + "." + (directory-file-name extra-dir))))) + group)) + +(defun yas--subdirs (directory &optional filep) + "Return subdirs or files of DIRECTORY according to FILEP." + (cl-remove-if (lambda (file) + (or (string-match "\\`\\." + (file-name-nondirectory file)) + (string-match "\\`#.*#\\'" + (file-name-nondirectory file)) + (string-match "~\\'" + (file-name-nondirectory file)) + (if filep + (file-directory-p file) + (not (file-directory-p file))))) + (directory-files directory t))) + +(defun yas--make-menu-binding (template) + (let ((mode (yas--table-mode (yas--template-table template)))) + `(lambda () (interactive) (yas--expand-or-visit-from-menu ',mode ,(yas--template-uuid template))))) + +(defun yas--expand-or-visit-from-menu (mode uuid) + (let* ((table (yas--table-get-create mode)) + (yas--current-template (and table + (gethash uuid (yas--table-uuidhash table))))) + (when yas--current-template + (if yas-visit-from-menu + (yas--visit-snippet-file-1 yas--current-template) + (let ((where (if (region-active-p) + (cons (region-beginning) (region-end)) + (cons (point) (point))))) + (yas-expand-snippet yas--current-template + (car where) (cdr where))))))) + +(defun yas--key-from-desc (text) + "Return a yasnippet key from a description string TEXT." + (replace-regexp-in-string "\\(\\w+\\).*" "\\1" text)) + + +;;; Popping up for keys and templates + +(defun yas--prompt-for-template (templates &optional prompt) + "Interactively choose a template from the list TEMPLATES. + +TEMPLATES is a list of `yas--template'. + +Optional PROMPT sets the prompt to use." + (when templates + (setq templates + (sort templates #'(lambda (t1 t2) + (< (length (yas--template-name t1)) + (length (yas--template-name t2)))))) + (cl-some (lambda (fn) + (funcall fn (or prompt "Choose a snippet: ") + templates + #'yas--template-name)) + yas-prompt-functions))) + +(defun yas--prompt-for-keys (keys &optional prompt) + "Interactively choose a template key from the list KEYS. + +Optional PROMPT sets the prompt to use." + (when keys + (cl-some (lambda (fn) + (funcall fn (or prompt "Choose a snippet key: ") keys)) + yas-prompt-functions))) + +(defun yas--prompt-for-table (tables &optional prompt) + "Interactively choose a table from the list TABLES. + +Optional PROMPT sets the prompt to use." + (when tables + (cl-some (lambda (fn) + (funcall fn (or prompt "Choose a snippet table: ") + tables + #'yas--table-name)) + yas-prompt-functions))) + +(defun yas-x-prompt (prompt choices &optional display-fn) + "Display choices in a x-window prompt." + (when (and window-system choices) + ;; Let window position be recalculated to ensure that + ;; `posn-at-point' returns non-nil. + (redisplay) + (or + (x-popup-menu + (if (fboundp 'posn-at-point) + (let ((x-y (posn-x-y (posn-at-point (point))))) + (list (list (+ (car x-y) 10) + (+ (cdr x-y) 20)) + (selected-window))) + t) + `(,prompt ("title" + ,@(cl-mapcar (lambda (c d) `(,(concat " " d) . ,c)) + choices + (if display-fn (mapcar display-fn choices) + choices))))) + (keyboard-quit)))) + +(defun yas-maybe-ido-prompt (prompt choices &optional display-fn) + (when (bound-and-true-p ido-mode) + (yas-ido-prompt prompt choices display-fn))) + +(defun yas-ido-prompt (prompt choices &optional display-fn) + (require 'ido) + (yas-completing-prompt prompt choices display-fn #'ido-completing-read)) + +(defun yas-dropdown-prompt (_prompt choices &optional display-fn) + (when (fboundp 'dropdown-list) + (let* ((formatted-choices + (if display-fn (mapcar display-fn choices) choices)) + (n (dropdown-list formatted-choices))) + (if n (nth n choices) + (keyboard-quit))))) + +(defun yas-completing-prompt (prompt choices &optional display-fn completion-fn) + (let* ((formatted-choices + (if display-fn (mapcar display-fn choices) choices)) + (chosen (funcall (or completion-fn #'completing-read) + prompt formatted-choices + nil 'require-match nil nil))) + (if (eq choices formatted-choices) + chosen + (nth (or (cl-position chosen formatted-choices :test #'string=) 0) + choices)))) + +(defun yas-no-prompt (_prompt choices &optional _display-fn) + (cl-first choices)) + + +;;; Defining snippets +;; This consists of creating and registering `yas--template' objects in the +;; correct tables. +;; + +(defvar yas--creating-compiled-snippets nil) + +(defun yas--define-snippets-1 (snippet snippet-table) + "Helper for `yas-define-snippets'." + ;; Update the appropriate table. Also takes care of adding the + ;; key indicators in the templates menu entry, if any. + (yas--update-template + snippet-table (apply #'yas--define-snippets-2 snippet-table snippet))) + +(defun yas-define-snippets (mode snippets) + "Define SNIPPETS for MODE. + +SNIPPETS is a list of snippet definitions, each taking the +following form + + (KEY TEMPLATE NAME CONDITION GROUP EXPAND-ENV LOAD-FILE KEYBINDING UUID SAVE-FILE) + +Within these, only KEY and TEMPLATE are actually mandatory. + +TEMPLATE might be a Lisp form or a string, depending on whether +this is a snippet or a snippet-command. + +CONDITION, EXPAND-ENV and KEYBINDING are Lisp forms, they have +been `yas--read-lisp'-ed and will eventually be +`yas--eval-for-string'-ed. + +The remaining elements are strings. + +FILE is probably of very little use if you're programatically +defining snippets. + +UUID is the snippet's \"unique-id\". Loading a second snippet +file with the same uuid would replace the previous snippet. + +You can use `yas--parse-template' to return such lists based on +the current buffers contents." + (if yas--creating-compiled-snippets + (let ((print-length nil)) + (insert ";;; Snippet definitions:\n;;;\n") + (dolist (snippet snippets) + ;; Fill in missing elements with nil. + (setq snippet (append snippet (make-list (- 10 (length snippet)) nil))) + ;; Move LOAD-FILE to SAVE-FILE because we will load from the + ;; compiled file, not LOAD-FILE. + (let ((load-file (nth 6 snippet))) + (setcar (nthcdr 6 snippet) nil) + (setcar (nthcdr 9 snippet) load-file))) + (insert (pp-to-string + `(yas-define-snippets ',mode ',snippets))) + (insert "\n\n")) + ;; Normal case. + (let ((snippet-table (yas--table-get-create mode)) + (template nil)) + (dolist (snippet snippets) + (setq template (yas--define-snippets-1 snippet + snippet-table))) + template))) + + +;;; Loading snippets from files + +(defun yas--template-get-file (template) + "Return TEMPLATE's LOAD-FILE or SAVE-FILE." + (or (yas--template-load-file template) + (let ((file (yas--template-save-file template))) + (when file + (yas--message 3 "%s has no load file, using save file, %s, instead." + (yas--template-name template) file)) + file))) + +(defun yas--load-yas-setup-file (file) + (if (not yas--creating-compiled-snippets) + ;; Normal case. + (load file 'noerror (<= yas-verbosity 4)) + (let ((elfile (concat file ".el"))) + (when (file-exists-p elfile) + (insert ";;; contents of the .yas-setup.el support file:\n;;;\n") + (insert-file-contents elfile) + (goto-char (point-max)))))) + +(defun yas--define-parents (mode parents) + "Add PARENTS to the list of MODE's parents." + (puthash mode (cl-remove-duplicates + (append parents + (gethash mode yas--parents))) + yas--parents)) + +(defun yas-load-directory (top-level-dir &optional use-jit interactive) + "Load snippets in directory hierarchy TOP-LEVEL-DIR. + +Below TOP-LEVEL-DIR each directory should be a mode name. + +With prefix argument USE-JIT do jit-loading of snippets." + (interactive + (list (read-directory-name "Select the root directory: " nil nil t) + current-prefix-arg t)) + (unless yas-snippet-dirs + (setq yas-snippet-dirs top-level-dir)) + (let ((impatient-buffers)) + (dolist (dir (yas--subdirs top-level-dir)) + (let* ((major-mode-and-parents (yas--compute-major-mode-and-parents + (concat dir "/dummy"))) + (mode-sym (car major-mode-and-parents)) + (parents (cdr major-mode-and-parents))) + ;; Attention: The parents and the menus are already defined + ;; here, even if the snippets are later jit-loaded. + ;; + ;; * We need to know the parents at this point since entering a + ;; given mode should jit load for its parents + ;; immediately. This could be reviewed, the parents could be + ;; discovered just-in-time-as well + ;; + ;; * We need to create the menus here to support the `full' + ;; option to `yas-use-menu' (all known snippet menus are shown to the user) + ;; + (yas--define-parents mode-sym parents) + (yas--menu-keymap-get-create mode-sym) + (let ((fun (apply-partially #'yas--load-directory-1 dir mode-sym))) + (if use-jit + (yas--schedule-jit mode-sym fun) + (funcall fun))) + ;; Look for buffers that are already in `mode-sym', and so + ;; need the new snippets immediately... + ;; + (when use-jit + (cl-loop for buffer in (buffer-list) + do (with-current-buffer buffer + (when (eq major-mode mode-sym) + (yas--message 4 "Discovered there was already %s in %s" buffer mode-sym) + (push buffer impatient-buffers))))))) + ;; ...after TOP-LEVEL-DIR has been completely loaded, call + ;; `yas--load-pending-jits' in these impatient buffers. + ;; + (cl-loop for buffer in impatient-buffers + do (with-current-buffer buffer (yas--load-pending-jits)))) + (when interactive + (yas--message 3 "Loaded snippets from %s." top-level-dir))) + +(defun yas--load-directory-1 (directory mode-sym) + "Recursively load snippet templates from DIRECTORY." + (if yas--creating-compiled-snippets + (let ((output-file (expand-file-name ".yas-compiled-snippets.el" + directory))) + (with-temp-file output-file + (insert (format ";;; Compiled snippets and support files for `%s'\n" + mode-sym)) + (yas--load-directory-2 directory mode-sym) + (insert (format ";;; Do not edit! File generated at %s\n" + (current-time-string))))) + ;; Normal case. + (unless (file-exists-p (expand-file-name ".yas-skip" directory)) + (unless (and (load (expand-file-name ".yas-compiled-snippets" directory) 'noerror (<= yas-verbosity 3)) + (progn (yas--message 4 "Loaded compiled snippets from %s" directory) t)) + (yas--message 4 "Loading snippet files from %s" directory) + (yas--load-directory-2 directory mode-sym))))) + +(defun yas--load-directory-2 (directory mode-sym) + ;; Load .yas-setup.el files wherever we find them + ;; + (yas--load-yas-setup-file (expand-file-name ".yas-setup" directory)) + (let* ((default-directory directory) + (snippet-defs nil)) + ;; load the snippet files + ;; + (with-temp-buffer + (dolist (file (yas--subdirs directory 'no-subdirs-just-files)) + (when (file-readable-p file) + ;; Erase the buffer instead of passing non-nil REPLACE to + ;; `insert-file-contents' (avoids Emacs bug #23659). + (erase-buffer) + (insert-file-contents file) + (push (yas--parse-template file) + snippet-defs)))) + (when snippet-defs + (yas-define-snippets mode-sym + snippet-defs)) + ;; now recurse to a lower level + ;; + (dolist (subdir (yas--subdirs directory)) + (yas--load-directory-2 subdir + mode-sym)))) + +(defun yas--load-snippet-dirs (&optional nojit) + "Reload the directories listed in `yas-snippet-dirs' or +prompt the user to select one." + (let (errors) + (if (null yas-snippet-dirs) + (call-interactively 'yas-load-directory) + (when (member yas--default-user-snippets-dir yas-snippet-dirs) + (make-directory yas--default-user-snippets-dir t)) + (dolist (directory (reverse (yas-snippet-dirs))) + (cond ((file-directory-p directory) + (yas-load-directory directory (not nojit)) + (if nojit + (yas--message 4 "Loaded %s" directory) + (yas--message 4 "Prepared just-in-time loading for %s" directory))) + (t + (push (yas--message 1 "Check your `yas-snippet-dirs': %s is not a directory" directory) errors))))) + errors)) + +(defun yas-reload-all (&optional no-jit interactive) + "Reload all snippets and rebuild the YASnippet menu. + +When NO-JIT is non-nil force immediate reload of all known +snippets under `yas-snippet-dirs', otherwise use just-in-time +loading. + +When called interactively, use just-in-time loading when given a +prefix argument." + (interactive (list (not current-prefix-arg) t)) + (catch 'abort + (let ((errors) + (snippet-editing-buffers + (cl-remove-if-not (lambda (buffer) + (with-current-buffer buffer + yas--editing-template)) + (buffer-list)))) + ;; Warn if there are buffers visiting snippets, since reloading will break + ;; any on-line editing of those buffers. + ;; + (when snippet-editing-buffers + (if interactive + (if (y-or-n-p "Some buffers editing live snippets, close them and proceed with reload? ") + (mapc #'kill-buffer snippet-editing-buffers) + (yas--message 1 "Aborted reload...") + (throw 'abort nil)) + ;; in a non-interactive use, at least set + ;; `yas--editing-template' to nil, make it guess it next time around + (mapc #'(lambda (buffer) + (with-current-buffer buffer + (kill-local-variable 'yas--editing-template))) + (buffer-list)))) + + ;; Empty all snippet tables and parenting info + ;; + (setq yas--tables (make-hash-table)) + (setq yas--parents (make-hash-table)) + + ;; Before killing `yas--menu-table' use its keys to cleanup the + ;; mode menu parts of `yas--minor-mode-menu' (thus also cleaning + ;; up `yas-minor-mode-map', which points to it) + ;; + (maphash #'(lambda (menu-symbol _keymap) + (define-key yas--minor-mode-menu (vector menu-symbol) nil)) + yas--menu-table) + ;; Now empty `yas--menu-table' as well + (setq yas--menu-table (make-hash-table)) + + ;; Cancel all pending 'yas--scheduled-jit-loads' + ;; + (setq yas--scheduled-jit-loads (make-hash-table)) + + ;; Reload the directories listed in `yas-snippet-dirs' or prompt + ;; the user to select one. + ;; + (setq errors (yas--load-snippet-dirs no-jit)) + ;; Reload the direct keybindings + ;; + (yas-direct-keymaps-reload) + + (run-hooks 'yas-after-reload-hook) + (let ((no-snippets + (cl-every (lambda (table) (= (hash-table-count table) 0)) + (list yas--scheduled-jit-loads + yas--parents yas--tables)))) + (yas--message (if (or no-snippets errors) 2 3) + (if no-jit "Snippets loaded %s." + "Prepared just-in-time loading of snippets %s.") + (cond (errors + "with some errors. Check *Messages*") + (no-snippets + "(but no snippets found)") + (t + "successfully"))))))) + +(defvar yas-after-reload-hook nil + "Hooks run after `yas-reload-all'.") + +(defun yas--load-pending-jits () + (dolist (mode (yas--modes-to-activate)) + (let ((funs (reverse (gethash mode yas--scheduled-jit-loads)))) + ;; must reverse to maintain coherence with `yas-snippet-dirs' + (dolist (fun funs) + (yas--message 4 "Loading for `%s', just-in-time: %s!" mode fun) + (funcall fun)) + (remhash mode yas--scheduled-jit-loads)))) + +(defun yas-escape-text (text) + "Escape TEXT for snippet." + (when text + (replace-regexp-in-string "[\\$]" "\\\\\\&" text))) + + +;;; Snippet compilation function + +(defun yas-compile-directory (top-level-dir) + "Create .yas-compiled-snippets.el files under subdirs of TOP-LEVEL-DIR. + +This works by stubbing a few functions, then calling +`yas-load-directory'." + (interactive "DTop level snippet directory?") + (let ((yas--creating-compiled-snippets t)) + (yas-load-directory top-level-dir nil))) + +(defun yas-recompile-all () + "Compile every dir in `yas-snippet-dirs'." + (interactive) + (mapc #'yas-compile-directory (yas-snippet-dirs))) + + +;;; JIT loading +;;; + +(defvar yas--scheduled-jit-loads (make-hash-table) + "Alist of mode-symbols to forms to be evaled when `yas-minor-mode' kicks in.") + +(defun yas--schedule-jit (mode fun) + (push fun (gethash mode yas--scheduled-jit-loads))) + + + +;;; Some user level functions + +(defun yas-about () + (interactive) + (message "yasnippet (version %s) -- pluskid/joaotavora/npostavs" + (or (ignore-errors (car (let ((default-directory yas--loaddir)) + (process-lines "git" "describe" + "--tags" "--dirty")))) + (when (and (featurep 'package) + (fboundp 'package-desc-version) + (fboundp 'package-version-join)) + (defvar package-alist) + (ignore-errors + (let* ((yas-pkg (cdr (assq 'yasnippet package-alist))) + (version (package-version-join + (package-desc-version (car yas-pkg))))) + ;; Special case for MELPA's bogus version numbers. + (if (string-match "\\`20..[01][0-9][0-3][0-9][.][0-9]\\{3,4\\}\\'" + version) + (concat yas--version "-snapshot" version) + version)))) + yas--version))) + + +;;; Apropos snippet menu: +;; +;; The snippet menu keymaps are stored by mode in hash table called +;; `yas--menu-table'. They are linked to the main menu in +;; `yas--menu-keymap-get-create' and are initially created empty, +;; reflecting the table hierarchy. +;; +;; They can be populated in two mutually exclusive ways: (1) by +;; reading `yas--template-group', which in turn is populated by the "# +;; group:" directives of the snippets or the ".yas-make-groups" file +;; or (2) by using a separate `yas-define-menu' call, which declares a +;; menu structure based on snippets uuids. +;; +;; Both situations are handled in `yas--update-template-menu', which +;; uses the predicate `yas--template-menu-managed-by-yas-define-menu' +;; that can tell between the two situations. +;; +;; Note: +;; +;; * if `yas-define-menu' is used it must run before +;; `yas-define-snippets' and the UUIDS must match, otherwise we get +;; duplicate entries. The `yas--template' objects are created in +;; `yas-define-menu', holding nothing but the menu entry, +;; represented by a pair of ((menu-item NAME :keys KEYS) TYPE) and +;; stored in `yas--template-menu-binding-pair'. The (menu-item ...) +;; part is then stored in the menu keymap itself which make the item +;; appear to the user. These limitations could probably be revised. +;; +;; * The `yas--template-perm-group' slot is only used in +;; `yas-describe-tables'. +;; +(defun yas--template-menu-binding-pair-get-create (template &optional type) + "Get TEMPLATE's menu binding or assign it a new one. + +TYPE may be `:stay', signaling this menu binding should be +static in the menu." + (or (yas--template-menu-binding-pair template) + (let (;; (key (yas--template-key template)) + ;; (keybinding (yas--template-keybinding template)) + ) + (setf (yas--template-menu-binding-pair template) + (cons `(menu-item ,(or (yas--template-name template) + (yas--template-uuid template)) + ,(yas--make-menu-binding template) + :keys ,nil) + type))))) +(defun yas--template-menu-managed-by-yas-define-menu (template) + "Non-nil if TEMPLATE's menu entry was included in a `yas-define-menu' call." + (cdr (yas--template-menu-binding-pair template))) + + +(defun yas--show-menu-p (mode) + (cond ((eq yas-use-menu 'abbreviate) + (cl-find mode + (mapcar #'yas--table-mode + (yas--get-snippet-tables)))) + (yas-use-menu t))) + +(defun yas--delete-from-keymap (keymap uuid) + "Recursively delete items with UUID from KEYMAP and its submenus." + + ;; XXX: This used to skip any submenus named \"parent mode\" + ;; + ;; First of all, recursively enter submenus, i.e. the tree is + ;; searched depth first so that stale submenus can be found in the + ;; higher passes. + ;; + (mapc #'(lambda (item) + (when (and (consp (cdr-safe item)) + (keymapp (nth 2 (cdr item)))) + (yas--delete-from-keymap (nth 2 (cdr item)) uuid))) + (cdr keymap)) + ;; Set the uuid entry to nil + ;; + (define-key keymap (vector (make-symbol uuid)) nil) + ;; Destructively modify keymap + ;; + (setcdr keymap (cl-delete-if (lambda (item) + (cond ((not (listp item)) nil) + ((null (cdr item))) + ((and (keymapp (nth 2 (cdr item))) + (null (cdr (nth 2 (cdr item)))))))) + (cdr keymap)))) + +(defun yas-define-menu (mode menu &optional omit-items) + "Define a snippet menu for MODE according to MENU, omitting OMIT-ITEMS. + +MENU is a list, its elements can be: + +- (yas-item UUID) : Creates an entry the snippet identified with + UUID. The menu entry for a snippet thus identified is + permanent, i.e. it will never move (be reordered) in the menu. + +- (yas-separator) : Creates a separator + +- (yas-submenu NAME SUBMENU) : Creates a submenu with NAME, + SUBMENU has the same form as MENU. NAME is also added to the + list of groups of the snippets defined thereafter. + +OMIT-ITEMS is a list of snippet uuids that will always be +omitted from MODE's menu, even if they're manually loaded." + (let* ((table (yas--table-get-create mode)) + (hash (yas--table-uuidhash table))) + (yas--define-menu-1 table + (yas--menu-keymap-get-create mode) + menu + hash) + (dolist (uuid omit-items) + (let ((template (or (gethash uuid hash) + (puthash uuid + (yas--make-template :table table + :uuid uuid) + hash)))) + (setf (yas--template-menu-binding-pair template) (cons nil :none)))))) + +(defun yas--define-menu-1 (table menu-keymap menu uuidhash &optional group-list) + "Helper for `yas-define-menu'." + (cl-loop + for (type name submenu) in (reverse menu) + collect (cond + ((or (eq type 'yas-item) + (and yas-alias-to-yas/prefix-p + (eq type 'yas/item))) + (let ((template (or (gethash name uuidhash) + (puthash name + (yas--make-template + :table table + :perm-group group-list + :uuid name) + uuidhash)))) + (car (yas--template-menu-binding-pair-get-create + template :stay)))) + ((or (eq type 'yas-submenu) + (and yas-alias-to-yas/prefix-p + (eq type 'yas/submenu))) + (let ((subkeymap (make-sparse-keymap))) + (yas--define-menu-1 table subkeymap submenu uuidhash + (append group-list (list name))) + `(menu-item ,name ,subkeymap))) + ((or (eq type 'yas-separator) + (and yas-alias-to-yas/prefix-p + (eq type 'yas/separator))) + '(menu-item "----")) + (t (yas--message 1 "Don't know anything about menu entry %s" type) + nil)) + into menu-entries + finally do (push (apply #'vector menu-entries) (cdr menu-keymap)))) + +(defun yas--define (mode key template &optional name condition group) + "Define a snippet. Expanding KEY into TEMPLATE. + +NAME is a description to this template. Also update the menu if +`yas-use-menu' is t. CONDITION is the condition attached to +this snippet. If you attach a condition to a snippet, then it +will only be expanded when the condition evaluated to non-nil." + (yas-define-snippets mode + (list (list key template name condition group)))) + +(defun yas-hippie-try-expand (first-time?) + "Integrate with hippie expand. + +Just put this function in `hippie-expand-try-functions-list'." + (when yas-minor-mode + (if (not first-time?) + (let ((yas-fallback-behavior 'return-nil)) + (yas-expand)) + (undo 1) + nil))) + + +;;; Apropos condition-cache: +;;; +;;; +;;; +;;; +(defmacro yas-define-condition-cache (func doc &rest body) + "Define a function FUNC with doc DOC and body BODY. +BODY is executed at most once every snippet expansion attempt, to check +expansion conditions. + +It doesn't make any sense to call FUNC programatically." + `(defun ,func () ,(if (and doc + (stringp doc)) + (concat doc +"\n\nFor use in snippets' conditions. Within each +snippet-expansion routine like `yas-expand', computes actual +value for the first time then always returns a cached value.") + (setq body (cons doc body)) + nil) + (let ((timestamp-and-value (get ',func 'yas--condition-cache))) + (if (equal (car timestamp-and-value) yas--condition-cache-timestamp) + (cdr timestamp-and-value) + (let ((new-value (progn + ,@body + ))) + (put ',func 'yas--condition-cache (cons yas--condition-cache-timestamp new-value)) + new-value))))) + +(defalias 'yas-expand 'yas-expand-from-trigger-key) +(defun yas-expand-from-trigger-key (&optional field) + "Expand a snippet before point. + +If no snippet expansion is possible, fall back to the behaviour +defined in `yas-fallback-behavior'. + +Optional argument FIELD is for non-interactive use and is an +object satisfying `yas--field-p' to restrict the expansion to." + (interactive) + (setq yas--condition-cache-timestamp (current-time)) + (let (templates-and-pos) + (unless (and yas-expand-only-for-last-commands + (not (member last-command yas-expand-only-for-last-commands))) + (setq templates-and-pos (if field + (save-restriction + (narrow-to-region (yas--field-start field) + (yas--field-end field)) + (yas--templates-for-key-at-point)) + (yas--templates-for-key-at-point)))) + (if templates-and-pos + (yas--expand-or-prompt-for-template + (nth 0 templates-and-pos) + ;; Delete snippet key and active region when expanding. + (min (if (use-region-p) (region-beginning) most-positive-fixnum) + (nth 1 templates-and-pos)) + (max (if (use-region-p) (region-end) most-negative-fixnum) + (nth 2 templates-and-pos))) + (yas--fallback)))) + +(defun yas--maybe-expand-from-keymap-filter (cmd) + "Check whether a snippet may be expanded. +If there are expandable snippets, return CMD (this is useful for +conditional keybindings) or the list of expandable snippet +template objects if CMD is nil (this is useful as a more general predicate)." + (let* ((yas--condition-cache-timestamp (current-time)) + (vec (cl-subseq (this-command-keys-vector) + (if current-prefix-arg + (length (this-command-keys)) + 0))) + (templates (cl-mapcan (lambda (table) + (yas--fetch table vec)) + (yas--get-snippet-tables)))) + (if templates (or cmd templates)))) + +(defun yas-expand-from-keymap () + "Directly expand some snippets, searching `yas--direct-keymaps'." + (interactive) + (setq yas--condition-cache-timestamp (current-time)) + (let* ((templates (yas--maybe-expand-from-keymap-filter nil))) + (when templates + (yas--expand-or-prompt-for-template templates)))) + +(defun yas--expand-or-prompt-for-template (templates &optional start end) + "Expand one of TEMPLATES from START to END. + +Prompt the user if TEMPLATES has more than one element, else +expand immediately. Common gateway for +`yas-expand-from-trigger-key' and `yas-expand-from-keymap'." + (let ((yas--current-template + (or (and (cl-rest templates) ;; more than one + (yas--prompt-for-template (mapcar #'cdr templates))) + (cdar templates)))) + (when yas--current-template + (yas-expand-snippet yas--current-template start end)))) + +;; Apropos the trigger key and the fallback binding: +;; +;; When `yas-minor-mode-map' binds <tab>, that correctly overrides +;; org-mode's <tab>, for example and searching for fallbacks correctly +;; returns `org-cycle'. However, most other modes bind "TAB". TODO, +;; improve this explanation. +;; +(defun yas--fallback () + "Fallback after expansion has failed. + +Common gateway for `yas-expand-from-trigger-key' and +`yas-expand-from-keymap'." + (cond ((eq yas-fallback-behavior 'return-nil) + ;; return nil + nil) + ((eq yas-fallback-behavior 'yas--fallback) + (error (concat "yasnippet fallback loop!\n" + "This can happen when you bind `yas-expand' " + "outside of the `yas-minor-mode-map'."))) + ((eq yas-fallback-behavior 'call-other-command) + (let* ((yas-fallback-behavior 'yas--fallback) + ;; Also bind `yas-minor-mode' to prevent fallback + ;; loops when other extensions use mechanisms similar + ;; to `yas--keybinding-beyond-yasnippet'. (github #525 + ;; and #526) + ;; + (yas-minor-mode nil) + (beyond-yasnippet (yas--keybinding-beyond-yasnippet))) + (yas--message 4 "Falling back to %s" beyond-yasnippet) + (cl-assert (or (null beyond-yasnippet) (commandp beyond-yasnippet))) + (setq this-command beyond-yasnippet) + (when beyond-yasnippet + (call-interactively beyond-yasnippet)))) + ((and (listp yas-fallback-behavior) + (cdr yas-fallback-behavior) + (eq 'apply (car yas-fallback-behavior))) + (let ((command-or-fn (cadr yas-fallback-behavior)) + (args (cddr yas-fallback-behavior)) + (yas-fallback-behavior 'yas--fallback) + (yas-minor-mode nil)) + (if args + (apply command-or-fn args) + (when (commandp command-or-fn) + (setq this-command command-or-fn) + (call-interactively command-or-fn))))) + (t + ;; also return nil if all the other fallbacks have failed + nil))) + +(defun yas--keybinding-beyond-yasnippet () + "Get current keys's binding as if YASsnippet didn't exist." + (let* ((yas-minor-mode nil) + (yas--direct-keymaps nil) + (keys (this-single-command-keys))) + (or (key-binding keys t) + (key-binding (yas--fallback-translate-input keys) t)))) + +(defun yas--fallback-translate-input (keys) + "Emulate `read-key-sequence', at least what I think it does. + +Keys should be an untranslated key vector. Returns a translated +vector of keys. FIXME not thoroughly tested." + (let ((retval []) + (i 0)) + (while (< i (length keys)) + (let ((j i) + (translated local-function-key-map)) + (while (and (< j (length keys)) + translated + (keymapp translated)) + (setq translated (cdr (assoc (aref keys j) (remove 'keymap translated))) + j (1+ j))) + (setq retval (vconcat retval (cond ((symbolp translated) + `[,translated]) + ((vectorp translated) + translated) + (t + (substring keys i j))))) + (setq i j))) + retval)) + + +;;; Utils for snippet development: + +(defun yas--all-templates (tables) + "Get `yas--template' objects in TABLES, applicable for buffer and point. + +Honours `yas-choose-tables-first', `yas-choose-keys-first' and +`yas-buffer-local-condition'" + (when yas-choose-tables-first + (setq tables (list (yas--prompt-for-table tables)))) + (mapcar #'cdr + (if yas-choose-keys-first + (let ((key (yas--prompt-for-keys + (cl-mapcan #'yas--table-all-keys tables)))) + (when key + (cl-mapcan (lambda (table) + (yas--fetch table key)) + tables))) + (cl-remove-duplicates (cl-mapcan #'yas--table-templates tables) + :test #'equal)))) + +(defun yas--lookup-snippet-1 (name mode) + "Get the snippet called NAME in MODE's tables." + (let ((yas-choose-tables-first nil) ; avoid prompts + (yas-choose-keys-first nil)) + (cl-find name (yas--all-templates + (yas--get-snippet-tables mode)) + :key #'yas--template-name :test #'string=))) + +(defun yas-lookup-snippet (name &optional mode noerror) + "Get the snippet named NAME in MODE's tables. + +MODE defaults to the current buffer's `major-mode'. If NOERROR +is non-nil, then don't signal an error if there isn't any snippet +called NAME. + +Honours `yas-buffer-local-condition'." + (cond + ((yas--lookup-snippet-1 name mode)) + (noerror nil) + (t (error "No snippet named: %s" name)))) + +(defun yas-insert-snippet (&optional no-condition) + "Choose a snippet to expand, pop-up a list of choices according +to `yas-prompt-functions'. + +With prefix argument NO-CONDITION, bypass filtering of snippets +by condition." + (interactive "P") + (setq yas--condition-cache-timestamp (current-time)) + (let* ((yas-buffer-local-condition (or (and no-condition + 'always) + yas-buffer-local-condition)) + (templates (yas--all-templates (yas--get-snippet-tables))) + (yas--current-template (and templates + (or (and (cl-rest templates) ;; more than one template for same key + (yas--prompt-for-template templates)) + (car templates)))) + (where (if (region-active-p) + (cons (region-beginning) (region-end)) + (cons (point) (point))))) + (if yas--current-template + (yas-expand-snippet yas--current-template (car where) (cdr where)) + (yas--message 1 "No snippets can be inserted here!")))) + +(defun yas-visit-snippet-file () + "Choose a snippet to edit, selection like `yas-insert-snippet'. + +Only success if selected snippet was loaded from a file. Put the +visited file in `snippet-mode'." + (interactive) + (let* ((yas-buffer-local-condition 'always) + (templates (yas--all-templates (yas--get-snippet-tables))) + (template (and templates + (or (yas--prompt-for-template templates + "Choose a snippet template to edit: ") + (car templates))))) + + (if template + (yas--visit-snippet-file-1 template) + (message "No snippets tables active!")))) + +(defun yas--visit-snippet-file-1 (template) + "Helper for `yas-visit-snippet-file'." + (let ((file (yas--template-get-file template))) + (cond ((and file (file-readable-p file)) + (find-file-other-window file) + (snippet-mode) + (set (make-local-variable 'yas--editing-template) template)) + (file + (message "Original file %s no longer exists!" file)) + (t + (switch-to-buffer (format "*%s*"(yas--template-name template))) + (let ((type 'snippet)) + (when (listp (yas--template-content template)) + (insert (format "# type: command\n")) + (setq type 'command)) + (insert (format "# key: %s\n" (yas--template-key template))) + (insert (format "# name: %s\n" (yas--template-name template))) + (when (yas--template-keybinding template) + (insert (format "# binding: %s\n" (yas--template-keybinding template)))) + (when (yas--template-expand-env template) + (insert (format "# expand-env: %s\n" (yas--template-expand-env template)))) + (when (yas--template-condition template) + (insert (format "# condition: %s\n" (yas--template-condition template)))) + (insert "# --\n") + (insert (if (eq type 'command) + (pp-to-string (yas--template-content template)) + (yas--template-content template)))) + (snippet-mode) + (set (make-local-variable 'yas--editing-template) template) + (set (make-local-variable 'default-directory) + (car (cdr (car (yas--guess-snippet-directories (yas--template-table template)))))))))) + +(defun yas--guess-snippet-directories-1 (table) + "Guess possible snippet subdirectories for TABLE." + (cons (file-name-as-directory (yas--table-name table)) + (cl-mapcan #'yas--guess-snippet-directories-1 + (yas--table-parents table)))) + +(defun yas--guess-snippet-directories (&optional table) + "Try to guess suitable directories based on the current active +tables (or optional TABLE). + +Returns a list of elements (TABLE . DIRS) where TABLE is a +`yas--table' object and DIRS is a list of all possible directories +where snippets of table might exist." + (let ((main-dir (car (or (yas-snippet-dirs) + (setq yas-snippet-dirs + (list yas--default-user-snippets-dir))))) + (tables (if table (list table) + (yas--get-snippet-tables)))) + ;; HACK! the snippet table created here is actually registered! + (unless table + ;; The major mode is probably the best guess, put it first. + (let ((major-mode-table (yas--table-get-create major-mode))) + (cl-callf2 delq major-mode-table tables) + (push major-mode-table tables))) + + (mapcar #'(lambda (table) + (cons table + (mapcar #'(lambda (subdir) + (expand-file-name subdir main-dir)) + (yas--guess-snippet-directories-1 table)))) + tables))) + +(defun yas--make-directory-maybe (table-and-dirs &optional main-table-string) + "Return a dir inside TABLE-AND-DIRS, prompts for creation if none exists." + (or (cl-some (lambda (dir) (when (file-directory-p dir) dir)) + (cdr table-and-dirs)) + (let ((candidate (cl-first (cdr table-and-dirs)))) + (unless (file-writable-p (file-name-directory candidate)) + (error (yas--format "%s is not writable." candidate))) + (if (y-or-n-p (format "Guessed directory (%s) for%s%s table \"%s\" does not exist! Create? " + candidate + (if (gethash (yas--table-mode (car table-and-dirs)) + yas--tables) + "" + " brand new") + (or main-table-string + "") + (yas--table-name (car table-and-dirs)))) + (progn + (make-directory candidate 'also-make-parents) + ;; create the .yas-parents file here... + candidate))))) + +;; NOTE: Using the traditional "*new snippet*" stops whitespace mode +;; from activating (it doesn't like the leading "*"). +(defconst yas-new-snippet-buffer-name "+new-snippet+") + +(defun yas-new-snippet (&optional no-template) + "Pops a new buffer for writing a snippet. + +Expands a snippet-writing snippet, unless the optional prefix arg +NO-TEMPLATE is non-nil." + (interactive "P") + (let ((guessed-directories (yas--guess-snippet-directories)) + (yas-selected-text (or yas-selected-text + (and (region-active-p) + (buffer-substring-no-properties + (region-beginning) (region-end)))))) + + (switch-to-buffer yas-new-snippet-buffer-name) + (erase-buffer) + (kill-all-local-variables) + (snippet-mode) + (yas-minor-mode 1) + (set (make-local-variable 'yas--guessed-modes) + (mapcar (lambda (d) (yas--table-mode (car d))) + guessed-directories)) + (set (make-local-variable 'default-directory) + (car (cdr (car guessed-directories)))) + (if (and (not no-template) yas-new-snippet-default) + (yas-expand-snippet yas-new-snippet-default)))) + +(defun yas--compute-major-mode-and-parents (file) + "Given FILE, find the nearest snippet directory for a given mode. + +Returns a list (MODE-SYM PARENTS), the mode's symbol and a list +representing one or more of the mode's parents. + +Note that MODE-SYM need not be the symbol of a real major mode, +neither do the elements of PARENTS." + (let* ((file-dir (and file + (directory-file-name + (or (cl-some (lambda (special) + (locate-dominating-file file special)) + '(".yas-setup.el" + ".yas-make-groups" + ".yas-parents")) + (directory-file-name (file-name-directory file)))))) + (parents-file-name (concat file-dir "/.yas-parents")) + (major-mode-name (and file-dir + (file-name-nondirectory file-dir))) + (major-mode-sym (or (and major-mode-name + (intern major-mode-name)))) + (parents (when (file-readable-p parents-file-name) + (mapcar #'intern + (split-string + (with-temp-buffer + (insert-file-contents parents-file-name) + (buffer-substring-no-properties (point-min) + (point-max)))))))) + (when major-mode-sym + (cons major-mode-sym (remove major-mode-sym parents))))) + +(defvar yas--editing-template nil + "Supporting variable for `yas-load-snippet-buffer' and `yas--visit-snippet'.") + +(defvar yas--current-template nil + "Holds the current template being expanded into a snippet.") + +(defvar yas--guessed-modes nil + "List of guessed modes supporting `yas-load-snippet-buffer'.") + +(defun yas--read-table () + "Ask user for a snippet table, help with some guessing." + (let ((prompt (if (and (featurep 'ido) + ido-mode) + 'ido-completing-read 'completing-read))) + (unless yas--guessed-modes + (set (make-local-variable 'yas--guessed-modes) + (or (yas--compute-major-mode-and-parents buffer-file-name)))) + (intern + (funcall prompt (format "Choose or enter a table (yas guesses %s): " + (if yas--guessed-modes + (cl-first yas--guessed-modes) + "nothing")) + (mapcar #'symbol-name yas--guessed-modes) + nil + nil + nil + nil + (if (cl-first yas--guessed-modes) + (symbol-name (cl-first yas--guessed-modes))))))) + +(defun yas-load-snippet-buffer (table &optional interactive) + "Parse and load current buffer's snippet definition into TABLE. +TABLE is a symbol name passed to `yas--table-get-create'. When +called interactively, prompt for the table name. +Return the `yas--template' object created" + (interactive (list (yas--read-table) t)) + (cond + ;; We have `yas--editing-template', this buffer's content comes from a + ;; template which is already loaded and neatly positioned,... + ;; + (yas--editing-template + (yas--define-snippets-1 (yas--parse-template (yas--template-load-file yas--editing-template)) + (yas--template-table yas--editing-template))) + ;; Try to use `yas--guessed-modes'. If we don't have that use the + ;; value from `yas--compute-major-mode-and-parents' + ;; + (t + (unless yas--guessed-modes + (set (make-local-variable 'yas--guessed-modes) (or (yas--compute-major-mode-and-parents buffer-file-name)))) + (let* ((table (yas--table-get-create table))) + (set (make-local-variable 'yas--editing-template) + (yas--define-snippets-1 (yas--parse-template buffer-file-name) + table))))) + (when interactive + (yas--message 3 "Snippet \"%s\" loaded for %s." + (yas--template-name yas--editing-template) + (yas--table-name (yas--template-table yas--editing-template)))) + yas--editing-template) + +(defun yas-maybe-load-snippet-buffer () + "Added to `after-save-hook' in `snippet-mode'." + (let* ((mode (intern (file-name-sans-extension + (file-name-nondirectory + (directory-file-name default-directory))))) + (current-snippet + (apply #'yas--define-snippets-2 (yas--table-get-create mode) + (yas--parse-template buffer-file-name))) + (uuid (yas--template-uuid current-snippet))) + (unless (equal current-snippet + (if uuid (yas--get-template-by-uuid mode uuid) + (yas--lookup-snippet-1 + (yas--template-name current-snippet) mode))) + (yas-load-snippet-buffer mode t)))) + +(defun yas-load-snippet-buffer-and-close (table &optional kill) + "Load and save the snippet, then `quit-window' if saved. +Loading is performed by `yas-load-snippet-buffer'. If the +snippet is new, ask the user whether (and where) to save it. If +the snippet already has a file, just save it. + +The prefix argument KILL is passed to `quit-window'. + +Don't use this from a Lisp program, call `yas-load-snippet-buffer' +and `kill-buffer' instead." + (interactive (list (yas--read-table) current-prefix-arg)) + (let ((template (yas-load-snippet-buffer table t))) + (when (and (buffer-modified-p) + (y-or-n-p + (format "[yas] Loaded for %s. Also save snippet buffer?" + (yas--table-name (yas--template-table template))))) + (let ((default-directory (car (cdr (car (yas--guess-snippet-directories + (yas--template-table template)))))) + (default-file-name (yas--template-name template))) + (unless (or buffer-file-name (not default-file-name)) + (setq buffer-file-name + (read-file-name "File to save snippet in: " + nil nil nil default-file-name)) + (rename-buffer (file-name-nondirectory buffer-file-name) t)) + (save-buffer))) + (quit-window kill))) + +(declare-function yas-debug-snippets "yasnippet-debug") + +(defun yas-tryout-snippet (&optional debug) + "Test current buffer's snippet template in other buffer. +DEBUG is for debugging the YASnippet engine itself." + (interactive "P") + (let* ((major-mode-and-parent (yas--compute-major-mode-and-parents buffer-file-name)) + (parsed (yas--parse-template)) + (test-mode (or (and (car major-mode-and-parent) + (fboundp (car major-mode-and-parent)) + (car major-mode-and-parent)) + (cl-first yas--guessed-modes) + (intern (read-from-minibuffer (yas--format "Please input a mode: "))))) + (yas--current-template + (and parsed + (fboundp test-mode) + (yas--make-template :table nil ;; no tables for ephemeral snippets + :key (nth 0 parsed) + :content (nth 1 parsed) + :name (nth 2 parsed) + :expand-env (nth 5 parsed))))) + (cond (yas--current-template + (let ((buffer-name + (format "*testing snippet: %s*" + (yas--template-name yas--current-template)))) + (kill-buffer (get-buffer-create buffer-name)) + (switch-to-buffer (get-buffer-create buffer-name)) + (setq buffer-undo-list nil) + (condition-case nil (funcall test-mode) (error nil)) + (yas-minor-mode 1) + (setq buffer-read-only nil) + (yas-expand-snippet yas--current-template + (point-min) (point-max)) + (when (and debug + (require 'yasnippet-debug nil t)) + (yas-debug-snippets "*YASnippet trace*" 'snippet-navigation) + (display-buffer "*YASnippet trace*")))) + (t + (yas--message 1 "Cannot test snippet for unknown major mode"))))) + +(defun yas-active-keys () + "Return all active trigger keys for current buffer and point." + (cl-remove-duplicates + (cl-remove-if-not #'stringp (cl-mapcan #'yas--table-all-keys + (yas--get-snippet-tables))) + :test #'string=)) + +(defun yas--template-fine-group (template) + (car (last (or (yas--template-group template) + (yas--template-perm-group template))))) + +(defun yas-describe-table-by-namehash () + "Display snippet tables by NAMEHASH." + (interactive) + (with-current-buffer (get-buffer-create "*YASnippet Tables by NAMEHASH*") + (let ((inhibit-read-only t)) + (erase-buffer) + (insert "YASnippet tables by NAMEHASH: \n") + (maphash + (lambda (_mode table) + (insert (format "\nSnippet table `%s':\n\n" (yas--table-name table))) + (maphash + (lambda (key _v) + (insert (format " key %s maps snippets: %s\n" key + (let ((names)) + (maphash #'(lambda (k _v) + (push k names)) + (gethash key (yas--table-hash table))) + names)))) + (yas--table-hash table))) + yas--tables)) + (view-mode +1) + (goto-char 1) + (display-buffer (current-buffer)))) + +(defun yas-describe-tables (&optional with-nonactive) + "Display snippets for each table." + (interactive "P") + (let ((original-buffer (current-buffer)) + (tables (yas--get-snippet-tables))) + (with-current-buffer (get-buffer-create "*YASnippet Tables*") + (let ((inhibit-read-only t)) + (when with-nonactive + (maphash #'(lambda (_k v) + (cl-pushnew v tables)) + yas--tables)) + (erase-buffer) + (insert "YASnippet tables:\n") + (dolist (table tables) + (yas--describe-pretty-table table original-buffer)) + (yas--create-snippet-xrefs)) + (help-mode) + (goto-char 1) + (display-buffer (current-buffer))))) + +(defun yas--describe-pretty-table (table &optional original-buffer) + (insert (format "\nSnippet table `%s'" + (yas--table-name table))) + (if (yas--table-parents table) + (insert (format " parents: %s\n" + (mapcar #'yas--table-name + (yas--table-parents table)))) + (insert "\n")) + (insert (make-string 100 ?-) "\n") + (insert "group state name key binding\n") + (let ((groups-hash (make-hash-table :test #'equal))) + (maphash #'(lambda (_k v) + (let ((group (or (yas--template-fine-group v) + "(top level)"))) + (when (yas--template-name v) + (puthash group + (cons v (gethash group groups-hash)) + groups-hash)))) + (yas--table-uuidhash table)) + (maphash + #'(lambda (group templates) + (setq group (truncate-string-to-width group 25 0 ? "...")) + (insert (make-string 100 ?-) "\n") + (dolist (p templates) + (let* ((name (truncate-string-to-width (propertize (format "\\\\snippet `%s'" (yas--template-name p)) + 'yasnippet p) + 50 0 ? "...")) + (group (prog1 group + (setq group (make-string (length group) ? )))) + (condition-string (let ((condition (yas--template-condition p))) + (if (and condition + original-buffer) + (with-current-buffer original-buffer + (if (yas--eval-condition condition) + "(y)" + "(s)")) + "(a)"))) + (key-description-string (key-description (yas--template-keybinding p))) + (template-key-padding (if (string= key-description-string "") nil ? ))) + (insert group " " + condition-string " " + name (if (string-match "\\.\\.\\.$" name) + "'" " ") + " " + (truncate-string-to-width (or (yas--template-key p) "") + 15 0 template-key-padding "...") + (or template-key-padding "") + (truncate-string-to-width key-description-string + 15 0 nil "...") + "\n")))) + groups-hash))) + + + +;;; User convenience functions, for using in `yas-key-syntaxes' + +(defun yas-try-key-from-whitespace (_start-point) + "As `yas-key-syntaxes' element, look for whitespace delimited key. + +A newline will be considered whitespace even if the mode syntax +marks it as something else (typically comment ender)." + (skip-chars-backward "^[:space:]\n")) + +(defun yas-shortest-key-until-whitespace (_start-point) + "Like `yas-longest-key-from-whitespace' but take the shortest key." + (when (/= (skip-chars-backward "^[:space:]\n" (1- (point))) 0) + 'again)) + +(defun yas-longest-key-from-whitespace (start-point) + "As `yas-key-syntaxes' element, look for longest key between point and whitespace. + +A newline will be considered whitespace even if the mode syntax +marks it as something else (typically comment ender)." + (if (= (point) start-point) + (yas-try-key-from-whitespace start-point) + (forward-char)) + (unless (<= start-point (1+ (point))) + 'again)) + + + +;;; User convenience functions, for using in snippet definitions + +(defvar yas-modified-p nil + "Non-nil if field has been modified by user or transformation.") + +(defvar yas-moving-away-p nil + "Non-nil if user is about to exit field.") + +(defvar yas-text nil + "Contains current field text.") + +(defun yas-substr (str pattern &optional subexp) + "Search PATTERN in STR and return SUBEXPth match. + +If found, the content of subexp group SUBEXP (default 0) is + returned, or else the original STR will be returned." + (let ((grp (or subexp 0))) + (save-match-data + (if (string-match pattern str) + (match-string-no-properties grp str) + str)))) + +(defun yas-choose-value (&rest possibilities) + "Prompt for a string in POSSIBILITIES and return it. + +The last element of POSSIBILITIES may be a list of strings." + (unless (or yas-moving-away-p + yas-modified-p) + (let* ((last-link (last possibilities)) + (last-elem (car last-link))) + (when (listp last-elem) + (setcar last-link (car last-elem)) + (setcdr last-link (cdr last-elem)))) + (cl-some (lambda (fn) + (funcall fn "Choose: " possibilities)) + yas-prompt-functions))) + +(defun yas-completing-read (&rest args) + "A snippet-aware version of `completing-read'. +This can be used to query the user for the initial value of a +snippet field. The arguments are the same as `completing-read'. + +\(fn PROMPT COLLECTION &optional PREDICATE REQUIRE-MATCH INITIAL-INPUT HIST DEF INHERIT-INPUT-METHOD)" + (unless (or yas-moving-away-p + yas-modified-p) + (apply #'completing-read args))) + +(defun yas--auto-next () + "Helper for `yas-auto-next'." + (cl-loop + do (progn (remove-hook 'post-command-hook #'yas--auto-next t) + (yas-next-field)) + ;; The transform in the next field may have requested auto-next as + ;; well. Call it ourselves, since the command loop itself won't + ;; recheck the value of post-command-hook while running it. + while (memq #'yas--auto-next post-command-hook))) + +(defmacro yas-auto-next (&rest body) + "Automatically advance to next field after eval'ing BODY." + (declare (indent 0) (debug t)) + `(unless yas-moving-away-p + (prog1 ,@body + (add-hook 'post-command-hook #'yas--auto-next nil t)))) + +(defun yas-key-to-value (alist) + (unless (or yas-moving-away-p + yas-modified-p) + (let ((key (read-key-sequence ""))) + (when (stringp key) + (or (cdr (cl-find key alist :key #'car :test #'string=)) + key))))) + +(defun yas-throw (text) + "Signal `yas-exception' with TEXT as the reason." + (signal 'yas-exception (list text))) +(put 'yas-exception 'error-conditions '(error yas-exception)) +(put 'yas-exception 'error-message "[yas] Exception") + +(defun yas-verify-value (possibilities) + "Verify that the current field value is in POSSIBILITIES. +Otherwise signal `yas-exception'." + (when (and yas-moving-away-p (not (member yas-text possibilities))) + (yas-throw (format "Field only allows %s" possibilities)))) + +(defun yas-field-value (number) + "Get the string for field with NUMBER. + +Use this in primary and mirror transformations to get the text of +other fields." + (let* ((snippet (car (yas-active-snippets))) + (field (and snippet + (yas--snippet-find-field snippet number)))) + (when field + (yas--field-text-for-display field)))) + +(defun yas-text () + "Return `yas-text' if that exists and is non-empty, else nil." + (if (and yas-text + (not (string= "" yas-text))) + yas-text)) + +(defun yas-selected-text () + "Return `yas-selected-text' if that exists and is non-empty, else nil." + (if (and yas-selected-text + (not (string= "" yas-selected-text))) + yas-selected-text)) + +(defun yas--get-field-once (number &optional transform-fn) + (unless yas-modified-p + (if transform-fn + (funcall transform-fn (yas-field-value number)) + (yas-field-value number)))) + +(defun yas-default-from-field (number) + (unless yas-modified-p + (yas-field-value number))) + +(defun yas-inside-string () + "Return non-nil if the point is inside a string according to font-lock." + (equal 'font-lock-string-face (get-char-property (1- (point)) 'face))) + +(defun yas-unimplemented (&optional missing-feature) + (if yas--current-template + (if (y-or-n-p (format "This snippet is unimplemented (missing %s) Visit the snippet definition? " + (or missing-feature + "something"))) + (yas--visit-snippet-file-1 yas--current-template)) + (message "No implementation. Missing %s" (or missing-feature "something")))) + + +;;; Snippet expansion and field management + +(defvar yas--active-field-overlay nil + "Overlays the currently active field.") + +(defvar yas--active-snippets nil + "List of currently active snippets") +(make-variable-buffer-local 'yas--active-snippets) + +(defvar yas--field-protection-overlays nil + "Two overlays protect the current active field.") + +(defvar yas-selected-text nil + "The selected region deleted on the last snippet expansion.") + +(defvar yas--start-column nil + "The column where the snippet expansion started.") + +(make-variable-buffer-local 'yas--active-field-overlay) +(make-variable-buffer-local 'yas--field-protection-overlays) +(put 'yas--active-field-overlay 'permanent-local t) +(put 'yas--field-protection-overlays 'permanent-local t) + +(cl-defstruct (yas--snippet (:constructor yas--make-snippet (expand-env))) + "A snippet. + +..." + expand-env + (fields '()) + (exit nil) + (id (yas--snippet-next-id) :read-only t) + (control-overlay nil) + active-field + ;; stacked expansion: the `previous-active-field' slot saves the + ;; active field where the child expansion took place + previous-active-field + force-exit) + +(cl-defstruct (yas--field (:constructor yas--make-field (number start end parent-field))) + "A field. + +NUMBER is the field number. +START and END are mostly buffer markers, but see \"apropos markers-to-points\". +PARENT-FIELD is a `yas--field' this field is nested under, or nil. +MIRRORS is a list of `yas--mirror's +TRANSFORM is a lisp form. +MODIFIED-P is a boolean set to true once user inputs text. +NEXT is another `yas--field' or `yas--mirror' or `yas--exit'. +" + number + start end + parent-field + (mirrors '()) + (transform nil) + (modified-p nil) + next) + + +(cl-defstruct (yas--mirror (:constructor yas--make-mirror (start end transform))) + "A mirror. + +START and END are mostly buffer markers, but see \"apropos markers-to-points\". +TRANSFORM is a lisp form. +PARENT-FIELD is a `yas--field' this mirror is nested under, or nil. +NEXT is another `yas--field' or `yas--mirror' or `yas--exit' +DEPTH is a count of how many nested mirrors can affect this mirror" + start end + (transform nil) + parent-field + next + depth) + +(cl-defstruct (yas--exit (:constructor yas--make-exit (marker))) + marker + next) + +(defmacro yas--letenv (env &rest body) + "Evaluate BODY with bindings from ENV. +ENV is a lisp expression that evaluates to list of elements with +the form (VAR FORM), where VAR is a symbol and FORM is a lisp +expression that evaluates to its value." + (declare (debug (form body)) (indent 1)) + (let ((envvar (make-symbol "envvar"))) + `(let ((,envvar ,env)) + (cl-progv + (mapcar #'car ,envvar) + (mapcar (lambda (v-f) (eval (cadr v-f))) ,envvar) + ,@body)))) + +(defun yas--snippet-map-markers (fun snippet) + "Apply FUN to all marker (sub)fields in SNIPPET. +Update each field with the result of calling FUN." + (dolist (field (yas--snippet-fields snippet)) + (setf (yas--field-start field) (funcall fun (yas--field-start field))) + (setf (yas--field-end field) (funcall fun (yas--field-end field))) + (dolist (mirror (yas--field-mirrors field)) + (setf (yas--mirror-start mirror) (funcall fun (yas--mirror-start mirror))) + (setf (yas--mirror-end mirror) (funcall fun (yas--mirror-end mirror))))) + (let ((snippet-exit (yas--snippet-exit snippet))) + (when snippet-exit + (setf (yas--exit-marker snippet-exit) + (funcall fun (yas--exit-marker snippet-exit)))))) + +(defun yas--snippet-live-p (snippet) + "Return non-nil if SNIPPET hasn't been committed." + (catch 'live + (yas--snippet-map-markers (lambda (m) + (if (markerp m) m + (throw 'live nil))) + snippet) + t)) + +(defun yas--apply-transform (field-or-mirror field &optional empty-on-nil-p) + "Calculate transformed string for FIELD-OR-MIRROR from FIELD. + +If there is no transform for ht field, return nil. + +If there is a transform but it returns nil, return the empty +string iff EMPTY-ON-NIL-P is true." + (let* ((yas-text (yas--field-text-for-display field)) + (yas-modified-p (yas--field-modified-p field)) + (transform (if (yas--mirror-p field-or-mirror) + (yas--mirror-transform field-or-mirror) + (yas--field-transform field-or-mirror))) + (start-point (if (yas--mirror-p field-or-mirror) + (yas--mirror-start field-or-mirror) + (yas--field-start field-or-mirror))) + (transformed (and transform + (save-excursion + (goto-char start-point) + (let ((ret (yas--eval-for-string transform))) + (or ret (and empty-on-nil-p ""))))))) + transformed)) + +(defsubst yas--replace-all (from to &optional text) + "Replace all occurrences from FROM to TO. + +With optional string TEXT do it in that string." + (if text + (replace-regexp-in-string (regexp-quote from) to text t t) + (goto-char (point-min)) + (while (search-forward from nil t) + (replace-match to t t text)))) + +(defun yas--snippet-find-field (snippet number) + (cl-find-if (lambda (field) + (eq number (yas--field-number field))) + (yas--snippet-fields snippet))) + +(defun yas--snippet-sort-fields (snippet) + "Sort the fields of SNIPPET in navigation order." + (setf (yas--snippet-fields snippet) + (sort (yas--snippet-fields snippet) + #'yas--snippet-field-compare))) + +(defun yas--snippet-field-compare (field1 field2) + "Compare FIELD1 and FIELD2. + +The field with a number is sorted first. If they both have a +number, compare through the number. If neither have, compare +through the field's start point" + (let ((n1 (yas--field-number field1)) + (n2 (yas--field-number field2))) + (if n1 + (if n2 + (or (zerop n2) (and (not (zerop n1)) + (< n1 n2))) + (not (zerop n1))) + (if n2 + (zerop n2) + (< (yas--field-start field1) + (yas--field-start field2)))))) + +(defun yas--field-probably-deleted-p (snippet field) + "Guess if SNIPPET's FIELD should be skipped." + (and + ;; field must be zero length + ;; + (zerop (- (yas--field-start field) (yas--field-end field))) + ;; field must have been modified + ;; + (yas--field-modified-p field) + ;; either: + (or + ;; 1) it's a nested field + ;; + (yas--field-parent-field field) + ;; 2) ends just before the snippet end + ;; + (and (eq field (car (last (yas--snippet-fields snippet)))) + (= (yas--field-start field) (overlay-end (yas--snippet-control-overlay snippet))))) + ;; the field numbered 0, just before the exit marker, should + ;; never be skipped + ;; + (not (and (yas--field-number field) + (zerop (yas--field-number field)))))) + +(defun yas-active-snippets (&optional beg end) + "Return a sorted list of active snippets. +The most recently-inserted snippets are returned first. + +Only snippets overlapping the region BEG ... END are returned. +Overlapping has the same meaning as described in `overlays-in'. +If END is omitted, it defaults to (1+ BEG). If BEG is omitted, +it defaults to point. A non-nil, non-buffer position BEG is +equivalent to a range covering the whole buffer." + (unless beg + (setq beg (point))) + (cond ((not (or (integerp beg) (markerp beg))) + (setq beg (point-min) end (point-max))) + ((not end) + (setq end (1+ beg)))) + (if (and (eq beg (point-min)) + (eq end (point-max))) + yas--active-snippets + ;; Note: don't use `mapcar' here, since it would allocate in + ;; proportion to the amount of overlays, even though the list of + ;; active snippets should be very small. + (let ((snippets nil)) + (dolist (ov (overlays-in beg end)) + (let ((snippet (overlay-get ov 'yas--snippet))) + ;; Snippets have multiple overlays, so check for dups. + (when (and snippet (not (memq snippet snippets))) + (push snippet snippets)))) + (cl-sort snippets #'>= :key #'yas--snippet-id)))) + +(define-obsolete-function-alias 'yas--snippets-at-point + 'yas-active-snippets "0.12") + +(defun yas-next-field-or-maybe-expand () + "Try to expand a snippet at a key before point. + +Otherwise delegate to `yas-next-field'." + (interactive) + (if yas-triggers-in-field + (let ((yas-fallback-behavior 'return-nil) + (active-field (overlay-get yas--active-field-overlay 'yas--field))) + (when active-field + (unless (yas-expand-from-trigger-key active-field) + (yas-next-field)))) + (yas-next-field))) + +(defun yas-next-field-will-exit-p (&optional arg) + "Return non-nil if (yas-next-field ARG) would exit the current snippet." + (let ((snippet (car (yas-active-snippets))) + (active (overlay-get yas--active-field-overlay 'yas--field))) + (when snippet + (not (yas--find-next-field arg snippet active))))) + +(defun yas--find-next-field (n snippet active) + "Return the Nth field after the ACTIVE one in SNIPPET." + (let ((live-fields (cl-remove-if + (lambda (field) + (and (not (eq field active)) + (yas--field-probably-deleted-p snippet field))) + (yas--snippet-fields snippet)))) + (nth (abs n) (memq active (if (>= n 0) live-fields (reverse live-fields)))))) + +(defun yas-next-field (&optional arg) + "Navigate to the ARGth next field. + +If there's none, exit the snippet." + (interactive) + (unless arg (setq arg 1)) + (let* ((active-field (overlay-get yas--active-field-overlay 'yas--field)) + (snippet (car (yas-active-snippets (yas--field-start active-field) + (yas--field-end active-field)))) + (target-field (yas--find-next-field arg snippet active-field))) + (yas--letenv (yas--snippet-expand-env snippet) + ;; Apply transform to active field. + (when active-field + (let ((yas-moving-away-p t)) + (when (yas--field-update-display active-field) + (yas--update-mirrors snippet)))) + ;; Now actually move... + (if target-field + (yas--move-to-field snippet target-field) + (yas-exit-snippet snippet))))) + +(defun yas--place-overlays (snippet field) + "Correctly place overlays for SNIPPET's FIELD." + (yas--make-move-field-protection-overlays snippet field) + ;; Only move active field overlays if this is field is from the + ;; innermost snippet. + (when (eq snippet (car (yas-active-snippets (1- (yas--field-start field)) + (1+ (yas--field-end field))))) + (yas--make-move-active-field-overlay snippet field))) + +(defun yas--move-to-field (snippet field) + "Update SNIPPET to move to field FIELD. + +Also create some protection overlays" + (goto-char (yas--field-start field)) + (yas--place-overlays snippet field) + (overlay-put yas--active-field-overlay 'yas--snippet snippet) + (overlay-put yas--active-field-overlay 'yas--field field) + (let ((number (yas--field-number field))) + ;; check for the special ${0: ...} field + (if (and number (zerop number)) + (progn + (set-mark (yas--field-end field)) + (setf (yas--snippet-force-exit snippet) + (or (yas--field-transform field) + t))) + ;; make this field active + (setf (yas--snippet-active-field snippet) field) + ;; primary field transform: first call to snippet transform + (unless (yas--field-modified-p field) + (if (yas--field-update-display field) + (yas--update-mirrors snippet) + (setf (yas--field-modified-p field) nil)))))) + +(defun yas-prev-field () + "Navigate to prev field. If there's none, exit the snippet." + (interactive) + (yas-next-field -1)) + +(defun yas-abort-snippet (&optional snippet) + (interactive) + (let ((snippet (or snippet + (car (yas-active-snippets))))) + (when snippet + (setf (yas--snippet-force-exit snippet) t)))) + +(defun yas-exit-snippet (snippet) + "Goto exit-marker of SNIPPET." + (interactive (list (cl-first (yas-active-snippets)))) + (when snippet + (setf (yas--snippet-force-exit snippet) t) + (goto-char (if (yas--snippet-exit snippet) + (yas--exit-marker (yas--snippet-exit snippet)) + (overlay-end (yas--snippet-control-overlay snippet)))))) + +(defun yas-exit-all-snippets () + "Exit all snippets." + (interactive) + (mapc #'(lambda (snippet) + (yas-exit-snippet snippet) + (yas--check-commit-snippet)) + (yas-active-snippets 'all))) + + +;;; Some low level snippet-routines: + +(defvar yas--inhibit-overlay-hooks nil + "Bind this temporarily to non-nil to prevent running `yas--on-*-modification'.") + +(defvar yas-snippet-beg nil "Beginning position of the last snippet committed.") +(defvar yas-snippet-end nil "End position of the last snippet committed.") + +(defun yas--commit-snippet (snippet) + "Commit SNIPPET, but leave point as it is. + +This renders the snippet as ordinary text." + + (let ((control-overlay (yas--snippet-control-overlay snippet))) + ;; + ;; Save the end of the moribund snippet in case we need to revive it + ;; its original expansion. + ;; + (when (and control-overlay + (overlay-buffer control-overlay)) + (setq yas-snippet-beg (overlay-start control-overlay)) + (setq yas-snippet-end (overlay-end control-overlay)) + (delete-overlay control-overlay) + (setf (yas--snippet-control-overlay snippet) nil)) + + (let ((yas--inhibit-overlay-hooks t)) + (when yas--active-field-overlay + (delete-overlay yas--active-field-overlay)) + (when yas--field-protection-overlays + (mapc #'delete-overlay yas--field-protection-overlays))) + + ;; stacked expansion: if the original expansion took place from a + ;; field, make sure we advance it here at least to + ;; `yas-snippet-end'... + ;; + (let ((previous-field (yas--snippet-previous-active-field snippet))) + (when (and yas-snippet-end previous-field) + (yas--advance-end-maybe-previous-fields + previous-field yas-snippet-end (cdr yas--active-snippets)))) + + ;; Convert all markers to points, + ;; + (yas--markers-to-points snippet) + + ;; It's no longer an active snippet. + (cl-callf2 delq snippet yas--active-snippets) + + ;; Take care of snippet revival on undo. + (if (and yas-snippet-revival (listp buffer-undo-list)) + (push `(apply yas--snippet-revive ,yas-snippet-beg ,yas-snippet-end ,snippet) + buffer-undo-list) + ;; Dismember the snippet... this is useful if we get called + ;; again from `yas--take-care-of-redo'.... + (setf (yas--snippet-fields snippet) nil))) + + (yas--message 4 "Snippet %s exited." (yas--snippet-id snippet))) + +(defvar yas--snippets-to-move nil) +(make-variable-buffer-local 'yas--snippets-to-move) + +(defun yas--prepare-snippets-for-move (beg end buf pos) + "Gather snippets in BEG..END for moving to POS in BUF." + (let ((to-move nil) + (snippets (yas-active-snippets beg end)) + (dst-base-line (with-current-buffer buf + (count-lines (point-min) pos)))) + (when snippets + (dolist (snippet snippets) + (yas--snippet-map-markers + (lambda (m) + (prog1 (cons m (yas--snapshot-line-location m)) + (set-marker m nil))) + snippet) + (let ((ctrl-ov (yas--snapshot-overlay-line-location + (yas--snippet-control-overlay snippet)))) + (push (list ctrl-ov dst-base-line snippet) to-move) + (delete-overlay (car ctrl-ov)))) + (with-current-buffer buf + (cl-callf2 nconc to-move yas--snippets-to-move))))) + +(defun yas--on-buffer-kill () + ;; Org mode uses temp buffers for fontification and "native tab", + ;; move all the snippets to the original org-mode buffer when it's + ;; killed. + (let ((org-marker nil) + (org-buffer nil)) + (when (and yas-minor-mode + (or (bound-and-true-p org-edit-src-from-org-mode) + (bound-and-true-p org-src--from-org-mode)) + (markerp + (setq org-marker + (or (bound-and-true-p org-edit-src-beg-marker) + (bound-and-true-p org-src--beg-marker)))) + ;; If the org source buffer is killed before the temp + ;; fontification one, org-marker might point nowhere. + (setq org-buffer (marker-buffer org-marker))) + (yas--prepare-snippets-for-move + (point-min) (point-max) + org-buffer org-marker)))) + +(add-hook 'kill-buffer-hook #'yas--on-buffer-kill) + +(defun yas--finish-moving-snippets () + "Finish job started in `yas--prepare-snippets-for-move'." + (cl-loop for (ctrl-ov base-line snippet) in yas--snippets-to-move + for base-pos = (progn (goto-char (point-min)) + (forward-line base-line) (point)) + do (yas--snippet-map-markers + (lambda (saved-location) + (let ((m (pop saved-location))) + (set-marker m (yas--goto-saved-line-location + base-pos saved-location)) + m)) + snippet) + (goto-char base-pos) + (yas--restore-overlay-line-location base-pos ctrl-ov) + (yas--maybe-move-to-active-field snippet) + (push snippet yas--active-snippets)) + (setq yas--snippets-to-move nil)) + +(defun yas--safely-call-fun (fun) + "Call FUN and catch any errors." + (condition-case error + (funcall fun) + ((debug error) + (yas--message 2 "Error running %s: %s" fun + (error-message-string error))))) + +(defun yas--safely-run-hook (hook) + "Call HOOK's functions. +HOOK should be a symbol, a hook variable, as in `run-hooks'." + (let ((debug-on-error (and (not (memq yas-good-grace '(t hooks))) + debug-on-error))) + (yas--safely-call-fun (apply-partially #'run-hooks hook)))) + +(defun yas--check-commit-snippet () + "Check if point exited the currently active field of the snippet. + +If so cleans up the whole snippet up." + (let* ((snippet-exit-transform nil) + (exited-snippets-p nil) + ;; Record the custom snippet `yas-after-exit-snippet-hook' + ;; set in the expand-env field. + (snippet-exit-hook yas-after-exit-snippet-hook)) + (dolist (snippet yas--active-snippets) + (let ((active-field (yas--snippet-active-field snippet))) + (yas--letenv (yas--snippet-expand-env snippet) + ;; Note: the `force-exit' field could be a transform in case of + ;; ${0: ...}, see `yas--move-to-field'. + (setq snippet-exit-transform (yas--snippet-force-exit snippet)) + (cond ((or snippet-exit-transform + (not (and active-field (yas--field-contains-point-p active-field)))) + (setf (yas--snippet-force-exit snippet) nil) + (setq snippet-exit-hook yas-after-exit-snippet-hook) + (yas--commit-snippet snippet) + (setq exited-snippets-p t)) + ((and active-field + (or (not yas--active-field-overlay) + (not (overlay-buffer yas--active-field-overlay)))) + ;; + ;; stacked expansion: this case is mainly for recent + ;; snippet exits that place us back int the field of + ;; another snippet + ;; + (save-excursion + (yas--move-to-field snippet active-field) + (yas--update-mirrors snippet))) + (t + nil))))) + (unless (or yas--active-snippets (not exited-snippets-p)) + (when snippet-exit-transform + (yas--eval-for-effect snippet-exit-transform)) + (let ((yas-after-exit-snippet-hook snippet-exit-hook)) + (yas--safely-run-hook 'yas-after-exit-snippet-hook))))) + +;; Apropos markers-to-points: +;; +;; This was found useful for performance reasons, so that an excessive +;; number of live markers aren't kept around in the +;; `buffer-undo-list'. We don't reuse the original marker object +;; because that leaves an unreadable object in the history list and +;; undo-tree persistence has trouble with that. +;; +;; This shouldn't bring horrible problems with undo/redo, but you +;; never know. +;; +(defun yas--markers-to-points (snippet) + "Save all markers of SNIPPET as positions." + (yas--snippet-map-markers (lambda (m) + (prog1 (marker-position m) + (set-marker m nil))) + snippet)) + +(defun yas--points-to-markers (snippet) + "Restore SNIPPET's marker positions, saved by `yas--markers-to-points'." + (yas--snippet-map-markers #'copy-marker snippet)) + +(defun yas--maybe-move-to-active-field (snippet) + "Try to move to SNIPPET's active (or first) field and return it if found." + (let ((target-field (or (yas--snippet-active-field snippet) + (car (yas--snippet-fields snippet))))) + (when target-field + (yas--move-to-field snippet target-field) + target-field))) + +(defun yas--field-contains-point-p (field &optional point) + (let ((point (or point + (point)))) + (and (>= point (yas--field-start field)) + (<= point (yas--field-end field))))) + +(defun yas--field-text-for-display (field) + "Return the propertized display text for field FIELD." + (buffer-substring (yas--field-start field) (yas--field-end field))) + +(defun yas--undo-in-progress () + "True if some kind of undo is in progress." + (or undo-in-progress + (eq this-command 'undo) + (eq this-command 'redo))) + +(defun yas--make-control-overlay (snippet start end) + "Create the control overlay that surrounds the snippet and +holds the keymap." + (let ((overlay (make-overlay start + end + nil + nil + t))) + (overlay-put overlay 'keymap yas-keymap) + (overlay-put overlay 'priority yas-overlay-priority) + (overlay-put overlay 'yas--snippet snippet) + overlay)) + +(defun yas-current-field () + "Return the currently active field." + (and yas--active-field-overlay + (overlay-buffer yas--active-field-overlay) + (overlay-get yas--active-field-overlay 'yas--field))) + +(defun yas--maybe-clear-field-filter (cmd) + "Return CMD if at start of unmodified snippet field. +Use as a `:filter' argument for a conditional keybinding." + (let ((field (yas-current-field))) + (when (and field + (not (yas--field-modified-p field)) + (eq (point) (marker-position (yas--field-start field)))) + cmd))) + +(defun yas-skip-and-clear-field (&optional field) + "Clears unmodified FIELD if at field start, skips to next tab." + (interactive) + (yas--skip-and-clear (or field (yas-current-field))) + (yas-next-field 1)) + +(defun yas-clear-field (&optional field) + "Clears unmodified FIELD if at field start." + (interactive) + (yas--skip-and-clear (or field (yas-current-field)))) + +(defun yas-skip-and-clear-or-delete-char (&optional field) + "Clears unmodified field if at field start, skips to next tab. + +Otherwise deletes a character normally by calling `delete-char'." + (interactive) + (declare (obsolete "Bind to `yas-maybe-skip-and-clear-field' instead." "0.13")) + (cond ((yas--maybe-clear-field-filter t) + (yas--skip-and-clear (or field (yas-current-field))) + (yas-next-field 1)) + (t (call-interactively 'delete-char)))) + +(defun yas--skip-and-clear (field &optional from) + "Deletes the region of FIELD and sets it's modified state to t. +If given, FROM indicates position to start at instead of FIELD's beginning." + ;; Just before skipping-and-clearing the field, mark its children + ;; fields as modified, too. If the children have mirrors-in-fields + ;; this prevents them from updating erroneously (we're skipping and + ;; deleting!). + ;; + (yas--mark-this-and-children-modified field) + (unless (= (yas--field-start field) (yas--field-end field)) + (delete-region (or from (yas--field-start field)) (yas--field-end field)))) + +(defun yas--mark-this-and-children-modified (field) + (setf (yas--field-modified-p field) t) + (let ((fom (yas--field-next field))) + (while (and fom + (yas--fom-parent-field fom)) + (when (and (eq (yas--fom-parent-field fom) field) + (yas--field-p fom)) + (yas--mark-this-and-children-modified fom)) + (setq fom (yas--fom-next fom))))) + +(defun yas--make-move-active-field-overlay (snippet field) + "Place the active field overlay in SNIPPET's FIELD. + +Move the overlay, or create it if it does not exit." + (if (and yas--active-field-overlay + (overlay-buffer yas--active-field-overlay)) + (move-overlay yas--active-field-overlay + (yas--field-start field) + (yas--field-end field)) + (setq yas--active-field-overlay + (make-overlay (yas--field-start field) + (yas--field-end field) + nil nil t)) + (overlay-put yas--active-field-overlay 'priority yas-overlay-priority) + (overlay-put yas--active-field-overlay 'face 'yas-field-highlight-face) + (overlay-put yas--active-field-overlay 'yas--snippet snippet) + (overlay-put yas--active-field-overlay 'modification-hooks '(yas--on-field-overlay-modification)) + (overlay-put yas--active-field-overlay 'insert-in-front-hooks + '(yas--on-field-overlay-modification)) + (overlay-put yas--active-field-overlay 'insert-behind-hooks + '(yas--on-field-overlay-modification)))) + +(defun yas--skip-and-clear-field-p (field beg _end length) + "Tell if newly modified FIELD should be cleared and skipped. +BEG, END and LENGTH like overlay modification hooks." + (and (= length 0) ; A 0 pre-change length indicates insertion. + (= beg (yas--field-start field)) ; Insertion at field start? + (not (yas--field-modified-p field)))) + + +(defun yas--merge-and-drop-dups (list1 list2 cmp key) + ;; `delete-consecutive-dups' + `cl-merge'. + (funcall (if (fboundp 'delete-consecutive-dups) + #'delete-consecutive-dups ; 24.4 + #'delete-dups) + (cl-merge 'list list1 list2 cmp :key key))) + +(defvar yas--before-change-modified-snippets nil) +(make-variable-buffer-local 'yas--before-change-modified-snippets) + +(defun yas--gather-active-snippets (overlay beg end then-delete) + ;; Add active snippets in BEG..END into an OVERLAY keyed entry of + ;; `yas--before-change-modified-snippets'. Return accumulated list. + ;; If THEN-DELETE is non-nil, delete the entry. + (let ((new (yas-active-snippets beg end)) + (old (assq overlay yas--before-change-modified-snippets))) + (prog1 (cond ((and new old) + (setf (cdr old) + (yas--merge-and-drop-dups + (cdr old) new + ;; Sort like `yas-active-snippets'. + #'>= #'yas--snippet-id))) + (new (unless then-delete + ;; Don't add new entry if we're about to + ;; remove it anyway. + (push (cons overlay new) + yas--before-change-modified-snippets)) + new) + (old (cdr old)) + (t nil)) + (when then-delete + (cl-callf2 delq old yas--before-change-modified-snippets))))) + +(defvar yas--todo-snippet-indent nil nil) +(make-variable-buffer-local 'yas--todo-snippet-indent) + +(defun yas--on-field-overlay-modification (overlay after? beg end &optional length) + "Clears the field and updates mirrors, conditionally. + +Only clears the field if it hasn't been modified and point is at +field start. This hook does nothing if an undo is in progress." + (unless (or yas--inhibit-overlay-hooks + (not (overlayp yas--active-field-overlay)) ; Avoid Emacs bug #21824. + ;; If a single change hits multiple overlays of the same + ;; snippet, then we delete the snippet the first time, + ;; and then subsequent calls get a deleted overlay. + ;; Don't delete the snippet again! + (not (overlay-buffer overlay)) + (yas--undo-in-progress)) + (let* ((inhibit-modification-hooks nil) + (yas--inhibit-overlay-hooks t) + (field (overlay-get overlay 'yas--field)) + (snippet (overlay-get yas--active-field-overlay 'yas--snippet))) + (if (yas--snippet-live-p snippet) + (if after? + (save-match-data + (yas--letenv (yas--snippet-expand-env snippet) + (when (yas--skip-and-clear-field-p field beg end length) + ;; We delete text starting from the END of insertion. + (yas--skip-and-clear field end)) + (setf (yas--field-modified-p field) t) + ;; Adjust any pending active fields in case of stacked + ;; expansion. + (yas--advance-end-maybe-previous-fields + field (overlay-end overlay) + (yas--gather-active-snippets overlay beg end t)) + ;; Update fields now, but delay auto indentation until + ;; post-command. We don't want to run indentation on + ;; the intermediate state where field text might be + ;; removed (and hence the field could be deleted along + ;; with leading indentation). + (let ((yas-indent-line nil)) + (save-excursion + (yas--field-update-display field)) + (yas--update-mirrors snippet)) + (unless (or (not (eq yas-indent-line 'auto)) + (memq snippet yas--todo-snippet-indent)) + (push snippet yas--todo-snippet-indent)))) + ;; Remember active snippets to use for after the change. + (yas--gather-active-snippets overlay beg end nil)) + (lwarn '(yasnippet zombie) :warning "Killing zombie snippet!") + (delete-overlay overlay))))) + +(defun yas--do-todo-snippet-indent () + ;; Do pending indentation of snippet fields, called from + ;; `yas--post-command-handler'. + (when yas--todo-snippet-indent + (save-excursion + (cl-loop for snippet in yas--todo-snippet-indent + do (yas--indent-mirrors-of-snippet + snippet (yas--snippet-field-mirrors snippet))) + (setq yas--todo-snippet-indent nil)))) + +(defun yas--auto-fill () + ;; Preserve snippet markers during auto-fill. + (let* ((orig-point (point)) + (end (progn (forward-paragraph) (point))) + (beg (progn (backward-paragraph) (point))) + (snippets (yas-active-snippets beg end)) + (remarkers nil) + (reoverlays nil)) + (dolist (snippet snippets) + (dolist (m (yas--collect-snippet-markers snippet)) + (when (and (<= beg m) (<= m end)) + (push (cons m (yas--snapshot-location m beg end)) remarkers))) + (push (yas--snapshot-overlay-location + (yas--snippet-control-overlay snippet) beg end) + reoverlays)) + (goto-char orig-point) + (let ((yas--inhibit-overlay-hooks t)) + (if yas--original-auto-fill-function + (funcall yas--original-auto-fill-function) + ;; Shouldn't happen, gather more info about it (see #873/919). + (let ((yas--fill-fun-values `((t ,(default-value 'yas--original-auto-fill-function)))) + (fill-fun-values `((t ,(default-value 'auto-fill-function)))) + ;; Listing 2 buffers with the same value is enough + (print-length 3)) + (save-current-buffer + (dolist (buf (let ((bufs (buffer-list))) + ;; List the current buffer first. + (setq bufs (cons (current-buffer) + (remq (current-buffer) bufs))))) + (set-buffer buf) + (let* ((yf-cell (assq yas--original-auto-fill-function + yas--fill-fun-values)) + (af-cell (assq auto-fill-function fill-fun-values))) + (when (local-variable-p 'yas--original-auto-fill-function) + (if yf-cell (setcdr yf-cell (cons buf (cdr yf-cell))) + (push (list yas--original-auto-fill-function buf) yas--fill-fun-values))) + (when (local-variable-p 'auto-fill-function) + (if af-cell (setcdr af-cell (cons buf (cdr af-cell))) + (push (list auto-fill-function buf) fill-fun-values)))))) + (lwarn '(yasnippet auto-fill bug) :error + "`yas--original-auto-fill-function' unexpectedly nil in %S! Disabling auto-fill. + %S + `auto-fill-function': %S\n%s" + (current-buffer) yas--fill-fun-values fill-fun-values + (if (fboundp 'backtrace--print-frame) + (with-output-to-string + (mapc (lambda (frame) + (apply #'backtrace--print-frame frame)) + yas--watch-auto-fill-backtrace)) + "")) + ;; Try to avoid repeated triggering of this bug. + (auto-fill-mode -1) + ;; Don't pop up more than once in a session (still log though). + (defvar warning-suppress-types) ; `warnings' is autoloaded by `lwarn'. + (add-to-list 'warning-suppress-types '(yasnippet auto-fill bug))))) + (save-excursion + (setq end (progn (forward-paragraph) (point))) + (setq beg (progn (backward-paragraph) (point)))) + (save-excursion + (save-restriction + (narrow-to-region beg end) + (dolist (remarker remarkers) + (set-marker (car remarker) + (yas--goto-saved-location (cdr remarker)))) + (mapc #'yas--restore-overlay-location reoverlays)) + (mapc (lambda (snippet) + (yas--letenv (yas--snippet-expand-env snippet) + (yas--update-mirrors snippet))) + snippets)))) + + +;;; Apropos protection overlays: +;; +;; These exist for nasty users who will try to delete parts of the +;; snippet outside the active field. Actual protection happens in +;; `yas--on-protection-overlay-modification'. +;; +;; As of github #537 this no longer inhibits the command by issuing an +;; error: all the snippets at point, including nested snippets, are +;; automatically commited and the current command can proceed. +;; +(defun yas--make-move-field-protection-overlays (snippet field) + "Place protection overlays surrounding SNIPPET's FIELD. + +Move the overlays, or create them if they do not exit." + (let ((start (yas--field-start field)) + (end (yas--field-end field))) + ;; First check if the (1+ end) is contained in the buffer, + ;; otherwise we'll have to do a bit of cheating and silently + ;; insert a newline. the `(1+ (buffer-size))' should prevent this + ;; when using stacked expansion + ;; + (when (< (buffer-size) end) + (save-excursion + (let ((yas--inhibit-overlay-hooks t)) + (goto-char (point-max)) + (newline)))) + ;; go on to normal overlay creation/moving + ;; + (cond ((and yas--field-protection-overlays + (cl-every #'overlay-buffer yas--field-protection-overlays)) + (move-overlay (nth 0 yas--field-protection-overlays) + (1- start) start) + (move-overlay (nth 1 yas--field-protection-overlays) end (1+ end))) + (t + (setq yas--field-protection-overlays + (list (make-overlay (1- start) start nil t nil) + (make-overlay end (1+ end) nil t nil))) + (dolist (ov yas--field-protection-overlays) + (overlay-put ov 'face 'yas--field-debug-face) + (overlay-put ov 'yas--snippet snippet) + ;; (overlay-put ov 'evaporate t) + (overlay-put ov 'modification-hooks '(yas--on-protection-overlay-modification))))))) + +(defun yas--on-protection-overlay-modification (_overlay after? beg end &optional length) + "Commit the snippet if the protection overlay is being killed." + (unless (or yas--inhibit-overlay-hooks + yas-inhibit-overlay-modification-protection + (not after?) + (= length (- end beg)) ; deletion or insertion + (yas--undo-in-progress)) + (let ((snippets (yas-active-snippets))) + (yas--message 2 "Committing snippets. Action would destroy a protection overlay.") + (cl-loop for snippet in snippets + do (yas--commit-snippet snippet))))) + +(add-to-list 'debug-ignored-errors "^Exit the snippet first!$") + + +;;; Snippet expansion and "stacked" expansion: +;; +;; Stacked expansion is when you try to expand a snippet when already +;; inside a snippet expansion. +;; +;; The parent snippet does not run its fields modification hooks +;; (`yas--on-field-overlay-modification' and +;; `yas--on-protection-overlay-modification') while the child snippet +;; is active. This means, among other things, that the mirrors of the +;; parent snippet are not updated, this only happening when one exits +;; the child snippet. +;; +;; Unfortunately, this also puts some ugly (and not fully-tested) +;; bits of code in `yas-expand-snippet' and +;; `yas--commit-snippet'. I've tried to mark them with "stacked +;; expansion:". +;; +;; This was thought to be safer in an undo/redo perspective, but +;; maybe the correct implementation is to make the globals +;; `yas--active-field-overlay' and `yas--field-protection-overlays' be +;; snippet-local and be active even while the child snippet is +;; running. This would mean a lot of overlay modification hooks +;; running, but if managed correctly (including overlay priorities) +;; they should account for all situations... + +(defun yas-expand-snippet (snippet &optional start end expand-env) + "Expand SNIPPET at current point. + +Text between START and END will be deleted before inserting +template. EXPAND-ENV is a list of (SYM VALUE) let-style dynamic +bindings considered when expanding the snippet. If omitted, use +SNIPPET's expand-env field. + +SNIPPET may be a snippet structure (e.g., as returned by +`yas-lookup-snippet'), or just a snippet body (which is a string +for normal snippets, and a list for command snippets)." + (cl-assert (and yas-minor-mode + (memq 'yas--post-command-handler post-command-hook)) + nil + "[yas] `yas-expand-snippet' needs properly setup `yas-minor-mode'") + (run-hooks 'yas-before-expand-snippet-hook) + + (let* ((clear-field + (let ((field (and yas--active-field-overlay + (overlay-buffer yas--active-field-overlay) + (overlay-get yas--active-field-overlay 'yas--field)))) + (and field (yas--skip-and-clear-field-p + field (point) (point) 0) + field))) + (start (cond (start) + ((region-active-p) + (region-beginning)) + (clear-field + (yas--field-start clear-field)) + (t (point)))) + (end (cond (end) + ((region-active-p) + (region-end)) + (clear-field + (yas--field-end clear-field)) + (t (point)))) + (to-delete (and (> end start) + (buffer-substring-no-properties start end))) + (yas-selected-text + (cond (yas-selected-text) + ((and (region-active-p) + (not clear-field)) + to-delete)))) + (goto-char start) + (setq yas--indent-original-column (current-column)) + ;; Delete the region to delete, this *does* get undo-recorded. + (when to-delete + (delete-region start end)) + + (let ((content (if (yas--template-p snippet) + (yas--template-content snippet) + snippet))) + (when (and (not expand-env) (yas--template-p snippet)) + (setq expand-env (yas--template-expand-env snippet))) + (cond ((listp content) + ;; x) This is a snippet-command. + (yas--eval-for-effect content)) + (t + ;; x) This is a snippet-snippet :-) + (setq yas--start-column (current-column)) + ;; Stacked expansion: also shoosh the overlay modification hooks. + (let ((yas--inhibit-overlay-hooks t)) + (setq snippet + (yas--snippet-create content expand-env start (point)))) + + ;; Stacked-expansion: This checks for stacked expansion, save the + ;; `yas--previous-active-field' and advance its boundary. + (let ((existing-field (and yas--active-field-overlay + (overlay-buffer yas--active-field-overlay) + (overlay-get yas--active-field-overlay 'yas--field)))) + (when existing-field + (setf (yas--snippet-previous-active-field snippet) existing-field) + (yas--advance-end-maybe-previous-fields + existing-field (overlay-end yas--active-field-overlay) + (cdr yas--active-snippets)))) + + ;; Exit the snippet immediately if no fields. + (unless (yas--snippet-fields snippet) + (yas-exit-snippet snippet)) + + ;; Now, schedule a move to the first field. + (let ((first-field (car (yas--snippet-fields snippet)))) + (when first-field + (sit-for 0) ;; fix issue 125 + (yas--letenv (yas--snippet-expand-env snippet) + (yas--move-to-field snippet first-field)) + (when (and (eq (yas--field-number first-field) 0) + (> (length (yas--field-text-for-display + first-field)) + 0)) + ;; Keep region for ${0:exit text}. + (setq deactivate-mark nil)))) + (yas--message 4 "snippet %d expanded." (yas--snippet-id snippet)) + t))))) + +(defun yas--take-care-of-redo (snippet) + "Commits SNIPPET, which in turn pushes an undo action for reviving it. + +Meant to exit in the `buffer-undo-list'." + ;; slightly optimize: this action is only needed for snippets with + ;; at least one field + (when (yas--snippet-fields snippet) + (yas--commit-snippet snippet))) + +(defun yas--snippet-revive (beg end snippet) + "Revives SNIPPET and creates a control overlay from BEG to END. + +BEG and END are, we hope, the original snippets boundaries. +All the markers/points exiting existing inside SNIPPET should point +to their correct locations *at the time the snippet is revived*. + +After revival, push the `yas--take-care-of-redo' in the +`buffer-undo-list'" + ;; Reconvert all the points to markers + (yas--points-to-markers snippet) + ;; When at least one editable field existed in the zombie snippet, + ;; try to revive the whole thing... + (when (yas--maybe-move-to-active-field snippet) + (setf (yas--snippet-control-overlay snippet) (yas--make-control-overlay snippet beg end)) + (overlay-put (yas--snippet-control-overlay snippet) 'yas--snippet snippet) + (push snippet yas--active-snippets) + (when (listp buffer-undo-list) + (push `(apply yas--take-care-of-redo ,snippet) + buffer-undo-list)))) + +(defun yas--snippet-create (content expand-env begin end) + "Create a snippet from a template inserted at BEGIN to END. + +Returns the newly created snippet." + (save-restriction + (let ((snippet (yas--make-snippet expand-env))) + (yas--letenv expand-env + ;; Put a single undo action for the expanded snippet's + ;; content. + (let ((buffer-undo-list t)) + (goto-char begin) + ;; Call before and after change functions manually, + ;; otherwise cc-mode's cache can get messed up. Don't use + ;; `inhibit-modification-hooks' for that, that blocks + ;; overlay and text property hooks as well! FIXME: Maybe + ;; use `combine-change-calls'? (Requires Emacs 27+ though.) + (run-hook-with-args 'before-change-functions begin end) + (let ((before-change-functions nil) + (after-change-functions nil)) + ;; Some versions of cc-mode (might be the one with Emacs + ;; 24.3 only) fail when inserting snippet content in a + ;; narrowed buffer, so make sure to insert before + ;; narrowing. + (insert content) + (narrow-to-region begin (point)) + (goto-char (point-min)) + (yas--snippet-parse-create snippet)) + (run-hook-with-args 'after-change-functions + (point-min) (point-max) + (- end begin))) + (when (listp buffer-undo-list) + (push (cons (point-min) (point-max)) + buffer-undo-list)) + + ;; Indent, collecting undo information normally. + (yas--indent snippet) + + ;; Follow up with `yas--take-care-of-redo' on the newly + ;; inserted snippet boundaries. + (when (listp buffer-undo-list) + (push `(apply yas--take-care-of-redo ,snippet) + buffer-undo-list)) + + ;; Sort and link each field + (yas--snippet-sort-fields snippet) + + ;; Create keymap overlay for snippet + (setf (yas--snippet-control-overlay snippet) + (yas--make-control-overlay snippet (point-min) (point-max))) + + ;; Move to end + (goto-char (point-max)) + + (push snippet yas--active-snippets) + snippet)))) + + +;;; Apropos adjacencies and "fom's": +;; +;; Once the $-constructs bits like "$n" and "${:n" are deleted in the +;; recently expanded snippet, we might actually have many fields, +;; mirrors (and the snippet exit) in the very same position in the +;; buffer. Therefore we need to single-link the +;; fields-or-mirrors-or-exit (which I have abbreviated to "fom") +;; according to their original positions in the buffer. +;; +;; Then we have operation `yas--advance-end-maybe' and +;; `yas--advance-start-maybe', which conditionally push the starts and +;; ends of these foms down the chain. +;; +;; This allows for like the printf with the magic ",": +;; +;; printf ("${1:%s}\\n"${1:$(if (string-match "%" text) "," "\);")} \ +;; $2${1:$(if (string-match "%" text) "\);" "")}$0 +;; +(defun yas--fom-start (fom) + (cond ((yas--field-p fom) + (yas--field-start fom)) + ((yas--mirror-p fom) + (yas--mirror-start fom)) + (t + (yas--exit-marker fom)))) + +(defun yas--fom-end (fom) + (cond ((yas--field-p fom) + (yas--field-end fom)) + ((yas--mirror-p fom) + (yas--mirror-end fom)) + (t + (yas--exit-marker fom)))) + +(defun yas--fom-next (fom) + (cond ((yas--field-p fom) + (yas--field-next fom)) + ((yas--mirror-p fom) + (yas--mirror-next fom)) + (t + (yas--exit-next fom)))) + +(defun yas--fom-parent-field (fom) + (cond ((yas--field-p fom) + (yas--field-parent-field fom)) + ((yas--mirror-p fom) + (yas--mirror-parent-field fom)) + (t + nil))) + +(defun yas--calculate-adjacencies (snippet) + "Calculate adjacencies for fields or mirrors of SNIPPET. + +This is according to their relative positions in the buffer, and +has to be called before the $-constructs are deleted." + (let* ((fom-set-next-fom + (lambda (fom nextfom) + (cond ((yas--field-p fom) + (setf (yas--field-next fom) nextfom)) + ((yas--mirror-p fom) + (setf (yas--mirror-next fom) nextfom)) + (t + (setf (yas--exit-next fom) nextfom))))) + (compare-fom-begs + (lambda (fom1 fom2) + (if (= (yas--fom-start fom2) (yas--fom-start fom1)) + (yas--mirror-p fom2) + (>= (yas--fom-start fom2) (yas--fom-start fom1))))) + (link-foms fom-set-next-fom)) + ;; make some yas--field, yas--mirror and yas--exit soup + (let ((soup)) + (when (yas--snippet-exit snippet) + (push (yas--snippet-exit snippet) soup)) + (dolist (field (yas--snippet-fields snippet)) + (push field soup) + (dolist (mirror (yas--field-mirrors field)) + (push mirror soup))) + (setq soup + (sort soup compare-fom-begs)) + (when soup + (cl-reduce link-foms soup))))) + +(defun yas--calculate-simple-fom-parentage (snippet fom) + "Discover if FOM is parented by some field in SNIPPET. + +Use the tightest containing field if more than one field contains +the mirror. Intended to be called *before* the dollar-regions are +deleted." + (let ((min (point-min)) + (max (point-max))) + (dolist (field (remq fom (yas--snippet-fields snippet))) + (when (and (<= (yas--field-start field) (yas--fom-start fom)) + (<= (yas--fom-end fom) (yas--field-end field)) + (< min (yas--field-start field)) + (< (yas--field-end field) max)) + (setq min (yas--field-start field) + max (yas--field-end field)) + (cond ((yas--field-p fom) + (setf (yas--field-parent-field fom) field)) + ((yas--mirror-p fom) + (setf (yas--mirror-parent-field fom) field)) + (t ; it's an exit, so noop + nil )))))) + +(defun yas--advance-end-maybe (fom newend) + "Maybe advance FOM's end to NEWEND if it needs it. + +If it does, also: + +* call `yas--advance-start-maybe' on FOM's next fom. + +* in case FOM is field call `yas--advance-end-maybe' on its parent + field + +Also, if FOM is an exit-marker, always call +`yas--advance-start-maybe' on its next fom. This is because +exit-marker have identical start and end markers." + (cond ((and fom (< (yas--fom-end fom) newend)) + (set-marker (yas--fom-end fom) newend) + (yas--advance-start-maybe (yas--fom-next fom) newend) + (yas--advance-end-of-parents-maybe (yas--fom-parent-field fom) newend)) + ((yas--exit-p fom) + (yas--advance-start-maybe (yas--fom-next fom) newend)))) + +(defun yas--advance-end-maybe-previous-fields (field end snippets) + "Call `yas--advance-end-maybe' on FIELD, and previous fields on SNIPPETS." + (dolist (snippet snippets) + (cl-assert (memq field (yas--snippet-fields snippet))) + (yas--advance-end-maybe field end) + (setq field (yas--snippet-previous-active-field snippet)))) + +(defun yas--advance-start-maybe (fom newstart) + "Maybe advance FOM's start to NEWSTART if it needs it. + +If it does, also call `yas--advance-end-maybe' on FOM." + (when (and fom (< (yas--fom-start fom) newstart)) + (set-marker (yas--fom-start fom) newstart) + (yas--advance-end-maybe fom newstart))) + +(defun yas--advance-end-of-parents-maybe (field newend) + "Like `yas--advance-end-maybe' but for parent fields. + +Only works for fields and doesn't care about the start of the +next FOM. Works its way up recursively for parents of parents." + (when (and field + (< (yas--field-end field) newend)) + (set-marker (yas--field-end field) newend) + (yas--advance-end-of-parents-maybe (yas--field-parent-field field) newend))) + +(defvar yas--dollar-regions nil + "When expanding the snippet the \"parse-create\" functions add +cons cells to this var.") + +(defvar yas--indent-markers nil + "List of markers for manual indentation.") + +(defun yas--snippet-parse-create (snippet) + "Parse a recently inserted snippet template, creating all +necessary fields, mirrors and exit points. + +Meant to be called in a narrowed buffer, does various passes" + (let ((saved-quotes nil) + (parse-start (point))) + ;; Avoid major-mode's syntax propertizing function, since we + ;; change the syntax-table while calling `scan-sexps'. + (let ((syntax-propertize-function nil)) + (setq yas--dollar-regions nil) ; Reset the yas--dollar-regions. + (yas--protect-escapes nil '(?`)) ; Protect just the backquotes. + (goto-char parse-start) + (setq saved-quotes (yas--save-backquotes)) ; `expressions`. + (yas--protect-escapes) ; Protect escaped characters. + (goto-char parse-start) + (yas--indent-parse-create) ; Parse indent markers: `$>'. + (goto-char parse-start) + (yas--field-parse-create snippet) ; Parse fields with {}. + (goto-char parse-start) + (yas--simple-fom-create snippet) ; Parse simple mirrors & fields. + (goto-char parse-start) + (yas--transform-mirror-parse-create snippet) ; Parse mirror transforms. + ;; Invalidate any syntax-propertizing done while + ;; `syntax-propertize-function' was nil. + (syntax-ppss-flush-cache parse-start)) + ;; Set "next" links of fields & mirrors. + (yas--calculate-adjacencies snippet) + (yas--save-restriction-and-widen ; Delete $-constructs. + (yas--delete-regions yas--dollar-regions)) + ;; Make sure to do this insertion *after* deleting the dollar + ;; regions, otherwise we invalidate the calculated positions of + ;; all the fields following $0. + (let ((exit (yas--snippet-exit snippet))) + (goto-char (if exit (yas--exit-marker exit) (point-max)))) + (when (eq yas-wrap-around-region 'cua) + (setq yas-wrap-around-region ?0)) + (cond ((and yas-wrap-around-region yas-selected-text) + (insert yas-selected-text)) + ((and (characterp yas-wrap-around-region) + (get-register yas-wrap-around-region)) + (insert (prog1 (get-register yas-wrap-around-region) + (set-register yas-wrap-around-region nil))))) + (yas--restore-backquotes saved-quotes) ; Restore `expression` values. + (goto-char parse-start) + (yas--restore-escapes) ; Restore escapes. + (yas--update-mirrors snippet) ; Update mirrors for the first time. + (goto-char parse-start))) + +;; HACK: Some implementations of `indent-line-function' (called via +;; `indent-according-to-mode') delete text before they insert (like +;; cc-mode), some make complicated regexp replacements (looking at +;; you, org-mode). To find place where the marker "should" go after +;; indentation, we create a regexp based on what the line looks like +;; before, putting a capture group where the marker is. The regexp +;; matches any whitespace with [[:space:]]* to allow for the +;; indentation changing whitespace. Additionally, we try to preserve +;; the amount of whitespace *following* the marker, because +;; indentation generally affects whitespace at the beginning, not the +;; end. +;; +;; Two other cases where we apply a similar strategy: +;; +;; 1. Handling `auto-fill-mode', in this case we need to use the +;; current paragraph instead of line. +;; +;; 2. Moving snippets from an `org-src' temp buffer into the main org +;; buffer, in this case we need to count the relative line number +;; (because org may add indentation on each line making character +;; positions unreliable). +;; +;; Data formats: +;; (LOCATION) = (REGEXP WS-COUNT) +;; MARKER -> (MARKER . (LOCATION)) +;; OVERLAY -> (OVERLAY LOCATION-BEG LOCATION-END) +;; +;; For `org-src' temp buffer, add a line number to format: +;; (LINE-LOCATION) = (LINE . (LOCATION)) +;; MARKER@LINE -> (MARKER . (LINE-LOCATION)) +;; OVERLAY@LINE -> (OVERLAY LINE-LOCATION-BEG LINE-LOCATION-END) +;; +;; This is all best-effort heuristic stuff, but it should cover 99% of +;; use-cases. + +(defun yas--snapshot-location (position &optional beg end) + "Returns info for restoring POSITIONS's location after indent. +The returned value is a list of the form (REGEXP WS-COUNT). +POSITION may be either a marker or just a buffer position. The +REGEXP matches text between BEG..END which default to the current +line if omitted." + (goto-char position) + (unless beg (setq beg (line-beginning-position))) + (unless end (setq end (line-end-position))) + (let ((before (split-string (buffer-substring-no-properties beg position) + "[[:space:]\n]+" t)) + (after (split-string (buffer-substring-no-properties position end) + "[[:space:]\n]+" t))) + (list (concat "[[:space:]\n]*" + (mapconcat (lambda (s) + (if (eq s position) "\\(\\)" + (regexp-quote s))) + (nconc before (list position) after) + "[[:space:]\n]*")) + (progn (skip-chars-forward "[:space:]\n" end) + (- (point) position))))) + +(defun yas--snapshot-line-location (position &optional beg end) + "Like `yas--snapshot-location', but return also line number. +Returned format is (LINE REGEXP WS-COUNT)." + (goto-char position) + (cons (count-lines (point-min) (line-beginning-position)) + (yas--snapshot-location position beg end))) + +(defun yas--snapshot-overlay-location (overlay beg end) + "Like `yas--snapshot-location' for overlays. +The returned format is (OVERLAY (RE WS) (RE WS)). Either of +the (RE WS) lists may be nil if the start or end, respectively, +of the overlay is outside the range BEG .. END." + (let ((obeg (overlay-start overlay)) + (oend (overlay-end overlay))) + (list overlay + (when (and (<= beg obeg) (< obeg end)) + (yas--snapshot-location obeg beg end)) + (when (and (<= beg oend) (< oend end)) + (yas--snapshot-location oend beg end))))) + +(defun yas--snapshot-overlay-line-location (overlay) + "Return info for restoring OVERLAY's line based location. +The returned format is (OVERLAY (LINE RE WS) (LINE RE WS))." + (list overlay + (yas--snapshot-line-location (overlay-start overlay)) + (yas--snapshot-line-location (overlay-end overlay)))) + +(defun yas--goto-saved-location (re-count) + "Move to and return point saved by `yas--snapshot-location'. +Buffer must be narrowed to BEG..END used to create the snapshot info." + (let ((regexp (pop re-count)) + (ws-count (pop re-count))) + (goto-char (point-min)) + (if (not (looking-at regexp)) + (lwarn '(yasnippet re-marker) :warning + "Couldn't find: %S" regexp) + (goto-char (match-beginning 1)) + (skip-chars-forward "[:space:]\n") + (skip-chars-backward "[:space:]\n" (- (point) ws-count))) + (point))) + +(defun yas--restore-overlay-location (ov-locations) + "Restores marker based on info from `yas--snapshot-overlay-location'. +Buffer must be narrowed to BEG..END used to create the snapshot info." + (cl-destructuring-bind (overlay loc-beg loc-end) ov-locations + (move-overlay overlay + (if (not loc-beg) (overlay-start overlay) + (yas--goto-saved-location loc-beg)) + (if (not loc-end) (overlay-end overlay) + (yas--goto-saved-location loc-end))))) + +(defun yas--goto-saved-line-location (base-pos l-re-count) + "Move to and return point saved by `yas--snapshot-line-location'. +Additionally requires BASE-POS to tell where the line numbers are +relative to." + (goto-char base-pos) + (forward-line (pop l-re-count)) + (save-restriction + (narrow-to-region (line-beginning-position) + (line-end-position)) + (yas--goto-saved-location l-re-count))) + +(defun yas--restore-overlay-line-location (base-pos ov-locations) + "Restores marker based on info from `yas--snapshot-overlay-line-location'." + (cl-destructuring-bind (overlay beg-l-r-w end-l-r-w) + ov-locations + (move-overlay overlay + (yas--goto-saved-line-location base-pos beg-l-r-w) + (yas--goto-saved-line-location base-pos end-l-r-w)))) + +(defun yas--indent-region (from to snippet) + "Indent the lines between FROM and TO with `indent-according-to-mode'. +The SNIPPET's markers are preserved." + (save-excursion + (yas--save-restriction-and-widen + (let* ((snippet-markers (yas--collect-snippet-markers snippet)) + (to (set-marker (make-marker) to))) + (goto-char from) + (cl-loop for bol = (line-beginning-position) + for eol = (line-end-position) + if (or yas-also-indent-empty-lines + (/= bol eol)) + do + ;; Indent each non-empty line. + (let ((remarkers nil)) + (dolist (m snippet-markers) + (when (and (<= bol m) (<= m eol)) + (push (cons m (yas--snapshot-location m bol eol)) + remarkers))) + (unwind-protect + (progn (back-to-indentation) + (indent-according-to-mode)) + (save-restriction + (narrow-to-region bol (line-end-position)) + (dolist (remarker remarkers) + (set-marker (car remarker) + (yas--goto-saved-location (cdr remarker))))))) + while (and (zerop (forward-line 1)) + (< (point) to))))))) + +(defvar yas--indent-original-column nil) +(defun yas--indent (snippet) + ;; Indent lines that had indent markers (`$>') on them. + (save-excursion + (dolist (marker yas--indent-markers) + (unless (eq yas-indent-line 'auto) + (goto-char marker) + (yas--indent-region (line-beginning-position) + (line-end-position) + snippet)) + ;; Finished with this marker. + (set-marker marker nil)) + (setq yas--indent-markers nil)) + ;; Now do stuff for `fixed' and `auto'. + (save-excursion + ;; We need to be at end of line, so that `forward-line' will only + ;; report 0 if it actually moves over a newline. + (end-of-line) + (cond ((eq yas-indent-line 'fixed) + (when (= (forward-line 1) 0) + (let ((indent-line-function + (lambda () + ;; We need to be at beginning of line in order to + ;; indent existing whitespace correctly. + (beginning-of-line) + (indent-to-column yas--indent-original-column)))) + (yas--indent-region (line-beginning-position) + (point-max) + snippet)))) + ((eq yas-indent-line 'auto) + (when (or yas-also-auto-indent-first-line + (= (forward-line 1) 0)) + (yas--indent-region (line-beginning-position) + (point-max) + snippet)))))) + +(defun yas--collect-snippet-markers (snippet) + "Make a list of all the markers used by SNIPPET." + (let (markers) + (yas--snippet-map-markers (lambda (m) (push m markers) m) snippet) + markers)) + +(defun yas--escape-string (escaped) + (concat "YASESCAPE" (format "%d" escaped) "PROTECTGUARD")) + +(defun yas--protect-escapes (&optional text escaped) + "Protect all escaped characters with their numeric ASCII value. + +With optional string TEXT do it in string instead of buffer." + (let ((changed-text text) + (text-provided-p text)) + (mapc #'(lambda (escaped) + (setq changed-text + (yas--replace-all (concat "\\" (char-to-string escaped)) + (yas--escape-string escaped) + (when text-provided-p changed-text)))) + (or escaped yas--escaped-characters)) + changed-text)) + +(defun yas--restore-escapes (&optional text escaped) + "Restore all escaped characters from their numeric ASCII value. + +With optional string TEXT do it in string instead of the buffer." + (let ((changed-text text) + (text-provided-p text)) + (mapc #'(lambda (escaped) + (setq changed-text + (yas--replace-all (yas--escape-string escaped) + (char-to-string escaped) + (when text-provided-p changed-text)))) + (or escaped yas--escaped-characters)) + changed-text)) + +(defun yas--save-backquotes () + "Save all \"\\=`(lisp-expression)\\=`\"-style expressions. +Return a list of (MARKER . STRING) entires for each backquoted +Lisp expression." + (let* ((saved-quotes nil) + (yas--snippet-buffer (current-buffer)) + (yas--change-detected nil) + (detect-change (lambda (_beg _end) + (when (eq (current-buffer) yas--snippet-buffer) + (setq yas--change-detected t))))) + (while (re-search-forward yas--backquote-lisp-expression-regexp nil t) + (let ((current-string (match-string-no-properties 1)) transformed) + (yas--save-restriction-and-widen + (delete-region (match-beginning 0) (match-end 0))) + (let ((before-change-functions + (cons detect-change before-change-functions))) + (setq transformed (yas--eval-for-string (yas--read-lisp + (yas--restore-escapes + current-string '(?`)))))) + (goto-char (match-beginning 0)) + (when transformed + (let ((marker (make-marker))) + (yas--save-restriction-and-widen + (insert "Y") ;; quite horrendous, I love it :) + (set-marker marker (point)) + (insert "Y")) + (push (cons marker transformed) saved-quotes))))) + (when yas--change-detected + (lwarn '(yasnippet backquote-change) :warning + "`%s' modified buffer in a backquote expression. + To hide this warning, add (yasnippet backquote-change) to `warning-suppress-types'." + (if yas--current-template + (yas--template-name yas--current-template) + "Snippet"))) + saved-quotes)) + +(defun yas--restore-backquotes (saved-quotes) + "Replace markers in SAVED-QUOTES with their values. +SAVED-QUOTES is the in format returned by `yas--save-backquotes'." + (cl-loop for (marker . string) in saved-quotes do + (save-excursion + (goto-char marker) + (yas--save-restriction-and-widen + (delete-char -1) + (insert string) + (delete-char 1)) + (set-marker marker nil)))) + +(defun yas--scan-sexps (from count) + (ignore-errors + (save-match-data ; `scan-sexps' may modify match data. + ;; Parse using the syntax table corresponding to the yasnippet syntax. + (with-syntax-table (standard-syntax-table) + ;; And ignore syntax-table properties that may have been placed by the + ;; major mode since these aren't related to the yasnippet syntax. + (let ((parse-sexp-lookup-properties nil)) + (scan-sexps from count)))))) + +(defun yas--make-marker (pos) + "Create a marker at POS with nil `marker-insertion-type'." + (let ((marker (set-marker (make-marker) pos))) + (set-marker-insertion-type marker nil) + marker)) + +(defun yas--indent-parse-create () + "Parse the \"$>\" indentation markers just inserted." + (setq yas--indent-markers ()) + (while (search-forward "$>" nil t) + (delete-region (match-beginning 0) (match-end 0)) + ;; Mark the beginning of the line. + (push (yas--make-marker (line-beginning-position)) + yas--indent-markers)) + (setq yas--indent-markers (nreverse yas--indent-markers))) + +(defun yas--scan-for-field-end () + (while (progn (re-search-forward "\\${\\|}") + (when (eq (char-before) ?\{) + ;; Nested field. + (yas--scan-for-field-end)))) + (point)) + +(defun yas--field-parse-create (snippet &optional parent-field) + "Parse most field expressions in SNIPPET, except for the simple one \"$n\". + +The following count as a field: + +* \"${n: text}\", for a numbered field with default text, as long as N is not 0; + +* \"${n: text$(expression)}, the same with a Lisp expression; + this is caught with the curiously named `yas--multi-dollar-lisp-expression-regexp' + +* the same as above but unnumbered, (no N:) and number is calculated automatically. + +When multiple expressions are found, only the last one counts." + ;; + (save-excursion + (while (re-search-forward yas--field-regexp nil t) + (let* ((brace-scan (save-match-data + (goto-char (match-beginning 2)) + (yas--scan-for-field-end))) + ;; if the `brace-scan' didn't reach a brace, we have a + ;; snippet with invalid escaping, probably a closing + ;; brace escaped with two backslashes (github#979). But + ;; be lenient, because we can. + (real-match-end-0 (if (eq ?} (char-before brace-scan)) + brace-scan + (point))) + (number (and (match-string-no-properties 1) + (string-to-number (match-string-no-properties 1)))) + (brand-new-field (and real-match-end-0 + ;; break if on "$(" immediately + ;; after the ":", this will be + ;; caught as a mirror with + ;; transform later. + (not (string-match-p "\\`\\$[ \t\n]*(" + (match-string-no-properties 2))) + ;; allow ${0: some exit text} + ;; (not (and number (zerop number))) + (yas--make-field number + (yas--make-marker (match-beginning 2)) + (yas--make-marker (1- real-match-end-0)) + parent-field)))) + (when brand-new-field + (goto-char real-match-end-0) + (push (cons (1- real-match-end-0) real-match-end-0) + yas--dollar-regions) + (push (cons (match-beginning 0) (match-beginning 2)) + yas--dollar-regions) + (push brand-new-field (yas--snippet-fields snippet)) + (save-excursion + (save-restriction + (narrow-to-region (yas--field-start brand-new-field) (yas--field-end brand-new-field)) + (goto-char (point-min)) + (yas--field-parse-create snippet brand-new-field))))))) + ;; if we entered from a parent field, now search for the + ;; `yas--multi-dollar-lisp-expression-regexp'. This is used for + ;; primary field transformations + ;; + (when parent-field + (save-excursion + (while (re-search-forward yas--multi-dollar-lisp-expression-regexp nil t) + (let* ((real-match-end-1 (yas--scan-sexps (match-beginning 1) 1))) + ;; commit the primary field transformation if: + ;; + ;; 1. we don't find it in yas--dollar-regions (a subnested + ;; field) might have already caught it. + ;; + ;; 2. we really make sure we have either two '$' or some + ;; text and a '$' after the colon ':'. This is a FIXME: work + ;; my regular expressions and end these ugly hacks. + ;; + (when (and real-match-end-1 + (not (member (cons (match-beginning 0) + real-match-end-1) + yas--dollar-regions)) + (not (eq ?: + (char-before (1- (match-beginning 1)))))) + (let ((lisp-expression-string (buffer-substring-no-properties (match-beginning 1) + real-match-end-1))) + (setf (yas--field-transform parent-field) + (yas--read-lisp (yas--restore-escapes lisp-expression-string)))) + (push (cons (match-beginning 0) real-match-end-1) + yas--dollar-regions))))))) + +(defun yas--transform-mirror-parse-create (snippet) + "Parse the \"${n:$(lisp-expression)}\" mirror transformations in SNIPPET." + (while (re-search-forward yas--transform-mirror-regexp nil t) + (let* ((real-match-end-0 (yas--scan-sexps (1+ (match-beginning 0)) 1)) + (number (string-to-number (match-string-no-properties 1))) + (field (and number + (not (zerop number)) + (yas--snippet-find-field snippet number))) + (brand-new-mirror + (and real-match-end-0 + field + (yas--make-mirror (yas--make-marker (match-beginning 0)) + (yas--make-marker (match-beginning 0)) + (yas--read-lisp + (yas--restore-escapes + (buffer-substring-no-properties (match-beginning 2) + (1- real-match-end-0)))))))) + (when brand-new-mirror + (push brand-new-mirror + (yas--field-mirrors field)) + (yas--calculate-simple-fom-parentage snippet brand-new-mirror) + (push (cons (match-beginning 0) real-match-end-0) yas--dollar-regions))))) + +(defun yas--simple-fom-create (snippet) + "Parse the simple \"$n\" fields/mirrors/exitmarkers in SNIPPET." + (while (re-search-forward yas--simple-mirror-regexp nil t) + (let ((number (string-to-number (match-string-no-properties 1)))) + (cond ((zerop number) + (setf (yas--snippet-exit snippet) + (yas--make-exit (yas--make-marker (match-end 0)))) + (push (cons (match-beginning 0) (yas--exit-marker (yas--snippet-exit snippet))) + yas--dollar-regions)) + (t + (let ((field (yas--snippet-find-field snippet number)) + (fom)) + (if field + (push + (setq fom (yas--make-mirror + (yas--make-marker (match-beginning 0)) + (yas--make-marker (match-beginning 0)) + nil)) + (yas--field-mirrors field)) + (push + (setq fom (yas--make-field number + (yas--make-marker (match-beginning 0)) + (yas--make-marker (match-beginning 0)) + nil)) + (yas--snippet-fields snippet))) + (yas--calculate-simple-fom-parentage snippet fom)) + (push (cons (match-beginning 0) (match-end 0)) + yas--dollar-regions)))))) + +(defun yas--delete-regions (regions) + "Sort disjuct REGIONS by start point, then delete from the back." + (mapc #'(lambda (reg) + (delete-region (car reg) (cdr reg))) + (sort regions + #'(lambda (r1 r2) + (>= (car r1) (car r2)))))) + +(defun yas--calculate-mirror-depth (mirror &optional traversed) + (let* ((parent (yas--mirror-parent-field mirror)) + (parents-mirrors (and parent + (yas--field-mirrors parent)))) + (or (yas--mirror-depth mirror) + (setf (yas--mirror-depth mirror) + (cond ((memq mirror traversed) 0) + ((and parent parents-mirrors) + (1+ (cl-reduce + #'max parents-mirrors + :key (lambda (m) + (yas--calculate-mirror-depth + m (cons mirror traversed)))))) + (parent 1) + (t 0)))))) + +(defun yas--snippet-field-mirrors (snippet) + ;; Make a list of (FIELD . MIRROR). + (cl-sort + (cl-mapcan (lambda (field) + (mapcar (lambda (mirror) + (cons field mirror)) + (yas--field-mirrors field))) + (yas--snippet-fields snippet)) + ;; Then sort this list so that entries with mirrors with + ;; parent fields appear before. This was important for + ;; fixing #290, and also handles the case where a mirror in + ;; a field causes another mirror to need reupdating. + #'> :key (lambda (fm) (yas--calculate-mirror-depth (cdr fm))))) + +(defun yas--indent-mirrors-of-snippet (snippet &optional f-ms) + ;; Indent mirrors of SNIPPET. F-MS is the return value of + ;; (yas--snippet-field-mirrors SNIPPET). + (when (eq yas-indent-line 'auto) + (let ((yas--inhibit-overlay-hooks t)) + (cl-loop for (beg . end) in + (cl-sort (mapcar (lambda (f-m) + (let ((mirror (cdr f-m))) + (cons (yas--mirror-start mirror) + (yas--mirror-end mirror)))) + (or f-ms + (yas--snippet-field-mirrors snippet))) + #'< :key #'car) + do (yas--indent-region beg end snippet))))) + +(defun yas--update-mirrors (snippet) + "Update all the mirrors of SNIPPET." + (yas--save-restriction-and-widen + (save-excursion + (let ((f-ms (yas--snippet-field-mirrors snippet))) + (cl-loop + for (field . mirror) in f-ms + ;; Before updating a mirror with a parent-field, maybe advance + ;; its start (#290). + do (let ((parent-field (yas--mirror-parent-field mirror))) + (when parent-field + (yas--advance-start-maybe mirror (yas--fom-start parent-field)))) + ;; Update this mirror. + do (yas--mirror-update-display mirror field) + ;; `yas--place-overlays' is needed since the active field and + ;; protected overlays might have been changed because of insertions + ;; in `yas--mirror-update-display'. + do (let ((active-field (yas--snippet-active-field snippet))) + (when active-field (yas--place-overlays snippet active-field)))) + ;; Delay indenting until we're done all mirrors. We must do + ;; this to avoid losing whitespace between fields that are + ;; still empty (i.e., they will be non-empty after updating). + (yas--indent-mirrors-of-snippet snippet f-ms))))) + +(defun yas--mirror-update-display (mirror field) + "Update MIRROR according to FIELD (and mirror transform)." + + (let* ((mirror-parent-field (yas--mirror-parent-field mirror)) + (reflection (and (not (and mirror-parent-field + (yas--field-modified-p mirror-parent-field))) + (or (yas--apply-transform mirror field 'empty-on-nil) + (yas--field-text-for-display field))))) + (when (and reflection + (not (string= reflection (buffer-substring-no-properties (yas--mirror-start mirror) + (yas--mirror-end mirror))))) + (goto-char (yas--mirror-start mirror)) + (let ((yas--inhibit-overlay-hooks t)) + (insert reflection)) + (if (> (yas--mirror-end mirror) (point)) + (delete-region (point) (yas--mirror-end mirror)) + (set-marker (yas--mirror-end mirror) (point)) + (yas--advance-start-maybe (yas--mirror-next mirror) (point)) + ;; super-special advance + (yas--advance-end-of-parents-maybe mirror-parent-field (point)))))) + +(defun yas--field-update-display (field) + "Much like `yas--mirror-update-display', but for fields." + (when (yas--field-transform field) + (let ((transformed (and (not (eq (yas--field-number field) 0)) + (yas--apply-transform field field)))) + (when (and transformed + (not (string= transformed (buffer-substring-no-properties (yas--field-start field) + (yas--field-end field))))) + (setf (yas--field-modified-p field) t) + (goto-char (yas--field-start field)) + (let ((yas--inhibit-overlay-hooks t)) + (insert transformed) + (if (> (yas--field-end field) (point)) + (delete-region (point) (yas--field-end field)) + (set-marker (yas--field-end field) (point)) + (yas--advance-start-maybe (yas--field-next field) (point))) + t))))) + + +;;; Post-command hook: +;; +(defun yas--post-command-handler () + "Handles various yasnippet conditions after each command." + (when (and yas--watch-auto-fill-backtrace + (fboundp 'backtrace--print-frame) + (null yas--original-auto-fill-function) + (eq auto-fill-function 'yas--auto-fill)) + (lwarn '(yasnippet auto-fill bug) :error + "`yas--original-auto-fill-function' unexpectedly nil! Please report this backtrace\n%S" + (with-output-to-string + (mapc #'backtrace--print-frame + yas--watch-auto-fill-backtrace))) + ;; Don't pop up more than once in a session (still log though). + (defvar warning-suppress-types) ; `warnings' is autoloaded by `lwarn'. + (add-to-list 'warning-suppress-types '(yasnippet auto-fill bug))) + (yas--do-todo-snippet-indent) + (condition-case err + (progn (yas--finish-moving-snippets) + (cond ((eq 'undo this-command) + ;; + ;; After undo revival the correct field is sometimes not + ;; restored correctly, this condition handles that + ;; + (let* ((snippet (car (yas-active-snippets))) + (target-field + (and snippet + (cl-find-if-not + (lambda (field) + (yas--field-probably-deleted-p snippet field)) + (remq nil + (cons (yas--snippet-active-field snippet) + (yas--snippet-fields snippet))))))) + (when target-field + (yas--move-to-field snippet target-field)))) + ((not (yas--undo-in-progress)) + ;; When not in an undo, check if we must commit the snippet + ;; (user exited it). + (yas--check-commit-snippet)))) + ((debug error) (signal (car err) (cdr err))))) + +;;; Fancy docs: +;; +;; The docstrings for some functions are generated dynamically +;; depending on the context. +;; +(put 'yas-expand 'function-documentation + '(yas--expand-from-trigger-key-doc t)) +(defun yas--expand-from-trigger-key-doc (context) + "A doc synthesizer for `yas--expand-from-trigger-key-doc'." + (let* ((yas-fallback-behavior (and context yas-fallback-behavior)) + (fallback-description + (cond ((eq yas-fallback-behavior 'call-other-command) + (let* ((fallback (yas--keybinding-beyond-yasnippet))) + (or (and fallback + (format "call command `%s'." + (pp-to-string fallback))) + "do nothing (`yas-expand' doesn't override\nanything)."))) + ((eq yas-fallback-behavior 'return-nil) + "do nothing.") + (t "defer to `yas-fallback-behavior' (which see).")))) + (concat "Expand a snippet before point. If no snippet +expansion is possible, " + fallback-description + "\n\nOptional argument FIELD is for non-interactive use and is an +object satisfying `yas--field-p' to restrict the expansion to."))) + +(put 'yas-expand-from-keymap 'function-documentation + '(yas--expand-from-keymap-doc t)) +(defun yas--expand-from-keymap-doc (context) + "A doc synthesizer for `yas--expand-from-keymap-doc'." + (add-hook 'temp-buffer-show-hook #'yas--snippet-description-finish-runonce) + (concat "Expand/run snippets from keymaps, possibly falling back to original binding.\n" + (when (and context (eq this-command 'describe-key)) + (let* ((vec (this-single-command-keys)) + (templates (cl-mapcan (lambda (table) + (yas--fetch table vec)) + (yas--get-snippet-tables))) + (yas--direct-keymaps nil) + (fallback (key-binding vec))) + (concat "In this case, " + (when templates + (concat "these snippets are bound to this key:\n" + (yas--template-pretty-list templates) + "\n\nIf none of these expands, ")) + (or (and fallback + (format "fallback `%s' will be called." (pp-to-string fallback))) + "no fallback keybinding is called.")))))) + +(defun yas--template-pretty-list (templates) + (let ((acc) + (yas-buffer-local-condition 'always)) + (dolist (plate templates) + (setq acc (concat acc "\n*) " + (propertize (concat "\\\\snippet `" (car plate) "'") + 'yasnippet (cdr plate))))) + acc)) + +(define-button-type 'help-snippet-def + :supertype 'help-xref + 'help-function (lambda (template) (yas--visit-snippet-file-1 template)) + 'help-echo (purecopy "mouse-2, RET: find snippets's definition")) + +(defun yas--snippet-description-finish-runonce () + "Final adjustments for the help buffer when snippets are concerned." + (yas--create-snippet-xrefs) + (remove-hook 'temp-buffer-show-hook + #'yas--snippet-description-finish-runonce)) + +(defun yas--create-snippet-xrefs () + (save-excursion + (goto-char (point-min)) + (while (search-forward-regexp "\\\\\\\\snippet[ \s\t]+`\\([^']+\\)'" nil t) + (let ((template (get-text-property (match-beginning 1) + 'yasnippet))) + (when template + (help-xref-button 1 'help-snippet-def template) + (delete-region (match-end 1) (match-end 0)) + (delete-region (match-beginning 0) (match-beginning 1))))))) + +;;; Eldoc configuration. +(eldoc-add-command 'yas-next-field-or-maybe-expand + 'yas-next-field 'yas-prev-field + 'yas-expand 'yas-expand-from-keymap + 'yas-expand-from-trigger-key) + +;;; Utils + +(defvar yas-verbosity 3 + "Log level for `yas--message' 4 means trace most anything, 0 means nothing.") + +(defun yas--message (level message &rest args) + "When LEVEL is at or below `yas-verbosity', log MESSAGE and ARGS." + (when (>= yas-verbosity level) + (message "%s" (apply #'yas--format message args)))) + +(defun yas--warning (format-control &rest format-args) + (let ((msg (apply #'format format-control format-args))) + (display-warning 'yasnippet msg :warning) + (yas--message 1 msg))) + +(defun yas--format (format-control &rest format-args) + (apply #'format (concat "[yas] " format-control) format-args)) + + +;;; Unloading + +(defvar unload-function-defs-list) ; loadhist.el + +(defun yasnippet-unload-function () + "Disable minor modes when calling `unload-feature'." + ;; Disable `yas-minor-mode' everywhere it's enabled. + (yas-global-mode -1) + (save-current-buffer + (dolist (buffer (buffer-list)) + (set-buffer buffer) + (when yas-minor-mode + (yas-minor-mode -1)))) + ;; Remove symbol properties of all our functions, this avoids + ;; Bug#25088 in Emacs 25.1, where the compiler macro on + ;; `cl-defstruct' created functions hang around in the symbol plist + ;; and cause errors when loading again (we don't *need* to clean + ;; *all* symbol plists, but it's easier than being precise). + (dolist (def unload-function-defs-list) + (when (eq (car-safe def) 'defun) + (setplist (cdr def) nil))) + ;; Return nil so that `unload-feature' will take of undefining + ;; functions, and changing any buffers using `snippet-mode'. + nil) + + +;;; Backward compatibility to yasnippet <= 0.7 + +(defun yas-initialize () + "For backward compatibility, enable `yas-minor-mode' globally." + (declare (obsolete "Use (yas-global-mode 1) instead." "0.8")) + (yas-global-mode 1)) + +(defvar yas--backported-syms '(;; `defcustom's + ;; + yas-snippet-dirs + yas-prompt-functions + yas-indent-line + yas-also-auto-indent-first-line + yas-snippet-revival + yas-triggers-in-field + yas-fallback-behavior + yas-choose-keys-first + yas-choose-tables-first + yas-use-menu + yas-trigger-symbol + yas-wrap-around-region + yas-good-grace + yas-visit-from-menu + yas-expand-only-for-last-commands + yas-field-highlight-face + + ;; these vars can be customized as well + ;; + yas-keymap + yas-verbosity + yas-extra-modes + yas-key-syntaxes + yas-after-exit-snippet-hook + yas-before-expand-snippet-hook + yas-buffer-local-condition + yas-dont-activate + + ;; prompting functions + ;; + yas-x-prompt + yas-ido-prompt + yas-no-prompt + yas-completing-prompt + yas-dropdown-prompt + + ;; interactive functions + ;; + yas-expand + yas-minor-mode + yas-global-mode + yas-direct-keymaps-reload + yas-minor-mode-on + yas-load-directory + yas-reload-all + yas-compile-directory + yas-recompile-all + yas-about + yas-expand-from-trigger-key + yas-expand-from-keymap + yas-insert-snippet + yas-visit-snippet-file + yas-new-snippet + yas-load-snippet-buffer + yas-tryout-snippet + yas-describe-tables + yas-next-field-or-maybe-expand + yas-next-field + yas-prev-field + yas-abort-snippet + yas-exit-snippet + yas-exit-all-snippets + yas-skip-and-clear-or-delete-char + yas-initialize + + ;; symbols that I "exported" for use + ;; in snippets and hookage + ;; + yas-expand-snippet + yas-define-snippets + yas-define-menu + yas-snippet-beg + yas-snippet-end + yas-modified-p + yas-moving-away-p + yas-substr + yas-choose-value + yas-key-to-value + yas-throw + yas-verify-value + yas-field-value + yas-text + yas-selected-text + yas-default-from-field + yas-inside-string + yas-unimplemented + yas-define-condition-cache + yas-hippie-try-expand + + ;; debug definitions + ;; yas-debug-snippet-vars + ;; yas-exterminate-package + ;; yas-debug-test + + ;; testing definitions + ;; yas-should-expand + ;; yas-should-not-expand + ;; yas-mock-insert + ;; yas-make-file-or-dirs + ;; yas-variables + ;; yas-saving-variables + ;; yas-call-with-snippet-dirs + ;; yas-with-snippet-dirs +) + "Backported yasnippet symbols. + +They are mapped to \"yas/*\" variants.") + +(when yas-alias-to-yas/prefix-p + (dolist (sym yas--backported-syms) + (let ((backported (intern (replace-regexp-in-string "\\`yas-" "yas/" (symbol-name sym))))) + (when (boundp sym) + (make-obsolete-variable backported sym "yasnippet 0.8") + (defvaralias backported sym)) + (when (fboundp sym) + (make-obsolete backported sym "yasnippet 0.8") + (defalias backported sym)))) + (make-obsolete 'yas/root-directory 'yas-snippet-dirs "yasnippet 0.8") + (defvaralias 'yas/root-directory 'yas-snippet-dirs)) + +(defvar yas--exported-syms + (let (exported) + (mapatoms (lambda (atom) + (if (and (or (and (boundp atom) + (not (get atom 'byte-obsolete-variable))) + (and (fboundp atom) + (not (get atom 'byte-obsolete-info)))) + (string-match-p "\\`yas-[^-]" (symbol-name atom))) + (push atom exported)))) + exported) + "Exported yasnippet symbols. + +i.e. the ones with \"yas-\" single dash prefix. I will try to +keep them in future yasnippet versions and other elisp libraries +can more or less safely rely upon them.") + + +(provide 'yasnippet) +;; Local Variables: +;; coding: utf-8 +;; indent-tabs-mode: nil +;; End: +;;; yasnippet.el ends here diff --git a/.emacs.d/elpa/yasnippet-20200604.246/yasnippet.elc b/.emacs.d/elpa/yasnippet-20200604.246/yasnippet.elc new file mode 100644 index 0000000..bbe2c84 Binary files /dev/null and b/.emacs.d/elpa/yasnippet-20200604.246/yasnippet.elc differ diff --git a/.emacs.d/irony/bin/irony-server b/.emacs.d/irony/bin/irony-server new file mode 100755 index 0000000..684ad29 Binary files /dev/null and b/.emacs.d/irony/bin/irony-server differ diff --git a/.emacs.d/projectile-bookmarks.eld b/.emacs.d/projectile-bookmarks.eld new file mode 100644 index 0000000..303cc3a --- /dev/null +++ b/.emacs.d/projectile-bookmarks.eld @@ -0,0 +1 @@ +("~/Documents/GitHub/Plasmatum/") \ No newline at end of file diff --git a/.emacs.d/recentf b/.emacs.d/recentf new file mode 100644 index 0000000..7e8ed2c --- /dev/null +++ b/.emacs.d/recentf @@ -0,0 +1,21 @@ +;;; Automatically generated by ‘recentf’ on Sun Jul 25 18:20:26 2021. + +(setq recentf-list + '( + "/home/llehn/.emacs" + "/home/llehn/.emacs.d/session.1080c407afbb4c7bf9162351796716501400000024240126" + "/home/llehn/.emacs.d/elpa/pos-tip-20191227.1356/pos-tip-autoloads.el" + "/home/llehn/.emacs.d/elpa/yasnippet-20200604.246/yasnippet-autoloads.el" + "/home/llehn/.emacs.d/elpa/evil-20210527.2107/evil-autoloads.el" + "/home/llehn/.emacs.d/elpa/projectile-20210607.1513/projectile-autoloads.el" + "/home/llehn/.emacs.d/elpa/pkg-info-20150517.1143/pkg-info-autoloads.el" + "/home/llehn/.emacs.d/elpa/epl-20180205.2049/epl-autoloads.el" + "/home/llehn/.emacs.d/elpa/atom-dark-theme-20181022.1602/atom-dark-theme-autoloads.el" + )) + +(setq recentf-filter-changer-current 'nil) + + +;; Local Variables: +;; coding: utf-8-emacs +;; End: diff --git a/.emacs.d/session.1080c407afbb4c7bf9162351796716501400000024240126 b/.emacs.d/session.1080c407afbb4c7bf9162351796716501400000024240126 new file mode 100644 index 0000000..e69de29 diff --git a/.emacs.d/session.1080c407afbb4c7bf9162351808552916600000024240127 b/.emacs.d/session.1080c407afbb4c7bf9162351808552916600000024240127 new file mode 100644 index 0000000..e69de29 diff --git a/.xmonad/xmonad-laptop.hs b/.xmonad/xmonad-laptop.hs new file mode 100644 index 0000000..133bccb --- /dev/null +++ b/.xmonad/xmonad-laptop.hs @@ -0,0 +1,189 @@ +import qualified Data.Map as M +import Data.Monoid +import System.Exit +import XMonad +import XMonad.Util.Run +import XMonad.Util.SpawnOnce +import XMonad.Layout.Spacing +import XMonad.Hooks.ManageDocks +import qualified XMonad.StackSet as W + +myTerminal :: String +myTerminal = "kitty" + +myBrowser :: String +myBrowser = "brave" + +myAppMenu :: String +myAppMenu = "rofi -show run" + +myAppMenuThemes :: String +myAppMenuThemes = "rofi-theme-selector" + +myFocusFollowsMouse :: Bool +myFocusFollowsMouse = True + +myClickJustFocuses :: Bool +myClickJustFocuses = False + +myBorderWidth = 3 + +myModMask = mod4Mask + +myWorkspaces = ["1", "2", "3", "4", "5", "6", "7", "8", "9"] + +myNormalBorderColor = "#dddddd" +myFocusedBorderColor = "#ff8700" + +myKeys conf@(XConfig {XMonad.modMask = modm}) = + M.fromList $ + -- launch a terminal + [ ((modm, xK_Return), spawn $ XMonad.terminal conf), + -- launch dmenu + ((modm, xK_p), spawn myAppMenu), + -- launch gmrun + ((modm .|. shiftMask, xK_p), spawn myAppMenuThemes), + -- close focused window + ((modm, xK_q), kill), + -- Rotate through the available layout algorithms + ((modm, xK_space), sendMessage NextLayout), + -- Reset the layouts on the current workspace to default + ((modm .|. shiftMask, xK_space), setLayout $ XMonad.layoutHook conf), + -- Resize viewed windows to the correct size + ((modm, xK_n), refresh), + -- Move focus to the next window + ((modm, xK_Tab), windows W.focusDown), + -- Move focus to the next window + ((modm, xK_j), windows W.focusDown), + -- Move focus to the previous window + ((modm, xK_k), windows W.focusUp), + -- Move focus to the master window + ((modm, xK_m), windows W.focusMaster), + -- Swap the focused window and the master window + ((modm, xK_s), windows W.swapMaster), + -- Swap the focused window with the next window + ((modm .|. shiftMask, xK_j), windows W.swapDown), + -- Swap the focused window with the previous window + ((modm .|. shiftMask, xK_k), windows W.swapUp), + -- Shrink the master area + ((modm, xK_h), sendMessage Shrink), + -- Expand the master area + ((modm, xK_l), sendMessage Expand), + -- Push window back into tiling + ((modm, xK_t), withFocused $ windows . W.sink), + -- Increment the number of windows in the master area + ((modm, xK_comma), sendMessage (IncMasterN 1)), + -- Deincrement the number of windows in the master area + ((modm, xK_period), sendMessage (IncMasterN (-1))), + -- Toggle the status bar gap + -- Use this binding with avoidStruts from Hooks.ManageDocks. + -- See also the statusBar function from Hooks.DynamicLog. + -- + -- , ((modm , xK_b ), sendMessage ToggleStruts) + + -- Launch Browser + ((modm, xK_i), spawn myBrowser), + ((modm .|. shiftMask, xK_s), spawn "systemctl suspend"), + -- Quit xmonad + ((modm .|. shiftMask, xK_q), io (exitWith ExitSuccess)), + -- Restart xmonad + ((modm .|. shiftMask, xK_o), spawn "xmonad --recompile; xmonad --restart") + ] + ++ + -- + -- mod-[1..9], Switch to workspace N + -- mod-shift-[1..9], Move client to workspace N + -- + [ ((m .|. modm, k), windows $ f i) + | (i, k) <- zip (XMonad.workspaces conf) [xK_1 .. xK_9], + (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)] + ] + ++ + -- + -- + -- mod-{w,e,r}, Switch to physical/Xinerama screens 1, 2, or 3 + -- mod-shift-{w,e,r}, Move client to screen 1, 2, or 3 + -- + [ ((m .|. modm, key), screenWorkspace sc >>= flip whenJust (windows . f)) + | (key, sc) <- zip [xK_w, xK_e, xK_r] [0 ..], + (f, m) <- [(W.view, 0), (W.shift, shiftMask)] + ] + +------------------------------------------------------------------------ +-- Mouse bindings: default actions bound to mouse events +-- +myMouseBindings (XConfig {XMonad.modMask = modm}) = + M.fromList $ + -- mod-button1, Set the window to floating mode and move by dragging + [ ( (modm, button1), + ( \w -> + focus w >> mouseMoveWindow w + >> windows W.shiftMaster + ) + ), + -- mod-button2, Raise the window to the top of the stack + ((modm, button2), (\w -> focus w >> windows W.shiftMaster)), + -- mod-button3, Set the window to floating mode and resize by dragging + ( (modm, button3), + ( \w -> + focus w >> mouseResizeWindow w + >> windows W.shiftMaster + ) + ) + -- you may also bind events to the mouse scroll wheel (button4 and button5) + ] + +myLayout = spacing 24 $ avoidStruts (tiled ||| Mirror tiled ||| Full) + where + tiled = Tall nmaster delta ratio + nmaster = 1 + ratio = 1/2 + delta = 3/100 + +myManageHook = + composeAll + [ className =? "MPlayer" --> doFloat, + className =? "Gimp" --> doFloat, + resource =? "desktop_window" --> doIgnore, + resource =? "kdesktop" --> doIgnore + ] + +myEventHook = mempty + +myLogHook = return () + +myStartupHook = do + spawnOnce "xrandr --output DP-0 --primary --left-of HDMI-0 --auto &" + spawnOnce "nitrogen --restore &" + spawnOnce "killall picom; picom --config ~/.config/picom/picom.conf --vsync &" + spawnOnce "killall jackd;" + +main = do + -- xmproc0 <- spawnPipe "" + xmproc0 <- spawnPipe "killall xmobar; xmobar ~/.config/xmobar/xmobar.config" + xmproc1 <- spawnPipe "jackd" + xmonad $ docks defaults + + +defaults = + def + { -- simple stuff + terminal = myTerminal, + focusFollowsMouse = myFocusFollowsMouse, + clickJustFocuses = myClickJustFocuses, + borderWidth = myBorderWidth, + modMask = myModMask, + workspaces = myWorkspaces, + normalBorderColor = myNormalBorderColor, + focusedBorderColor = myFocusedBorderColor, + -- key bindings + keys = myKeys, + mouseBindings = myMouseBindings, + -- hooks, layouts + layoutHook = myLayout, + manageHook = myManageHook, + handleEventHook = myEventHook, + logHook = myLogHook, + startupHook = myStartupHook + } + diff --git a/.xmonad/xmonad-pc.hs b/.xmonad/xmonad-pc.hs new file mode 100644 index 0000000..133bccb --- /dev/null +++ b/.xmonad/xmonad-pc.hs @@ -0,0 +1,189 @@ +import qualified Data.Map as M +import Data.Monoid +import System.Exit +import XMonad +import XMonad.Util.Run +import XMonad.Util.SpawnOnce +import XMonad.Layout.Spacing +import XMonad.Hooks.ManageDocks +import qualified XMonad.StackSet as W + +myTerminal :: String +myTerminal = "kitty" + +myBrowser :: String +myBrowser = "brave" + +myAppMenu :: String +myAppMenu = "rofi -show run" + +myAppMenuThemes :: String +myAppMenuThemes = "rofi-theme-selector" + +myFocusFollowsMouse :: Bool +myFocusFollowsMouse = True + +myClickJustFocuses :: Bool +myClickJustFocuses = False + +myBorderWidth = 3 + +myModMask = mod4Mask + +myWorkspaces = ["1", "2", "3", "4", "5", "6", "7", "8", "9"] + +myNormalBorderColor = "#dddddd" +myFocusedBorderColor = "#ff8700" + +myKeys conf@(XConfig {XMonad.modMask = modm}) = + M.fromList $ + -- launch a terminal + [ ((modm, xK_Return), spawn $ XMonad.terminal conf), + -- launch dmenu + ((modm, xK_p), spawn myAppMenu), + -- launch gmrun + ((modm .|. shiftMask, xK_p), spawn myAppMenuThemes), + -- close focused window + ((modm, xK_q), kill), + -- Rotate through the available layout algorithms + ((modm, xK_space), sendMessage NextLayout), + -- Reset the layouts on the current workspace to default + ((modm .|. shiftMask, xK_space), setLayout $ XMonad.layoutHook conf), + -- Resize viewed windows to the correct size + ((modm, xK_n), refresh), + -- Move focus to the next window + ((modm, xK_Tab), windows W.focusDown), + -- Move focus to the next window + ((modm, xK_j), windows W.focusDown), + -- Move focus to the previous window + ((modm, xK_k), windows W.focusUp), + -- Move focus to the master window + ((modm, xK_m), windows W.focusMaster), + -- Swap the focused window and the master window + ((modm, xK_s), windows W.swapMaster), + -- Swap the focused window with the next window + ((modm .|. shiftMask, xK_j), windows W.swapDown), + -- Swap the focused window with the previous window + ((modm .|. shiftMask, xK_k), windows W.swapUp), + -- Shrink the master area + ((modm, xK_h), sendMessage Shrink), + -- Expand the master area + ((modm, xK_l), sendMessage Expand), + -- Push window back into tiling + ((modm, xK_t), withFocused $ windows . W.sink), + -- Increment the number of windows in the master area + ((modm, xK_comma), sendMessage (IncMasterN 1)), + -- Deincrement the number of windows in the master area + ((modm, xK_period), sendMessage (IncMasterN (-1))), + -- Toggle the status bar gap + -- Use this binding with avoidStruts from Hooks.ManageDocks. + -- See also the statusBar function from Hooks.DynamicLog. + -- + -- , ((modm , xK_b ), sendMessage ToggleStruts) + + -- Launch Browser + ((modm, xK_i), spawn myBrowser), + ((modm .|. shiftMask, xK_s), spawn "systemctl suspend"), + -- Quit xmonad + ((modm .|. shiftMask, xK_q), io (exitWith ExitSuccess)), + -- Restart xmonad + ((modm .|. shiftMask, xK_o), spawn "xmonad --recompile; xmonad --restart") + ] + ++ + -- + -- mod-[1..9], Switch to workspace N + -- mod-shift-[1..9], Move client to workspace N + -- + [ ((m .|. modm, k), windows $ f i) + | (i, k) <- zip (XMonad.workspaces conf) [xK_1 .. xK_9], + (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)] + ] + ++ + -- + -- + -- mod-{w,e,r}, Switch to physical/Xinerama screens 1, 2, or 3 + -- mod-shift-{w,e,r}, Move client to screen 1, 2, or 3 + -- + [ ((m .|. modm, key), screenWorkspace sc >>= flip whenJust (windows . f)) + | (key, sc) <- zip [xK_w, xK_e, xK_r] [0 ..], + (f, m) <- [(W.view, 0), (W.shift, shiftMask)] + ] + +------------------------------------------------------------------------ +-- Mouse bindings: default actions bound to mouse events +-- +myMouseBindings (XConfig {XMonad.modMask = modm}) = + M.fromList $ + -- mod-button1, Set the window to floating mode and move by dragging + [ ( (modm, button1), + ( \w -> + focus w >> mouseMoveWindow w + >> windows W.shiftMaster + ) + ), + -- mod-button2, Raise the window to the top of the stack + ((modm, button2), (\w -> focus w >> windows W.shiftMaster)), + -- mod-button3, Set the window to floating mode and resize by dragging + ( (modm, button3), + ( \w -> + focus w >> mouseResizeWindow w + >> windows W.shiftMaster + ) + ) + -- you may also bind events to the mouse scroll wheel (button4 and button5) + ] + +myLayout = spacing 24 $ avoidStruts (tiled ||| Mirror tiled ||| Full) + where + tiled = Tall nmaster delta ratio + nmaster = 1 + ratio = 1/2 + delta = 3/100 + +myManageHook = + composeAll + [ className =? "MPlayer" --> doFloat, + className =? "Gimp" --> doFloat, + resource =? "desktop_window" --> doIgnore, + resource =? "kdesktop" --> doIgnore + ] + +myEventHook = mempty + +myLogHook = return () + +myStartupHook = do + spawnOnce "xrandr --output DP-0 --primary --left-of HDMI-0 --auto &" + spawnOnce "nitrogen --restore &" + spawnOnce "killall picom; picom --config ~/.config/picom/picom.conf --vsync &" + spawnOnce "killall jackd;" + +main = do + -- xmproc0 <- spawnPipe "" + xmproc0 <- spawnPipe "killall xmobar; xmobar ~/.config/xmobar/xmobar.config" + xmproc1 <- spawnPipe "jackd" + xmonad $ docks defaults + + +defaults = + def + { -- simple stuff + terminal = myTerminal, + focusFollowsMouse = myFocusFollowsMouse, + clickJustFocuses = myClickJustFocuses, + borderWidth = myBorderWidth, + modMask = myModMask, + workspaces = myWorkspaces, + normalBorderColor = myNormalBorderColor, + focusedBorderColor = myFocusedBorderColor, + -- key bindings + keys = myKeys, + mouseBindings = myMouseBindings, + -- hooks, layouts + layoutHook = myLayout, + manageHook = myManageHook, + handleEventHook = myEventHook, + logHook = myLogHook, + startupHook = myStartupHook + } + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..0207b7f --- /dev/null +++ b/Makefile @@ -0,0 +1,8 @@ +default: + echo "please specifiy a target" + +pc: + ./scripts/setup-pc.sh + +laptop: + ./scripts/setup-laptop.sh diff --git a/backgrounds/lambda-bg.png b/backgrounds/lambda-bg-bright.png similarity index 100% rename from backgrounds/lambda-bg.png rename to backgrounds/lambda-bg-bright.png diff --git a/backgrounds/lambda-bg-dark.png b/backgrounds/lambda-bg-dark.png new file mode 100644 index 0000000..6d7cadb Binary files /dev/null and b/backgrounds/lambda-bg-dark.png differ diff --git a/drivers.md b/drivers.md index 755191f..5899515 100644 --- a/drivers.md +++ b/drivers.md @@ -1,2 +1,3 @@ # List of drivers WiFi 1: rtl8821ce-dkms +WiFi 2: rtl88x2bu diff --git a/scripts/basic-setup.sh b/scripts/basic-setup.sh new file mode 100644 index 0000000..464a779 --- /dev/null +++ b/scripts/basic-setup.sh @@ -0,0 +1,87 @@ +#!/bin/bash + +BASEDIR=$(dirname "$0") +FILEDIR="$BASEDIR/.." + +function ipkg { + pacman -Qs $1 > /dev/null + if [[ $? -ne 0 ]] ; then + sudo pacman -S $1 --noconfirm + fi +} + +function ipkg_yay { + yay -Qs $1 > /dev/null + if [[ $? -ne 0 ]] ; then + yay -S $1 --noconfirm + fi +} + +# update mirrors +sudo pacman -Sy --noconfirm + +# update pacman mirrorlist +sudo cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist-backup +ipkg reflector +sudo reflector -l 50 -c Germany -c Switzerland -c Denmark -c Belgium -p http -p https --sort rate --save /etc/pacman.d/mirrorlist + +# update packages +sudo pacman -Su --noconfirm + +# setup yay +ipkg yay + +# setup git +ipkg git +ipkg libsecret + +git config --global credential.helper /usr/lib/git-core/git-credential-libsecret + +# setup terminal stuff +ipkg zsh +ipkg kitty + +cp $FILEDIR/.zshrc ~ +mkdir -p ~/.config/kitty +cp $FILEDIR/.config/kitty/kitty.conf ~/.config/kitty/ + +sudo chsh -s `where zsh` $USER + +# setup snap support +ipkg snapd +sudo systemctl enable --now snapd.socket +sudo ln -s /var/lib/snapd/snap /snap + +# setup editor stuff +ipkg vim +cp $FILEDIR/.vimrc ~ + +curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ + https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim + +ipkg nodejs +ipkg npm + +vim -c source ~/.vimrc -c PlugInstall -c qa! + +ipkg emacs + +cp $FILEDIR/.emacs ~ +cp -r $FILEDIR/.emacs.d ~ + +sudo snap install code --classic + +# install brave +ipkg_yay brave-bin + +# enable ssh support (if not enabled) +sudo systemctl enable sshd + +# setup gdm +ipkg gdm + +sudo rm -f /etc/systemd/system/display-manager.service +sudo ln -s /usr/lib/systemd/system/gdm.service /etc/systemd/system/display-manager.service + +# install keepassxc +ipkg keepassxc diff --git a/scripts/doom-emacs-setup.sh b/scripts/doom-emacs-setup.sh deleted file mode 100755 index bc34199..0000000 --- a/scripts/doom-emacs-setup.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh - -# install emacs -sudo pacman -S emacs --noconfirm - -git clone --depth 1 https://github.com/hlissner/doom-emacs ~/.emacs.d -~/.emacs.d/bin/doom install - -cp ../.emacs.d/init.el ~/.emacs.d/init.el diff --git a/scripts/git-setup.sh b/scripts/git-setup.sh deleted file mode 100755 index db830ec..0000000 --- a/scripts/git-setup.sh +++ /dev/null @@ -1,9 +0,0 @@ -# install git -sudo pacman -S git --noconfirm - -# setup keyring -sudo pacman -S libsecret --noconfirm -git config --global credential.helper /usr/lib/git-core/git-credential-libsecret - -tput setaf 2; printf "Follow these steps to setup a GPG key for your git instance:\nhttps://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/telling-git-about-your-signing-key\n" - diff --git a/scripts/post-setup.sh b/scripts/post-setup.sh deleted file mode 100644 index 22a6d3f..0000000 --- a/scripts/post-setup.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -sudo rm -f /etc/systemd/system/display-manager.service -sudo systemctl enable gdm --now - - diff --git a/scripts/setup-laptop.sh b/scripts/setup-laptop.sh new file mode 100644 index 0000000..eae36c5 --- /dev/null +++ b/scripts/setup-laptop.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +BASEDIR=$(dirname "$0") +source $BASEDIR/basic-setup.sh + +# setup picom +ipkg picom + +cp $FILEDIR/.config/picom/picom-laptop.conf ~/.config/picom/picom.conf + +# setup wm +ipkg xmonad +ipkg xmonad-utils +ipkg xmonad-contrib +ipkg xmobar + +cp $FILEDIR/.xmonad/xmonad-laptop.hs ~/.xmonad/xmonad.hs +cp $FILEDIR/.config/xmobar/xmobar-laptop.config ~/.config/xmobar/xmobar.config + +sudo reboot \ No newline at end of file diff --git a/scripts/setup-pc.sh b/scripts/setup-pc.sh old mode 100644 new mode 100755 index 06ff83c..5cacfe7 --- a/scripts/setup-pc.sh +++ b/scripts/setup-pc.sh @@ -1,16 +1,22 @@ #!/bin/bash -source setup.sh +BASEDIR=$(dirname "$0") +source $BASEDIR/basic-setup.sh -# setup gnome -ipkg gnome -ipkg gnome-tweaks +# setup picom +ipkg picom + +cp $FILEDIR/.config/picom/picom-pc.conf ~/.config/picom/picom.conf + +# setup wm +ipkg xmonad +ipkg xmonad-utils +ipkg xmonad-contrib +ipkg xmobar + +cp $FILEDIR/.xmonad/xmonad-pc.hs ~/.xmonad/xmonad.hs +cp $FILEDIR/.config/xmobar/xmobar-pc.config ~/.config/xmobar/xmobar.config # setup nvidia driver -wget -O ~/Downloads/nvidia-driver.run https://us.download.nvidia.com/XFree86/Linux-x86_64/460.80/NVIDIA-Linux-x86_64-460.80.run -sudo ~/Downloads/nvidia-driver.run -echo "sudo ~/Downloads/nvidia-driver.run" > ~/.profile -cat post-setup.sh >> ~/.profile -echo "\nrm ~/.profile\nsudo reboot" >> ~/.profile +# ipkg nvidia sudo reboot - diff --git a/scripts/setup.sh b/scripts/setup.sh deleted file mode 100644 index c862e03..0000000 --- a/scripts/setup.sh +++ /dev/null @@ -1,57 +0,0 @@ -#!/bin/bash - -function ipkg { - pacman -Qs $1 > /dev/null - if [[ $? -ne 0 ]] ; then - sudo pacman -S $1 --yes - fi -} - -# update mirrors -sudo pacman -Sy --yes - -# update pacman mirrorlist -sudo cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist-backup -ipkg reflector -sudo reflector -l 50 -c Germany -c Switzerland -c Denmark -c Belgium -p http -p https --sort rate --save /etc/pacman.d/mirrorlist - -# update packages -sudo pacman -Su --yes - -# setup git -ipkg git -ipkg libsecret - -git config --global credential.helper /usr/lib/git-core/git-credential-libsecret - -# install zsh, vim, emacs and kitty -ipkg zsh -ipkg vim -ipkg emacs -ipkg kitty - -# copy config files -cp .vimrc ~ -cp .zshrc ~ -cp .emacs ~ -cp -r .emacs.d ~ -mkdir -p ~/.config/kitty -cp .config/kitty/kitty.conf - -# chsh to zsh -sudo chsh -s /bin/zsh $USER - -# setup snap support -ipkg snapd -sudo systemctl enable --now snapd.socket -sudo ln -s /var/lib/snapd/snap /snap - -# install brave -ipkg brave-bin - -# enable ssh -sudo systemctl enable sshd - -# setup gdm -ipkg gdm - diff --git a/scripts/update-pacman-mirrors.sh b/scripts/update-pacman-mirrors.sh deleted file mode 100755 index edb7fa3..0000000 --- a/scripts/update-pacman-mirrors.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -if [ "$EUID" -ne 0 ] - then echo "Please run as root!" - exit -fi - -if [ ! -f /etc/pacman.d/mirrorlist.backup ] ; then - echo "creating /etc/pacman.d/mirrorlist.backup ..." - cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.backup -fi - -echo "Ranking servers ..." -curl -s "https://www.archlinux.org/mirrorlist/?country=DE&country=FR&country=GB&country=NL&protocol=https&use_mirror_status=on" | sed -e 's/^#Server/Server/' -e '/^#/d' | rankmirrors -n 500 - > /etc/pacman.d/mirrorlist - diff --git a/scripts/vim-setup.sh b/scripts/vim-setup.sh deleted file mode 100755 index c42c20b..0000000 --- a/scripts/vim-setup.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh - -# install vim, nodejs and npm (dependencies for coc.nvim) -sudo pacman -S vim nodejs npm --noconfirm - -# setup vim-plug -curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ - https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim - -# copy vimrc -cp ../.vimrc ~/.vimrc - -# source copied vimrc -vim -c source ~/.vimrc -c qa! -# install plugins -vim -c PlugInstall -c qa! diff --git a/scripts/wifi-usb-setup.sh b/scripts/wifi-usb-setup.sh deleted file mode 100755 index b5f5785..0000000 --- a/scripts/wifi-usb-setup.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/bash -cd ~/Downloads -git clone https://github.com/cilynx/rtl88x2bu.git -sudo dkms add ./rtl88x2bu -sudo dkms install rtl88x2bu/5.6.1 -echo "Please to reboot to apply these changes to your system!" -