mirror of
				https://github.com/occivink/kakoune-sudo-write
				synced 2025-10-05 23:11:09 +02:00 
			
		
		
		
	fprint mode + cleanup
This commit is contained in:
		
							parent
							
								
									a0388698bf
								
							
						
					
					
						commit
						9193259641
					
				
							
								
								
									
										123
									
								
								sudo-write.kak
									
									
									
									
									
								
							
							
						
						
									
										123
									
								
								sudo-write.kak
									
									
									
									
									
								
							@ -1,12 +1,15 @@
 | 
			
		||||
# save the current buffer to its file as root using `sudo`
 | 
			
		||||
# (optionally pass the user password to sudo if not cached)
 | 
			
		||||
# prompt and pass the user password to sudo if not cached
 | 
			
		||||
 | 
			
		||||
define-command -hidden sudo-write-cached-password %{
 | 
			
		||||
# toggle fprint mode
 | 
			
		||||
declare-option bool fprint_mode false
 | 
			
		||||
 | 
			
		||||
define-command -hidden sudo-write-cached %{
 | 
			
		||||
    # easy case: the password was already cached, so we don't need any tricky handling
 | 
			
		||||
    eval -save-regs f %{
 | 
			
		||||
        reg f %sh{ mktemp -t XXXXXX }
 | 
			
		||||
    evaluate-commands -save-regs f %{
 | 
			
		||||
        set-register f %sh{ mktemp -t XXXXXX }
 | 
			
		||||
        write! %reg{f}
 | 
			
		||||
        eval %sh{
 | 
			
		||||
        evaluate-commands %sh{
 | 
			
		||||
            sudo -n -- dd if="$kak_main_reg_f" of="$kak_buffile" >/dev/null 2>&1
 | 
			
		||||
            if [ $? -eq 0 ]; then
 | 
			
		||||
                echo "edit!"
 | 
			
		||||
@ -18,12 +21,12 @@ define-command -hidden sudo-write-cached-password %{
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
define-command -hidden sudo-write-prompt-password %{
 | 
			
		||||
define-command -hidden sudo-write-prompt %{
 | 
			
		||||
    prompt -password 'Password:' %{
 | 
			
		||||
        eval -save-regs r %{
 | 
			
		||||
            eval -draft -save-regs 'tf|"' %{
 | 
			
		||||
                reg t %val{buffile}
 | 
			
		||||
                reg f %sh{ mktemp -t XXXXXX }
 | 
			
		||||
        evaluate-commands -save-regs r %{
 | 
			
		||||
            evaluate-commands -draft -save-regs 'tf|"' %{
 | 
			
		||||
                set-register t %val{buffile}
 | 
			
		||||
                set-register f %sh{ mktemp -t XXXXXX }
 | 
			
		||||
                write! %reg{f}
 | 
			
		||||
 | 
			
		||||
                # write the password in a buffer in order to pass it through STDIN to sudo
 | 
			
		||||
@ -31,9 +34,9 @@ define-command -hidden sudo-write-prompt-password %{
 | 
			
		||||
                # through the shell scope's environment or interpolating it inside the shell string
 | 
			
		||||
                # 'exec |' is pretty much the only way to pass data over STDIN
 | 
			
		||||
                edit -scratch '*sudo-password-tmp*'
 | 
			
		||||
                reg '"' "%val{text}"
 | 
			
		||||
                exec <a-P>
 | 
			
		||||
                reg | %{
 | 
			
		||||
                set-register '"' "%val{text}"
 | 
			
		||||
                execute-keys <a-P>
 | 
			
		||||
                set-register | %{
 | 
			
		||||
                    sudo -S -- dd if="$kak_main_reg_f" of="$kak_main_reg_t" > /dev/null 2>&1
 | 
			
		||||
                    if [ $? -eq 0 ]; then
 | 
			
		||||
                        printf 'edit!'
 | 
			
		||||
@ -42,41 +45,22 @@ define-command -hidden sudo-write-prompt-password %{
 | 
			
		||||
                    fi
 | 
			
		||||
                    rm -f "$kak_main_reg_f"
 | 
			
		||||
                }
 | 
			
		||||
                exec '|<ret>'
 | 
			
		||||
                exec -save-regs '' '%"ry'
 | 
			
		||||
                execute-keys '|<ret>'
 | 
			
		||||
                execute-keys -save-regs '' '%"ry'
 | 
			
		||||
                delete-buffer! '*sudo-password-tmp*'
 | 
			
		||||
            }
 | 
			
		||||
            eval %reg{r}
 | 
			
		||||
            evaluate-commands %reg{r}
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
define-command sudo-write -docstring "Write the content of the buffer using sudo" %{
 | 
			
		||||
    eval %sh{
 | 
			
		||||
        # tricky posix-way of getting the first character of a variable
 | 
			
		||||
        # no subprocess!
 | 
			
		||||
        if [ "${kak_buffile%"${kak_buffile#?}"}" != "/" ]; then
 | 
			
		||||
            # not entirely foolproof as a scratch buffer may start with '/', but good enough
 | 
			
		||||
            printf 'fail "Not a file"'
 | 
			
		||||
            exit
 | 
			
		||||
        fi
 | 
			
		||||
        # check if the password is cached
 | 
			
		||||
        if sudo -n true > /dev/null 2>&1; then
 | 
			
		||||
            printf sudo-write-cached-password
 | 
			
		||||
        else
 | 
			
		||||
            printf sudo-write-prompt-password
 | 
			
		||||
        fi
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# SAME AS ABOVE WITH 'QUIT' APPENEDED
 | 
			
		||||
 | 
			
		||||
define-command -hidden sudo-write-quit-cached-password %{
 | 
			
		||||
    eval -save-regs f %{
 | 
			
		||||
        reg f %sh{ mktemp -t XXXXXX }
 | 
			
		||||
define-command -hidden sudo-write-fprint %{
 | 
			
		||||
    evaluate-commands -save-regs f %{
 | 
			
		||||
        set-register f %sh{ mktemp -t XXXXXX }
 | 
			
		||||
        write! %reg{f}
 | 
			
		||||
        eval %sh{
 | 
			
		||||
            sudo -n -- dd if="$kak_main_reg_f" of="$kak_buffile" >/dev/null 2>&1
 | 
			
		||||
        evaluate-commands %sh{
 | 
			
		||||
            # if fprint is enabled we use -S to bypass the password prompt
 | 
			
		||||
            sudo -S -- dd if="$kak_main_reg_f" of="$kak_buffile" >/dev/null 2>&1
 | 
			
		||||
            if [ $? -eq 0 ]; then
 | 
			
		||||
                echo "edit!"
 | 
			
		||||
            else
 | 
			
		||||
@ -85,49 +69,44 @@ define-command -hidden sudo-write-quit-cached-password %{
 | 
			
		||||
            rm -f "$kak_main_reg_f"
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    quit
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
define-command -hidden sudo-write-quit-prompt-password %{
 | 
			
		||||
    prompt -password 'Password:' %{
 | 
			
		||||
        eval -save-regs r %{
 | 
			
		||||
            eval -draft -save-regs 'tf|"' %{
 | 
			
		||||
                reg t %val{buffile}
 | 
			
		||||
                reg f %sh{ mktemp -t XXXXXX }
 | 
			
		||||
                write! %reg{f}
 | 
			
		||||
                edit -scratch '*sudo-password-tmp*'
 | 
			
		||||
                reg '"' "%val{text}"
 | 
			
		||||
                exec <a-P>
 | 
			
		||||
                reg | %{
 | 
			
		||||
                    sudo -S -- dd if="$kak_main_reg_f" of="$kak_main_reg_t" > /dev/null 2>&1
 | 
			
		||||
                    if [ $? -eq 0 ]; then
 | 
			
		||||
                        printf 'edit!'
 | 
			
		||||
 | 
			
		||||
define-command sudo-write -docstring "Write the content of the buffer using sudo" %{
 | 
			
		||||
    evaluate-commands %sh{
 | 
			
		||||
        # tricky posix-way of getting the first character of a variable
 | 
			
		||||
        # no subprocess!
 | 
			
		||||
        if [ "${kak_buffile%"${kak_buffile#?}"}" != "/" ]; then
 | 
			
		||||
            # not entirely foolproof as a scratch buffer may start with '/', but good enough
 | 
			
		||||
            echo 'fail "Not a file"'
 | 
			
		||||
            exit
 | 
			
		||||
        # check if fprint is enabled
 | 
			
		||||
        elif "$kak_opt_fprint_mode"; then
 | 
			
		||||
            echo sudo-write-fprint
 | 
			
		||||
        # check if the password is cached
 | 
			
		||||
        elif sudo -n true > /dev/null 2>&1; then
 | 
			
		||||
            echo sudo-write-cached
 | 
			
		||||
        else
 | 
			
		||||
                        printf 'fail "Incorrect password?"'
 | 
			
		||||
            echo sudo-write-prompt
 | 
			
		||||
        fi
 | 
			
		||||
                    rm -f "$kak_main_reg_f"
 | 
			
		||||
                }
 | 
			
		||||
                exec '|<ret>'
 | 
			
		||||
                exec -save-regs '' '%"ry'
 | 
			
		||||
                delete-buffer! '*sudo-password-tmp*'
 | 
			
		||||
            }
 | 
			
		||||
            eval %reg{r}
 | 
			
		||||
        }
 | 
			
		||||
        quit
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# SAME AS ABOVE WITH 'QUIT' APPENEDED
 | 
			
		||||
 | 
			
		||||
define-command sudo-write-quit -docstring "Write the content of the buffer using sudo, then quit" %{
 | 
			
		||||
    eval %sh{
 | 
			
		||||
    evaluate-commands %sh{
 | 
			
		||||
        if [ "${kak_buffile%"${kak_buffile#?}"}" != "/" ]; then
 | 
			
		||||
            printf 'fail "Not a file"'
 | 
			
		||||
            echo 'fail "Not a file"'
 | 
			
		||||
            exit
 | 
			
		||||
        fi
 | 
			
		||||
        if sudo -n true > /dev/null 2>&1; then
 | 
			
		||||
            printf sudo-write-quit-cached-password
 | 
			
		||||
        elif "$kak_opt_fprint_mode"; then
 | 
			
		||||
            echo "sudo-write-fprint"
 | 
			
		||||
        elif sudo -n true > /dev/null 2>&1; then
 | 
			
		||||
            echo "sudo-write-cached"
 | 
			
		||||
        else
 | 
			
		||||
            printf sudo-write-quit-prompt-password
 | 
			
		||||
            echo "sudo-write-prompt"
 | 
			
		||||
        fi
 | 
			
		||||
        echo "quit"
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user