Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,12 @@ If the current line is empty, it will do the same thing to the most recent histo

The default binding sequence can be overriden by setting `sudope_sequence` to the desired sequence.

For example, to set the sequence to <kbd>Alt</kbd>+<kbd>u</kbd> you can add:
The default super user command "sudo" can be overriden by setting `sudope_command` to the desired command.

For example, to set the sequence to <kbd>Alt</kbd>+<kbd>u</kbd> and the super user command to "doas" you can add:
```fish
set -gx sudope_sequence \eu
set -gx sudope_command 'doas'
```
To `~/.config/omf/init.fish`.

Expand Down
40 changes: 25 additions & 15 deletions functions/sudope.fish
Original file line number Diff line number Diff line change
@@ -1,16 +1,26 @@
function sudope -d "Quickly toggle sudo prefix"
function sudope -d "Quickly toggle super user command prefix"

# Save the current command line and cursor position.
set -l command_buffer (commandline)
set -l cursor_position (commandline -C)

# If no custom super user command defaults to sudo
test -n "$sudope_command"
or set -l sudope_command 'sudo'

# Save regex escaped version of super user command for later
set -l sudope_command_re (string escape --style=regex "$sudope_command")

# Save su command length
set -l sudope_command_length (string length -- "$sudope_command")

# If the command line is empty, pull the last command from history.
if test -z "$command_buffer"
set command_buffer $history[1]
end

# Parse the command line (first line only).
set -l command_parts (string match -ir '^(\s*)(sudo(\s+|$))?(.*)' $command_buffer[1])
set -l command_parts (string match -ir "^(\s*)($sudope_command_re(\s+|\$))?(.*)" $command_buffer[1])

# Handle multiline commands with extra care.
set -l command_lines_count (count $command_buffer)
Expand All @@ -19,32 +29,32 @@ function sudope -d "Quickly toggle sudo prefix"

switch (count $command_parts)
case 3
# No "sudo".
# No su command.

# Add "sudo" to the beginning of the command, after any leading whitespace (if present).
commandline -r (string join \n (string join '' $command_parts[2] 'sudo ' $command_parts[3]) $command_rest)
# Add the su command to the beginning of the command, after any leading whitespace (if present).
commandline -r (string join \n (string join '' $command_parts[2] "$sudope_command " $command_parts[3]) $command_rest)

# Push the cursor position ahead if necessary (+5 for 'sudo ').
# Push the cursor position ahead if necessary
test $cursor_position -ge (string length -- "$command_parts[2]")
and set cursor_position (math $cursor_position+5)
and set cursor_position (math $cursor_position+$sudope_command_length+1)

# Place the cursor where it was (or where it should be).
commandline -C $cursor_position

case 5
# "sudo" is present in the beginning of the command.
# The su comamnd is present in the beginning of the command.

# Remove "sudo", leave any leading whitespace (if present).
# Remove the su command, leave any leading whitespace (if present).
commandline -r (string join \n (string join '' $command_parts[2 5]) $command_rest)

# Push the cursor position back if appropriate ('sudo' and whitespace).
# Push the cursor position back if appropriate (su command and whitespace).
set -l lead_length (string length -- "$command_parts[2]")
set -l sudo_length (string length -- "$command_parts[3]")
if test $cursor_position -ge (math $lead_length+$sudo_length)
# The cursor was after "sudo".
set cursor_position (math $cursor_position-$sudo_length)
set -l sudope_command_length (string length -- "$command_parts[3]")
if test $cursor_position -ge (math $lead_length+$sudope_command_length)
# The cursor was after the su command.
set cursor_position (math $cursor_position-$sudope_command_length)
else if test $cursor_position -ge $lead_length
# The cursor was somewhere on "sudo".
# The cursor was somewhere on the su command.
set cursor_position $lead_length
end

Expand Down