From 28e29c3422c878557446ae725ea6a96efe6f03f3 Mon Sep 17 00:00:00 2001 From: Andrey Orst Date: Mon, 25 Feb 2019 14:34:27 +0300 Subject: [PATCH 1/8] initial commit of project manager with fzf --- rc/fzf-modules/fzf-projects.kak | 54 +++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 rc/fzf-modules/fzf-projects.kak diff --git a/rc/fzf-modules/fzf-projects.kak b/rc/fzf-modules/fzf-projects.kak new file mode 100644 index 0000000..4d3bc97 --- /dev/null +++ b/rc/fzf-modules/fzf-projects.kak @@ -0,0 +1,54 @@ +# ╭─────────────╥────────────────────────╮ +# │ Author: ║ File: │ +# │ Andrey Orst ║ fzf-project.kak │ +# ╞═════════════╩════════════════════════╡ +# │ Module for storing and loading │ +# │ projects with fzf for fzf.kak plugin │ +# ╞══════════════════════════════════════╡ +# │ GitHub.com/andreyorst/fzf.kak │ +# ╰──────────────────────────────────────╯ + +declare-option -docstring "a file where saved projects are stored" \ +str fzf_projects_file %sh{ echo "$HOME/.cache/fzf.kak/projects" } + +declare-option -docstring 'allow showing preview window while changing projects +Default value: + false +' \ +bool fzf_projects_preview false + +declare-option -docstring 'command to show list of directories in preview window +Default value: + tree -d +' \ +str fzf_projects_preview_cmd "tree -d {}" + +declare-option -docstring 'maximum amount of previewed directories' \ +int fzf_projects_preview_dirs '300' + +map global fzf -docstring "open project" 'p' ': fzf-project' + +define-command -hidden fzf-project %{ evaluate-commands %sh{ + tmux_height=$kak_opt_fzf_tmux_height + printf '%s\n' "info -title %{fzf open project} %{Change the server's working directory to selected project}" + + items_command="cat $kak_opt_fzf_projects_file" + if [ $kak_opt_fzf_cd_preview = "true" ]; then + preview="--preview '($kak_opt_cd_preview_cmd) 2>/dev/null | head -n $kak_opt_fzf_preview_dirs'" + fi + printf "%s\n" "fzf %{change-directory} %{$items_command} %{$preview} %{fzf-file}" +}} + +define-command fzf-save-path-as-project %{ prompt "Project's name: " %{ nop %sh{ + mkdir -p "${kak_opt_fzf_projects_file%/*}" + printf "%s: %s\n" "$kak_text" "$(pwd)" >> $kak_opt_fzf_projects_file +}}} + +# a command to get poject names if `prompt' will ever support `-shell-script-candidates' +# %sh{ perl -n -e '/^([^:]+)/ && print "$1\n"' $kak_opt_fzf_projects_file } +define-command fzf-update-project-path %{ + prompt "Project to update: " %{ nop %sh{ + sed -i -E "s/($kak_text: ).*/\1$(pwd)/" "$kak_opt_fzf_projects_file" + }} +} + From b3ca672683bb5fcd427cf0b0ba6d6ce61c050c25 Mon Sep 17 00:00:00 2001 From: Andrey Orst Date: Thu, 28 Mar 2019 15:15:19 +0300 Subject: [PATCH 2/8] make project work --- rc/modules/fzf-projects.kak | 33 +++++++++------------------------ 1 file changed, 9 insertions(+), 24 deletions(-) diff --git a/rc/modules/fzf-projects.kak b/rc/modules/fzf-projects.kak index 4d3bc97..d56e5c9 100644 --- a/rc/modules/fzf-projects.kak +++ b/rc/modules/fzf-projects.kak @@ -11,37 +11,22 @@ declare-option -docstring "a file where saved projects are stored" \ str fzf_projects_file %sh{ echo "$HOME/.cache/fzf.kak/projects" } -declare-option -docstring 'allow showing preview window while changing projects -Default value: - false -' \ -bool fzf_projects_preview false - -declare-option -docstring 'command to show list of directories in preview window -Default value: - tree -d -' \ -str fzf_projects_preview_cmd "tree -d {}" - -declare-option -docstring 'maximum amount of previewed directories' \ -int fzf_projects_preview_dirs '300' - +try %{ declare-user-mode fzf } map global fzf -docstring "open project" 'p' ': fzf-project' -define-command -hidden fzf-project %{ evaluate-commands %sh{ - tmux_height=$kak_opt_fzf_tmux_height - printf '%s\n' "info -title %{fzf open project} %{Change the server's working directory to selected project}" +try %{ declare-user-mode fzf-project } +map global fzf -docstring "project menu" '' ': enter-user-mode fzf-project' +map global fzf-project -docstring "save current path as project" 's' ': fzf-save-path-as-project' +map global fzf-project -docstring "update project" 'u' ': fzf-update-project-path' - items_command="cat $kak_opt_fzf_projects_file" - if [ $kak_opt_fzf_cd_preview = "true" ]; then - preview="--preview '($kak_opt_cd_preview_cmd) 2>/dev/null | head -n $kak_opt_fzf_preview_dirs'" - fi - printf "%s\n" "fzf %{change-directory} %{$items_command} %{$preview} %{fzf-file}" +define-command -hidden fzf-project %{ evaluate-commands %sh{ + printf '%s\n' "info -title %{fzf open project} %{Change the server's working directory to selected project}" + printf "%s\n" "fzf -kak-cmd change-directory -items-cmd %{cat $kak_opt_fzf_projects_file} -preview-cmd %{$preview} -post-action fzf-file -filter %{sed 's/.*: //'}" }} define-command fzf-save-path-as-project %{ prompt "Project's name: " %{ nop %sh{ mkdir -p "${kak_opt_fzf_projects_file%/*}" - printf "%s: %s\n" "$kak_text" "$(pwd)" >> $kak_opt_fzf_projects_file + printf "%s: %s\n" "$kak_text" "$(pwd)" >> $kak_opt_fzf_projects_file }}} # a command to get poject names if `prompt' will ever support `-shell-script-candidates' From 53e047005881436d2f470e18600b7564bd833777 Mon Sep 17 00:00:00 2001 From: Andrey Orst Date: Thu, 28 Mar 2019 15:15:42 +0300 Subject: [PATCH 3/8] rename --- rc/modules/{fzf-projects.kak => fzf-project.kak} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename rc/modules/{fzf-projects.kak => fzf-project.kak} (100%) diff --git a/rc/modules/fzf-projects.kak b/rc/modules/fzf-project.kak similarity index 100% rename from rc/modules/fzf-projects.kak rename to rc/modules/fzf-project.kak From 733b65a35376e137aef1fe1cc8bf20a37681efb4 Mon Sep 17 00:00:00 2001 From: Andrey Orst Date: Thu, 28 Mar 2019 16:00:59 +0300 Subject: [PATCH 4/8] update project if exists --- rc/modules/fzf-project.kak | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/rc/modules/fzf-project.kak b/rc/modules/fzf-project.kak index d56e5c9..fc9ab0f 100644 --- a/rc/modules/fzf-project.kak +++ b/rc/modules/fzf-project.kak @@ -26,14 +26,21 @@ define-command -hidden fzf-project %{ evaluate-commands %sh{ define-command fzf-save-path-as-project %{ prompt "Project's name: " %{ nop %sh{ mkdir -p "${kak_opt_fzf_projects_file%/*}" - printf "%s: %s\n" "$kak_text" "$(pwd)" >> $kak_opt_fzf_projects_file + tmp=$(mktemp "${TMPDIR:-/tmp}/fzf-project.XXXXXXX") + project=$(grep "$kak_text: " $kak_opt_fzf_projects_file) + if [ -z "${project}" ]; then + printf "%s: %s\n" "$kak_text" "$(pwd)" >> $kak_opt_fzf_projects_file + else + perl -pe "s(\Q$kak_text: \E.*)($kak_text: $(pwd))" "${kak_opt_fzf_projects_file}" > ${tmp} && cat ${tmp} > "${kak_opt_fzf_projects_file}" + fi + rm -rf ${tmp} }}} -# a command to get poject names if `prompt' will ever support `-shell-script-candidates' -# %sh{ perl -n -e '/^([^:]+)/ && print "$1\n"' $kak_opt_fzf_projects_file } define-command fzf-update-project-path %{ - prompt "Project to update: " %{ nop %sh{ - sed -i -E "s/($kak_text: ).*/\1$(pwd)/" "$kak_opt_fzf_projects_file" + prompt -shell-script-candidates %{ perl -n -e '/^([^:]+)/ && print "$1\n"' $kak_opt_fzf_projects_file } "Project to update: " %{ nop %sh{ + tmp=$(mktemp "${TMPDIR:-/tmp}/fzf-project.XXXXXXX") + perl -pe "s(\Q$kak_text: \E.*)($kak_text: $(pwd))" "${kak_opt_fzf_projects_file}" > ${tmp} && cat ${tmp} > "${kak_opt_fzf_projects_file}" + rm -rf ${tmp} }} } From ad73e6255372465fa9141c37a91ee3b329372761 Mon Sep 17 00:00:00 2001 From: Andrey Orst Date: Sat, 30 Mar 2019 19:19:26 +0300 Subject: [PATCH 5/8] add delete command and prompt dialog --- %val{config}/.fzf-projects | 1 + rc/modules/fzf-project.kak | 46 +++++++++++++++++++++++++++++--------- 2 files changed, 37 insertions(+), 10 deletions(-) create mode 100644 %val{config}/.fzf-projects diff --git a/%val{config}/.fzf-projects b/%val{config}/.fzf-projects new file mode 100644 index 0000000..6afc507 --- /dev/null +++ b/%val{config}/.fzf-projects @@ -0,0 +1 @@ +fzf: /home/andreyorst/.config/kak/plugins/fzf.kak diff --git a/rc/modules/fzf-project.kak b/rc/modules/fzf-project.kak index fc9ab0f..e9039df 100644 --- a/rc/modules/fzf-project.kak +++ b/rc/modules/fzf-project.kak @@ -8,9 +8,6 @@ # │ GitHub.com/andreyorst/fzf.kak │ # ╰──────────────────────────────────────╯ -declare-option -docstring "a file where saved projects are stored" \ -str fzf_projects_file %sh{ echo "$HOME/.cache/fzf.kak/projects" } - try %{ declare-user-mode fzf } map global fzf -docstring "open project" 'p' ': fzf-project' @@ -18,28 +15,57 @@ try %{ declare-user-mode fzf-project } map global fzf -docstring "project menu" '' ': enter-user-mode fzf-project' map global fzf-project -docstring "save current path as project" 's' ': fzf-save-path-as-project' map global fzf-project -docstring "update project" 'u' ': fzf-update-project-path' +map global fzf-project -docstring "delete project from project list" 'd' ': fzf-delete-project' + +declare-option -docstring "file where saved projects are stored" str fzf_projects_file "%val{config}/.fzf-projects" define-command -hidden fzf-project %{ evaluate-commands %sh{ - printf '%s\n' "info -title %{fzf open project} %{Change the server's working directory to selected project}" - printf "%s\n" "fzf -kak-cmd change-directory -items-cmd %{cat $kak_opt_fzf_projects_file} -preview-cmd %{$preview} -post-action fzf-file -filter %{sed 's/.*: //'}" + if [ -s $kak_opt_fzf_projects_file ]; then + printf '%s\n' "info -title %{fzf open project} %{Change the server's working directory to selected project}" + printf "%s\n" "fzf -kak-cmd change-directory -items-cmd %{cat $kak_opt_fzf_projects_file} -preview-cmd %{$preview} -post-action fzf-file -filter %{sed 's/.*: //'}" + else + printf "%s\n" "echo -markup %{{Information}No projects defined in '$kak_opt_fzf_projects_file'}" + fi }} -define-command fzf-save-path-as-project %{ prompt "Project's name: " %{ nop %sh{ +define-command -hidden fzf-save-path-as-project %{ prompt "Project's name: " %{ evaluate-commands %sh{ mkdir -p "${kak_opt_fzf_projects_file%/*}" tmp=$(mktemp "${TMPDIR:-/tmp}/fzf-project.XXXXXXX") project=$(grep "$kak_text: " $kak_opt_fzf_projects_file) if [ -z "${project}" ]; then printf "%s: %s\n" "$kak_text" "$(pwd)" >> $kak_opt_fzf_projects_file + printf "%s\n" "echo -markup %{{Information}saved '$(pwd)' project as '$kak_text'}" else - perl -pe "s(\Q$kak_text: \E.*)($kak_text: $(pwd))" "${kak_opt_fzf_projects_file}" > ${tmp} && cat ${tmp} > "${kak_opt_fzf_projects_file}" + project="$kak_text" + printf "%s\n" "prompt -shell-script-candidates %{printf '%s\n%s\n' 'y' 'n'} %{Project '$project' exists. Update? (y/N): } %{ evaluate-commands %sh{ + if [ \"\$kak_text\" = 'y' ] || [ \"\$kak_text\" = 'yes' ]; then + printf \"%s\n\" \"fzf-update-project-path-impl %{$project}\" + printf \"%s\n\" \"echo -markup %{{Information}'$project' project updated}\" + else + printf \"%s\n\" \"echo -markup %{{Information}'$project' project kept}\" + fi + }}" fi rm -rf ${tmp} }}} -define-command fzf-update-project-path %{ - prompt -shell-script-candidates %{ perl -n -e '/^([^:]+)/ && print "$1\n"' $kak_opt_fzf_projects_file } "Project to update: " %{ nop %sh{ +define-command -hidden fzf-update-project-path %{ + prompt -shell-script-candidates %{ perl -n -e '/^([^:]+)/ && print "$1\n"' $kak_opt_fzf_projects_file } "Project to update: " %{ + fzf-update-project-path-impl %val{text} + echo -markup "{Information}'%val{text}' project updated" + } +} + +define-command fzf-update-project-path-impl -params 1 %{ nop %sh{ + tmp=$(mktemp "${TMPDIR:-/tmp}/fzf-project.XXXXXXX") + perl -pe "s(\Q$1: \E.*)($1: $(pwd))" "${kak_opt_fzf_projects_file}" > ${tmp} && cat ${tmp} > "${kak_opt_fzf_projects_file}" + rm -rf ${tmp} +}} + +define-command -hidden fzf-delete-project %{ + prompt -shell-script-candidates %{ perl -n -e '/^([^:]+)/ && print "$1\n"' $kak_opt_fzf_projects_file } "Project to delete: " %{ nop %sh{ tmp=$(mktemp "${TMPDIR:-/tmp}/fzf-project.XXXXXXX") - perl -pe "s(\Q$kak_text: \E.*)($kak_text: $(pwd))" "${kak_opt_fzf_projects_file}" > ${tmp} && cat ${tmp} > "${kak_opt_fzf_projects_file}" + perl -pe "s(\Q$kak_text: \E.*\n)()" "${kak_opt_fzf_projects_file}" > ${tmp} && cat ${tmp} > "${kak_opt_fzf_projects_file}" rm -rf ${tmp} }} } From edcb9cf771cc84b682614ddd0fe9b8e4b60ee38a Mon Sep 17 00:00:00 2001 From: Andrey Orst Date: Sat, 30 Mar 2019 19:23:16 +0300 Subject: [PATCH 6/8] more candidates --- rc/modules/fzf-project.kak | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rc/modules/fzf-project.kak b/rc/modules/fzf-project.kak index e9039df..8a87623 100644 --- a/rc/modules/fzf-project.kak +++ b/rc/modules/fzf-project.kak @@ -38,7 +38,7 @@ define-command -hidden fzf-save-path-as-project %{ prompt "Project's name: " %{ else project="$kak_text" printf "%s\n" "prompt -shell-script-candidates %{printf '%s\n%s\n' 'y' 'n'} %{Project '$project' exists. Update? (y/N): } %{ evaluate-commands %sh{ - if [ \"\$kak_text\" = 'y' ] || [ \"\$kak_text\" = 'yes' ]; then + if [ \"\$kak_text\" = 'y' ] || [ \"\$kak_text\" = 'Y' ] || [ \"\$kak_text\" = 'yes' ] || [ \"\$kak_text\" = 'Yes' ] || [ \"\$kak_text\" = 'YEs' ] || [ \"\$kak_text\" = 'YES' ]; then printf \"%s\n\" \"fzf-update-project-path-impl %{$project}\" printf \"%s\n\" \"echo -markup %{{Information}'$project' project updated}\" else From 7f54f8dcf15d8b81f52e22abf4babd9fec08a304 Mon Sep 17 00:00:00 2001 From: Andrey Orst Date: Sat, 30 Mar 2019 19:31:11 +0300 Subject: [PATCH 7/8] add project commands to readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index e38b856..7a07812 100644 --- a/README.md +++ b/README.md @@ -94,6 +94,8 @@ Each `fzf` module defines mnemonic mapping, like f for opening files, - t - Browse ctags tags. - Alt+t - Select tag kind filter on per language basis. - g - Interactive grep. +- p - Project selector. +- Alt+p - Project related commands. So for example pressing Ctrl+p f will open `fzf` window, showing you all files from current directory recursively. From 0fdafb4e6010ae17af04f6127f5dcca4605bbfb2 Mon Sep 17 00:00:00 2001 From: Andrey Orst Date: Sat, 30 Mar 2019 19:34:51 +0300 Subject: [PATCH 8/8] remove trash file --- %val{config}/.fzf-projects | 1 - 1 file changed, 1 deletion(-) delete mode 100644 %val{config}/.fzf-projects diff --git a/%val{config}/.fzf-projects b/%val{config}/.fzf-projects deleted file mode 100644 index 6afc507..0000000 --- a/%val{config}/.fzf-projects +++ /dev/null @@ -1 +0,0 @@ -fzf: /home/andreyorst/.config/kak/plugins/fzf.kak