From 2b584586ed1caf15429625da981575ee35d407b8 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Sun, 9 Feb 2025 11:53:35 +0900 Subject: Add --accept-nth option to transform the output This option can be used to replace a sed or awk in the post-processing step. ps -ef | fzf --multi --header-lines 1 | awk '{print $2}' ps -ef | fzf --multi --header-lines 1 --accept-nth 2 This may not be a very "Unix-y" thing to do, so I've always felt that fzf shouldn't have such an option, but I've finally changed my mind because: * fzf can be configured with a custom delimiter that is a fixed string or a regular expression. * In such cases, you'd need to repeat the delimiter again in the post-processing step. * Also, tools like awk or sed may interpret a regular expression differently, causing mismatches. You can still use sed, cut, or awk if you prefer. Close #3987 Close #1323 --- src/util/chars.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'src/util') diff --git a/src/util/chars.go b/src/util/chars.go index 4b9cca01..dd037caa 100644 --- a/src/util/chars.go +++ b/src/util/chars.go @@ -189,6 +189,27 @@ func (chars *Chars) TrimTrailingWhitespaces() { chars.slice = chars.slice[0 : len(chars.slice)-whitespaces] } +func (chars *Chars) TrimSuffix(runes []rune) { + lastIdx := len(chars.slice) + firstIdx := lastIdx - len(runes) + if firstIdx < 0 { + return + } + + for i := firstIdx; i < lastIdx; i++ { + char := chars.Get(i) + if char != runes[i-firstIdx] { + return + } + } + + chars.slice = chars.slice[0:firstIdx] +} + +func (chars *Chars) SliceRight(last int) { + chars.slice = chars.slice[:last] +} + func (chars *Chars) ToString() string { if runes := chars.optionalRunes(); runes != nil { return string(runes) -- cgit v1.2.3