2022-10-20 04:03:56 +00:00
;; ========== Function to reload current file =================
( defun reload-file ( )
" Revert buffer without confirmation. "
( interactive )
( revert-buffer :ignore-auto :noconfirm ) )
;; ===========================================================
;; ============= Run commands ================================
( defun run-command-on-buffer ( cmd &rest args )
" Run a command using the current buffer as stdin and replacing its contents if the command succeeds with the stdout from the command. This is useful for code formatters. "
( let (
( stdout-buffer ( generate-new-buffer " tmp-stdout " t ) )
( full-cmd ( append ' ( call-process-region nil nil cmd nil stdout-buffer nil ) args ) )
)
( unwind-protect
( let ( ( exit-status ( eval full-cmd ) ) )
( if ( eq exit-status 0 )
( save-excursion
( replace-buffer-contents stdout-buffer )
)
( message " FAILED running command on buffer %s " ( append ( list cmd ) args ) )
)
)
( kill-buffer stdout-buffer )
)
)
)
( defun run-command-in-directory ( dir cmd &rest args )
" Run a command in the specified directory. If the directory is nil, the directory of the file is used. The stdout result is trimmed of whitespace and returned. "
( let (
( default-directory ( or dir default-directory ) )
( stdout-buffer ( generate-new-buffer " tmp-stdout " t ) )
( full-cmd ( append ' ( call-process cmd nil ( list stdout-buffer nil ) nil ) args ) )
)
( unwind-protect
( let ( ( exit-status ( condition-case nil ( eval full-cmd ) ( file-missing nil ) ) ) )
( if ( eq exit-status 0 )
( progn
( with-current-buffer stdout-buffer
( string-trim ( buffer-string ) )
)
)
)
)
( kill-buffer stdout-buffer )
)
)
)
( defun load-directory ( dir )
( let ( ( load-it ( lambda ( f )
( load-file ( concat ( file-name-as-directory dir ) f ) ) )
) )
2023-09-30 04:50:25 +00:00
( mapc load-it ( directory-files dir nil " \\ .el$ " ) ) ) )
( defun generate-vc-link ( )
( interactive )
( or
( generate-github-link )
( generate-source-hut-link )
)
)
2022-10-20 04:03:56 +00:00
( defun generate-github-link ( )
" Generate a permalink to the current line. "
( interactive )
( let (
( current-rev ( vc-working-revision buffer-file-name ) )
( line-number ( line-number-at-pos ) )
( repository-url ( vc-git-repository-url buffer-file-name ) )
( relative-path ( file-relative-name buffer-file-name ( vc-root-dir ) ) )
)
( save-match-data
( and ( string-match " \\ (git@github \. com: \\ |https://github \. com/ \\ ) \\ ([^/]+ \\ )/ \\ ([^.]+ \\ ).git " repository-url )
( let* (
( gh-org ( match-string 2 repository-url ) )
( gh-repo ( match-string 3 repository-url ) )
2023-10-02 23:44:39 +00:00
( full-url ( format " https://github.com/%s/%s/blob/%s/%s?plain=1#L%s " gh-org gh-repo current-rev relative-path line-number ) )
2022-10-20 04:03:56 +00:00
)
( message " %s " full-url )
( kill-new full-url )
2023-09-30 04:50:25 +00:00
t
)
)
)
)
)
( defun generate-source-hut-link ( )
" Generate a permalink to the current line. "
( interactive )
( let (
( current-rev ( vc-working-revision buffer-file-name ) )
( line-number ( line-number-at-pos ) )
( repository-url ( vc-git-repository-url buffer-file-name ) )
( relative-path ( file-relative-name buffer-file-name ( vc-root-dir ) ) )
)
( message " Using repo url %s " repository-url )
( save-match-data
( and ( string-match " https://git.sr.ht/ \\ ([^/]+ \\ )/ \\ ([^/]+ \\ ) " repository-url )
( let* (
( sh-org ( match-string 1 repository-url ) )
( sh-repo ( match-string 2 repository-url ) )
( full-url ( format " https://git.sr.ht/%s/%s/tree/%s/%s#L%s " sh-org sh-repo current-rev relative-path line-number ) )
)
( message " %s " full-url )
( kill-new full-url )
t
2022-10-20 04:03:56 +00:00
)
)
)
)
)
( defmacro when-linux ( &rest body )
" Execute only when on Linux. "
( declare ( indent defun ) )
` ( when ( eq system-type 'gnu/linux ) ,@ body ) )
( defmacro when-freebsd ( &rest body )
" Execute only when on FreeBSD. "
( declare ( indent defun ) )
` ( when ( eq system-type 'berkeley-unix ) ,@ body ) )
( provide 'base-functions )